@pyric/cli 0.1.0-alpha.10 → 0.1.0-alpha.12

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 (498) hide show
  1. package/README.md.orig +2 -2
  2. package/dist/assurance/.generated/conformance-verdicts.d.ts +16 -0
  3. package/dist/assurance/.generated/conformance-verdicts.d.ts.map +1 -1
  4. package/dist/assurance/.generated/conformance-verdicts.js +16 -0
  5. package/dist/assurance/.generated/conformance-verdicts.js.map +1 -1
  6. package/dist/bridge/server/peer.d.ts +1 -1
  7. package/dist/bridge/server.d.ts +1 -1
  8. package/dist/bridge/server.js +1 -1
  9. package/dist/cli/index.d.ts +11 -0
  10. package/dist/cli/index.d.ts.map +1 -1
  11. package/dist/cli/index.js +13 -1
  12. package/dist/cli/index.js.map +1 -1
  13. package/dist/cli/init.d.ts +3 -3
  14. package/dist/cli/init.d.ts.map +1 -1
  15. package/dist/cli/init.js +5 -5
  16. package/dist/cli/init.js.map +1 -1
  17. package/dist/cli/serve.d.ts.map +1 -1
  18. package/dist/cli/serve.js +8 -2
  19. package/dist/cli/serve.js.map +1 -1
  20. package/dist/conformance/.generated/can-i-use-browser.d.ts.map +1 -1
  21. package/dist/conformance/.generated/can-i-use-browser.js +1 -1
  22. package/dist/conformance/.generated/can-i-use-browser.js.map +1 -1
  23. package/dist/conformance/.generated/can-i-use.d.ts.map +1 -1
  24. package/dist/conformance/.generated/can-i-use.js +2 -2
  25. package/dist/conformance/.generated/can-i-use.js.map +1 -1
  26. package/dist/conformance/.generated/conformance-docs.d.ts +12 -0
  27. package/dist/conformance/.generated/conformance-docs.d.ts.map +1 -0
  28. package/dist/conformance/.generated/conformance-docs.js +2 -0
  29. package/dist/conformance/.generated/conformance-docs.js.map +1 -0
  30. package/dist/conformance/docs.d.ts +6 -0
  31. package/dist/conformance/docs.d.ts.map +1 -0
  32. package/dist/conformance/docs.js +6 -0
  33. package/dist/conformance/docs.js.map +1 -0
  34. package/dist/remote/index.d.ts.map +1 -1
  35. package/dist/remote/index.js +1 -0
  36. package/dist/remote/index.js.map +1 -1
  37. package/dist/serve/activity-guard.d.ts +4 -0
  38. package/dist/serve/activity-guard.d.ts.map +1 -0
  39. package/dist/serve/activity-guard.js +22 -0
  40. package/dist/serve/activity-guard.js.map +1 -0
  41. package/dist/serve/activity-route.d.ts +4 -0
  42. package/dist/serve/activity-route.d.ts.map +1 -0
  43. package/dist/serve/activity-route.js +157 -0
  44. package/dist/serve/activity-route.js.map +1 -0
  45. package/dist/serve/activity-warning.d.ts +4 -0
  46. package/dist/serve/activity-warning.d.ts.map +1 -0
  47. package/dist/serve/activity-warning.js +21 -0
  48. package/dist/serve/activity-warning.js.map +1 -0
  49. package/dist/serve/bridge-mount.d.ts +5 -0
  50. package/dist/serve/bridge-mount.d.ts.map +1 -1
  51. package/dist/serve/bridge-mount.js +1 -0
  52. package/dist/serve/bridge-mount.js.map +1 -1
  53. package/dist/serve/docs-ui/404.html +3 -0
  54. package/dist/serve/docs-ui/_astro/{_slug_.DPUwShm2.css → _slug_.CXh9yTP1.css} +1 -1
  55. package/dist/serve/docs-ui/_astro/_slug_.DUci-duz.css +1 -0
  56. package/dist/serve/docs-ui/docs/_rhythm/index.html +2 -1
  57. package/dist/serve/docs-ui/docs/agent/set-up-your-agent/index.html +3 -2
  58. package/dist/serve/docs-ui/docs/agent/set-up-your-agent.md +1 -1
  59. package/dist/serve/docs-ui/docs/agent/watch-and-review/index.html +2 -1
  60. package/dist/serve/docs-ui/docs/agent/work-with-an-agent/index.html +2 -1
  61. package/dist/serve/docs-ui/docs/ai-compat/index.html +2 -1
  62. package/dist/serve/docs-ui/docs/api-reference/index.html +51 -49
  63. package/dist/serve/docs-ui/docs/api-reference.md +3 -3
  64. package/dist/serve/docs-ui/docs/app-compat/index.html +2 -1
  65. package/dist/serve/docs-ui/docs/auth-compat/index.html +2 -1
  66. package/dist/serve/docs-ui/docs/build/ai-logic/index.html +18 -3
  67. package/dist/serve/docs-ui/docs/build/ai-logic.md +30 -2
  68. package/dist/serve/docs-ui/docs/build/authentication/index.html +2 -1
  69. package/dist/serve/docs-ui/docs/build/authentication.md +1 -1
  70. package/dist/serve/docs-ui/docs/build/cloud-firestore/index.html +2 -1
  71. package/dist/serve/docs-ui/docs/build/cloud-messaging/index.html +46 -2
  72. package/dist/serve/docs-ui/docs/build/cloud-messaging.md +56 -1
  73. package/dist/serve/docs-ui/docs/build/cloud-storage/index.html +2 -1
  74. package/dist/serve/docs-ui/docs/build/cloud-storage.md +1 -1
  75. package/dist/serve/docs-ui/docs/build/realtime-database/index.html +21 -3
  76. package/dist/serve/docs-ui/docs/build/realtime-database.md +25 -1
  77. package/dist/serve/docs-ui/docs/conformance-scores/index.html +2 -1
  78. package/dist/serve/docs-ui/docs/create-pyric-reference-api/index.html +61 -28
  79. package/dist/serve/docs-ui/docs/create-pyric-reference-api.md +65 -20
  80. package/dist/serve/docs-ui/docs/database-compat/index.html +2 -1
  81. package/dist/serve/docs-ui/docs/firestore-compat/index.html +6 -5
  82. package/dist/serve/docs-ui/docs/firestore-compat.md +4 -4
  83. package/dist/serve/docs-ui/docs/functions-rtdb-compat/index.html +2 -1
  84. package/dist/serve/docs-ui/docs/get-started/how-the-swap-works/index.html +2 -1
  85. package/dist/serve/docs-ui/docs/get-started/start-building/index.html +4 -3
  86. package/dist/serve/docs-ui/docs/get-started/start-building.md +2 -2
  87. package/dist/serve/docs-ui/docs/index.json +979 -579
  88. package/dist/serve/docs-ui/docs/messaging-compat/index.html +2 -1
  89. package/dist/serve/docs-ui/docs/observe/see-whats-happening/index.html +2 -1
  90. package/dist/serve/docs-ui/docs/observe/shape-your-data/index.html +2 -1
  91. package/dist/serve/docs-ui/docs/overview/index.html +2 -1
  92. package/dist/serve/docs-ui/docs/pyric-admin-app-reference-api/index.html +5 -4
  93. package/dist/serve/docs-ui/docs/pyric-admin-app-reference-api.md +3 -4
  94. package/dist/serve/docs-ui/docs/pyric-admin-auth-reference-api/index.html +5 -4
  95. package/dist/serve/docs-ui/docs/pyric-admin-auth-reference-api.md +3 -4
  96. package/dist/serve/docs-ui/docs/pyric-admin-database-reference-api/index.html +5 -4
  97. package/dist/serve/docs-ui/docs/pyric-admin-database-reference-api.md +3 -4
  98. package/dist/serve/docs-ui/docs/pyric-admin-firestore-reference-api/index.html +2503 -12
  99. package/dist/serve/docs-ui/docs/pyric-admin-firestore-reference-api.md +2219 -8
  100. package/dist/serve/docs-ui/docs/pyric-admin-messaging-reference-api/index.html +916 -0
  101. package/dist/serve/docs-ui/docs/pyric-admin-messaging-reference-api.md +706 -0
  102. package/dist/serve/docs-ui/docs/pyric-admin-storage-reference-api/index.html +4 -3
  103. package/dist/serve/docs-ui/docs/pyric-admin-storage-reference-api.md +2 -3
  104. package/dist/serve/docs-ui/docs/pyric-ai-reference-api/index.html +16 -11
  105. package/dist/serve/docs-ui/docs/pyric-ai-reference-api.md +14 -13
  106. package/dist/serve/docs-ui/docs/pyric-ai-scripting-reference-api/index.html +4 -3
  107. package/dist/serve/docs-ui/docs/pyric-ai-scripting-reference-api.md +2 -3
  108. package/dist/serve/docs-ui/docs/pyric-app-reference-api/index.html +7 -2
  109. package/dist/serve/docs-ui/docs/pyric-app-reference-api.md +5 -2
  110. package/dist/serve/docs-ui/docs/pyric-auth-reference-api/index.html +23 -12
  111. package/dist/serve/docs-ui/docs/pyric-auth-reference-api.md +15 -12
  112. package/dist/serve/docs-ui/docs/pyric-cli-assurance-browser-reference-api/index.html +10 -48
  113. package/dist/serve/docs-ui/docs/pyric-cli-assurance-browser-reference-api.md +11 -24
  114. package/dist/serve/docs-ui/docs/pyric-cli-assurance-reference-api/index.html +87 -97
  115. package/dist/serve/docs-ui/docs/pyric-cli-assurance-reference-api.md +53 -65
  116. package/dist/serve/docs-ui/docs/pyric-cli-bridge-client-reference-api/index.html +14 -15
  117. package/dist/serve/docs-ui/docs/pyric-cli-bridge-client-reference-api.md +19 -28
  118. package/dist/serve/docs-ui/docs/pyric-cli-bridge-reference-api/index.html +4 -3
  119. package/dist/serve/docs-ui/docs/pyric-cli-bridge-reference-api.md +2 -3
  120. package/dist/serve/docs-ui/docs/pyric-cli-conformance-browser-reference-api/index.html +3 -2
  121. package/dist/serve/docs-ui/docs/pyric-cli-conformance-browser-reference-api.md +1 -2
  122. package/dist/serve/docs-ui/docs/pyric-cli-conformance-docs-reference-api/index.html +51 -0
  123. package/dist/serve/docs-ui/docs/pyric-cli-conformance-docs-reference-api.md +36 -0
  124. package/dist/serve/docs-ui/docs/pyric-cli-conformance-reference-api/index.html +3 -2
  125. package/dist/serve/docs-ui/docs/pyric-cli-conformance-reference-api.md +1 -2
  126. package/dist/serve/docs-ui/docs/pyric-cli-credentials-node-reference-api/index.html +3 -2
  127. package/dist/serve/docs-ui/docs/pyric-cli-credentials-node-reference-api.md +1 -2
  128. package/dist/serve/docs-ui/docs/pyric-cli-discover-reference-api/index.html +3 -2
  129. package/dist/serve/docs-ui/docs/pyric-cli-discover-reference-api.md +1 -2
  130. package/dist/serve/docs-ui/docs/pyric-cli-register-reference-api/index.html +3 -2
  131. package/dist/serve/docs-ui/docs/pyric-cli-register-reference-api.md +1 -2
  132. package/dist/serve/docs-ui/docs/pyric-cli-remote-reference-api/index.html +1067 -83
  133. package/dist/serve/docs-ui/docs/pyric-cli-remote-reference-api.md +1291 -160
  134. package/dist/serve/docs-ui/docs/pyric-cli-serve-worker-reference-api/index.html +253 -157
  135. package/dist/serve/docs-ui/docs/pyric-cli-serve-worker-reference-api.md +179 -85
  136. package/dist/serve/docs-ui/docs/pyric-cli-verify-reference-api/index.html +72 -7
  137. package/dist/serve/docs-ui/docs/pyric-cli-verify-reference-api.md +22 -7
  138. package/dist/serve/docs-ui/docs/pyric-cli-vite-reference-api/index.html +33 -12
  139. package/dist/serve/docs-ui/docs/pyric-cli-vite-reference-api.md +15 -12
  140. package/dist/serve/docs-ui/docs/pyric-database-reference-api/index.html +18 -17
  141. package/dist/serve/docs-ui/docs/pyric-database-reference-api.md +19 -22
  142. package/dist/serve/docs-ui/docs/pyric-firestore-reference-api/index.html +1512 -545
  143. package/dist/serve/docs-ui/docs/pyric-firestore-reference-api.md +1311 -316
  144. package/dist/serve/docs-ui/docs/pyric-messaging-reference-api/index.html +5 -4
  145. package/dist/serve/docs-ui/docs/pyric-messaging-reference-api.md +3 -4
  146. package/dist/serve/docs-ui/docs/pyric-messaging-sw-reference-api/index.html +69 -369
  147. package/dist/serve/docs-ui/docs/pyric-messaging-sw-reference-api.md +103 -216
  148. package/dist/serve/docs-ui/docs/pyric-rules-reference-api/index.html +10 -9
  149. package/dist/serve/docs-ui/docs/pyric-rules-reference-api.md +9 -10
  150. package/dist/serve/docs-ui/docs/pyric-sandbox-database-reference-api/index.html +8 -7
  151. package/dist/serve/docs-ui/docs/pyric-sandbox-database-reference-api.md +6 -7
  152. package/dist/serve/docs-ui/docs/pyric-sandbox-firestore-reference-api/index.html +10 -9
  153. package/dist/serve/docs-ui/docs/pyric-sandbox-firestore-reference-api.md +9 -10
  154. package/dist/serve/docs-ui/docs/pyric-sandbox-reference-api/index.html +371 -884
  155. package/dist/serve/docs-ui/docs/pyric-sandbox-reference-api.md +369 -883
  156. package/dist/serve/docs-ui/docs/pyric-storage-reference-api/index.html +25 -17
  157. package/dist/serve/docs-ui/docs/pyric-storage-reference-api.md +21 -19
  158. package/dist/serve/docs-ui/docs/pyric-ui-agents-reference-api/index.html +3 -2
  159. package/dist/serve/docs-ui/docs/pyric-ui-agents-reference-api.md +1 -2
  160. package/dist/serve/docs-ui/docs/pyric-ui-auth-hooks-reference-api/index.html +63 -776
  161. package/dist/serve/docs-ui/docs/pyric-ui-auth-hooks-reference-api.md +69 -510
  162. package/dist/serve/docs-ui/docs/pyric-ui-auth-reference-api/index.html +22 -21
  163. package/dist/serve/docs-ui/docs/pyric-ui-auth-reference-api.md +29 -30
  164. package/dist/serve/docs-ui/docs/pyric-ui-events-hooks-reference-api/index.html +15 -168
  165. package/dist/serve/docs-ui/docs/pyric-ui-events-hooks-reference-api.md +17 -87
  166. package/dist/serve/docs-ui/docs/pyric-ui-events-reference-api/index.html +6 -5
  167. package/dist/serve/docs-ui/docs/pyric-ui-events-reference-api.md +5 -6
  168. package/dist/serve/docs-ui/docs/pyric-ui-firestore-hooks-reference-api/index.html +82 -970
  169. package/dist/serve/docs-ui/docs/pyric-ui-firestore-hooks-reference-api.md +104 -479
  170. package/dist/serve/docs-ui/docs/pyric-ui-firestore-reference-api/index.html +30 -29
  171. package/dist/serve/docs-ui/docs/pyric-ui-firestore-reference-api.md +54 -55
  172. package/dist/serve/docs-ui/docs/pyric-ui-primitives-reference-api/index.html +3 -2
  173. package/dist/serve/docs-ui/docs/pyric-ui-primitives-reference-api.md +1 -2
  174. package/dist/serve/docs-ui/docs/pyric-ui-rtdb-reference-api/index.html +5 -4
  175. package/dist/serve/docs-ui/docs/pyric-ui-rtdb-reference-api.md +3 -4
  176. package/dist/serve/docs-ui/docs/pyric-ui-rules-hooks-reference-api/index.html +9 -124
  177. package/dist/serve/docs-ui/docs/pyric-ui-rules-hooks-reference-api.md +7 -58
  178. package/dist/serve/docs-ui/docs/pyric-ui-rules-reference-api/index.html +24 -23
  179. package/dist/serve/docs-ui/docs/pyric-ui-rules-reference-api.md +31 -34
  180. package/dist/serve/docs-ui/docs/pyric-ui-storage-hooks-reference-api/index.html +104 -1385
  181. package/dist/serve/docs-ui/docs/pyric-ui-storage-hooks-reference-api.md +133 -817
  182. package/dist/serve/docs-ui/docs/pyric-ui-storage-reference-api/index.html +34 -33
  183. package/dist/serve/docs-ui/docs/pyric-ui-storage-reference-api.md +37 -38
  184. package/dist/serve/docs-ui/docs/pyric-ui-traffic-hooks-reference-api/index.html +116 -1169
  185. package/dist/serve/docs-ui/docs/pyric-ui-traffic-hooks-reference-api.md +142 -590
  186. package/dist/serve/docs-ui/docs/pyric-ui-traffic-reference-api/index.html +4 -3
  187. package/dist/serve/docs-ui/docs/pyric-ui-traffic-reference-api.md +3 -4
  188. package/dist/serve/docs-ui/docs/rules-compat/index.html +34 -1
  189. package/dist/serve/docs-ui/docs/rules-compat.md +32 -0
  190. package/dist/serve/docs-ui/docs/secure/audit-your-rules/index.html +19 -2
  191. package/dist/serve/docs-ui/docs/secure/audit-your-rules.md +32 -0
  192. package/dist/serve/docs-ui/docs/secure/firestore-rules-limits/index.html +2 -1
  193. package/dist/serve/docs-ui/docs/secure/read-a-denial/index.html +2 -1
  194. package/dist/serve/docs-ui/docs/secure/rtdb-rules-in-typescript/index.html +2 -1
  195. package/dist/serve/docs-ui/docs/secure/rtdb-rules-in-typescript.md +1 -1
  196. package/dist/serve/docs-ui/docs/secure/rules-standard-library/index.html +2 -1
  197. package/dist/serve/docs-ui/docs/secure/secure-it-with-rules/index.html +2 -1
  198. package/dist/serve/docs-ui/docs/secure/simulate-and-lint/index.html +2 -1
  199. package/dist/serve/docs-ui/docs/secure/write-a-rules-test-suite/index.html +2 -1
  200. package/dist/serve/docs-ui/docs/ship/ship-to-production/index.html +2 -1
  201. package/dist/serve/docs-ui/docs/ship/test-in-node/index.html +2 -1
  202. package/dist/serve/docs-ui/docs/storage-compat/index.html +2 -1
  203. package/dist/serve/docs-ui/docs/trust/how-we-know-it-matches-firebase/index.html +2 -1
  204. package/dist/serve/docs-ui/docs/trust/versioning-and-compatibility/index.html +2 -1
  205. package/dist/serve/docs-ui/llms.txt +2 -1
  206. package/dist/serve/entries/ai.d.ts.map +1 -1
  207. package/dist/serve/entries/ai.js +39 -1
  208. package/dist/serve/entries/ai.js.map +1 -1
  209. package/dist/serve/entries/messaging-sw.d.ts.map +1 -1
  210. package/dist/serve/entries/messaging-sw.js +5 -1
  211. package/dist/serve/entries/messaging-sw.js.map +1 -1
  212. package/dist/serve/entries/messaging.d.ts.map +1 -1
  213. package/dist/serve/entries/messaging.js +7 -1
  214. package/dist/serve/entries/messaging.js.map +1 -1
  215. package/dist/serve/entries/runtime.d.ts.map +1 -1
  216. package/dist/serve/entries/runtime.js +20 -1
  217. package/dist/serve/entries/runtime.js.map +1 -1
  218. package/dist/serve/init-payload.d.ts +25 -0
  219. package/dist/serve/init-payload.d.ts.map +1 -1
  220. package/dist/serve/namespace.d.ts +39 -0
  221. package/dist/serve/namespace.d.ts.map +1 -1
  222. package/dist/serve/namespace.js +80 -1
  223. package/dist/serve/namespace.js.map +1 -1
  224. package/dist/serve/standalone-assets.d.ts +11 -9
  225. package/dist/serve/standalone-assets.d.ts.map +1 -1
  226. package/dist/serve/standalone-assets.js +6 -5
  227. package/dist/serve/standalone-assets.js.map +1 -1
  228. package/dist/serve/studio-ui/assets/{RulesCodeEditor-CXdSLKhO.js → RulesCodeEditor-CxVYcZXw.js} +1 -1
  229. package/dist/serve/studio-ui/assets/index-cpSfgQ7H.js +1218 -0
  230. package/dist/serve/studio-ui/assets/seed-DeuFKi4J.js +20 -0
  231. package/dist/serve/studio-ui/index.html +1 -1
  232. package/dist/serve/vite-plugin.d.ts +92 -15
  233. package/dist/serve/vite-plugin.d.ts.map +1 -1
  234. package/dist/serve/vite-plugin.js +281 -11
  235. package/dist/serve/vite-plugin.js.map +1 -1
  236. package/dist/serve/worker/activity-bootstrap.d.ts +8 -0
  237. package/dist/serve/worker/activity-bootstrap.d.ts.map +1 -0
  238. package/dist/serve/worker/activity-bootstrap.js +11 -0
  239. package/dist/serve/worker/activity-bootstrap.js.map +1 -0
  240. package/dist/serve/worker/client/connection.d.ts.map +1 -1
  241. package/dist/serve/worker/client/connection.js +17 -5
  242. package/dist/serve/worker/client/connection.js.map +1 -1
  243. package/dist/serve/worker/client/core.d.ts +2 -2
  244. package/dist/serve/worker/client/core.d.ts.map +1 -1
  245. package/dist/serve/worker/client/core.js +33 -5
  246. package/dist/serve/worker/client/core.js.map +1 -1
  247. package/dist/serve/worker/client/firestore-writes.d.ts.map +1 -1
  248. package/dist/serve/worker/client/firestore-writes.js +1 -0
  249. package/dist/serve/worker/client/firestore-writes.js.map +1 -1
  250. package/dist/serve/worker/client/messaging.d.ts +9 -1
  251. package/dist/serve/worker/client/messaging.d.ts.map +1 -1
  252. package/dist/serve/worker/client/messaging.js +15 -0
  253. package/dist/serve/worker/client/messaging.js.map +1 -1
  254. package/dist/serve/worker/client/studio.d.ts +10 -0
  255. package/dist/serve/worker/client/studio.d.ts.map +1 -1
  256. package/dist/serve/worker/client/studio.js +11 -0
  257. package/dist/serve/worker/client/studio.js.map +1 -1
  258. package/dist/serve/worker/durable-persistence.d.ts +12 -0
  259. package/dist/serve/worker/durable-persistence.d.ts.map +1 -0
  260. package/dist/serve/worker/durable-persistence.js +118 -0
  261. package/dist/serve/worker/durable-persistence.js.map +1 -0
  262. package/dist/serve/worker/entry.d.ts +7 -3
  263. package/dist/serve/worker/entry.d.ts.map +1 -1
  264. package/dist/serve/worker/entry.js +7 -3
  265. package/dist/serve/worker/entry.js.map +1 -1
  266. package/dist/serve/worker/host/core.d.ts +9 -5
  267. package/dist/serve/worker/host/core.d.ts.map +1 -1
  268. package/dist/serve/worker/host/core.js +34 -9
  269. package/dist/serve/worker/host/core.js.map +1 -1
  270. package/dist/serve/worker/host/dispatch.d.ts.map +1 -1
  271. package/dist/serve/worker/host/dispatch.js +9 -2
  272. package/dist/serve/worker/host/dispatch.js.map +1 -1
  273. package/dist/serve/worker/host/firestore-writes.d.ts.map +1 -1
  274. package/dist/serve/worker/host/firestore-writes.js +3 -2
  275. package/dist/serve/worker/host/firestore-writes.js.map +1 -1
  276. package/dist/serve/worker/host/studio.d.ts +1 -1
  277. package/dist/serve/worker/host/studio.d.ts.map +1 -1
  278. package/dist/serve/worker/host/studio.js +36 -1
  279. package/dist/serve/worker/host/studio.js.map +1 -1
  280. package/dist/serve/worker/host/subscriptions.d.ts.map +1 -1
  281. package/dist/serve/worker/host/subscriptions.js +27 -7
  282. package/dist/serve/worker/host/subscriptions.js.map +1 -1
  283. package/dist/serve/worker/host-context.d.ts +15 -0
  284. package/dist/serve/worker/host-context.d.ts.map +1 -1
  285. package/dist/serve/worker/host-context.js +10 -0
  286. package/dist/serve/worker/host-context.js.map +1 -1
  287. package/dist/serve/worker/host-messaging.d.ts.map +1 -1
  288. package/dist/serve/worker/host-messaging.js +9 -2
  289. package/dist/serve/worker/host-messaging.js.map +1 -1
  290. package/dist/serve/worker/index.d.ts +3 -2
  291. package/dist/serve/worker/index.d.ts.map +1 -1
  292. package/dist/serve/worker/index.js +4 -1
  293. package/dist/serve/worker/index.js.map +1 -1
  294. package/dist/serve/worker/protocol.d.ts +25 -3
  295. package/dist/serve/worker/protocol.d.ts.map +1 -1
  296. package/dist/serve/worker/protocol.js +2 -2
  297. package/dist/serve/worker/protocol.js.map +1 -1
  298. package/dist/serve/worker/serve-init.d.ts +23 -37
  299. package/dist/serve/worker/serve-init.d.ts.map +1 -1
  300. package/dist/serve/worker/serve-init.js +95 -172
  301. package/dist/serve/worker/serve-init.js.map +1 -1
  302. package/dist/vite.d.ts +4 -4
  303. package/dist/vite.d.ts.map +1 -1
  304. package/dist/vite.js +3 -3
  305. package/dist/vite.js.map +1 -1
  306. package/package.json +9 -4
  307. package/src/assurance/.generated/conformance-verdicts.ts +1090 -0
  308. package/src/assurance/attachment.ts +211 -0
  309. package/src/assurance/browser.ts +80 -0
  310. package/src/assurance/campaign.ts +496 -0
  311. package/src/assurance/capabilities.ts +446 -0
  312. package/src/assurance/cases.ts +43 -0
  313. package/src/assurance/index.ts +75 -0
  314. package/src/assurance/runner.ts +885 -0
  315. package/src/assurance/tool-names.ts +15 -0
  316. package/src/assurance/tools.ts +830 -0
  317. package/src/assurance/types.ts +352 -0
  318. package/src/assurance/validation.ts +434 -0
  319. package/src/bridge/client/bridge.ts +550 -0
  320. package/src/bridge/client/dispatch.ts +137 -0
  321. package/src/bridge/client.ts +45 -0
  322. package/src/bridge/protocol.ts +351 -0
  323. package/src/bridge/server/audit.ts +53 -0
  324. package/src/bridge/server/bridge.ts +597 -0
  325. package/src/bridge/server/headless.ts +160 -0
  326. package/src/bridge/server/json-schema-to-zod.ts +108 -0
  327. package/src/bridge/server/local-bridge.ts +66 -0
  328. package/src/bridge/server/logger.ts +50 -0
  329. package/src/bridge/server/mcp-contract.ts +93 -0
  330. package/src/bridge/server/mcp.ts +129 -0
  331. package/src/bridge/server/peer.ts +232 -0
  332. package/src/bridge/server/standalone.ts +347 -0
  333. package/src/bridge/server/tool-metadata.ts +99 -0
  334. package/src/bridge/server.ts +28 -0
  335. package/src/cli/can-i-use.ts +50 -0
  336. package/src/cli/cli.test.ts +493 -0
  337. package/src/cli/database-rules.ts +329 -0
  338. package/src/cli/dev-runner.ts +282 -0
  339. package/src/cli/firebase-json.ts +100 -0
  340. package/src/cli/firestore-indexes.ts +70 -0
  341. package/src/cli/index.ts +425 -0
  342. package/src/cli/init.ts +260 -0
  343. package/src/cli/mcp-proxy.ts +196 -0
  344. package/src/cli/parse-args.ts +80 -0
  345. package/src/cli/rules.ts +259 -0
  346. package/src/cli/scope.ts +67 -0
  347. package/src/cli/serve.ts +996 -0
  348. package/src/cli/service-commands.ts +73 -0
  349. package/src/cli/snapshot.ts +164 -0
  350. package/src/cli/storage-rules.ts +172 -0
  351. package/src/cli/verify.ts +416 -0
  352. package/src/conformance/.generated/can-i-use-browser.ts +113 -0
  353. package/src/conformance/.generated/can-i-use.ts +117 -0
  354. package/src/conformance/.generated/conformance-docs.ts +14 -0
  355. package/src/conformance/browser.ts +24 -0
  356. package/src/conformance/can-i-use-tool.ts +51 -0
  357. package/src/conformance/can-i-use.ts +18 -0
  358. package/src/conformance/docs.ts +8 -0
  359. package/src/conformance/index.ts +20 -0
  360. package/src/conformance/tools.ts +16 -0
  361. package/src/credentials/core/memoize-ttl.ts +142 -0
  362. package/src/credentials/core/types.ts +10 -0
  363. package/src/credentials/node/from-adc.ts +96 -0
  364. package/src/credentials/node/from-service-account.ts +133 -0
  365. package/src/credentials/node/index.ts +6 -0
  366. package/src/discover/concurrency.ts +127 -0
  367. package/src/discover/crawler-adapter.ts +142 -0
  368. package/src/discover/crawler.ts +1127 -0
  369. package/src/discover/credential-free.ts +27 -0
  370. package/src/discover/findCollectionGroup.ts +131 -0
  371. package/src/discover/firestore-source.ts +59 -0
  372. package/src/discover/index.ts +5 -0
  373. package/src/discover/merge.ts +523 -0
  374. package/src/discover/session.ts +402 -0
  375. package/src/discover/tools.ts +201 -0
  376. package/src/discover/types.ts +187 -0
  377. package/src/discover/wire.ts +324 -0
  378. package/src/functions-rtdb/child.ts +382 -0
  379. package/src/functions-rtdb/delivery.ts +7 -0
  380. package/src/functions-rtdb/discovery.ts +136 -0
  381. package/src/functions-rtdb/event.ts +64 -0
  382. package/src/functions-rtdb/execution.ts +111 -0
  383. package/src/functions-rtdb/in-memory-delivery.ts +40 -0
  384. package/src/functions-rtdb/project.ts +74 -0
  385. package/src/functions-rtdb/projection.ts +104 -0
  386. package/src/functions-rtdb/reference-pattern.ts +20 -0
  387. package/src/functions-rtdb/remote-delivery.ts +23 -0
  388. package/src/pkg-version.ts +49 -0
  389. package/src/register/esm-exports.ts +63 -0
  390. package/src/register/hooks.ts +30 -0
  391. package/src/register/index.ts +150 -0
  392. package/src/register/mapping.ts +33 -0
  393. package/src/remote/index.ts +1050 -0
  394. package/src/rtdb/crawl-snapshot.ts +118 -0
  395. package/src/rtdb/inspection.ts +137 -0
  396. package/src/rtdb/load-rules-document.ts +56 -0
  397. package/src/rtdb/rules-generation-tool.ts +38 -0
  398. package/src/rtdb/rules-json.ts +29 -0
  399. package/src/serve/activity-guard.ts +29 -0
  400. package/src/serve/activity-route.ts +164 -0
  401. package/src/serve/activity-warning.ts +26 -0
  402. package/src/serve/bridge-mount.ts +200 -0
  403. package/src/serve/bundler.ts +493 -0
  404. package/src/serve/capture-store.ts +65 -0
  405. package/src/serve/discovery.ts +199 -0
  406. package/src/serve/entries/ai.ts +292 -0
  407. package/src/serve/entries/app-backend.ts +4 -0
  408. package/src/serve/entries/app-client.ts +26 -0
  409. package/src/serve/entries/app-session-store.ts +47 -0
  410. package/src/serve/entries/app.ts +11 -0
  411. package/src/serve/entries/auth-helper-core.ts +181 -0
  412. package/src/serve/entries/auth-helper-dom.ts +134 -0
  413. package/src/serve/entries/auth-helper-runtime.ts +20 -0
  414. package/src/serve/entries/auth.ts +255 -0
  415. package/src/serve/entries/bridge-url.ts +31 -0
  416. package/src/serve/entries/database.ts +129 -0
  417. package/src/serve/entries/firestore.ts +232 -0
  418. package/src/serve/entries/init.ts +46 -0
  419. package/src/serve/entries/keepalive.ts +46 -0
  420. package/src/serve/entries/messaging-sw.ts +75 -0
  421. package/src/serve/entries/messaging.ts +96 -0
  422. package/src/serve/entries/runtime.ts +540 -0
  423. package/src/serve/entries/session-store.ts +97 -0
  424. package/src/serve/entries/storage.ts +92 -0
  425. package/src/serve/entries/tab-sync-wiring.ts +274 -0
  426. package/src/serve/entries/worker-runtime.ts +75 -0
  427. package/src/serve/init-payload.ts +42 -0
  428. package/src/serve/namespace.ts +675 -0
  429. package/src/serve/open-browser.ts +68 -0
  430. package/src/serve/rules.ts +272 -0
  431. package/src/serve/sandbox-marker.ts +31 -0
  432. package/src/serve/server.ts +428 -0
  433. package/src/serve/standalone-assets.ts +180 -0
  434. package/src/serve/state-store.ts +166 -0
  435. package/src/serve/studio/disk-project-store.ts +185 -0
  436. package/src/serve/studio/disk-workspace.ts +162 -0
  437. package/src/serve/studio/index.ts +20 -0
  438. package/src/serve/studio/routes.ts +237 -0
  439. package/src/serve/studio/store-types.ts +48 -0
  440. package/src/serve/studio/studio-storage.test.ts +289 -0
  441. package/src/serve/vite-plugin.ts +1102 -0
  442. package/src/serve/worker/activity-bootstrap.ts +24 -0
  443. package/src/serve/worker/client/admin-firestore.ts +38 -0
  444. package/src/serve/worker/client/ai.ts +124 -0
  445. package/src/serve/worker/client/auth.ts +489 -0
  446. package/src/serve/worker/client/connection.ts +202 -0
  447. package/src/serve/worker/client/core.ts +350 -0
  448. package/src/serve/worker/client/disconnect.ts +45 -0
  449. package/src/serve/worker/client/firestore-reads.ts +181 -0
  450. package/src/serve/worker/client/firestore-refs.ts +226 -0
  451. package/src/serve/worker/client/firestore-writes.ts +232 -0
  452. package/src/serve/worker/client/handles.ts +91 -0
  453. package/src/serve/worker/client/messaging.ts +119 -0
  454. package/src/serve/worker/client/presence.ts +174 -0
  455. package/src/serve/worker/client/rtdb.ts +311 -0
  456. package/src/serve/worker/client/rules.ts +63 -0
  457. package/src/serve/worker/client/service-worker-connection.ts +59 -0
  458. package/src/serve/worker/client/snapshots.ts +86 -0
  459. package/src/serve/worker/client/storage.ts +195 -0
  460. package/src/serve/worker/client/studio.ts +88 -0
  461. package/src/serve/worker/client.ts +57 -0
  462. package/src/serve/worker/durable-persistence.ts +137 -0
  463. package/src/serve/worker/entry.ts +179 -0
  464. package/src/serve/worker/host/admin-firestore.ts +88 -0
  465. package/src/serve/worker/host/connection.ts +179 -0
  466. package/src/serve/worker/host/core.ts +387 -0
  467. package/src/serve/worker/host/dispatch.ts +316 -0
  468. package/src/serve/worker/host/firestore-reads.ts +117 -0
  469. package/src/serve/worker/host/firestore-writes.ts +456 -0
  470. package/src/serve/worker/host/presence.ts +312 -0
  471. package/src/serve/worker/host/rtdb.ts +136 -0
  472. package/src/serve/worker/host/rules.ts +128 -0
  473. package/src/serve/worker/host/storage.ts +312 -0
  474. package/src/serve/worker/host/studio.ts +75 -0
  475. package/src/serve/worker/host/subscriptions.ts +238 -0
  476. package/src/serve/worker/host-ai.ts +165 -0
  477. package/src/serve/worker/host-auth.ts +469 -0
  478. package/src/serve/worker/host-context.ts +273 -0
  479. package/src/serve/worker/host-events.ts +94 -0
  480. package/src/serve/worker/host-messaging.ts +240 -0
  481. package/src/serve/worker/host.ts +47 -0
  482. package/src/serve/worker/index.ts +196 -0
  483. package/src/serve/worker/presence-timing.ts +15 -0
  484. package/src/serve/worker/protocol.ts +1112 -0
  485. package/src/serve/worker/serve-init.ts +606 -0
  486. package/src/serve/worker/service-worker-channel.ts +33 -0
  487. package/src/serve/worker/service-worker-relay.ts +86 -0
  488. package/src/serve/writer-lock.ts +53 -0
  489. package/src/verify/cases.ts +233 -0
  490. package/src/verify/fixture.ts +258 -0
  491. package/src/verify/index.ts +519 -0
  492. package/src/verify/tools.ts +108 -0
  493. package/src/version/compat-target.ts +17 -0
  494. package/src/vite.ts +17 -0
  495. package/dist/serve/docs-ui/docs/pyric-firestore-values-reference-api/index.html +0 -30
  496. package/dist/serve/docs-ui/docs/pyric-firestore-values-reference-api.md +0 -30
  497. package/dist/serve/studio-ui/assets/index-BvtQIpGn.js +0 -1211
  498. package/dist/serve/studio-ui/assets/seed-3DMedLL3.js +0 -2
@@ -1,6 +1,7 @@
1
- <!DOCTYPE html><html lang="en"> <head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>API reference: @pyric/ui/storage · Pyric Studio</title><meta name="description" content="Published declarations for @pyric/ui/storage."><link rel="preconnect" href="https://fonts.googleapis.com"><link rel="preconnect" href="https://fonts.gstatic.com" crossorigin><link href="https://fonts.googleapis.com/css2?family=Inter:wght@300;400;500;600;700&family=JetBrains+Mono:wght@400;500;700&display=swap" rel="stylesheet"><link rel="stylesheet" href="/__pyric/ui/_astro/_slug_.DPUwShm2.css"></head> <body> <header class="studio__bar"> <div class="studio__bar-inner"> <a class="studio__brand" href="/__pyric/ui/" aria-label="Pyric Studio">Pyric</a> <nav class="studio__nav" aria-label="Studio tabs"> <a class="studio__nav-tab" href="/__pyric/ui/"> Home </a><a class="studio__nav-tab" href="/__pyric/ui/firestore"> Firestore </a><a class="studio__nav-tab" href="/__pyric/ui/auth"> Auth </a><a class="studio__nav-tab" href="/__pyric/ui/rtdb"> RTDB </a><a class="studio__nav-tab" href="/__pyric/ui/storage"> Storage </a><a class="studio__nav-tab" href="/__pyric/ui/traffic"> Traffic </a><a class="studio__nav-tab" href="/__pyric/ui/settings"> Settings </a><a class="studio__nav-tab" href="/__pyric/ui/docs" aria-current="page"> Docs </a> </nav> </div> </header> <div class="docs-shell"> <details class="docs-nav-drawer"> <summary>Navigate</summary> <nav class="docs-nav" aria-label="Documentation"> <div class="docs-search" data-index-url="/__pyric/ui/docs/index.json"> <div class="docs-search-field"> <svg class="docs-search-icon" viewBox="0 0 16 16" width="14" height="14" aria-hidden="true"> <path d="M11.5 11.5 15 15M13 7A6 6 0 1 1 1 7a6 6 0 0 1 12 0Z" fill="none" stroke="currentColor" stroke-width="1.4" stroke-linecap="round"></path> </svg> <input type="text" class="docs-search-input" placeholder="Search docs" aria-label="Search docs" autocomplete="off" spellcheck="false"> <kbd class="docs-search-kbd">⌘K</kbd> </div> <ul class="docs-search-results" hidden></ul> </div> <script type="module">let i=null;function d(t){return i||(i=fetch(t).then(e=>e.json())),i}function l(t,e){return t.title.toLowerCase().includes(e)||t.excerpt.toLowerCase().includes(e)?!0:t.headings.some(r=>r.text.toLowerCase().includes(e))}function u(t,e,r){if(e.innerHTML="",t.length===0){e.hidden=!1;{const n=document.createElement("li");n.className="docs-search-empty",n.textContent="No matches",e.appendChild(n)}return}e.hidden=!1;for(const n of t.slice(0,8)){const s=document.createElement("li"),c=document.createElement("a");c.href=n.path;const o=document.createElement("span");o.className="docs-search-result-title",o.textContent=n.title;const a=document.createElement("span");a.className="docs-search-result-meta",a.textContent=[n.group,n.section].filter(Boolean).join(" / "),c.append(o,a),s.appendChild(c),e.appendChild(s)}}document.querySelectorAll(".docs-search").forEach(t=>{const e=t.dataset.indexUrl,r=t.querySelector(".docs-search-input"),n=t.querySelector(".docs-search-results");r.addEventListener("input",async()=>{const s=r.value.trim().toLowerCase();if(!s){n.hidden=!0,n.innerHTML="";return}const{pages:c}=await d(e);r.value.trim().toLowerCase()===s&&u(c.filter(o=>l(o,s)),n)}),r.addEventListener("focus",()=>{d(e),n.childElementCount>0&&(n.hidden=!1)}),r.addEventListener("keydown",s=>{s.key==="Escape"&&(r.value="",n.hidden=!0,n.innerHTML="",r.blur())}),r.addEventListener("blur",()=>{window.setTimeout(()=>{n.hidden=!0},150)})});document.addEventListener("keydown",t=>{if(!(t.metaKey||t.ctrlKey)||t.key.toLowerCase()!=="k")return;const e=[...document.querySelectorAll(".docs-search-input")].find(r=>r.offsetParent!==null);e&&(t.preventDefault(),e.focus(),e.select())});</script> <a class="docs-nav-toplink" href="/__pyric/ui/docs/overview/"> Overview </a><details class="docs-nav-group"> <summary>Get started</summary> <div class="docs-nav-group-body"> <div class="docs-nav-section"> <ul> <li> <a href="/__pyric/ui/docs/get-started/start-building/"> Quickstart </a> </li><li> <a href="/__pyric/ui/docs/get-started/how-the-swap-works/"> How the swap works </a> </li> </ul> </div> </div> </details><details class="docs-nav-group"> <summary>Build</summary> <div class="docs-nav-group-body"> <div class="docs-nav-section"> <ul> <li> <a href="/__pyric/ui/docs/build/authentication/"> Authentication </a> </li><li> <a href="/__pyric/ui/docs/build/cloud-firestore/"> Cloud Firestore </a> </li><li> <a href="/__pyric/ui/docs/build/realtime-database/"> Realtime Database </a> </li><li> <a href="/__pyric/ui/docs/build/cloud-storage/"> Cloud Storage </a> </li><li> <a href="/__pyric/ui/docs/build/cloud-messaging/"> Cloud Messaging </a> </li><li> <a href="/__pyric/ui/docs/build/ai-logic/"> AI Logic </a> </li> </ul> </div> </div> </details><details class="docs-nav-group"> <summary>Secure &amp; debug</summary> <div class="docs-nav-group-body"> <div class="docs-nav-section"> <ul> <li> <a href="/__pyric/ui/docs/secure/secure-it-with-rules/"> Security Rules </a> </li><li> <a href="/__pyric/ui/docs/secure/simulate-and-lint/"> Simulate and lint before you deploy </a> </li><li> <a href="/__pyric/ui/docs/secure/write-a-rules-test-suite/"> Write a rules test suite </a> </li><li> <a href="/__pyric/ui/docs/secure/read-a-denial/"> Read a denial and understand it </a> </li><li> <a href="/__pyric/ui/docs/secure/rules-standard-library/"> The rules standard library </a> </li><li> <a href="/__pyric/ui/docs/secure/rtdb-rules-in-typescript/"> RTDB rules in TypeScript </a> </li><li> <a href="/__pyric/ui/docs/secure/firestore-rules-limits/"> Rules limits </a> </li><li> <a href="/__pyric/ui/docs/secure/audit-your-rules/"> Audit rules and data </a> </li> </ul> </div> </div> </details><details class="docs-nav-group"> <summary>Observe &amp; shape</summary> <div class="docs-nav-group-body"> <div class="docs-nav-section"> <ul> <li> <a href="/__pyric/ui/docs/observe/see-whats-happening/"> Traffic &amp; rule verdicts </a> </li><li> <a href="/__pyric/ui/docs/observe/shape-your-data/"> Seed, snapshot, replay </a> </li> </ul> </div> </div> </details><details class="docs-nav-group"> <summary>Ship &amp; test</summary> <div class="docs-nav-group-body"> <div class="docs-nav-section"> <ul> <li> <a href="/__pyric/ui/docs/ship/ship-to-production/"> Ship to production </a> </li><li> <a href="/__pyric/ui/docs/ship/test-in-node/"> Test in Node </a> </li> </ul> </div> </div> </details><details class="docs-nav-group"> <summary>Work with an agent</summary> <div class="docs-nav-group-body"> <div class="docs-nav-section"> <ul> <li> <a href="/__pyric/ui/docs/agent/set-up-your-agent/"> Connect an agent </a> </li><li> <a href="/__pyric/ui/docs/agent/work-with-an-agent/"> Use the MCP tools </a> </li><li> <a href="/__pyric/ui/docs/agent/watch-and-review/"> Watch in Pyric Studio </a> </li> </ul> </div> </div> </details><a class="docs-nav-toplink" href="/__pyric/ui/docs/trust/versioning-and-compatibility/"> Trust </a><details class="docs-nav-group"> <summary>Conformance</summary> <div class="docs-nav-group-body"> <div class="docs-nav-section"> <ul> <li> <a href="/__pyric/ui/docs/conformance-scores/"> Public API coverage </a> </li><li> <a href="/__pyric/ui/docs/trust/how-we-know-it-matches-firebase/"> How we know it matches Firebase </a> </li><li> <a href="/__pyric/ui/docs/app-compat/"> App </a> </li><li> <a href="/__pyric/ui/docs/ai-compat/"> AI Logic </a> </li><li> <a href="/__pyric/ui/docs/auth-compat/"> Auth </a> </li><li> <a href="/__pyric/ui/docs/firestore-compat/"> Firestore </a> </li><li> <a href="/__pyric/ui/docs/database-compat/"> Realtime Database </a> </li><li> <a href="/__pyric/ui/docs/storage-compat/"> Storage </a> </li><li> <a href="/__pyric/ui/docs/messaging-compat/"> Messaging </a> </li><li> <a href="/__pyric/ui/docs/functions-rtdb-compat/"> Functions · RTDB </a> </li><li> <a href="/__pyric/ui/docs/rules-compat/"> Rules </a> </li> </ul> </div> </div> </details> <details class="docs-nav-group" open> <summary>Reference</summary> <div class="docs-nav-group-body docs-nav-group-body--reference"> <div class="docs-nav-section"> <ul> <li> <a href="/__pyric/ui/docs/api-reference/"> API reference </a> </li> </ul> </div><div class="docs-nav-section"> <h2 class="docs-nav-heading">pyric</h2> <ul> <li> <a href="/__pyric/ui/docs/pyric-app-reference-api/"> pyric/app </a> </li><li> <a href="/__pyric/ui/docs/pyric-firestore-reference-api/"> pyric/firestore </a> </li><li> <a href="/__pyric/ui/docs/pyric-auth-reference-api/"> pyric/auth </a> </li><li> <a href="/__pyric/ui/docs/pyric-ai-reference-api/"> pyric/ai </a> </li><li> <a href="/__pyric/ui/docs/pyric-ai-scripting-reference-api/"> pyric/ai/scripting </a> </li><li> <a href="/__pyric/ui/docs/pyric-database-reference-api/"> pyric/database </a> </li><li> <a href="/__pyric/ui/docs/pyric-storage-reference-api/"> pyric/storage </a> </li><li> <a href="/__pyric/ui/docs/pyric-messaging-reference-api/"> pyric/messaging </a> </li><li> <a href="/__pyric/ui/docs/pyric-messaging-sw-reference-api/"> pyric/messaging/sw </a> </li><li> <a href="/__pyric/ui/docs/pyric-rules-reference-api/"> pyric/rules </a> </li><li> <a href="/__pyric/ui/docs/pyric-firestore-values-reference-api/"> pyric/firestore-values </a> </li><li> <a href="/__pyric/ui/docs/pyric-sandbox-reference-api/"> pyric/sandbox </a> </li><li> <a href="/__pyric/ui/docs/pyric-sandbox-firestore-reference-api/"> pyric/sandbox/firestore </a> </li><li> <a href="/__pyric/ui/docs/pyric-sandbox-database-reference-api/"> pyric/sandbox/database </a> </li> </ul> </div><div class="docs-nav-section"> <h2 class="docs-nav-heading">pyric-admin</h2> <ul> <li> <a href="/__pyric/ui/docs/pyric-admin-app-reference-api/"> pyric-admin/app </a> </li><li> <a href="/__pyric/ui/docs/pyric-admin-firestore-reference-api/"> pyric-admin/firestore </a> </li><li> <a href="/__pyric/ui/docs/pyric-admin-auth-reference-api/"> pyric-admin/auth </a> </li><li> <a href="/__pyric/ui/docs/pyric-admin-database-reference-api/"> pyric-admin/database </a> </li><li> <a href="/__pyric/ui/docs/pyric-admin-storage-reference-api/"> pyric-admin/storage </a> </li> </ul> </div><div class="docs-nav-section"> <h2 class="docs-nav-heading">create-pyric</h2> <ul> <li> <a href="/__pyric/ui/docs/create-pyric-reference-api/"> create-pyric </a> </li> </ul> </div><div class="docs-nav-section"> <h2 class="docs-nav-heading">@pyric/cli</h2> <ul> <li> <a href="/__pyric/ui/docs/pyric-cli-credentials-node-reference-api/"> @pyric/cli/credentials/node </a> </li><li> <a href="/__pyric/ui/docs/pyric-cli-verify-reference-api/"> @pyric/cli/verify </a> </li><li> <a href="/__pyric/ui/docs/pyric-cli-conformance-reference-api/"> @pyric/cli/conformance </a> </li><li> <a href="/__pyric/ui/docs/pyric-cli-conformance-browser-reference-api/"> @pyric/cli/conformance/browser </a> </li><li> <a href="/__pyric/ui/docs/pyric-cli-assurance-reference-api/"> @pyric/cli/assurance </a> </li><li> <a href="/__pyric/ui/docs/pyric-cli-assurance-browser-reference-api/"> @pyric/cli/assurance/browser </a> </li><li> <a href="/__pyric/ui/docs/pyric-cli-bridge-reference-api/"> @pyric/cli/bridge </a> </li><li> <a href="/__pyric/ui/docs/pyric-cli-bridge-client-reference-api/"> @pyric/cli/bridge/client </a> </li><li> <a href="/__pyric/ui/docs/pyric-cli-discover-reference-api/"> @pyric/cli/discover </a> </li><li> <a href="/__pyric/ui/docs/pyric-cli-vite-reference-api/"> @pyric/cli/vite </a> </li><li> <a href="/__pyric/ui/docs/pyric-cli-serve-worker-reference-api/"> @pyric/cli/serve/worker </a> </li><li> <a href="/__pyric/ui/docs/pyric-cli-remote-reference-api/"> @pyric/cli/remote </a> </li><li> <a href="/__pyric/ui/docs/pyric-cli-register-reference-api/"> @pyric/cli/register </a> </li> </ul> </div><div class="docs-nav-section"> <h2 class="docs-nav-heading">@pyric/ui</h2> <ul> <li> <a href="/__pyric/ui/docs/pyric-ui-auth-reference-api/"> @pyric/ui/auth </a> </li><li> <a href="/__pyric/ui/docs/pyric-ui-auth-hooks-reference-api/"> @pyric/ui/auth/hooks </a> </li><li> <a href="/__pyric/ui/docs/pyric-ui-primitives-reference-api/"> @pyric/ui/primitives </a> </li><li> <a href="/__pyric/ui/docs/pyric-ui-firestore-reference-api/"> @pyric/ui/firestore </a> </li><li> <a href="/__pyric/ui/docs/pyric-ui-firestore-hooks-reference-api/"> @pyric/ui/firestore/hooks </a> </li><li> <a href="/__pyric/ui/docs/pyric-ui-rtdb-reference-api/"> @pyric/ui/rtdb </a> </li><li> <a href="/__pyric/ui/docs/pyric-ui-storage-reference-api/" aria-current="page"> @pyric/ui/storage </a> </li><li> <a href="/__pyric/ui/docs/pyric-ui-storage-hooks-reference-api/"> @pyric/ui/storage/hooks </a> </li><li> <a href="/__pyric/ui/docs/pyric-ui-traffic-reference-api/"> @pyric/ui/traffic </a> </li><li> <a href="/__pyric/ui/docs/pyric-ui-traffic-hooks-reference-api/"> @pyric/ui/traffic/hooks </a> </li><li> <a href="/__pyric/ui/docs/pyric-ui-events-reference-api/"> @pyric/ui/events </a> </li><li> <a href="/__pyric/ui/docs/pyric-ui-events-hooks-reference-api/"> @pyric/ui/events/hooks </a> </li><li> <a href="/__pyric/ui/docs/pyric-ui-agents-reference-api/"> @pyric/ui/agents </a> </li><li> <a href="/__pyric/ui/docs/pyric-ui-rules-reference-api/"> @pyric/ui/rules </a> </li><li> <a href="/__pyric/ui/docs/pyric-ui-rules-hooks-reference-api/"> @pyric/ui/rules/hooks </a> </li> </ul> </div> </div> </details> </nav> </details> <nav class="docs-nav" aria-label="Documentation"> <div class="docs-search" data-index-url="/__pyric/ui/docs/index.json"> <div class="docs-search-field"> <svg class="docs-search-icon" viewBox="0 0 16 16" width="14" height="14" aria-hidden="true"> <path d="M11.5 11.5 15 15M13 7A6 6 0 1 1 1 7a6 6 0 0 1 12 0Z" fill="none" stroke="currentColor" stroke-width="1.4" stroke-linecap="round"></path> </svg> <input type="text" class="docs-search-input" placeholder="Search docs" aria-label="Search docs" autocomplete="off" spellcheck="false"> <kbd class="docs-search-kbd">⌘K</kbd> </div> <ul class="docs-search-results" hidden></ul> </div> <a class="docs-nav-toplink" href="/__pyric/ui/docs/overview/" id="nav-group-overview"> Overview </a><details class="docs-nav-group" id="nav-group-get-started"> <summary>Get started</summary> <div class="docs-nav-group-body"> <div class="docs-nav-section"> <ul> <li> <a href="/__pyric/ui/docs/get-started/start-building/"> Quickstart </a> </li><li> <a href="/__pyric/ui/docs/get-started/how-the-swap-works/"> How the swap works </a> </li> </ul> </div> </div> </details><details class="docs-nav-group" id="nav-group-build"> <summary>Build</summary> <div class="docs-nav-group-body"> <div class="docs-nav-section"> <ul> <li> <a href="/__pyric/ui/docs/build/authentication/"> Authentication </a> </li><li> <a href="/__pyric/ui/docs/build/cloud-firestore/"> Cloud Firestore </a> </li><li> <a href="/__pyric/ui/docs/build/realtime-database/"> Realtime Database </a> </li><li> <a href="/__pyric/ui/docs/build/cloud-storage/"> Cloud Storage </a> </li><li> <a href="/__pyric/ui/docs/build/cloud-messaging/"> Cloud Messaging </a> </li><li> <a href="/__pyric/ui/docs/build/ai-logic/"> AI Logic </a> </li> </ul> </div> </div> </details><details class="docs-nav-group" id="nav-group-secure-debug"> <summary>Secure &amp; debug</summary> <div class="docs-nav-group-body"> <div class="docs-nav-section"> <ul> <li> <a href="/__pyric/ui/docs/secure/secure-it-with-rules/"> Security Rules </a> </li><li> <a href="/__pyric/ui/docs/secure/simulate-and-lint/"> Simulate and lint before you deploy </a> </li><li> <a href="/__pyric/ui/docs/secure/write-a-rules-test-suite/"> Write a rules test suite </a> </li><li> <a href="/__pyric/ui/docs/secure/read-a-denial/"> Read a denial and understand it </a> </li><li> <a href="/__pyric/ui/docs/secure/rules-standard-library/"> The rules standard library </a> </li><li> <a href="/__pyric/ui/docs/secure/rtdb-rules-in-typescript/"> RTDB rules in TypeScript </a> </li><li> <a href="/__pyric/ui/docs/secure/firestore-rules-limits/"> Rules limits </a> </li><li> <a href="/__pyric/ui/docs/secure/audit-your-rules/"> Audit rules and data </a> </li> </ul> </div> </div> </details><details class="docs-nav-group" id="nav-group-observe-shape"> <summary>Observe &amp; shape</summary> <div class="docs-nav-group-body"> <div class="docs-nav-section"> <ul> <li> <a href="/__pyric/ui/docs/observe/see-whats-happening/"> Traffic &amp; rule verdicts </a> </li><li> <a href="/__pyric/ui/docs/observe/shape-your-data/"> Seed, snapshot, replay </a> </li> </ul> </div> </div> </details><details class="docs-nav-group" id="nav-group-ship-test"> <summary>Ship &amp; test</summary> <div class="docs-nav-group-body"> <div class="docs-nav-section"> <ul> <li> <a href="/__pyric/ui/docs/ship/ship-to-production/"> Ship to production </a> </li><li> <a href="/__pyric/ui/docs/ship/test-in-node/"> Test in Node </a> </li> </ul> </div> </div> </details><details class="docs-nav-group" id="nav-group-work-with-an-agent"> <summary>Work with an agent</summary> <div class="docs-nav-group-body"> <div class="docs-nav-section"> <ul> <li> <a href="/__pyric/ui/docs/agent/set-up-your-agent/"> Connect an agent </a> </li><li> <a href="/__pyric/ui/docs/agent/work-with-an-agent/"> Use the MCP tools </a> </li><li> <a href="/__pyric/ui/docs/agent/watch-and-review/"> Watch in Pyric Studio </a> </li> </ul> </div> </div> </details><a class="docs-nav-toplink" href="/__pyric/ui/docs/trust/versioning-and-compatibility/" id="nav-group-trust"> Trust </a><details class="docs-nav-group" id="nav-group-conformance"> <summary>Conformance</summary> <div class="docs-nav-group-body"> <div class="docs-nav-section"> <ul> <li> <a href="/__pyric/ui/docs/conformance-scores/"> Public API coverage </a> </li><li> <a href="/__pyric/ui/docs/trust/how-we-know-it-matches-firebase/"> How we know it matches Firebase </a> </li><li> <a href="/__pyric/ui/docs/app-compat/"> App </a> </li><li> <a href="/__pyric/ui/docs/ai-compat/"> AI Logic </a> </li><li> <a href="/__pyric/ui/docs/auth-compat/"> Auth </a> </li><li> <a href="/__pyric/ui/docs/firestore-compat/"> Firestore </a> </li><li> <a href="/__pyric/ui/docs/database-compat/"> Realtime Database </a> </li><li> <a href="/__pyric/ui/docs/storage-compat/"> Storage </a> </li><li> <a href="/__pyric/ui/docs/messaging-compat/"> Messaging </a> </li><li> <a href="/__pyric/ui/docs/functions-rtdb-compat/"> Functions · RTDB </a> </li><li> <a href="/__pyric/ui/docs/rules-compat/"> Rules </a> </li> </ul> </div> </div> </details> <details class="docs-nav-group" id="nav-group-reference" open> <summary>Reference</summary> <div class="docs-nav-group-body docs-nav-group-body--reference"> <div class="docs-nav-section"> <ul> <li> <a href="/__pyric/ui/docs/api-reference/"> API reference </a> </li> </ul> </div><div class="docs-nav-section"> <h2 class="docs-nav-heading">pyric</h2> <ul> <li> <a href="/__pyric/ui/docs/pyric-app-reference-api/"> pyric/app </a> </li><li> <a href="/__pyric/ui/docs/pyric-firestore-reference-api/"> pyric/firestore </a> </li><li> <a href="/__pyric/ui/docs/pyric-auth-reference-api/"> pyric/auth </a> </li><li> <a href="/__pyric/ui/docs/pyric-ai-reference-api/"> pyric/ai </a> </li><li> <a href="/__pyric/ui/docs/pyric-ai-scripting-reference-api/"> pyric/ai/scripting </a> </li><li> <a href="/__pyric/ui/docs/pyric-database-reference-api/"> pyric/database </a> </li><li> <a href="/__pyric/ui/docs/pyric-storage-reference-api/"> pyric/storage </a> </li><li> <a href="/__pyric/ui/docs/pyric-messaging-reference-api/"> pyric/messaging </a> </li><li> <a href="/__pyric/ui/docs/pyric-messaging-sw-reference-api/"> pyric/messaging/sw </a> </li><li> <a href="/__pyric/ui/docs/pyric-rules-reference-api/"> pyric/rules </a> </li><li> <a href="/__pyric/ui/docs/pyric-firestore-values-reference-api/"> pyric/firestore-values </a> </li><li> <a href="/__pyric/ui/docs/pyric-sandbox-reference-api/"> pyric/sandbox </a> </li><li> <a href="/__pyric/ui/docs/pyric-sandbox-firestore-reference-api/"> pyric/sandbox/firestore </a> </li><li> <a href="/__pyric/ui/docs/pyric-sandbox-database-reference-api/"> pyric/sandbox/database </a> </li> </ul> </div><div class="docs-nav-section"> <h2 class="docs-nav-heading">pyric-admin</h2> <ul> <li> <a href="/__pyric/ui/docs/pyric-admin-app-reference-api/"> pyric-admin/app </a> </li><li> <a href="/__pyric/ui/docs/pyric-admin-firestore-reference-api/"> pyric-admin/firestore </a> </li><li> <a href="/__pyric/ui/docs/pyric-admin-auth-reference-api/"> pyric-admin/auth </a> </li><li> <a href="/__pyric/ui/docs/pyric-admin-database-reference-api/"> pyric-admin/database </a> </li><li> <a href="/__pyric/ui/docs/pyric-admin-storage-reference-api/"> pyric-admin/storage </a> </li> </ul> </div><div class="docs-nav-section"> <h2 class="docs-nav-heading">create-pyric</h2> <ul> <li> <a href="/__pyric/ui/docs/create-pyric-reference-api/"> create-pyric </a> </li> </ul> </div><div class="docs-nav-section"> <h2 class="docs-nav-heading">@pyric/cli</h2> <ul> <li> <a href="/__pyric/ui/docs/pyric-cli-credentials-node-reference-api/"> @pyric/cli/credentials/node </a> </li><li> <a href="/__pyric/ui/docs/pyric-cli-verify-reference-api/"> @pyric/cli/verify </a> </li><li> <a href="/__pyric/ui/docs/pyric-cli-conformance-reference-api/"> @pyric/cli/conformance </a> </li><li> <a href="/__pyric/ui/docs/pyric-cli-conformance-browser-reference-api/"> @pyric/cli/conformance/browser </a> </li><li> <a href="/__pyric/ui/docs/pyric-cli-assurance-reference-api/"> @pyric/cli/assurance </a> </li><li> <a href="/__pyric/ui/docs/pyric-cli-assurance-browser-reference-api/"> @pyric/cli/assurance/browser </a> </li><li> <a href="/__pyric/ui/docs/pyric-cli-bridge-reference-api/"> @pyric/cli/bridge </a> </li><li> <a href="/__pyric/ui/docs/pyric-cli-bridge-client-reference-api/"> @pyric/cli/bridge/client </a> </li><li> <a href="/__pyric/ui/docs/pyric-cli-discover-reference-api/"> @pyric/cli/discover </a> </li><li> <a href="/__pyric/ui/docs/pyric-cli-vite-reference-api/"> @pyric/cli/vite </a> </li><li> <a href="/__pyric/ui/docs/pyric-cli-serve-worker-reference-api/"> @pyric/cli/serve/worker </a> </li><li> <a href="/__pyric/ui/docs/pyric-cli-remote-reference-api/"> @pyric/cli/remote </a> </li><li> <a href="/__pyric/ui/docs/pyric-cli-register-reference-api/"> @pyric/cli/register </a> </li> </ul> </div><div class="docs-nav-section"> <h2 class="docs-nav-heading">@pyric/ui</h2> <ul> <li> <a href="/__pyric/ui/docs/pyric-ui-auth-reference-api/"> @pyric/ui/auth </a> </li><li> <a href="/__pyric/ui/docs/pyric-ui-auth-hooks-reference-api/"> @pyric/ui/auth/hooks </a> </li><li> <a href="/__pyric/ui/docs/pyric-ui-primitives-reference-api/"> @pyric/ui/primitives </a> </li><li> <a href="/__pyric/ui/docs/pyric-ui-firestore-reference-api/"> @pyric/ui/firestore </a> </li><li> <a href="/__pyric/ui/docs/pyric-ui-firestore-hooks-reference-api/"> @pyric/ui/firestore/hooks </a> </li><li> <a href="/__pyric/ui/docs/pyric-ui-rtdb-reference-api/"> @pyric/ui/rtdb </a> </li><li> <a href="/__pyric/ui/docs/pyric-ui-storage-reference-api/" aria-current="page"> @pyric/ui/storage </a> </li><li> <a href="/__pyric/ui/docs/pyric-ui-storage-hooks-reference-api/"> @pyric/ui/storage/hooks </a> </li><li> <a href="/__pyric/ui/docs/pyric-ui-traffic-reference-api/"> @pyric/ui/traffic </a> </li><li> <a href="/__pyric/ui/docs/pyric-ui-traffic-hooks-reference-api/"> @pyric/ui/traffic/hooks </a> </li><li> <a href="/__pyric/ui/docs/pyric-ui-events-reference-api/"> @pyric/ui/events </a> </li><li> <a href="/__pyric/ui/docs/pyric-ui-events-hooks-reference-api/"> @pyric/ui/events/hooks </a> </li><li> <a href="/__pyric/ui/docs/pyric-ui-agents-reference-api/"> @pyric/ui/agents </a> </li><li> <a href="/__pyric/ui/docs/pyric-ui-rules-reference-api/"> @pyric/ui/rules </a> </li><li> <a href="/__pyric/ui/docs/pyric-ui-rules-hooks-reference-api/"> @pyric/ui/rules/hooks </a> </li> </ul> </div> </div> </details> </nav> <main class="doc-main"> <nav class="docs-breadcrumbs" aria-label="Breadcrumb"> <ol> <li> <a href="/__pyric/ui/docs/api-reference/">API reference</a> </li><li> <span class="docs-breadcrumbs-sep" aria-hidden="true">/</span> <span>@pyric/ui</span> </li><li> <span class="docs-breadcrumbs-sep" aria-hidden="true">/</span> <span aria-current="page">@pyric/ui/storage</span> </li> </ol> </nav> <header class="api-reference-header"> <p class="api-reference-kicker">API reference</p> <h1><code>@pyric/ui/storage</code></h1> <p class="api-reference-meta"> 76 published symbols from <code>@pyric/ui</code> </p> <p class="api-reference-source">
1
+ <!DOCTYPE html><html lang="en"> <head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>API reference: @pyric/ui/storage · Pyric Studio</title><meta name="description" content="Published declarations for @pyric/ui/storage."><link rel="preconnect" href="https://fonts.googleapis.com"><link rel="preconnect" href="https://fonts.gstatic.com" crossorigin><link href="https://fonts.googleapis.com/css2?family=Inter:wght@300;400;500;600;700&family=JetBrains+Mono:wght@400;500;700&display=swap" rel="stylesheet"><link rel="stylesheet" href="/__pyric/ui/_astro/_slug_.CXh9yTP1.css">
2
+ <link rel="stylesheet" href="/__pyric/ui/_astro/_slug_.DUci-duz.css"></head> <body> <header class="studio__bar"> <div class="studio__bar-inner"> <a class="studio__brand" href="/__pyric/ui/" aria-label="Pyric Studio">Pyric</a> <nav class="studio__nav" aria-label="Studio tabs"> <a class="studio__nav-tab" href="/__pyric/ui/"> Home </a><a class="studio__nav-tab" href="/__pyric/ui/firestore"> Firestore </a><a class="studio__nav-tab" href="/__pyric/ui/auth"> Auth </a><a class="studio__nav-tab" href="/__pyric/ui/rtdb"> RTDB </a><a class="studio__nav-tab" href="/__pyric/ui/storage"> Storage </a><a class="studio__nav-tab" href="/__pyric/ui/traffic"> Traffic </a><a class="studio__nav-tab" href="/__pyric/ui/settings"> Settings </a><a class="studio__nav-tab" href="/__pyric/ui/docs" aria-current="page"> Docs </a> </nav> </div> </header> <div class="docs-shell"> <details class="docs-nav-drawer"> <summary>Navigate</summary> <nav class="docs-nav" aria-label="Documentation"> <div class="docs-search" data-index-url="/__pyric/ui/docs/index.json"> <div class="docs-search-field"> <svg class="docs-search-icon" viewBox="0 0 16 16" width="14" height="14" aria-hidden="true"> <path d="M11.5 11.5 15 15M13 7A6 6 0 1 1 1 7a6 6 0 0 1 12 0Z" fill="none" stroke="currentColor" stroke-width="1.4" stroke-linecap="round"></path> </svg> <input type="text" class="docs-search-input" placeholder="Search docs" aria-label="Search docs" autocomplete="off" spellcheck="false"> <kbd class="docs-search-kbd">⌘K</kbd> </div> <ul class="docs-search-results" hidden></ul> </div> <script type="module">let i=null;function d(t){return i||(i=fetch(t).then(e=>e.json())),i}function l(t,e){return t.title.toLowerCase().includes(e)||t.excerpt.toLowerCase().includes(e)?!0:t.headings.some(r=>r.text.toLowerCase().includes(e))}function u(t,e,r){if(e.innerHTML="",t.length===0){e.hidden=!1;{const n=document.createElement("li");n.className="docs-search-empty",n.textContent="No matches",e.appendChild(n)}return}e.hidden=!1;for(const n of t.slice(0,8)){const s=document.createElement("li"),c=document.createElement("a");c.href=n.path;const o=document.createElement("span");o.className="docs-search-result-title",o.textContent=n.title;const a=document.createElement("span");a.className="docs-search-result-meta",a.textContent=[n.group,n.section].filter(Boolean).join(" / "),c.append(o,a),s.appendChild(c),e.appendChild(s)}}document.querySelectorAll(".docs-search").forEach(t=>{const e=t.dataset.indexUrl,r=t.querySelector(".docs-search-input"),n=t.querySelector(".docs-search-results");r.addEventListener("input",async()=>{const s=r.value.trim().toLowerCase();if(!s){n.hidden=!0,n.innerHTML="";return}const{pages:c}=await d(e);r.value.trim().toLowerCase()===s&&u(c.filter(o=>l(o,s)),n)}),r.addEventListener("focus",()=>{d(e),n.childElementCount>0&&(n.hidden=!1)}),r.addEventListener("keydown",s=>{s.key==="Escape"&&(r.value="",n.hidden=!0,n.innerHTML="",r.blur())}),r.addEventListener("blur",()=>{window.setTimeout(()=>{n.hidden=!0},150)})});document.addEventListener("keydown",t=>{if(!(t.metaKey||t.ctrlKey)||t.key.toLowerCase()!=="k")return;const e=[...document.querySelectorAll(".docs-search-input")].find(r=>r.offsetParent!==null);e&&(t.preventDefault(),e.focus(),e.select())});</script> <a class="docs-nav-toplink" href="/__pyric/ui/docs/overview/"> Overview </a><details class="docs-nav-group"> <summary>Get started</summary> <div class="docs-nav-group-body"> <div class="docs-nav-section"> <ul> <li> <a href="/__pyric/ui/docs/get-started/start-building/"> Quickstart </a> </li><li> <a href="/__pyric/ui/docs/get-started/how-the-swap-works/"> How the swap works </a> </li> </ul> </div> </div> </details><details class="docs-nav-group"> <summary>Build</summary> <div class="docs-nav-group-body"> <div class="docs-nav-section"> <ul> <li> <a href="/__pyric/ui/docs/build/authentication/"> Authentication </a> </li><li> <a href="/__pyric/ui/docs/build/cloud-firestore/"> Cloud Firestore </a> </li><li> <a href="/__pyric/ui/docs/build/realtime-database/"> Realtime Database </a> </li><li> <a href="/__pyric/ui/docs/build/cloud-storage/"> Cloud Storage </a> </li><li> <a href="/__pyric/ui/docs/build/cloud-messaging/"> Cloud Messaging </a> </li><li> <a href="/__pyric/ui/docs/build/ai-logic/"> AI Logic </a> </li> </ul> </div> </div> </details><details class="docs-nav-group"> <summary>Secure &amp; debug</summary> <div class="docs-nav-group-body"> <div class="docs-nav-section"> <ul> <li> <a href="/__pyric/ui/docs/secure/secure-it-with-rules/"> Security Rules </a> </li><li> <a href="/__pyric/ui/docs/secure/simulate-and-lint/"> Simulate and lint before you deploy </a> </li><li> <a href="/__pyric/ui/docs/secure/write-a-rules-test-suite/"> Write a rules test suite </a> </li><li> <a href="/__pyric/ui/docs/secure/read-a-denial/"> Read a denial and understand it </a> </li><li> <a href="/__pyric/ui/docs/secure/rules-standard-library/"> The rules standard library </a> </li><li> <a href="/__pyric/ui/docs/secure/rtdb-rules-in-typescript/"> RTDB rules in TypeScript </a> </li><li> <a href="/__pyric/ui/docs/secure/firestore-rules-limits/"> Rules limits </a> </li><li> <a href="/__pyric/ui/docs/secure/audit-your-rules/"> Audit rules and data </a> </li> </ul> </div> </div> </details><details class="docs-nav-group"> <summary>Observe &amp; shape</summary> <div class="docs-nav-group-body"> <div class="docs-nav-section"> <ul> <li> <a href="/__pyric/ui/docs/observe/see-whats-happening/"> Traffic &amp; rule verdicts </a> </li><li> <a href="/__pyric/ui/docs/observe/shape-your-data/"> Seed, snapshot, replay </a> </li> </ul> </div> </div> </details><details class="docs-nav-group"> <summary>Ship &amp; test</summary> <div class="docs-nav-group-body"> <div class="docs-nav-section"> <ul> <li> <a href="/__pyric/ui/docs/ship/ship-to-production/"> Ship to production </a> </li><li> <a href="/__pyric/ui/docs/ship/test-in-node/"> Test in Node </a> </li> </ul> </div> </div> </details><details class="docs-nav-group"> <summary>Work with an agent</summary> <div class="docs-nav-group-body"> <div class="docs-nav-section"> <ul> <li> <a href="/__pyric/ui/docs/agent/set-up-your-agent/"> Connect an agent </a> </li><li> <a href="/__pyric/ui/docs/agent/work-with-an-agent/"> Use the MCP tools </a> </li><li> <a href="/__pyric/ui/docs/agent/watch-and-review/"> Watch in Pyric Studio </a> </li> </ul> </div> </div> </details><a class="docs-nav-toplink" href="/__pyric/ui/docs/trust/versioning-and-compatibility/"> Trust </a><details class="docs-nav-group"> <summary>Conformance</summary> <div class="docs-nav-group-body"> <div class="docs-nav-section"> <ul> <li> <a href="/__pyric/ui/docs/conformance-scores/"> Public API coverage </a> </li><li> <a href="/__pyric/ui/docs/trust/how-we-know-it-matches-firebase/"> How we know it matches Firebase </a> </li><li> <a href="/__pyric/ui/docs/app-compat/"> App </a> </li><li> <a href="/__pyric/ui/docs/ai-compat/"> AI Logic </a> </li><li> <a href="/__pyric/ui/docs/auth-compat/"> Auth </a> </li><li> <a href="/__pyric/ui/docs/firestore-compat/"> Firestore </a> </li><li> <a href="/__pyric/ui/docs/database-compat/"> Realtime Database </a> </li><li> <a href="/__pyric/ui/docs/storage-compat/"> Storage </a> </li><li> <a href="/__pyric/ui/docs/messaging-compat/"> Messaging </a> </li><li> <a href="/__pyric/ui/docs/functions-rtdb-compat/"> Functions · RTDB </a> </li><li> <a href="/__pyric/ui/docs/rules-compat/"> Rules </a> </li> </ul> </div> </div> </details> <details class="docs-nav-group" open> <summary>Reference</summary> <div class="docs-nav-group-body docs-nav-group-body--reference"> <div class="docs-nav-section"> <ul> <li> <a href="/__pyric/ui/docs/api-reference/"> API reference </a> </li> </ul> </div><div class="docs-nav-section"> <h2 class="docs-nav-heading">pyric</h2> <ul> <li> <a href="/__pyric/ui/docs/pyric-app-reference-api/"> pyric/app </a> </li><li> <a href="/__pyric/ui/docs/pyric-firestore-reference-api/"> pyric/firestore </a> </li><li> <a href="/__pyric/ui/docs/pyric-auth-reference-api/"> pyric/auth </a> </li><li> <a href="/__pyric/ui/docs/pyric-ai-reference-api/"> pyric/ai </a> </li><li> <a href="/__pyric/ui/docs/pyric-ai-scripting-reference-api/"> pyric/ai/scripting </a> </li><li> <a href="/__pyric/ui/docs/pyric-database-reference-api/"> pyric/database </a> </li><li> <a href="/__pyric/ui/docs/pyric-storage-reference-api/"> pyric/storage </a> </li><li> <a href="/__pyric/ui/docs/pyric-messaging-reference-api/"> pyric/messaging </a> </li><li> <a href="/__pyric/ui/docs/pyric-messaging-sw-reference-api/"> pyric/messaging/sw </a> </li><li> <a href="/__pyric/ui/docs/pyric-rules-reference-api/"> pyric/rules </a> </li><li> <a href="/__pyric/ui/docs/pyric-sandbox-reference-api/"> pyric/sandbox </a> </li><li> <a href="/__pyric/ui/docs/pyric-sandbox-firestore-reference-api/"> pyric/sandbox/firestore </a> </li><li> <a href="/__pyric/ui/docs/pyric-sandbox-database-reference-api/"> pyric/sandbox/database </a> </li> </ul> </div><div class="docs-nav-section"> <h2 class="docs-nav-heading">pyric-admin</h2> <ul> <li> <a href="/__pyric/ui/docs/pyric-admin-app-reference-api/"> pyric-admin/app </a> </li><li> <a href="/__pyric/ui/docs/pyric-admin-firestore-reference-api/"> pyric-admin/firestore </a> </li><li> <a href="/__pyric/ui/docs/pyric-admin-auth-reference-api/"> pyric-admin/auth </a> </li><li> <a href="/__pyric/ui/docs/pyric-admin-database-reference-api/"> pyric-admin/database </a> </li><li> <a href="/__pyric/ui/docs/pyric-admin-storage-reference-api/"> pyric-admin/storage </a> </li><li> <a href="/__pyric/ui/docs/pyric-admin-messaging-reference-api/"> pyric-admin/messaging </a> </li> </ul> </div><div class="docs-nav-section"> <h2 class="docs-nav-heading">create-pyric</h2> <ul> <li> <a href="/__pyric/ui/docs/create-pyric-reference-api/"> create-pyric </a> </li> </ul> </div><div class="docs-nav-section"> <h2 class="docs-nav-heading">@pyric/cli</h2> <ul> <li> <a href="/__pyric/ui/docs/pyric-cli-credentials-node-reference-api/"> @pyric/cli/credentials/node </a> </li><li> <a href="/__pyric/ui/docs/pyric-cli-verify-reference-api/"> @pyric/cli/verify </a> </li><li> <a href="/__pyric/ui/docs/pyric-cli-conformance-reference-api/"> @pyric/cli/conformance </a> </li><li> <a href="/__pyric/ui/docs/pyric-cli-conformance-browser-reference-api/"> @pyric/cli/conformance/browser </a> </li><li> <a href="/__pyric/ui/docs/pyric-cli-conformance-docs-reference-api/"> @pyric/cli/conformance/docs </a> </li><li> <a href="/__pyric/ui/docs/pyric-cli-assurance-reference-api/"> @pyric/cli/assurance </a> </li><li> <a href="/__pyric/ui/docs/pyric-cli-assurance-browser-reference-api/"> @pyric/cli/assurance/browser </a> </li><li> <a href="/__pyric/ui/docs/pyric-cli-bridge-reference-api/"> @pyric/cli/bridge </a> </li><li> <a href="/__pyric/ui/docs/pyric-cli-bridge-client-reference-api/"> @pyric/cli/bridge/client </a> </li><li> <a href="/__pyric/ui/docs/pyric-cli-discover-reference-api/"> @pyric/cli/discover </a> </li><li> <a href="/__pyric/ui/docs/pyric-cli-vite-reference-api/"> @pyric/cli/vite </a> </li><li> <a href="/__pyric/ui/docs/pyric-cli-serve-worker-reference-api/"> @pyric/cli/serve/worker </a> </li><li> <a href="/__pyric/ui/docs/pyric-cli-remote-reference-api/"> @pyric/cli/remote </a> </li><li> <a href="/__pyric/ui/docs/pyric-cli-register-reference-api/"> @pyric/cli/register </a> </li> </ul> </div><div class="docs-nav-section"> <h2 class="docs-nav-heading">@pyric/ui</h2> <ul> <li> <a href="/__pyric/ui/docs/pyric-ui-auth-reference-api/"> @pyric/ui/auth </a> </li><li> <a href="/__pyric/ui/docs/pyric-ui-auth-hooks-reference-api/"> @pyric/ui/auth/hooks </a> </li><li> <a href="/__pyric/ui/docs/pyric-ui-primitives-reference-api/"> @pyric/ui/primitives </a> </li><li> <a href="/__pyric/ui/docs/pyric-ui-firestore-reference-api/"> @pyric/ui/firestore </a> </li><li> <a href="/__pyric/ui/docs/pyric-ui-firestore-hooks-reference-api/"> @pyric/ui/firestore/hooks </a> </li><li> <a href="/__pyric/ui/docs/pyric-ui-rtdb-reference-api/"> @pyric/ui/rtdb </a> </li><li> <a href="/__pyric/ui/docs/pyric-ui-storage-reference-api/" aria-current="page"> @pyric/ui/storage </a> </li><li> <a href="/__pyric/ui/docs/pyric-ui-storage-hooks-reference-api/"> @pyric/ui/storage/hooks </a> </li><li> <a href="/__pyric/ui/docs/pyric-ui-traffic-reference-api/"> @pyric/ui/traffic </a> </li><li> <a href="/__pyric/ui/docs/pyric-ui-traffic-hooks-reference-api/"> @pyric/ui/traffic/hooks </a> </li><li> <a href="/__pyric/ui/docs/pyric-ui-events-reference-api/"> @pyric/ui/events </a> </li><li> <a href="/__pyric/ui/docs/pyric-ui-events-hooks-reference-api/"> @pyric/ui/events/hooks </a> </li><li> <a href="/__pyric/ui/docs/pyric-ui-agents-reference-api/"> @pyric/ui/agents </a> </li><li> <a href="/__pyric/ui/docs/pyric-ui-rules-reference-api/"> @pyric/ui/rules </a> </li><li> <a href="/__pyric/ui/docs/pyric-ui-rules-hooks-reference-api/"> @pyric/ui/rules/hooks </a> </li> </ul> </div> </div> </details> </nav> </details> <nav class="docs-nav" aria-label="Documentation"> <div class="docs-search" data-index-url="/__pyric/ui/docs/index.json"> <div class="docs-search-field"> <svg class="docs-search-icon" viewBox="0 0 16 16" width="14" height="14" aria-hidden="true"> <path d="M11.5 11.5 15 15M13 7A6 6 0 1 1 1 7a6 6 0 0 1 12 0Z" fill="none" stroke="currentColor" stroke-width="1.4" stroke-linecap="round"></path> </svg> <input type="text" class="docs-search-input" placeholder="Search docs" aria-label="Search docs" autocomplete="off" spellcheck="false"> <kbd class="docs-search-kbd">⌘K</kbd> </div> <ul class="docs-search-results" hidden></ul> </div> <a class="docs-nav-toplink" href="/__pyric/ui/docs/overview/" id="nav-group-overview"> Overview </a><details class="docs-nav-group" id="nav-group-get-started"> <summary>Get started</summary> <div class="docs-nav-group-body"> <div class="docs-nav-section"> <ul> <li> <a href="/__pyric/ui/docs/get-started/start-building/"> Quickstart </a> </li><li> <a href="/__pyric/ui/docs/get-started/how-the-swap-works/"> How the swap works </a> </li> </ul> </div> </div> </details><details class="docs-nav-group" id="nav-group-build"> <summary>Build</summary> <div class="docs-nav-group-body"> <div class="docs-nav-section"> <ul> <li> <a href="/__pyric/ui/docs/build/authentication/"> Authentication </a> </li><li> <a href="/__pyric/ui/docs/build/cloud-firestore/"> Cloud Firestore </a> </li><li> <a href="/__pyric/ui/docs/build/realtime-database/"> Realtime Database </a> </li><li> <a href="/__pyric/ui/docs/build/cloud-storage/"> Cloud Storage </a> </li><li> <a href="/__pyric/ui/docs/build/cloud-messaging/"> Cloud Messaging </a> </li><li> <a href="/__pyric/ui/docs/build/ai-logic/"> AI Logic </a> </li> </ul> </div> </div> </details><details class="docs-nav-group" id="nav-group-secure-debug"> <summary>Secure &amp; debug</summary> <div class="docs-nav-group-body"> <div class="docs-nav-section"> <ul> <li> <a href="/__pyric/ui/docs/secure/secure-it-with-rules/"> Security Rules </a> </li><li> <a href="/__pyric/ui/docs/secure/simulate-and-lint/"> Simulate and lint before you deploy </a> </li><li> <a href="/__pyric/ui/docs/secure/write-a-rules-test-suite/"> Write a rules test suite </a> </li><li> <a href="/__pyric/ui/docs/secure/read-a-denial/"> Read a denial and understand it </a> </li><li> <a href="/__pyric/ui/docs/secure/rules-standard-library/"> The rules standard library </a> </li><li> <a href="/__pyric/ui/docs/secure/rtdb-rules-in-typescript/"> RTDB rules in TypeScript </a> </li><li> <a href="/__pyric/ui/docs/secure/firestore-rules-limits/"> Rules limits </a> </li><li> <a href="/__pyric/ui/docs/secure/audit-your-rules/"> Audit rules and data </a> </li> </ul> </div> </div> </details><details class="docs-nav-group" id="nav-group-observe-shape"> <summary>Observe &amp; shape</summary> <div class="docs-nav-group-body"> <div class="docs-nav-section"> <ul> <li> <a href="/__pyric/ui/docs/observe/see-whats-happening/"> Traffic &amp; rule verdicts </a> </li><li> <a href="/__pyric/ui/docs/observe/shape-your-data/"> Seed, snapshot, replay </a> </li> </ul> </div> </div> </details><details class="docs-nav-group" id="nav-group-ship-test"> <summary>Ship &amp; test</summary> <div class="docs-nav-group-body"> <div class="docs-nav-section"> <ul> <li> <a href="/__pyric/ui/docs/ship/ship-to-production/"> Ship to production </a> </li><li> <a href="/__pyric/ui/docs/ship/test-in-node/"> Test in Node </a> </li> </ul> </div> </div> </details><details class="docs-nav-group" id="nav-group-work-with-an-agent"> <summary>Work with an agent</summary> <div class="docs-nav-group-body"> <div class="docs-nav-section"> <ul> <li> <a href="/__pyric/ui/docs/agent/set-up-your-agent/"> Connect an agent </a> </li><li> <a href="/__pyric/ui/docs/agent/work-with-an-agent/"> Use the MCP tools </a> </li><li> <a href="/__pyric/ui/docs/agent/watch-and-review/"> Watch in Pyric Studio </a> </li> </ul> </div> </div> </details><a class="docs-nav-toplink" href="/__pyric/ui/docs/trust/versioning-and-compatibility/" id="nav-group-trust"> Trust </a><details class="docs-nav-group" id="nav-group-conformance"> <summary>Conformance</summary> <div class="docs-nav-group-body"> <div class="docs-nav-section"> <ul> <li> <a href="/__pyric/ui/docs/conformance-scores/"> Public API coverage </a> </li><li> <a href="/__pyric/ui/docs/trust/how-we-know-it-matches-firebase/"> How we know it matches Firebase </a> </li><li> <a href="/__pyric/ui/docs/app-compat/"> App </a> </li><li> <a href="/__pyric/ui/docs/ai-compat/"> AI Logic </a> </li><li> <a href="/__pyric/ui/docs/auth-compat/"> Auth </a> </li><li> <a href="/__pyric/ui/docs/firestore-compat/"> Firestore </a> </li><li> <a href="/__pyric/ui/docs/database-compat/"> Realtime Database </a> </li><li> <a href="/__pyric/ui/docs/storage-compat/"> Storage </a> </li><li> <a href="/__pyric/ui/docs/messaging-compat/"> Messaging </a> </li><li> <a href="/__pyric/ui/docs/functions-rtdb-compat/"> Functions · RTDB </a> </li><li> <a href="/__pyric/ui/docs/rules-compat/"> Rules </a> </li> </ul> </div> </div> </details> <details class="docs-nav-group" id="nav-group-reference" open> <summary>Reference</summary> <div class="docs-nav-group-body docs-nav-group-body--reference"> <div class="docs-nav-section"> <ul> <li> <a href="/__pyric/ui/docs/api-reference/"> API reference </a> </li> </ul> </div><div class="docs-nav-section"> <h2 class="docs-nav-heading">pyric</h2> <ul> <li> <a href="/__pyric/ui/docs/pyric-app-reference-api/"> pyric/app </a> </li><li> <a href="/__pyric/ui/docs/pyric-firestore-reference-api/"> pyric/firestore </a> </li><li> <a href="/__pyric/ui/docs/pyric-auth-reference-api/"> pyric/auth </a> </li><li> <a href="/__pyric/ui/docs/pyric-ai-reference-api/"> pyric/ai </a> </li><li> <a href="/__pyric/ui/docs/pyric-ai-scripting-reference-api/"> pyric/ai/scripting </a> </li><li> <a href="/__pyric/ui/docs/pyric-database-reference-api/"> pyric/database </a> </li><li> <a href="/__pyric/ui/docs/pyric-storage-reference-api/"> pyric/storage </a> </li><li> <a href="/__pyric/ui/docs/pyric-messaging-reference-api/"> pyric/messaging </a> </li><li> <a href="/__pyric/ui/docs/pyric-messaging-sw-reference-api/"> pyric/messaging/sw </a> </li><li> <a href="/__pyric/ui/docs/pyric-rules-reference-api/"> pyric/rules </a> </li><li> <a href="/__pyric/ui/docs/pyric-sandbox-reference-api/"> pyric/sandbox </a> </li><li> <a href="/__pyric/ui/docs/pyric-sandbox-firestore-reference-api/"> pyric/sandbox/firestore </a> </li><li> <a href="/__pyric/ui/docs/pyric-sandbox-database-reference-api/"> pyric/sandbox/database </a> </li> </ul> </div><div class="docs-nav-section"> <h2 class="docs-nav-heading">pyric-admin</h2> <ul> <li> <a href="/__pyric/ui/docs/pyric-admin-app-reference-api/"> pyric-admin/app </a> </li><li> <a href="/__pyric/ui/docs/pyric-admin-firestore-reference-api/"> pyric-admin/firestore </a> </li><li> <a href="/__pyric/ui/docs/pyric-admin-auth-reference-api/"> pyric-admin/auth </a> </li><li> <a href="/__pyric/ui/docs/pyric-admin-database-reference-api/"> pyric-admin/database </a> </li><li> <a href="/__pyric/ui/docs/pyric-admin-storage-reference-api/"> pyric-admin/storage </a> </li><li> <a href="/__pyric/ui/docs/pyric-admin-messaging-reference-api/"> pyric-admin/messaging </a> </li> </ul> </div><div class="docs-nav-section"> <h2 class="docs-nav-heading">create-pyric</h2> <ul> <li> <a href="/__pyric/ui/docs/create-pyric-reference-api/"> create-pyric </a> </li> </ul> </div><div class="docs-nav-section"> <h2 class="docs-nav-heading">@pyric/cli</h2> <ul> <li> <a href="/__pyric/ui/docs/pyric-cli-credentials-node-reference-api/"> @pyric/cli/credentials/node </a> </li><li> <a href="/__pyric/ui/docs/pyric-cli-verify-reference-api/"> @pyric/cli/verify </a> </li><li> <a href="/__pyric/ui/docs/pyric-cli-conformance-reference-api/"> @pyric/cli/conformance </a> </li><li> <a href="/__pyric/ui/docs/pyric-cli-conformance-browser-reference-api/"> @pyric/cli/conformance/browser </a> </li><li> <a href="/__pyric/ui/docs/pyric-cli-conformance-docs-reference-api/"> @pyric/cli/conformance/docs </a> </li><li> <a href="/__pyric/ui/docs/pyric-cli-assurance-reference-api/"> @pyric/cli/assurance </a> </li><li> <a href="/__pyric/ui/docs/pyric-cli-assurance-browser-reference-api/"> @pyric/cli/assurance/browser </a> </li><li> <a href="/__pyric/ui/docs/pyric-cli-bridge-reference-api/"> @pyric/cli/bridge </a> </li><li> <a href="/__pyric/ui/docs/pyric-cli-bridge-client-reference-api/"> @pyric/cli/bridge/client </a> </li><li> <a href="/__pyric/ui/docs/pyric-cli-discover-reference-api/"> @pyric/cli/discover </a> </li><li> <a href="/__pyric/ui/docs/pyric-cli-vite-reference-api/"> @pyric/cli/vite </a> </li><li> <a href="/__pyric/ui/docs/pyric-cli-serve-worker-reference-api/"> @pyric/cli/serve/worker </a> </li><li> <a href="/__pyric/ui/docs/pyric-cli-remote-reference-api/"> @pyric/cli/remote </a> </li><li> <a href="/__pyric/ui/docs/pyric-cli-register-reference-api/"> @pyric/cli/register </a> </li> </ul> </div><div class="docs-nav-section"> <h2 class="docs-nav-heading">@pyric/ui</h2> <ul> <li> <a href="/__pyric/ui/docs/pyric-ui-auth-reference-api/"> @pyric/ui/auth </a> </li><li> <a href="/__pyric/ui/docs/pyric-ui-auth-hooks-reference-api/"> @pyric/ui/auth/hooks </a> </li><li> <a href="/__pyric/ui/docs/pyric-ui-primitives-reference-api/"> @pyric/ui/primitives </a> </li><li> <a href="/__pyric/ui/docs/pyric-ui-firestore-reference-api/"> @pyric/ui/firestore </a> </li><li> <a href="/__pyric/ui/docs/pyric-ui-firestore-hooks-reference-api/"> @pyric/ui/firestore/hooks </a> </li><li> <a href="/__pyric/ui/docs/pyric-ui-rtdb-reference-api/"> @pyric/ui/rtdb </a> </li><li> <a href="/__pyric/ui/docs/pyric-ui-storage-reference-api/" aria-current="page"> @pyric/ui/storage </a> </li><li> <a href="/__pyric/ui/docs/pyric-ui-storage-hooks-reference-api/"> @pyric/ui/storage/hooks </a> </li><li> <a href="/__pyric/ui/docs/pyric-ui-traffic-reference-api/"> @pyric/ui/traffic </a> </li><li> <a href="/__pyric/ui/docs/pyric-ui-traffic-hooks-reference-api/"> @pyric/ui/traffic/hooks </a> </li><li> <a href="/__pyric/ui/docs/pyric-ui-events-reference-api/"> @pyric/ui/events </a> </li><li> <a href="/__pyric/ui/docs/pyric-ui-events-hooks-reference-api/"> @pyric/ui/events/hooks </a> </li><li> <a href="/__pyric/ui/docs/pyric-ui-agents-reference-api/"> @pyric/ui/agents </a> </li><li> <a href="/__pyric/ui/docs/pyric-ui-rules-reference-api/"> @pyric/ui/rules </a> </li><li> <a href="/__pyric/ui/docs/pyric-ui-rules-hooks-reference-api/"> @pyric/ui/rules/hooks </a> </li> </ul> </div> </div> </details> </nav> <main class="doc-main"> <nav class="docs-breadcrumbs" aria-label="Breadcrumb"> <ol> <li> <a href="/__pyric/ui/docs/api-reference/">API reference</a> </li><li> <span class="docs-breadcrumbs-sep" aria-hidden="true">/</span> <span>@pyric/ui</span> </li><li> <span class="docs-breadcrumbs-sep" aria-hidden="true">/</span> <span aria-current="page">@pyric/ui/storage</span> </li> </ol> </nav> <header class="api-reference-header"> <p class="api-reference-kicker">API reference</p> <h1><code>@pyric/ui/storage</code></h1> <p class="api-reference-meta"> 76 published symbols from <code>@pyric/ui</code> </p> <p class="api-reference-source">
2
3
  Generated from the TypeScript declarations shipped at this import path.
3
- </p> </header> <article class="prose api-reference-body"> <!-- Generated from published package declarations via TypeDoc. Do not edit by hand; run bun run docs:api:generate. -->
4
+ </p> </header> <article class="prose api-reference-body"> <!-- Generated from published package declarations via TypeDoc. Rendered by the api-reference content loader. -->
4
5
  <h2 id="interfaces">Interfaces</h2>
5
6
  <p><a id="custommetadataentry"></a></p>
6
7
  <h3 id="custommetadataentry">CustomMetadataEntry</h3>
@@ -112,7 +113,7 @@ user-editable, so they can’t key the rows themselves.</p>
112
113
 
113
114
 
114
115
 
115
- <table><thead><tr><th align="left">Property</th><th align="left">Type</th><th align="left">Description</th></tr></thead><tbody><tr><td align="left"><a id="body"></a> <code>body?</code></td><td align="left"><code>ReactNode</code></td><td align="left">Confirm-dialog body. Default lists the selected paths.</td></tr><tr><td align="left"><a id="classname"></a> <code>className?</code></td><td align="left"><code>string</code></td><td align="left">Class forwarded to the default trigger button.</td></tr><tr><td align="left"><a id="confirmlabel"></a> <code>confirmLabel?</code></td><td align="left"><code>string</code></td><td align="left">-</td></tr><tr><td align="left"><a id="entries"></a> <code>entries</code></td><td align="left"><a href="#storageselectionentry"><code>StorageSelectionEntry</code></a>[]</td><td align="left">What to delete — <code>useStorageSelection().selected</code> (or any <code>{kind, fullPath}</code> rows). Folders delete recursively.</td></tr><tr><td align="left"><a id="gate"></a> <code>gate?</code></td><td align="left"><code>Pick</code>&#x3C;<a href="#usestoragerulesgateresult"><code>UseStorageRulesGateResult</code></a>, <code>"verdictFor"</code>></td><td align="left">Rules-aware affordance — pass <code>useStorageRulesGate(storage)</code>. When ANY selected entry’s DELETE verdict denies, the trigger disables with the reason (default trigger: <code>data-pyric-denied</code> + <code>data-pyric-denied-reason</code> + <code>title</code>; <code>renderTrigger</code> receives <code>deniedReason</code>). For folder entries the verdict evaluates the folder path itself — an approximation of the recursive walk (descendants matched by <code>{allPaths=**}</code> rules share the verdict).</td></tr><tr><td align="left"><a id="impl"></a> <code>impl?</code></td><td align="left"><a href="#storagerecursivedeleteimpl"><code>StorageRecursiveDeleteImpl</code></a></td><td align="left">Folder-walk impl override (default: the <code>listAll</code>-driven one).</td></tr><tr><td align="left"><a id="list"></a> <code>list?</code></td><td align="left"><code>Pick</code>&#x3C;<a href="#usestoragelistresult"><code>UseStorageListResult</code></a>, <code>"insertItem"</code> | <code>"removeItem"</code>></td><td align="left">Optimistic seam from <code>useStorageList</code>.</td></tr><tr><td align="left"><a id="ondeleted"></a> <code>onDeleted?</code></td><td align="left">(<code>outcome</code>: <a href="#storagedeleteoutcome"><code>StorageDeleteOutcome</code></a>) => <code>void</code></td><td align="left">Fired after a run with NO failures (e.g. clear the selection + refresh the list).</td></tr><tr><td align="left"><a id="onfailed"></a> <code>onFailed?</code></td><td align="left">(<code>outcome</code>: <a href="#storagedeleteoutcome"><code>StorageDeleteOutcome</code></a>) => <code>void</code></td><td align="left">Fired after a run with failures (the toast already showed).</td></tr><tr><td align="left"><a id="rendertrigger"></a> <code>renderTrigger?</code></td><td align="left">(<code>props</code>: { <code>deniedReason?</code>: <code>string</code>; <code>disabled</code>: <code>boolean</code>; <code>isRunning</code>: <code>boolean</code>; <code>onClick</code>: () => <code>void</code>; <code>progress</code>: <code>number</code>; }) => <code>ReactNode</code></td><td align="left">Render override for the trigger button.</td></tr><tr><td align="left"><a id="storage"></a> <code>storage</code></td><td align="left"><code>any</code></td><td align="left">The package’s single Storage handle prop.</td></tr><tr><td align="left"><a id="title"></a> <code>title?</code></td><td align="left"><code>string</code></td><td align="left">Confirm-dialog title. Default derives from the entry count.</td></tr></tbody></table></div>
116
+ <table><thead><tr><th align="left">Property</th><th align="left">Type</th><th align="left">Description</th></tr></thead><tbody><tr><td align="left"><a id="body"></a> <code>body?</code></td><td align="left"><code>ReactNode</code></td><td align="left">Confirm-dialog body. Default lists the selected paths.</td></tr><tr><td align="left"><a id="classname"></a> <code>className?</code></td><td align="left"><code>string</code></td><td align="left">Class forwarded to the default trigger button.</td></tr><tr><td align="left"><a id="confirmlabel"></a> <code>confirmLabel?</code></td><td align="left"><code>string</code></td><td align="left">-</td></tr><tr><td align="left"><a id="entries"></a> <code>entries</code></td><td align="left"><a href="#storageselectionentry"><code>StorageSelectionEntry</code></a>[]</td><td align="left">What to delete — <code>useStorageSelection().selected</code> (or any <code>{kind, fullPath}</code> rows). Folders delete recursively.</td></tr><tr><td align="left"><a id="gate"></a> <code>gate?</code></td><td align="left"><code>Pick</code>&#x3C;<a href="#usestoragerulesgateresult"><code>UseStorageRulesGateResult</code></a>, <code>"verdictFor"</code>></td><td align="left">Rules-aware affordance — pass <code>useStorageRulesGate(storage)</code>. When ANY selected entry’s DELETE verdict denies, the trigger disables with the reason (default trigger: <code>data-pyric-denied</code> + <code>data-pyric-denied-reason</code> + <code>title</code>; <code>renderTrigger</code> receives <code>deniedReason</code>). For folder entries the verdict evaluates the folder path itself — an approximation of the recursive walk (descendants matched by <code>{allPaths=**}</code> rules share the verdict).</td></tr><tr><td align="left"><a id="impl"></a> <code>impl?</code></td><td align="left"><a href="#storagerecursivedeleteimpl"><code>StorageRecursiveDeleteImpl</code></a></td><td align="left">Folder-walk impl override (default: the <code>listAll</code>-driven one).</td></tr><tr><td align="left"><a id="list"></a> <code>list?</code></td><td align="left"><code>Pick</code>&#x3C;<a href="#usestoragelistresult"><code>UseStorageListResult</code></a>, <code>"insertItem"</code> | <code>"removeItem"</code>></td><td align="left">Optimistic seam from <code>useStorageList</code>.</td></tr><tr><td align="left"><a id="ondeleted"></a> <code>onDeleted?</code></td><td align="left">(<code>outcome</code>: <a href="#storagedeleteoutcome"><code>StorageDeleteOutcome</code></a>) => <code>void</code></td><td align="left">Fired after a run with NO failures (e.g. clear the selection + refresh the list).</td></tr><tr><td align="left"><a id="onfailed"></a> <code>onFailed?</code></td><td align="left">(<code>outcome</code>: <a href="#storagedeleteoutcome"><code>StorageDeleteOutcome</code></a>) => <code>void</code></td><td align="left">Fired after a run with failures (the toast already showed).</td></tr><tr><td align="left"><a id="rendertrigger"></a> <code>renderTrigger?</code></td><td align="left">(<code>props</code>: { <code>deniedReason?</code>: <code>string</code>; <code>disabled</code>: <code>boolean</code>; <code>isRunning</code>: <code>boolean</code>; <code>onClick</code>: () => <code>void</code>; <code>progress</code>: <code>number</code>; }) => <code>ReactNode</code></td><td align="left">Render override for the trigger button.</td></tr><tr><td align="left"><a id="storage"></a> <code>storage</code></td><td align="left"><a href="/docs/pyric-storage-reference-api/#firebasestorage"><code>FirebaseStorage</code></a></td><td align="left">The package’s single Storage handle prop.</td></tr><tr><td align="left"><a id="title"></a> <code>title?</code></td><td align="left"><code>string</code></td><td align="left">Confirm-dialog title. Default derives from the entry count.</td></tr></tbody></table></div>
116
117
  <hr>
117
118
  <p><a id="droppedfile"></a></p>
118
119
  <h3 id="droppedfile">DroppedFile</h3>
@@ -253,7 +254,7 @@ user-editable, so they can’t key the rows themselves.</p>
253
254
 
254
255
 
255
256
 
256
- <table><thead><tr><th align="left">Property</th><th align="left">Type</th><th align="left">Description</th></tr></thead><tbody><tr><td align="left"><a id="classname-1"></a> <code>className?</code></td><td align="left"><code>string</code></td><td align="left">-</td></tr><tr><td align="left"><a id="emptystate"></a> <code>emptyState?</code></td><td align="left"><code>ReactNode</code></td><td align="left">-</td></tr><tr><td align="left"><a id="entries-1"></a> <code>entries</code></td><td align="left"><a href="#storagelistentry"><code>StorageListEntry</code></a>[]</td><td align="left">The folders-first row model from <code>useStorageList</code>.</td></tr><tr><td align="left"><a id="error-1"></a> <code>error?</code></td><td align="left"><code>Error</code></td><td align="left">Renders a <code>role="alert"</code> container with the message. Pair with the hook’s typed <code>StorageError</code> for code-driven copy.</td></tr><tr><td align="left"><a id="gate-1"></a> <code>gate?</code></td><td align="left"><code>Pick</code>&#x3C;<a href="#usestoragerulesgateresult"><code>UseStorageRulesGateResult</code></a>, <code>"verdictFor"</code>></td><td align="left">Rules-aware affordances — pass <code>useStorageRulesGate(storage)</code>. Rows whose READ verdict denies are stamped <code>data-pyric-denied</code> (with the evaluator’s reason trace on <code>data-pyric-denied-reason</code>). A denied folder row would throw <code>storage/unauthorized</code> on <code>listAll</code>; the stamp warns BEFORE the click. Rows stay clickable — the affordance is advisory and the sandbox enforcement layer remains authoritative.</td></tr><tr><td align="left"><a id="onnavigate"></a> <code>onNavigate?</code></td><td align="left">(<code>path</code>: <code>string</code>) => <code>void</code></td><td align="left">Folder row click — fired with the prefix’s <code>fullPath</code>. Wire to <code>usePathState.enter</code> (or <code>setPath</code>).</td></tr><tr><td align="left"><a id="onselect"></a> <code>onSelect?</code></td><td align="left">(<code>ref</code>: <code>StorageReference</code>) => <code>void</code></td><td align="left">Object row click — fired with the object’s reference.</td></tr><tr><td align="left"><a id="renderentry"></a> <code>renderEntry?</code></td><td align="left">(<code>entry</code>: <a href="#storagelistentry"><code>StorageListEntry</code></a>) => <code>ReactNode</code></td><td align="left">Row-label slot. Default renders the entry name. The row button, its click wiring, and the <code>data-*</code> states stay with the component — the slot only owns the label content.</td></tr><tr><td align="left"><a id="renderrowaction"></a> <code>renderRowAction?</code></td><td align="left">(<code>entry</code>: <a href="#storagelistentry"><code>StorageListEntry</code></a>) => <code>ReactNode</code></td><td align="left">Optional per-row action rendered as a sibling of the navigation/select button. Use this for independent controls such as selection checkboxes.</td></tr><tr><td align="left"><a id="rowheight"></a> <code>rowHeight?</code></td><td align="left"><code>number</code> | (<code>index</code>: <code>number</code>) => <code>number</code></td><td align="left">Estimated row height when virtualizing. Default 36.</td></tr><tr><td align="left"><a id="selectedpath"></a> <code>selectedPath?</code></td><td align="left"><code>string</code></td><td align="left">Marks the matching object row <code>data-pyric-selected</code> + <code>aria-selected</code>.</td></tr><tr><td align="left"><a id="status"></a> <code>status?</code></td><td align="left"><a href="#storageliststatus"><code>StorageListStatus</code></a></td><td align="left">Drives the loading state (<code>'loading'</code> with no rows yet) and the idle short-circuit. Default <code>'success'</code> for static usage.</td></tr><tr><td align="left"><a id="virtualizedheight"></a> <code>virtualizedHeight?</code></td><td align="left"><code>string</code> | <code>number</code></td><td align="left">Scroll-container height when virtualized. Default <code>'60vh'</code>.</td></tr><tr><td align="left"><a id="virtualizethreshold"></a> <code>virtualizeThreshold?</code></td><td align="left"><code>number</code></td><td align="left">Above this row count, the list switches to virtualization via <code>&#x3C;VirtualList></code> — <code>listAll</code> has no pagination, so a big prefix arrives as one flat result and virtualization is the only defense. Default 100 (same as <code>&#x3C;DocumentList></code>). <code>Infinity</code> disables.</td></tr></tbody></table></div>
257
+ <table><thead><tr><th align="left">Property</th><th align="left">Type</th><th align="left">Description</th></tr></thead><tbody><tr><td align="left"><a id="classname-1"></a> <code>className?</code></td><td align="left"><code>string</code></td><td align="left">-</td></tr><tr><td align="left"><a id="emptystate"></a> <code>emptyState?</code></td><td align="left"><code>ReactNode</code></td><td align="left">-</td></tr><tr><td align="left"><a id="entries-1"></a> <code>entries</code></td><td align="left"><a href="#storagelistentry"><code>StorageListEntry</code></a>[]</td><td align="left">The folders-first row model from <code>useStorageList</code>.</td></tr><tr><td align="left"><a id="error-1"></a> <code>error?</code></td><td align="left"><code>Error</code></td><td align="left">Renders a <code>role="alert"</code> container with the message. Pair with the hook’s typed <code>StorageError</code> for code-driven copy.</td></tr><tr><td align="left"><a id="gate-1"></a> <code>gate?</code></td><td align="left"><code>Pick</code>&#x3C;<a href="#usestoragerulesgateresult"><code>UseStorageRulesGateResult</code></a>, <code>"verdictFor"</code>></td><td align="left">Rules-aware affordances — pass <code>useStorageRulesGate(storage)</code>. Rows whose READ verdict denies are stamped <code>data-pyric-denied</code> (with the evaluator’s reason trace on <code>data-pyric-denied-reason</code>). A denied folder row would throw <code>storage/unauthorized</code> on <code>listAll</code>; the stamp warns BEFORE the click. Rows stay clickable — the affordance is advisory and the sandbox enforcement layer remains authoritative.</td></tr><tr><td align="left"><a id="onnavigate"></a> <code>onNavigate?</code></td><td align="left">(<code>path</code>: <code>string</code>) => <code>void</code></td><td align="left">Folder row click — fired with the prefix’s <code>fullPath</code>. Wire to <code>usePathState.enter</code> (or <code>setPath</code>).</td></tr><tr><td align="left"><a id="onselect"></a> <code>onSelect?</code></td><td align="left">(<code>ref</code>: <a href="/docs/pyric-storage-reference-api/#storagereference"><code>StorageReference</code></a>) => <code>void</code></td><td align="left">Object row click — fired with the object’s reference.</td></tr><tr><td align="left"><a id="renderentry"></a> <code>renderEntry?</code></td><td align="left">(<code>entry</code>: <a href="#storagelistentry"><code>StorageListEntry</code></a>) => <code>ReactNode</code></td><td align="left">Row-label slot. Default renders the entry name. The row button, its click wiring, and the <code>data-*</code> states stay with the component — the slot only owns the label content.</td></tr><tr><td align="left"><a id="renderrowaction"></a> <code>renderRowAction?</code></td><td align="left">(<code>entry</code>: <a href="#storagelistentry"><code>StorageListEntry</code></a>) => <code>ReactNode</code></td><td align="left">Optional per-row action rendered as a sibling of the navigation/select button. Use this for independent controls such as selection checkboxes.</td></tr><tr><td align="left"><a id="rowheight"></a> <code>rowHeight?</code></td><td align="left"><code>number</code> | (<code>index</code>: <code>number</code>) => <code>number</code></td><td align="left">Estimated row height when virtualizing. Default 36.</td></tr><tr><td align="left"><a id="selectedpath"></a> <code>selectedPath?</code></td><td align="left"><code>string</code></td><td align="left">Marks the matching object row <code>data-pyric-selected</code> + <code>aria-selected</code>.</td></tr><tr><td align="left"><a id="status"></a> <code>status?</code></td><td align="left"><a href="#storageliststatus"><code>StorageListStatus</code></a></td><td align="left">Drives the loading state (<code>'loading'</code> with no rows yet) and the idle short-circuit. Default <code>'success'</code> for static usage.</td></tr><tr><td align="left"><a id="virtualizedheight"></a> <code>virtualizedHeight?</code></td><td align="left"><code>string</code> | <code>number</code></td><td align="left">Scroll-container height when virtualized. Default <code>'60vh'</code>.</td></tr><tr><td align="left"><a id="virtualizethreshold"></a> <code>virtualizeThreshold?</code></td><td align="left"><code>number</code></td><td align="left">Above this row count, the list switches to virtualization via <code>&#x3C;VirtualList></code> — <code>listAll</code> has no pagination, so a big prefix arrives as one flat result and virtualization is the only defense. Default 100 (same as <code>&#x3C;DocumentList></code>). <code>Infinity</code> disables.</td></tr></tbody></table></div>
257
258
  <hr>
258
259
  <p><a id="objectinspectorprops"></a></p>
259
260
  <h3 id="objectinspectorprops">ObjectInspectorProps</h3>
@@ -298,7 +299,7 @@ user-editable, so they can’t key the rows themselves.</p>
298
299
 
299
300
 
300
301
 
301
- <table><thead><tr><th align="left">Property</th><th align="left">Type</th><th align="left">Description</th></tr></thead><tbody><tr><td align="left"><a id="children"></a> <code>children?</code></td><td align="left"><code>ReactNode</code></td><td align="left">Extra content below the preview (metadata editor, delete button, …).</td></tr><tr><td align="left"><a id="classname-2"></a> <code>className?</code></td><td align="left"><code>string</code></td><td align="left">-</td></tr><tr><td align="left"><a id="path"></a> <code>path</code></td><td align="left"><code>string</code></td><td align="left">Object path to inspect. <code>null</code> renders the idle shell — keep the inspector mounted and swap paths as the user selects rows.</td></tr><tr><td align="left"><a id="previews"></a> <code>previews?</code></td><td align="left"><a href="#storagepreview"><code>StoragePreview</code></a>[]</td><td align="left">Consumer previews, tried BEFORE the built-ins (first match wins) — the extension channel of the preview registry.</td></tr><tr><td align="left"><a id="rendermetadata"></a> <code>renderMetadata?</code></td><td align="left">(<code>metadata</code>: <code>FullMetadata</code>) => <code>ReactNode</code></td><td align="left">Metadata-section slot. Default renders the standard field list. The header, preview, and state wiring stay with the component.</td></tr><tr><td align="left"><a id="storage-1"></a> <code>storage</code></td><td align="left"><code>any</code></td><td align="left">The package’s sandbox Storage handle.</td></tr></tbody></table></div>
302
+ <table><thead><tr><th align="left">Property</th><th align="left">Type</th><th align="left">Description</th></tr></thead><tbody><tr><td align="left"><a id="children"></a> <code>children?</code></td><td align="left"><code>ReactNode</code></td><td align="left">Extra content below the preview (metadata editor, delete button, …).</td></tr><tr><td align="left"><a id="classname-2"></a> <code>className?</code></td><td align="left"><code>string</code></td><td align="left">-</td></tr><tr><td align="left"><a id="path"></a> <code>path</code></td><td align="left"><code>string</code></td><td align="left">Object path to inspect. <code>null</code> renders the idle shell — keep the inspector mounted and swap paths as the user selects rows.</td></tr><tr><td align="left"><a id="previews"></a> <code>previews?</code></td><td align="left"><a href="#storagepreview"><code>StoragePreview</code></a>[]</td><td align="left">Consumer previews, tried BEFORE the built-ins (first match wins) — the extension channel of the preview registry.</td></tr><tr><td align="left"><a id="rendermetadata"></a> <code>renderMetadata?</code></td><td align="left">(<code>metadata</code>: <a href="/docs/pyric-storage-reference-api/#fullmetadata"><code>FullMetadata</code></a>) => <code>ReactNode</code></td><td align="left">Metadata-section slot. Default renders the standard field list. The header, preview, and state wiring stay with the component.</td></tr><tr><td align="left"><a id="storage-1"></a> <code>storage</code></td><td align="left"><a href="/docs/pyric-storage-reference-api/#firebasestorage"><code>FirebaseStorage</code></a></td><td align="left">The package’s sandbox Storage handle.</td></tr></tbody></table></div>
302
303
  <hr>
303
304
  <p><a id="pathbreadcrumbprops"></a></p>
304
305
  <h3 id="pathbreadcrumbprops">PathBreadcrumbProps</h3>
@@ -506,7 +507,7 @@ rows, its <code>items</code> become <code>kind: 'object'</code> rows, folders fi
506
507
 
507
508
 
508
509
 
509
- <table><thead><tr><th align="left">Property</th><th align="left">Type</th><th align="left">Description</th></tr></thead><tbody><tr><td align="left"><a id="fullpath-1"></a> <code>fullPath</code></td><td align="left"><code>string</code></td><td align="left">Bucket-rooted path (no trailing slash, even for folders).</td></tr><tr><td align="left"><a id="kind"></a> <code>kind</code></td><td align="left"><code>"object"</code> | <code>"folder"</code></td><td align="left">-</td></tr><tr><td align="left"><a id="name"></a> <code>name</code></td><td align="left"><code>string</code></td><td align="left">Last path segment, display name.</td></tr><tr><td align="left"><a id="ref"></a> <code>ref</code></td><td align="left"><code>StorageReference</code></td><td align="left">-</td></tr></tbody></table></div>
510
+ <table><thead><tr><th align="left">Property</th><th align="left">Type</th><th align="left">Description</th></tr></thead><tbody><tr><td align="left"><a id="fullpath-1"></a> <code>fullPath</code></td><td align="left"><code>string</code></td><td align="left">Bucket-rooted path (no trailing slash, even for folders).</td></tr><tr><td align="left"><a id="kind"></a> <code>kind</code></td><td align="left"><code>"object"</code> | <code>"folder"</code></td><td align="left">-</td></tr><tr><td align="left"><a id="name"></a> <code>name</code></td><td align="left"><code>string</code></td><td align="left">Last path segment, display name.</td></tr><tr><td align="left"><a id="ref"></a> <code>ref</code></td><td align="left"><a href="/docs/pyric-storage-reference-api/#storagereference"><code>StorageReference</code></a></td><td align="left">-</td></tr></tbody></table></div>
510
511
  <hr>
511
512
  <p><a id="storagepreview"></a></p>
512
513
  <h3 id="storagepreview">StoragePreview</h3>
@@ -552,7 +553,7 @@ matcher.</p>
552
553
 
553
554
 
554
555
 
555
- <table><thead><tr><th align="left">Property</th><th align="left">Type</th><th align="left">Description</th></tr></thead><tbody><tr><td align="left"><a id="id-1"></a> <code>id</code></td><td align="left"><code>string</code></td><td align="left">Diagnostic id — also stamped on the preview container as <code>data-pyric-preview="&#x3C;id>"</code>.</td></tr><tr><td align="left"><a id="match"></a> <code>match</code></td><td align="left">(<code>metadata</code>: <code>FullMetadata</code>) => <code>boolean</code></td><td align="left">-</td></tr><tr><td align="left"><a id="maxbytes"></a> <code>maxBytes?</code></td><td align="left"><code>number</code></td><td align="left">Skip the preview (and the blob download) for objects larger than this — the inspector renders its <code>data-pyric-preview-too-large</code> fallback instead. <code>undefined</code> = no cap.</td></tr><tr><td align="left"><a id="needsblob"></a> <code>needsBlob?</code></td><td align="left"><code>boolean</code></td><td align="left">Ask the inspector to <code>loadBlob()</code> before rendering. Default <code>false</code> (metadata-only previews render immediately).</td></tr><tr><td align="left"><a id="render"></a> <code>render</code></td><td align="left">(<code>ctx</code>: <a href="#storagepreviewcontext"><code>StoragePreviewContext</code></a>) => <code>ReactNode</code></td><td align="left">-</td></tr></tbody></table></div>
556
+ <table><thead><tr><th align="left">Property</th><th align="left">Type</th><th align="left">Description</th></tr></thead><tbody><tr><td align="left"><a id="id-1"></a> <code>id</code></td><td align="left"><code>string</code></td><td align="left">Diagnostic id — also stamped on the preview container as <code>data-pyric-preview="&#x3C;id>"</code>.</td></tr><tr><td align="left"><a id="match"></a> <code>match</code></td><td align="left">(<code>metadata</code>: <a href="/docs/pyric-storage-reference-api/#fullmetadata"><code>FullMetadata</code></a>) => <code>boolean</code></td><td align="left">-</td></tr><tr><td align="left"><a id="maxbytes"></a> <code>maxBytes?</code></td><td align="left"><code>number</code></td><td align="left">Skip the preview (and the blob download) for objects larger than this — the inspector renders its <code>data-pyric-preview-too-large</code> fallback instead. <code>undefined</code> = no cap.</td></tr><tr><td align="left"><a id="needsblob"></a> <code>needsBlob?</code></td><td align="left"><code>boolean</code></td><td align="left">Ask the inspector to <code>loadBlob()</code> before rendering. Default <code>false</code> (metadata-only previews render immediately).</td></tr><tr><td align="left"><a id="render"></a> <code>render</code></td><td align="left">(<code>ctx</code>: <a href="#storagepreviewcontext"><code>StoragePreviewContext</code></a>) => <code>ReactNode</code></td><td align="left">-</td></tr></tbody></table></div>
556
557
  <hr>
557
558
  <p><a id="storagepreviewcontext"></a></p>
558
559
  <h3 id="storagepreviewcontext">StoragePreviewContext</h3>
@@ -580,7 +581,7 @@ populated for previews that declared <code>needsBlob</code>.</p>
580
581
 
581
582
 
582
583
 
583
- <table><thead><tr><th align="left">Property</th><th align="left">Type</th></tr></thead><tbody><tr><td align="left"><a id="blob"></a> <code>blob</code></td><td align="left"><code>Blob</code></td></tr><tr><td align="left"><a id="bloburl"></a> <code>blobUrl</code></td><td align="left"><code>string</code></td></tr><tr><td align="left"><a id="metadata"></a> <code>metadata</code></td><td align="left"><code>FullMetadata</code></td></tr></tbody></table></div>
584
+ <table><thead><tr><th align="left">Property</th><th align="left">Type</th></tr></thead><tbody><tr><td align="left"><a id="blob"></a> <code>blob</code></td><td align="left"><code>Blob</code></td></tr><tr><td align="left"><a id="bloburl"></a> <code>blobUrl</code></td><td align="left"><code>string</code></td></tr><tr><td align="left"><a id="metadata"></a> <code>metadata</code></td><td align="left"><a href="/docs/pyric-storage-reference-api/#fullmetadata"><code>FullMetadata</code></a></td></tr></tbody></table></div>
584
585
  <hr>
585
586
  <p><a id="storagerecursivedeleteimpl"></a></p>
586
587
  <h3 id="storagerecursivedeleteimpl">StorageRecursiveDeleteImpl</h3>
@@ -604,7 +605,7 @@ inject your own for server-driven deletes.</p>
604
605
 
605
606
 
606
607
 
607
- <table><thead><tr><th align="left">Property</th><th align="left">Type</th></tr></thead><tbody><tr><td align="left"><a id="start"></a> <code>start</code></td><td align="left">(<code>target</code>: <code>StorageReference</code>) => <code>AsyncIterableIterator</code>&#x3C;<a href="#storagedeleteprogress"><code>StorageDeleteProgress</code></a>></td></tr></tbody></table></div>
608
+ <table><thead><tr><th align="left">Property</th><th align="left">Type</th></tr></thead><tbody><tr><td align="left"><a id="start"></a> <code>start</code></td><td align="left">(<code>target</code>: <a href="/docs/pyric-storage-reference-api/#storagereference"><code>StorageReference</code></a>) => <code>AsyncIterableIterator</code>&#x3C;<a href="#storagedeleteprogress"><code>StorageDeleteProgress</code></a>></td></tr></tbody></table></div>
608
609
  <hr>
609
610
  <p><a id="storageselectionentry"></a></p>
610
611
  <h3 id="storageselectionentry">StorageSelectionEntry</h3>
@@ -698,7 +699,7 @@ in. The <code>kind</code> decides the delete verb later (object →
698
699
 
699
700
 
700
701
 
701
- <table><thead><tr><th align="left">Property</th><th align="left">Type</th></tr></thead><tbody><tr><td align="left"><a id="data"></a> <code>data</code></td><td align="left"><code>Blob</code> | <code>ArrayBuffer</code> | <code>Uint8Array</code>&#x3C;<code>ArrayBufferLike</code>></td></tr><tr><td align="left"><a id="metadata-1"></a> <code>metadata?</code></td><td align="left"><code>SettableMetadata</code></td></tr><tr><td align="left"><a id="path-2"></a> <code>path</code></td><td align="left"><code>string</code></td></tr></tbody></table></div>
702
+ <table><thead><tr><th align="left">Property</th><th align="left">Type</th></tr></thead><tbody><tr><td align="left"><a id="data"></a> <code>data</code></td><td align="left"><code>ArrayBuffer</code> | <code>Uint8Array</code>&#x3C;<code>ArrayBufferLike</code>> | <code>Blob</code></td></tr><tr><td align="left"><a id="metadata-1"></a> <code>metadata?</code></td><td align="left"><a href="/docs/pyric-storage-reference-api/#settablemetadata"><code>SettableMetadata</code></a></td></tr><tr><td align="left"><a id="path-2"></a> <code>path</code></td><td align="left"><code>string</code></td></tr></tbody></table></div>
702
703
  <hr>
703
704
  <p><a id="uploadtask"></a></p>
704
705
  <h3 id="uploadtask">UploadTask</h3>
@@ -755,7 +756,7 @@ at <code>totalBytes</code>.</p>
755
756
 
756
757
 
757
758
 
758
- <table><thead><tr><th align="left">Property</th><th align="left">Type</th><th align="left">Description</th></tr></thead><tbody><tr><td align="left"><a id="bytestransferred"></a> <code>bytesTransferred</code></td><td align="left"><code>number</code></td><td align="left">-</td></tr><tr><td align="left"><a id="error-3"></a> <code>error?</code></td><td align="left"><code>Error</code></td><td align="left">Populated on <code>'error'</code> — a typed <code>StorageError</code> from the sandbox (<code>.code</code> is <code>storage/&#x3C;code></code>, e.g. <code>storage/unauthorized</code> for a rules-denied write).</td></tr><tr><td align="left"><a id="fullpath-3"></a> <code>fullPath</code></td><td align="left"><code>string</code></td><td align="left">Bucket-rooted destination path.</td></tr><tr><td align="left"><a id="id-2"></a> <code>id</code></td><td align="left"><code>string</code></td><td align="left">Stable id — key task rows on this, not on <code>fullPath</code> (two uploads can target the same path).</td></tr><tr><td align="left"><a id="metadata-2"></a> <code>metadata?</code></td><td align="left"><code>FullMetadata</code></td><td align="left">Populated on <code>'success'</code>.</td></tr><tr><td align="left"><a id="status-1"></a> <code>status</code></td><td align="left"><a href="#uploadtaskstatus-1"><code>UploadTaskStatus</code></a></td><td align="left">-</td></tr><tr><td align="left"><a id="totalbytes"></a> <code>totalBytes</code></td><td align="left"><code>number</code></td><td align="left">-</td></tr></tbody></table></div>
759
+ <table><thead><tr><th align="left">Property</th><th align="left">Type</th><th align="left">Description</th></tr></thead><tbody><tr><td align="left"><a id="bytestransferred"></a> <code>bytesTransferred</code></td><td align="left"><code>number</code></td><td align="left">-</td></tr><tr><td align="left"><a id="error-3"></a> <code>error?</code></td><td align="left"><code>Error</code></td><td align="left">Populated on <code>'error'</code> — a typed <code>StorageError</code> from the sandbox (<code>.code</code> is <code>storage/&#x3C;code></code>, e.g. <code>storage/unauthorized</code> for a rules-denied write).</td></tr><tr><td align="left"><a id="fullpath-3"></a> <code>fullPath</code></td><td align="left"><code>string</code></td><td align="left">Bucket-rooted destination path.</td></tr><tr><td align="left"><a id="id-2"></a> <code>id</code></td><td align="left"><code>string</code></td><td align="left">Stable id — key task rows on this, not on <code>fullPath</code> (two uploads can target the same path).</td></tr><tr><td align="left"><a id="metadata-2"></a> <code>metadata?</code></td><td align="left"><a href="/docs/pyric-storage-reference-api/#fullmetadata"><code>FullMetadata</code></a></td><td align="left">Populated on <code>'success'</code>.</td></tr><tr><td align="left"><a id="status-1"></a> <code>status</code></td><td align="left"><a href="#uploadtaskstatus-1"><code>UploadTaskStatus</code></a></td><td align="left">-</td></tr><tr><td align="left"><a id="totalbytes"></a> <code>totalBytes</code></td><td align="left"><code>number</code></td><td align="left">-</td></tr></tbody></table></div>
759
760
  <hr>
760
761
  <p><a id="usemetadataeditoroptions"></a></p>
761
762
  <h3 id="usemetadataeditoroptions">UseMetadataEditorOptions</h3>
@@ -775,7 +776,7 @@ at <code>totalBytes</code>.</p>
775
776
 
776
777
 
777
778
 
778
- <table><thead><tr><th align="left">Property</th><th align="left">Type</th><th align="left">Description</th></tr></thead><tbody><tr><td align="left"><a id="initial-1"></a> <code>initial?</code></td><td align="left"><code>SettableMetadata</code></td><td align="left">The metadata being edited — the same shape <code>useStorageObject</code>’s <code>metadata</code> carries. Read once on mount (the editor is a stateful workspace, like the document editor); <code>reset()</code> + remount to re-initialize.</td></tr></tbody></table></div>
779
+ <table><thead><tr><th align="left">Property</th><th align="left">Type</th><th align="left">Description</th></tr></thead><tbody><tr><td align="left"><a id="initial-1"></a> <code>initial?</code></td><td align="left"><a href="/docs/pyric-storage-reference-api/#settablemetadata"><code>SettableMetadata</code></a></td><td align="left">The metadata being edited — the same shape <code>useStorageObject</code>’s <code>metadata</code> carries. Read once on mount (the editor is a stateful workspace, like the document editor); <code>reset()</code> + remount to re-initialize.</td></tr></tbody></table></div>
779
780
  <hr>
780
781
  <p><a id="usemetadataeditorresult"></a></p>
781
782
  <h3 id="usemetadataeditorresult">UseMetadataEditorResult</h3>
@@ -880,7 +881,7 @@ at <code>totalBytes</code>.</p>
880
881
 
881
882
 
882
883
 
883
- <table><thead><tr><th align="left">Property</th><th align="left">Type</th><th align="left">Description</th></tr></thead><tbody><tr><td align="left"><a id="addcustomentry"></a> <code>addCustomEntry</code></td><td align="left">(<code>key?</code>: <code>string</code>, <code>value?</code>: <code>string</code>) => <code>void</code></td><td align="left">-</td></tr><tr><td align="left"><a id="cachecontrol"></a> <code>cacheControl</code></td><td align="left"><code>string</code></td><td align="left">-</td></tr><tr><td align="left"><a id="contenttype"></a> <code>contentType</code></td><td align="left"><code>string</code></td><td align="left">-</td></tr><tr><td align="left"><a id="custom"></a> <code>custom</code></td><td align="left"><a href="#custommetadataentry"><code>CustomMetadataEntry</code></a>[]</td><td align="left">-</td></tr><tr><td align="left"><a id="dispatch"></a> <code>dispatch</code></td><td align="left">(<code>action</code>: <a href="#metadataeditoraction"><code>MetadataEditorAction</code></a>) => <code>void</code></td><td align="left">Raw dispatch — prefer the named helpers.</td></tr><tr><td align="left"><a id="errorcount-1"></a> <code>errorCount</code></td><td align="left"><code>number</code></td><td align="left">-</td></tr><tr><td align="left"><a id="isdirty"></a> <code>isDirty</code></td><td align="left"><code>boolean</code></td><td align="left"><code>true</code> once any modifying action fired since the last <code>reset</code>/successful <code>save</code>. Reference-compare semantics — manual re-entry of the original values does NOT clear it.</td></tr><tr><td align="left"><a id="issaving"></a> <code>isSaving</code></td><td align="left"><code>boolean</code></td><td align="left">-</td></tr><tr><td align="left"><a id="isvalid"></a> <code>isValid</code></td><td align="left"><code>boolean</code></td><td align="left">Convenience: <code>errorCount === 0</code>.</td></tr><tr><td align="left"><a id="removecustomentry"></a> <code>removeCustomEntry</code></td><td align="left">(<code>id</code>: <code>string</code>) => <code>void</code></td><td align="left">-</td></tr><tr><td align="left"><a id="reset"></a> <code>reset</code></td><td align="left">() => <code>void</code></td><td align="left">Restore the initial values. Clears <code>isDirty</code>.</td></tr><tr><td align="left"><a id="save"></a> <code>save</code></td><td align="left">() => <code>Promise</code>&#x3C;<code>any</code>></td><td align="left"><code>updateMetadata(ref(storage, path), toPatch())</code>. Errors surface via <code>saveError</code> (typed <code>StorageError</code>), not throws — resolves <code>undefined</code> on failure or when the draft is invalid. On success the draft becomes the new baseline (<code>isDirty</code> clears) and the fresh <code>FullMetadata</code> is returned.</td></tr><tr><td align="left"><a id="saveerror"></a> <code>saveError</code></td><td align="left"><code>Error</code></td><td align="left">-</td></tr><tr><td align="left"><a id="setcachecontrol"></a> <code>setCacheControl</code></td><td align="left">(<code>value</code>: <code>string</code>) => <code>void</code></td><td align="left">-</td></tr><tr><td align="left"><a id="setcontenttype"></a> <code>setContentType</code></td><td align="left">(<code>value</code>: <code>string</code>) => <code>void</code></td><td align="left">-</td></tr><tr><td align="left"><a id="setcustomkey"></a> <code>setCustomKey</code></td><td align="left">(<code>id</code>: <code>string</code>, <code>key</code>: <code>string</code>) => <code>void</code></td><td align="left">-</td></tr><tr><td align="left"><a id="setcustomvalue"></a> <code>setCustomValue</code></td><td align="left">(<code>id</code>: <code>string</code>, <code>value</code>: <code>string</code>) => <code>void</code></td><td align="left">-</td></tr><tr><td align="left"><a id="topatch"></a> <code>toPatch</code></td><td align="left">() => <code>SettableMetadata</code></td><td align="left">Serialize the draft to an <code>updateMetadata</code> patch. Empty <code>contentType</code>/<code>cacheControl</code> become <code>undefined</code> — which LEAVES the previous value (the sandbox doesn’t model null-clears; see <code>pyric/storage</code>’s <code>updateMetadata</code> doc). <code>customMetadata</code> is always included and replaces wholesale, so row removal works.</td></tr></tbody></table></div>
884
+ <table><thead><tr><th align="left">Property</th><th align="left">Type</th><th align="left">Description</th></tr></thead><tbody><tr><td align="left"><a id="addcustomentry"></a> <code>addCustomEntry</code></td><td align="left">(<code>key?</code>: <code>string</code>, <code>value?</code>: <code>string</code>) => <code>void</code></td><td align="left">-</td></tr><tr><td align="left"><a id="cachecontrol"></a> <code>cacheControl</code></td><td align="left"><code>string</code></td><td align="left">-</td></tr><tr><td align="left"><a id="contenttype"></a> <code>contentType</code></td><td align="left"><code>string</code></td><td align="left">-</td></tr><tr><td align="left"><a id="custom"></a> <code>custom</code></td><td align="left"><a href="#custommetadataentry"><code>CustomMetadataEntry</code></a>[]</td><td align="left">-</td></tr><tr><td align="left"><a id="dispatch"></a> <code>dispatch</code></td><td align="left">(<code>action</code>: <a href="#metadataeditoraction"><code>MetadataEditorAction</code></a>) => <code>void</code></td><td align="left">Raw dispatch — prefer the named helpers.</td></tr><tr><td align="left"><a id="errorcount-1"></a> <code>errorCount</code></td><td align="left"><code>number</code></td><td align="left">-</td></tr><tr><td align="left"><a id="isdirty"></a> <code>isDirty</code></td><td align="left"><code>boolean</code></td><td align="left"><code>true</code> once any modifying action fired since the last <code>reset</code>/successful <code>save</code>. Reference-compare semantics — manual re-entry of the original values does NOT clear it.</td></tr><tr><td align="left"><a id="issaving"></a> <code>isSaving</code></td><td align="left"><code>boolean</code></td><td align="left">-</td></tr><tr><td align="left"><a id="isvalid"></a> <code>isValid</code></td><td align="left"><code>boolean</code></td><td align="left">Convenience: <code>errorCount === 0</code>.</td></tr><tr><td align="left"><a id="removecustomentry"></a> <code>removeCustomEntry</code></td><td align="left">(<code>id</code>: <code>string</code>) => <code>void</code></td><td align="left">-</td></tr><tr><td align="left"><a id="reset"></a> <code>reset</code></td><td align="left">() => <code>void</code></td><td align="left">Restore the initial values. Clears <code>isDirty</code>.</td></tr><tr><td align="left"><a id="save"></a> <code>save</code></td><td align="left">() => <code>Promise</code>&#x3C;<a href="/docs/pyric-storage-reference-api/#fullmetadata"><code>FullMetadata</code></a>></td><td align="left"><code>updateMetadata(ref(storage, path), toPatch())</code>. Errors surface via <code>saveError</code> (typed <code>StorageError</code>), not throws — resolves <code>undefined</code> on failure or when the draft is invalid. On success the draft becomes the new baseline (<code>isDirty</code> clears) and the fresh <code>FullMetadata</code> is returned.</td></tr><tr><td align="left"><a id="saveerror"></a> <code>saveError</code></td><td align="left"><code>Error</code></td><td align="left">-</td></tr><tr><td align="left"><a id="setcachecontrol"></a> <code>setCacheControl</code></td><td align="left">(<code>value</code>: <code>string</code>) => <code>void</code></td><td align="left">-</td></tr><tr><td align="left"><a id="setcontenttype"></a> <code>setContentType</code></td><td align="left">(<code>value</code>: <code>string</code>) => <code>void</code></td><td align="left">-</td></tr><tr><td align="left"><a id="setcustomkey"></a> <code>setCustomKey</code></td><td align="left">(<code>id</code>: <code>string</code>, <code>key</code>: <code>string</code>) => <code>void</code></td><td align="left">-</td></tr><tr><td align="left"><a id="setcustomvalue"></a> <code>setCustomValue</code></td><td align="left">(<code>id</code>: <code>string</code>, <code>value</code>: <code>string</code>) => <code>void</code></td><td align="left">-</td></tr><tr><td align="left"><a id="topatch"></a> <code>toPatch</code></td><td align="left">() => <a href="/docs/pyric-storage-reference-api/#settablemetadata"><code>SettableMetadata</code></a></td><td align="left">Serialize the draft to an <code>updateMetadata</code> patch. Empty <code>contentType</code>/<code>cacheControl</code> become <code>undefined</code> — which LEAVES the previous value (the sandbox doesn’t model null-clears; see <code>pyric/storage</code>’s <code>updateMetadata</code> doc). <code>customMetadata</code> is always included and replaces wholesale, so row removal works.</td></tr></tbody></table></div>
884
885
  <hr>
885
886
  <p><a id="useobjectuploadoptions"></a></p>
886
887
  <h3 id="useobjectuploadoptions">UseObjectUploadOptions</h3>
@@ -1150,7 +1151,7 @@ at <code>totalBytes</code>.</p>
1150
1151
 
1151
1152
 
1152
1153
 
1153
- <table><thead><tr><th align="left">Property</th><th align="left">Type</th><th align="left">Description</th></tr></thead><tbody><tr><td align="left"><a id="entries-2"></a> <code>entries</code></td><td align="left"><a href="#storagelistentry"><code>StorageListEntry</code></a>[]</td><td align="left">Folders-first merged row model. Derived from <code>prefixes</code> + <code>items</code>.</td></tr><tr><td align="left"><a id="error-5"></a> <code>error</code></td><td align="left"><code>Error</code></td><td align="left"><code>StorageError</code> (with a typed <code>storage/&#x3C;code></code> on <code>.code</code>) from the sandbox. A denied list is <code>error.code === 'storage/unauthorized'</code> (ST-B2).</td></tr><tr><td align="left"><a id="insertitem"></a> <code>insertItem</code></td><td align="left">(<code>fullPath</code>: <code>string</code>) => <code>void</code></td><td align="left">Optimistic seam (consumed by M3 upload / M6 bulk ops, exposed now so those hooks layer on without reshaping this one). Inserts <code>fullPath</code> into the local list immediately, applying the same prefix→folder synthesis <code>listAll</code> would: a direct child becomes an item, a deeper descendant surfaces as its first-segment folder. A trailing slash declares a folder (the GCS placeholder convention <code>useObjectUpload.createFolder</code> writes): a direct trailing-slash child inserts a prefix, not an item. No-op for paths outside the listed path, duplicates, or when <code>status</code> is <code>'idle'</code>. What each call ACTUALLY inserted is recorded (keyed by the given <code>fullPath</code>) so <code>removeItem</code> can reverse it precisely. Rollback = <code>removeItem</code> or <code>refresh</code>.</td></tr><tr><td align="left"><a id="items"></a> <code>items</code></td><td align="left"><code>StorageReference</code>[]</td><td align="left">Direct child objects under <code>path</code>. Sorted by <code>fullPath</code>.</td></tr><tr><td align="left"><a id="prefixes"></a> <code>prefixes</code></td><td align="left"><code>StorageReference</code>[]</td><td align="left">Synthetic folder prefixes under <code>path</code>. Sorted by <code>fullPath</code>.</td></tr><tr><td align="left"><a id="refresh"></a> <code>refresh</code></td><td align="left">() => <code>void</code></td><td align="left">Re-run <code>listAll</code> for the current path.</td></tr><tr><td align="left"><a id="removeitem"></a> <code>removeItem</code></td><td align="left">(<code>fullPath</code>: <code>string</code>) => <code>void</code></td><td align="left">Optimistic counterpart. When <code>fullPath</code> was previously given to <code>insertItem</code>, this reverses EXACTLY what that call inserted: a deep upload that synthesized a first-segment folder row removes that folder row, and an insert that was a no-op (the row already existed — e.g. a real, listed folder) removes NOTHING, so a failed upload can never delete server-truth rows. For paths never seen by <code>insertItem</code> it removes the matching item/folder row directly (the optimistic-delete use). Rollback = <code>refresh</code>.</td></tr><tr><td align="left"><a id="status-2"></a> <code>status</code></td><td align="left"><a href="#storageliststatus"><code>StorageListStatus</code></a></td><td align="left"><code>'idle'</code> only when <code>storage</code> is null/undefined.</td></tr></tbody></table></div>
1154
+ <table><thead><tr><th align="left">Property</th><th align="left">Type</th><th align="left">Description</th></tr></thead><tbody><tr><td align="left"><a id="entries-2"></a> <code>entries</code></td><td align="left"><a href="#storagelistentry"><code>StorageListEntry</code></a>[]</td><td align="left">Folders-first merged row model. Derived from <code>prefixes</code> + <code>items</code>.</td></tr><tr><td align="left"><a id="error-5"></a> <code>error</code></td><td align="left"><code>Error</code></td><td align="left"><code>StorageError</code> (with a typed <code>storage/&#x3C;code></code> on <code>.code</code>) from the sandbox. A denied list is <code>error.code === 'storage/unauthorized'</code> (ST-B2).</td></tr><tr><td align="left"><a id="insertitem"></a> <code>insertItem</code></td><td align="left">(<code>fullPath</code>: <code>string</code>) => <code>void</code></td><td align="left">Optimistic seam (consumed by M3 upload / M6 bulk ops, exposed now so those hooks layer on without reshaping this one). Inserts <code>fullPath</code> into the local list immediately, applying the same prefix→folder synthesis <code>listAll</code> would: a direct child becomes an item, a deeper descendant surfaces as its first-segment folder. A trailing slash declares a folder (the GCS placeholder convention <code>useObjectUpload.createFolder</code> writes): a direct trailing-slash child inserts a prefix, not an item. No-op for paths outside the listed path, duplicates, or when <code>status</code> is <code>'idle'</code>. What each call ACTUALLY inserted is recorded (keyed by the given <code>fullPath</code>) so <code>removeItem</code> can reverse it precisely. Rollback = <code>removeItem</code> or <code>refresh</code>.</td></tr><tr><td align="left"><a id="items"></a> <code>items</code></td><td align="left"><a href="/docs/pyric-storage-reference-api/#storagereference"><code>StorageReference</code></a>[]</td><td align="left">Direct child objects under <code>path</code>. Sorted by <code>fullPath</code>.</td></tr><tr><td align="left"><a id="prefixes"></a> <code>prefixes</code></td><td align="left"><a href="/docs/pyric-storage-reference-api/#storagereference"><code>StorageReference</code></a>[]</td><td align="left">Synthetic folder prefixes under <code>path</code>. Sorted by <code>fullPath</code>.</td></tr><tr><td align="left"><a id="refresh"></a> <code>refresh</code></td><td align="left">() => <code>void</code></td><td align="left">Re-run <code>listAll</code> for the current path.</td></tr><tr><td align="left"><a id="removeitem"></a> <code>removeItem</code></td><td align="left">(<code>fullPath</code>: <code>string</code>) => <code>void</code></td><td align="left">Optimistic counterpart. When <code>fullPath</code> was previously given to <code>insertItem</code>, this reverses EXACTLY what that call inserted: a deep upload that synthesized a first-segment folder row removes that folder row, and an insert that was a no-op (the row already existed — e.g. a real, listed folder) removes NOTHING, so a failed upload can never delete server-truth rows. For paths never seen by <code>insertItem</code> it removes the matching item/folder row directly (the optimistic-delete use). Rollback = <code>refresh</code>.</td></tr><tr><td align="left"><a id="status-2"></a> <code>status</code></td><td align="left"><a href="#storageliststatus"><code>StorageListStatus</code></a></td><td align="left"><code>'idle'</code> only when <code>storage</code> is null/undefined.</td></tr></tbody></table></div>
1154
1155
  <hr>
1155
1156
  <p><a id="usestorageobjectresult"></a></p>
1156
1157
  <h3 id="usestorageobjectresult">UseStorageObjectResult</h3>
@@ -1210,7 +1211,7 @@ at <code>totalBytes</code>.</p>
1210
1211
 
1211
1212
 
1212
1213
 
1213
- <table><thead><tr><th align="left">Property</th><th align="left">Type</th><th align="left">Description</th></tr></thead><tbody><tr><td align="left"><a id="blob-1"></a> <code>blob</code></td><td align="left"><code>Blob</code></td><td align="left">-</td></tr><tr><td align="left"><a id="bloberror"></a> <code>blobError</code></td><td align="left"><code>Error</code></td><td align="left">-</td></tr><tr><td align="left"><a id="blobstatus"></a> <code>blobStatus</code></td><td align="left"><a href="#storageobjectstatus"><code>StorageObjectStatus</code></a></td><td align="left">Blob read state. Stays <code>'idle'</code> until <code>loadBlob()</code>, the blob is LAZY; metadata alone never downloads bytes.</td></tr><tr><td align="left"><a id="bloburl-1"></a> <code>blobUrl</code></td><td align="left"><code>string</code></td><td align="left"><code>URL.createObjectURL</code> handle for the loaded blob, used as the local preview channel. Revoked automatically when the blob is replaced, the path changes, or the hook unmounts.</td></tr><tr><td align="left"><a id="error-6"></a> <code>error</code></td><td align="left"><code>Error</code></td><td align="left">Typed <code>StorageError</code> (<code>storage/object-not-found</code>, <code>storage/unauthorized</code>, …).</td></tr><tr><td align="left"><a id="loadblob"></a> <code>loadBlob</code></td><td align="left">() => <code>void</code></td><td align="left">Fetch the bytes via <code>getBlob</code>. Subsequent calls re-fetch.</td></tr><tr><td align="left"><a id="metadata-3"></a> <code>metadata</code></td><td align="left"><code>any</code></td><td align="left">-</td></tr><tr><td align="left"><a id="refresh-1"></a> <code>refresh</code></td><td align="left">() => <code>void</code></td><td align="left">Re-read the metadata (also resets the blob, the object may have been overwritten).</td></tr><tr><td align="left"><a id="status-3"></a> <code>status</code></td><td align="left"><a href="#storageobjectstatus"><code>StorageObjectStatus</code></a></td><td align="left">Metadata read state. <code>'idle'</code> when <code>storage</code> or <code>path</code> is null.</td></tr></tbody></table></div>
1214
+ <table><thead><tr><th align="left">Property</th><th align="left">Type</th><th align="left">Description</th></tr></thead><tbody><tr><td align="left"><a id="blob-1"></a> <code>blob</code></td><td align="left"><code>Blob</code></td><td align="left">-</td></tr><tr><td align="left"><a id="bloberror"></a> <code>blobError</code></td><td align="left"><code>Error</code></td><td align="left">-</td></tr><tr><td align="left"><a id="blobstatus"></a> <code>blobStatus</code></td><td align="left"><a href="#storageobjectstatus"><code>StorageObjectStatus</code></a></td><td align="left">Blob read state. Stays <code>'idle'</code> until <code>loadBlob()</code>, the blob is LAZY; metadata alone never downloads bytes.</td></tr><tr><td align="left"><a id="bloburl-1"></a> <code>blobUrl</code></td><td align="left"><code>string</code></td><td align="left"><code>URL.createObjectURL</code> handle for the loaded blob, used as the local preview channel. Revoked automatically when the blob is replaced, the path changes, or the hook unmounts.</td></tr><tr><td align="left"><a id="error-6"></a> <code>error</code></td><td align="left"><code>Error</code></td><td align="left">Typed <code>StorageError</code> (<code>storage/object-not-found</code>, <code>storage/unauthorized</code>, …).</td></tr><tr><td align="left"><a id="loadblob"></a> <code>loadBlob</code></td><td align="left">() => <code>void</code></td><td align="left">Fetch the bytes via <code>getBlob</code>. Subsequent calls re-fetch.</td></tr><tr><td align="left"><a id="metadata-3"></a> <code>metadata</code></td><td align="left"><a href="/docs/pyric-storage-reference-api/#fullmetadata"><code>FullMetadata</code></a></td><td align="left">-</td></tr><tr><td align="left"><a id="refresh-1"></a> <code>refresh</code></td><td align="left">() => <code>void</code></td><td align="left">Re-read the metadata (also resets the blob, the object may have been overwritten).</td></tr><tr><td align="left"><a id="status-3"></a> <code>status</code></td><td align="left"><a href="#storageobjectstatus"><code>StorageObjectStatus</code></a></td><td align="left">Metadata read state. <code>'idle'</code> when <code>storage</code> or <code>path</code> is null.</td></tr></tbody></table></div>
1214
1215
  <hr>
1215
1216
  <p><a id="usestoragerulesgateoptions"></a></p>
1216
1217
  <h3 id="usestoragerulesgateoptions">UseStorageRulesGateOptions</h3>
@@ -1255,7 +1256,7 @@ at <code>totalBytes</code>.</p>
1255
1256
 
1256
1257
 
1257
1258
 
1258
- <table><thead><tr><th align="left">Property</th><th align="left">Type</th><th align="left">Description</th></tr></thead><tbody><tr><td align="left"><a id="identity"></a> <code>identity?</code></td><td align="left"><code>any</code></td><td align="left">Identity override. <code>null</code> is anonymous; OMIT the field to use the handle’s own identity (the sandbox context’s <code>auth</code>).</td></tr><tr><td align="left"><a id="paths"></a> <code>paths?</code></td><td align="left"><code>string</code> | readonly <code>string</code>[]</td><td align="left">Path (or paths) to pre-evaluate into <code>verdicts</code>, keyed by the normalized path. Ad-hoc paths (e.g. browser rows) go through <code>verdictFor</code> instead — the two are the same evaluation.</td></tr><tr><td align="left"><a id="rules"></a> <code>rules?</code></td><td align="left"><code>any</code></td><td align="left">Explicit rules source — raw rules text (parsed here; a malformed string surfaces as <code>status: 'error'</code>) or a pre-parsed <code>StorageRules</code> handle. Overrides the sandbox’s deployed ruleset when both exist.</td></tr><tr><td align="left"><a id="writeresource"></a> <code>writeResource?</code></td><td align="left">{ <code>contentType?</code>: <code>string</code>; <code>size</code>: <code>number</code>; }</td><td align="left">The about-to-write payload bound to <code>request.resource</code> for the WRITE evaluation — pass <code>{ size, contentType }</code> when gating a specific upload so size/contentType-conditioned rules evaluate truthfully. When omitted, <code>request.resource</code> is unset, which is exactly DELETE semantics (deletes carry no inbound payload) — a rule like <code>request.resource.size &#x3C; N</code> then denies, the conservative answer for uploads.</td></tr><tr><td align="left"><code>writeResource.contentType?</code></td><td align="left"><code>string</code></td><td align="left">-</td></tr><tr><td align="left"><code>writeResource.size</code></td><td align="left"><code>number</code></td><td align="left">-</td></tr></tbody></table></div>
1259
+ <table><thead><tr><th align="left">Property</th><th align="left">Type</th><th align="left">Description</th></tr></thead><tbody><tr><td align="left"><a id="identity"></a> <code>identity?</code></td><td align="left"><a href="/docs/pyric-storage-reference-api/#storageauth"><code>StorageAuth</code></a></td><td align="left">Identity override. <code>null</code> is anonymous; OMIT the field to use the handle’s own identity (the sandbox context’s <code>auth</code>).</td></tr><tr><td align="left"><a id="paths"></a> <code>paths?</code></td><td align="left"><code>string</code> | readonly <code>string</code>[]</td><td align="left">Path (or paths) to pre-evaluate into <code>verdicts</code>, keyed by the normalized path. Ad-hoc paths (e.g. browser rows) go through <code>verdictFor</code> instead — the two are the same evaluation.</td></tr><tr><td align="left"><a id="rules"></a> <code>rules?</code></td><td align="left"><code>string</code> | <a href="/docs/pyric-storage-reference-api/#storagerules"><code>StorageRules</code></a></td><td align="left">Explicit rules source — raw rules text (parsed here; a malformed string surfaces as <code>status: 'error'</code>) or a pre-parsed <code>StorageRules</code> handle. Overrides the sandbox’s deployed ruleset when both exist.</td></tr><tr><td align="left"><a id="writeresource"></a> <code>writeResource?</code></td><td align="left">{ <code>contentType?</code>: <code>string</code>; <code>size</code>: <code>number</code>; }</td><td align="left">The about-to-write payload bound to <code>request.resource</code> for the WRITE evaluation — pass <code>{ size, contentType }</code> when gating a specific upload so size/contentType-conditioned rules evaluate truthfully. When omitted, <code>request.resource</code> is unset, which is exactly DELETE semantics (deletes carry no inbound payload) — a rule like <code>request.resource.size &#x3C; N</code> then denies, the conservative answer for uploads.</td></tr><tr><td align="left"><code>writeResource.contentType?</code></td><td align="left"><code>string</code></td><td align="left">-</td></tr><tr><td align="left"><code>writeResource.size</code></td><td align="left"><code>number</code></td><td align="left">-</td></tr></tbody></table></div>
1259
1260
  <hr>
1260
1261
  <p><a id="usestoragerulesgateresult"></a></p>
1261
1262
  <h3 id="usestoragerulesgateresult">UseStorageRulesGateResult</h3>
@@ -1305,7 +1306,7 @@ at <code>totalBytes</code>.</p>
1305
1306
 
1306
1307
 
1307
1308
 
1308
- <table><thead><tr><th align="left">Property</th><th align="left">Type</th><th align="left">Description</th></tr></thead><tbody><tr><td align="left"><a id="advisory"></a> <code>advisory</code></td><td align="left"><code>boolean</code></td><td align="left">Always false: <code>pyric/storage</code> handles are sandbox mirrors.</td></tr><tr><td align="left"><a id="error-7"></a> <code>error</code></td><td align="left"><code>Error</code></td><td align="left">Rules-resolution failure (e.g. a malformed <code>rules</code> string).</td></tr><tr><td align="left"><a id="identity-1"></a> <code>identity</code></td><td align="left"><code>any</code></td><td align="left">The identity the verdicts evaluate under.</td></tr><tr><td align="left"><a id="source"></a> <code>source</code></td><td align="left"><a href="#storagerulessource"><code>StorageRulesSource</code></a></td><td align="left">Where the active ruleset came from.</td></tr><tr><td align="left"><a id="status-4"></a> <code>status</code></td><td align="left"><a href="#storagerulesgatestatus"><code>StorageRulesGateStatus</code></a></td><td align="left"><code>'idle'</code> only when <code>storage</code> is null/undefined.</td></tr><tr><td align="left"><a id="verdictfor"></a> <code>verdictFor</code></td><td align="left">(<code>path</code>: <code>string</code>) => <a href="#storagegateverdict"><code>StorageGateVerdict</code></a></td><td align="left">Evaluate an arbitrary path under the current ruleset + identity. Pure and synchronous once <code>status</code> is <code>'ready'</code>; before that (and whenever no rules are reachable) it returns the allow-all verdict — the gate FAILS OPEN, because affordances are advisory and the real enforcement (sandbox throw / server denial) stays authoritative.</td></tr><tr><td align="left"><a id="verdicts"></a> <code>verdicts</code></td><td align="left"><code>Record</code>&#x3C;<code>string</code>, <a href="#storagegateverdict"><code>StorageGateVerdict</code></a>></td><td align="left">Pre-evaluated verdicts for <code>options.paths</code>, keyed by normalized path.</td></tr></tbody></table></div>
1309
+ <table><thead><tr><th align="left">Property</th><th align="left">Type</th><th align="left">Description</th></tr></thead><tbody><tr><td align="left"><a id="advisory"></a> <code>advisory</code></td><td align="left"><code>boolean</code></td><td align="left">Always false: <code>pyric/storage</code> handles are sandbox mirrors.</td></tr><tr><td align="left"><a id="error-7"></a> <code>error</code></td><td align="left"><code>Error</code></td><td align="left">Rules-resolution failure (e.g. a malformed <code>rules</code> string).</td></tr><tr><td align="left"><a id="identity-1"></a> <code>identity</code></td><td align="left"><a href="/docs/pyric-storage-reference-api/#storageauth"><code>StorageAuth</code></a></td><td align="left">The identity the verdicts evaluate under.</td></tr><tr><td align="left"><a id="source"></a> <code>source</code></td><td align="left"><a href="#storagerulessource"><code>StorageRulesSource</code></a></td><td align="left">Where the active ruleset came from.</td></tr><tr><td align="left"><a id="status-4"></a> <code>status</code></td><td align="left"><a href="#storagerulesgatestatus"><code>StorageRulesGateStatus</code></a></td><td align="left"><code>'idle'</code> only when <code>storage</code> is null/undefined.</td></tr><tr><td align="left"><a id="verdictfor"></a> <code>verdictFor</code></td><td align="left">(<code>path</code>: <code>string</code>) => <a href="#storagegateverdict"><code>StorageGateVerdict</code></a></td><td align="left">Evaluate an arbitrary path under the current ruleset + identity. Pure and synchronous once <code>status</code> is <code>'ready'</code>; before that (and whenever no rules are reachable) it returns the allow-all verdict — the gate FAILS OPEN, because affordances are advisory and the real enforcement (sandbox throw / server denial) stays authoritative.</td></tr><tr><td align="left"><a id="verdicts"></a> <code>verdicts</code></td><td align="left"><code>Record</code>&#x3C;<code>string</code>, <a href="#storagegateverdict"><code>StorageGateVerdict</code></a>></td><td align="left">Pre-evaluated verdicts for <code>options.paths</code>, keyed by normalized path.</td></tr></tbody></table></div>
1309
1310
  <hr>
1310
1311
  <p><a id="usestorageselectionresult"></a></p>
1311
1312
  <h3 id="usestorageselectionresult">UseStorageSelectionResult</h3>
@@ -1529,7 +1530,7 @@ ancestors from pending (they are real prefixes now).</p>
1529
1530
  <hr>
1530
1531
  <p><a id="storageapi"></a></p>
1531
1532
  <h3 id="storageapi">StorageApi</h3>
1532
- <pre class="astro-code one-dark-pro" style="background-color:#282c34;color:#abb2bf; overflow-x: auto;" tabindex="0" data-language="ts"><code><span class="line"><span style="color:#C678DD">type</span><span style="color:#E5C07B"> StorageApi</span><span style="color:#56B6C2"> =</span><span style="color:#E5C07B"> Pick</span><span style="color:#ABB2BF">&#x3C;</span><span style="color:#E5C07B">any</span><span style="color:#ABB2BF">,</span></span>
1533
+ <pre class="astro-code one-dark-pro" style="background-color:#282c34;color:#abb2bf; overflow-x: auto;" tabindex="0" data-language="ts"><code><span class="line"><span style="color:#C678DD">type</span><span style="color:#E5C07B"> StorageApi</span><span style="color:#56B6C2"> =</span><span style="color:#E5C07B"> Pick</span><span style="color:#ABB2BF">&#x3C;</span><span style="color:#E5C07B">pyric</span><span style="color:#ABB2BF">-</span><span style="color:#E5C07B">storage</span><span style="color:#ABB2BF">-</span><span style="color:#E5C07B">reference</span><span style="color:#ABB2BF">-</span><span style="color:#E5C07B">api</span><span style="color:#ABB2BF">,</span></span>
1533
1534
  <span class="line"><span style="color:#ABB2BF"> | </span><span style="color:#98C379">"ref"</span></span>
1534
1535
  <span class="line"><span style="color:#ABB2BF"> | </span><span style="color:#98C379">"listAll"</span></span>
1535
1536
  <span class="line"><span style="color:#ABB2BF"> | </span><span style="color:#98C379">"getMetadata"</span></span>
@@ -1728,7 +1729,7 @@ names).</p>
1728
1729
  <hr>
1729
1730
  <p><a id="initmetadataeditorstate"></a></p>
1730
1731
  <h3 id="initmetadataeditorstate">initMetadataEditorState()</h3>
1731
- <pre class="astro-code one-dark-pro" style="background-color:#282c34;color:#abb2bf; overflow-x: auto;" tabindex="0" data-language="ts"><code><span class="line"><span style="color:#C678DD">function</span><span style="color:#61AFEF"> initMetadataEditorState</span><span style="color:#ABB2BF">(</span><span style="color:#E06C75;font-style:italic">initial</span><span style="color:#ABB2BF">: </span><span style="color:#E5C07B">any</span><span style="color:#ABB2BF">): </span><span style="color:#E5C07B">MetadataEditorState</span><span style="color:#ABB2BF">;</span></span></code></pre>
1732
+ <pre class="astro-code one-dark-pro" style="background-color:#282c34;color:#abb2bf; overflow-x: auto;" tabindex="0" data-language="ts"><code><span class="line"><span style="color:#C678DD">function</span><span style="color:#61AFEF"> initMetadataEditorState</span><span style="color:#ABB2BF">(</span><span style="color:#E06C75;font-style:italic">initial</span><span style="color:#ABB2BF">: </span><span style="color:#E5C07B">SettableMetadata</span><span style="color:#ABB2BF">): </span><span style="color:#E5C07B">MetadataEditorState</span><span style="color:#ABB2BF">;</span></span></code></pre>
1732
1733
  <p>Build the edit state from the metadata a <code>getMetadata</code> /
1733
1734
  <code>useStorageObject</code> read returned.</p>
1734
1735
  <h4 id="parameters-4">Parameters</h4>
@@ -1745,7 +1746,7 @@ names).</p>
1745
1746
 
1746
1747
 
1747
1748
 
1748
- <table><thead><tr><th align="left">Parameter</th><th align="left">Type</th></tr></thead><tbody><tr><td align="left"><code>initial</code></td><td align="left"><code>any</code></td></tr></tbody></table></div>
1749
+ <table><thead><tr><th align="left">Parameter</th><th align="left">Type</th></tr></thead><tbody><tr><td align="left"><code>initial</code></td><td align="left"><a href="/docs/pyric-storage-reference-api/#settablemetadata"><code>SettableMetadata</code></a></td></tr></tbody></table></div>
1749
1750
  <h4 id="returns-4">Returns</h4>
1750
1751
  <p><a href="#metadataeditorstate"><code>MetadataEditorState</code></a></p>
1751
1752
  <hr>
@@ -2131,7 +2132,7 @@ means metadata-only.</p>
2131
2132
 
2132
2133
 
2133
2134
 
2134
- <table><thead><tr><th align="left">Parameter</th><th align="left">Type</th></tr></thead><tbody><tr><td align="left"><code>metadata</code></td><td align="left"><code>FullMetadata</code></td></tr><tr><td align="left"><code>consumerPreviews</code></td><td align="left">readonly <a href="#storagepreview"><code>StoragePreview</code></a>[]</td></tr></tbody></table></div>
2135
+ <table><thead><tr><th align="left">Parameter</th><th align="left">Type</th></tr></thead><tbody><tr><td align="left"><code>metadata</code></td><td align="left"><a href="/docs/pyric-storage-reference-api/#fullmetadata"><code>FullMetadata</code></a></td></tr><tr><td align="left"><code>consumerPreviews</code></td><td align="left">readonly <a href="#storagepreview"><code>StoragePreview</code></a>[]</td></tr></tbody></table></div>
2135
2136
  <h4 id="returns-16">Returns</h4>
2136
2137
  <p><a href="#storagepreview"><code>StoragePreview</code></a></p>
2137
2138
  <hr>
@@ -2237,7 +2238,7 @@ enter/leave pairs so crossing child elements doesn’t flicker).</p>
2237
2238
  <p><a id="usemetadataeditor"></a></p>
2238
2239
  <h3 id="usemetadataeditor">useMetadataEditor()</h3>
2239
2240
  <pre class="astro-code one-dark-pro" style="background-color:#282c34;color:#abb2bf; overflow-x: auto;" tabindex="0" data-language="ts"><code><span class="line"><span style="color:#C678DD">function</span><span style="color:#61AFEF"> useMetadataEditor</span><span style="color:#ABB2BF">(</span></span>
2240
- <span class="line"><span style="color:#E06C75;font-style:italic"> storage</span><span style="color:#ABB2BF">: </span><span style="color:#E5C07B">any</span><span style="color:#ABB2BF">,</span></span>
2241
+ <span class="line"><span style="color:#E06C75;font-style:italic"> storage</span><span style="color:#ABB2BF">: </span><span style="color:#E5C07B">FirebaseStorage</span><span style="color:#ABB2BF">,</span></span>
2241
2242
  <span class="line"><span style="color:#E06C75;font-style:italic"> path</span><span style="color:#ABB2BF">: </span><span style="color:#E5C07B">string</span><span style="color:#ABB2BF">,</span></span>
2242
2243
  <span class="line"><span style="color:#E06C75;font-style:italic"> options</span><span style="color:#C678DD">?</span><span style="color:#ABB2BF">: </span><span style="color:#E5C07B">UseMetadataEditorOptions</span><span style="color:#ABB2BF">): </span><span style="color:#E5C07B">UseMetadataEditorResult</span><span style="color:#ABB2BF">;</span></span></code></pre>
2243
2244
  <p>Headless metadata editor — the <code>useDocumentEditor</code> reducer pattern
@@ -2267,13 +2268,13 @@ helpers and the save half.</p>
2267
2268
 
2268
2269
 
2269
2270
 
2270
- <table><thead><tr><th align="left">Parameter</th><th align="left">Type</th></tr></thead><tbody><tr><td align="left"><code>storage</code></td><td align="left"><code>any</code></td></tr><tr><td align="left"><code>path</code></td><td align="left"><code>string</code></td></tr><tr><td align="left"><code>options?</code></td><td align="left"><a href="#usemetadataeditoroptions"><code>UseMetadataEditorOptions</code></a></td></tr></tbody></table></div>
2271
+ <table><thead><tr><th align="left">Parameter</th><th align="left">Type</th></tr></thead><tbody><tr><td align="left"><code>storage</code></td><td align="left"><a href="/docs/pyric-storage-reference-api/#firebasestorage"><code>FirebaseStorage</code></a></td></tr><tr><td align="left"><code>path</code></td><td align="left"><code>string</code></td></tr><tr><td align="left"><code>options?</code></td><td align="left"><a href="#usemetadataeditoroptions"><code>UseMetadataEditorOptions</code></a></td></tr></tbody></table></div>
2271
2272
  <h4 id="returns-20">Returns</h4>
2272
2273
  <p><a href="#usemetadataeditorresult"><code>UseMetadataEditorResult</code></a></p>
2273
2274
  <hr>
2274
2275
  <p><a id="useobjectupload"></a></p>
2275
2276
  <h3 id="useobjectupload">useObjectUpload()</h3>
2276
- <pre class="astro-code one-dark-pro" style="background-color:#282c34;color:#abb2bf; overflow-x: auto;" tabindex="0" data-language="ts"><code><span class="line"><span style="color:#C678DD">function</span><span style="color:#61AFEF"> useObjectUpload</span><span style="color:#ABB2BF">(</span><span style="color:#E06C75;font-style:italic">storage</span><span style="color:#ABB2BF">: </span><span style="color:#E5C07B">any</span><span style="color:#ABB2BF">, </span><span style="color:#E06C75;font-style:italic">options</span><span style="color:#C678DD">?</span><span style="color:#ABB2BF">: </span><span style="color:#E5C07B">UseObjectUploadOptions</span><span style="color:#ABB2BF">): </span><span style="color:#E5C07B">UseObjectUploadResult</span><span style="color:#ABB2BF">;</span></span></code></pre>
2277
+ <pre class="astro-code one-dark-pro" style="background-color:#282c34;color:#abb2bf; overflow-x: auto;" tabindex="0" data-language="ts"><code><span class="line"><span style="color:#C678DD">function</span><span style="color:#61AFEF"> useObjectUpload</span><span style="color:#ABB2BF">(</span><span style="color:#E06C75;font-style:italic">storage</span><span style="color:#ABB2BF">: </span><span style="color:#E5C07B">FirebaseStorage</span><span style="color:#ABB2BF">, </span><span style="color:#E06C75;font-style:italic">options</span><span style="color:#C678DD">?</span><span style="color:#ABB2BF">: </span><span style="color:#E5C07B">UseObjectUploadOptions</span><span style="color:#ABB2BF">): </span><span style="color:#E5C07B">UseObjectUploadResult</span><span style="color:#ABB2BF">;</span></span></code></pre>
2277
2278
  <p>Multi-file upload over the package’s single Storage handle prop.
2278
2279
  Headless: returns task state; render it however you like (the
2279
2280
  <code>&#x3C;UploadDropzone></code> component is one producer of <code>upload()</code> calls).</p>
@@ -2298,7 +2299,7 @@ the write fails (typed <code>StorageError</code> on <code>task.error</code>).</p
2298
2299
 
2299
2300
 
2300
2301
 
2301
- <table><thead><tr><th align="left">Parameter</th><th align="left">Type</th></tr></thead><tbody><tr><td align="left"><code>storage</code></td><td align="left"><code>any</code></td></tr><tr><td align="left"><code>options?</code></td><td align="left"><a href="#useobjectuploadoptions"><code>UseObjectUploadOptions</code></a></td></tr></tbody></table></div>
2302
+ <table><thead><tr><th align="left">Parameter</th><th align="left">Type</th></tr></thead><tbody><tr><td align="left"><code>storage</code></td><td align="left"><a href="/docs/pyric-storage-reference-api/#firebasestorage"><code>FirebaseStorage</code></a></td></tr><tr><td align="left"><code>options?</code></td><td align="left"><a href="#useobjectuploadoptions"><code>UseObjectUploadOptions</code></a></td></tr></tbody></table></div>
2302
2303
  <h4 id="returns-21">Returns</h4>
2303
2304
  <p><a href="#useobjectuploadresult"><code>UseObjectUploadResult</code></a></p>
2304
2305
  <hr>
@@ -2336,7 +2337,7 @@ semantics. All emitted paths are normalized (<code>normalizeStoragePath</code>).
2336
2337
  <hr>
2337
2338
  <p><a id="usestoragedelete"></a></p>
2338
2339
  <h3 id="usestoragedelete">useStorageDelete()</h3>
2339
- <pre class="astro-code one-dark-pro" style="background-color:#282c34;color:#abb2bf; overflow-x: auto;" tabindex="0" data-language="ts"><code><span class="line"><span style="color:#C678DD">function</span><span style="color:#61AFEF"> useStorageDelete</span><span style="color:#ABB2BF">(</span><span style="color:#E06C75;font-style:italic">storage</span><span style="color:#ABB2BF">: </span><span style="color:#E5C07B">any</span><span style="color:#ABB2BF">, </span><span style="color:#E06C75;font-style:italic">options</span><span style="color:#C678DD">?</span><span style="color:#ABB2BF">: </span><span style="color:#E5C07B">UseStorageDeleteOptions</span><span style="color:#ABB2BF">): </span><span style="color:#E5C07B">UseStorageDeleteResult</span><span style="color:#ABB2BF">;</span></span></code></pre>
2340
+ <pre class="astro-code one-dark-pro" style="background-color:#282c34;color:#abb2bf; overflow-x: auto;" tabindex="0" data-language="ts"><code><span class="line"><span style="color:#C678DD">function</span><span style="color:#61AFEF"> useStorageDelete</span><span style="color:#ABB2BF">(</span><span style="color:#E06C75;font-style:italic">storage</span><span style="color:#ABB2BF">: </span><span style="color:#E5C07B">FirebaseStorage</span><span style="color:#ABB2BF">, </span><span style="color:#E06C75;font-style:italic">options</span><span style="color:#C678DD">?</span><span style="color:#ABB2BF">: </span><span style="color:#E5C07B">UseStorageDeleteOptions</span><span style="color:#ABB2BF">): </span><span style="color:#E5C07B">UseStorageDeleteResult</span><span style="color:#ABB2BF">;</span></span></code></pre>
2340
2341
  <p>Drive bulk + recursive deletes from a React component — the
2341
2342
  storage counterpart of <code>useRecursiveDelete</code> (same progress /
2342
2343
  isRunning / error shape, same stale-run generation token), bulk
@@ -2359,13 +2360,13 @@ because storage selections are flat multi-row affairs.</p>
2359
2360
 
2360
2361
 
2361
2362
 
2362
- <table><thead><tr><th align="left">Parameter</th><th align="left">Type</th></tr></thead><tbody><tr><td align="left"><code>storage</code></td><td align="left"><code>any</code></td></tr><tr><td align="left"><code>options?</code></td><td align="left"><a href="#usestoragedeleteoptions"><code>UseStorageDeleteOptions</code></a></td></tr></tbody></table></div>
2363
+ <table><thead><tr><th align="left">Parameter</th><th align="left">Type</th></tr></thead><tbody><tr><td align="left"><code>storage</code></td><td align="left"><a href="/docs/pyric-storage-reference-api/#firebasestorage"><code>FirebaseStorage</code></a></td></tr><tr><td align="left"><code>options?</code></td><td align="left"><a href="#usestoragedeleteoptions"><code>UseStorageDeleteOptions</code></a></td></tr></tbody></table></div>
2363
2364
  <h4 id="returns-24">Returns</h4>
2364
2365
  <p><a href="#usestoragedeleteresult"><code>UseStorageDeleteResult</code></a></p>
2365
2366
  <hr>
2366
2367
  <p><a id="usestoragelist"></a></p>
2367
2368
  <h3 id="usestoragelist">useStorageList()</h3>
2368
- <pre class="astro-code one-dark-pro" style="background-color:#282c34;color:#abb2bf; overflow-x: auto;" tabindex="0" data-language="ts"><code><span class="line"><span style="color:#C678DD">function</span><span style="color:#61AFEF"> useStorageList</span><span style="color:#ABB2BF">(</span><span style="color:#E06C75;font-style:italic">storage</span><span style="color:#ABB2BF">: </span><span style="color:#E5C07B">any</span><span style="color:#ABB2BF">, </span><span style="color:#E06C75;font-style:italic">path</span><span style="color:#ABB2BF">: </span><span style="color:#E5C07B">string</span><span style="color:#ABB2BF">): </span><span style="color:#E5C07B">UseStorageListResult</span><span style="color:#ABB2BF">;</span></span></code></pre>
2369
+ <pre class="astro-code one-dark-pro" style="background-color:#282c34;color:#abb2bf; overflow-x: auto;" tabindex="0" data-language="ts"><code><span class="line"><span style="color:#C678DD">function</span><span style="color:#61AFEF"> useStorageList</span><span style="color:#ABB2BF">(</span><span style="color:#E06C75;font-style:italic">storage</span><span style="color:#ABB2BF">: </span><span style="color:#E5C07B">FirebaseStorage</span><span style="color:#ABB2BF">, </span><span style="color:#E06C75;font-style:italic">path</span><span style="color:#ABB2BF">: </span><span style="color:#E5C07B">string</span><span style="color:#ABB2BF">): </span><span style="color:#E5C07B">UseStorageListResult</span><span style="color:#ABB2BF">;</span></span></code></pre>
2369
2370
  <p>List the objects + synthetic folders directly under <code>path</code> :
2370
2371
  <code>listAll</code> over the package’s sandbox Storage handle. Read-via-get,
2371
2372
  not realtime: the list updates on <code>refresh</code>, path change, or the
@@ -2391,13 +2392,13 @@ result (virtualize the rendering, which <code>&#x3C;ObjectBrowser></code> does).
2391
2392
 
2392
2393
 
2393
2394
 
2394
- <table><thead><tr><th align="left">Parameter</th><th align="left">Type</th></tr></thead><tbody><tr><td align="left"><code>storage</code></td><td align="left"><code>any</code></td></tr><tr><td align="left"><code>path</code></td><td align="left"><code>string</code></td></tr></tbody></table></div>
2395
+ <table><thead><tr><th align="left">Parameter</th><th align="left">Type</th></tr></thead><tbody><tr><td align="left"><code>storage</code></td><td align="left"><a href="/docs/pyric-storage-reference-api/#firebasestorage"><code>FirebaseStorage</code></a></td></tr><tr><td align="left"><code>path</code></td><td align="left"><code>string</code></td></tr></tbody></table></div>
2395
2396
  <h4 id="returns-25">Returns</h4>
2396
2397
  <p><a href="#usestoragelistresult"><code>UseStorageListResult</code></a></p>
2397
2398
  <hr>
2398
2399
  <p><a id="usestorageobject"></a></p>
2399
2400
  <h3 id="usestorageobject">useStorageObject()</h3>
2400
- <pre class="astro-code one-dark-pro" style="background-color:#282c34;color:#abb2bf; overflow-x: auto;" tabindex="0" data-language="ts"><code><span class="line"><span style="color:#C678DD">function</span><span style="color:#61AFEF"> useStorageObject</span><span style="color:#ABB2BF">(</span><span style="color:#E06C75;font-style:italic">storage</span><span style="color:#ABB2BF">: </span><span style="color:#E5C07B">any</span><span style="color:#ABB2BF">, </span><span style="color:#E06C75;font-style:italic">path</span><span style="color:#ABB2BF">: </span><span style="color:#E5C07B">string</span><span style="color:#ABB2BF">): </span><span style="color:#E5C07B">UseStorageObjectResult</span><span style="color:#ABB2BF">;</span></span></code></pre>
2401
+ <pre class="astro-code one-dark-pro" style="background-color:#282c34;color:#abb2bf; overflow-x: auto;" tabindex="0" data-language="ts"><code><span class="line"><span style="color:#C678DD">function</span><span style="color:#61AFEF"> useStorageObject</span><span style="color:#ABB2BF">(</span><span style="color:#E06C75;font-style:italic">storage</span><span style="color:#ABB2BF">: </span><span style="color:#E5C07B">FirebaseStorage</span><span style="color:#ABB2BF">, </span><span style="color:#E06C75;font-style:italic">path</span><span style="color:#ABB2BF">: </span><span style="color:#E5C07B">string</span><span style="color:#ABB2BF">): </span><span style="color:#E5C07B">UseStorageObjectResult</span><span style="color:#ABB2BF">;</span></span></code></pre>
2401
2402
  <p>One object’s metadata + lazily-loaded bytes, the data source for
2402
2403
  <code>&#x3C;ObjectInspector></code>. Read-via-get like the rest of the storage
2403
2404
  half: updates on <code>refresh</code>, <code>path</code> change, or <code>loadBlob</code>.</p>
@@ -2419,13 +2420,13 @@ half: updates on <code>refresh</code>, <code>path</code> change, or <code>loadBl
2419
2420
 
2420
2421
 
2421
2422
 
2422
- <table><thead><tr><th align="left">Parameter</th><th align="left">Type</th></tr></thead><tbody><tr><td align="left"><code>storage</code></td><td align="left"><code>any</code></td></tr><tr><td align="left"><code>path</code></td><td align="left"><code>string</code></td></tr></tbody></table></div>
2423
+ <table><thead><tr><th align="left">Parameter</th><th align="left">Type</th></tr></thead><tbody><tr><td align="left"><code>storage</code></td><td align="left"><a href="/docs/pyric-storage-reference-api/#firebasestorage"><code>FirebaseStorage</code></a></td></tr><tr><td align="left"><code>path</code></td><td align="left"><code>string</code></td></tr></tbody></table></div>
2423
2424
  <h4 id="returns-26">Returns</h4>
2424
2425
  <p><a href="#usestorageobjectresult"><code>UseStorageObjectResult</code></a></p>
2425
2426
  <hr>
2426
2427
  <p><a id="usestoragerulesgate"></a></p>
2427
2428
  <h3 id="usestoragerulesgate">useStorageRulesGate()</h3>
2428
- <pre class="astro-code one-dark-pro" style="background-color:#282c34;color:#abb2bf; overflow-x: auto;" tabindex="0" data-language="ts"><code><span class="line"><span style="color:#C678DD">function</span><span style="color:#61AFEF"> useStorageRulesGate</span><span style="color:#ABB2BF">(</span><span style="color:#E06C75;font-style:italic">storage</span><span style="color:#ABB2BF">: </span><span style="color:#E5C07B">any</span><span style="color:#ABB2BF">, </span><span style="color:#E06C75;font-style:italic">options</span><span style="color:#C678DD">?</span><span style="color:#ABB2BF">: </span><span style="color:#E5C07B">UseStorageRulesGateOptions</span><span style="color:#ABB2BF">): </span><span style="color:#E5C07B">UseStorageRulesGateResult</span><span style="color:#ABB2BF">;</span></span></code></pre>
2429
+ <pre class="astro-code one-dark-pro" style="background-color:#282c34;color:#abb2bf; overflow-x: auto;" tabindex="0" data-language="ts"><code><span class="line"><span style="color:#C678DD">function</span><span style="color:#61AFEF"> useStorageRulesGate</span><span style="color:#ABB2BF">(</span><span style="color:#E06C75;font-style:italic">storage</span><span style="color:#ABB2BF">: </span><span style="color:#E5C07B">FirebaseStorage</span><span style="color:#ABB2BF">, </span><span style="color:#E06C75;font-style:italic">options</span><span style="color:#C678DD">?</span><span style="color:#ABB2BF">: </span><span style="color:#E5C07B">UseStorageRulesGateOptions</span><span style="color:#ABB2BF">): </span><span style="color:#E5C07B">UseStorageRulesGateResult</span><span style="color:#ABB2BF">;</span></span></code></pre>
2429
2430
  <p>Pre-flight rules evaluation — the M7 differentiator. Evaluates the
2430
2431
  current identity against paths BEFORE the click, so components can
2431
2432
  annotate denied affordances (<code>data-pyric-denied</code>, disabled-with-
@@ -2461,7 +2462,7 @@ common identity/path/payload-shaped rules evaluate exactly.</p>
2461
2462
 
2462
2463
 
2463
2464
 
2464
- <table><thead><tr><th align="left">Parameter</th><th align="left">Type</th></tr></thead><tbody><tr><td align="left"><code>storage</code></td><td align="left"><code>any</code></td></tr><tr><td align="left"><code>options?</code></td><td align="left"><a href="#usestoragerulesgateoptions"><code>UseStorageRulesGateOptions</code></a></td></tr></tbody></table></div>
2465
+ <table><thead><tr><th align="left">Parameter</th><th align="left">Type</th></tr></thead><tbody><tr><td align="left"><code>storage</code></td><td align="left"><a href="/docs/pyric-storage-reference-api/#firebasestorage"><code>FirebaseStorage</code></a></td></tr><tr><td align="left"><code>options?</code></td><td align="left"><a href="#usestoragerulesgateoptions"><code>UseStorageRulesGateOptions</code></a></td></tr></tbody></table></div>
2465
2466
  <h4 id="returns-27">Returns</h4>
2466
2467
  <p><a href="#usestoragerulesgateresult"><code>UseStorageRulesGateResult</code></a></p>
2467
2468
  <hr>