@pyric/cli 0.1.0-alpha.14 → 0.1.0-alpha.16

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 (606) hide show
  1. package/dist/assurance/.generated/conformance-verdicts.d.ts +120 -75
  2. package/dist/assurance/.generated/conformance-verdicts.d.ts.map +1 -1
  3. package/dist/assurance/.generated/conformance-verdicts.js +120 -75
  4. package/dist/assurance/.generated/conformance-verdicts.js.map +1 -1
  5. package/dist/bridge/client/dispatch.js +1 -1
  6. package/dist/bridge/client/dispatch.js.map +1 -1
  7. package/dist/cli/serve.d.ts +1 -1
  8. package/dist/cli/serve.d.ts.map +1 -1
  9. package/dist/cli/serve.js +207 -284
  10. package/dist/cli/serve.js.map +1 -1
  11. package/dist/cli/service-command-records/database-rules-generate.d.ts +4 -0
  12. package/dist/cli/service-command-records/database-rules-generate.d.ts.map +1 -0
  13. package/dist/cli/service-command-records/database-rules-generate.js +3 -0
  14. package/dist/cli/service-command-records/database-rules-generate.js.map +1 -0
  15. package/dist/cli/service-command-records/database-rules-lint.d.ts +4 -0
  16. package/dist/cli/service-command-records/database-rules-lint.d.ts.map +1 -0
  17. package/dist/cli/service-command-records/database-rules-lint.js +3 -0
  18. package/dist/cli/service-command-records/database-rules-lint.js.map +1 -0
  19. package/dist/cli/service-command-records/database-rules-simulate.d.ts +4 -0
  20. package/dist/cli/service-command-records/database-rules-simulate.d.ts.map +1 -0
  21. package/dist/cli/service-command-records/database-rules-simulate.js +3 -0
  22. package/dist/cli/service-command-records/database-rules-simulate.js.map +1 -0
  23. package/dist/cli/service-command-records/database-rules-validate.d.ts +4 -0
  24. package/dist/cli/service-command-records/database-rules-validate.d.ts.map +1 -0
  25. package/dist/cli/service-command-records/database-rules-validate.js +3 -0
  26. package/dist/cli/service-command-records/database-rules-validate.js.map +1 -0
  27. package/dist/cli/service-command-records/firestore-indexes-generate.d.ts +4 -0
  28. package/dist/cli/service-command-records/firestore-indexes-generate.d.ts.map +1 -0
  29. package/dist/cli/service-command-records/firestore-indexes-generate.js +3 -0
  30. package/dist/cli/service-command-records/firestore-indexes-generate.js.map +1 -0
  31. package/dist/cli/service-command-records/firestore-rules-lint.d.ts +4 -0
  32. package/dist/cli/service-command-records/firestore-rules-lint.d.ts.map +1 -0
  33. package/dist/cli/service-command-records/firestore-rules-lint.js +3 -0
  34. package/dist/cli/service-command-records/firestore-rules-lint.js.map +1 -0
  35. package/dist/cli/service-command-records/firestore-rules-resolve.d.ts +4 -0
  36. package/dist/cli/service-command-records/firestore-rules-resolve.d.ts.map +1 -0
  37. package/dist/cli/service-command-records/firestore-rules-resolve.js +3 -0
  38. package/dist/cli/service-command-records/firestore-rules-resolve.js.map +1 -0
  39. package/dist/cli/service-command-records/firestore-rules-simulate.d.ts +4 -0
  40. package/dist/cli/service-command-records/firestore-rules-simulate.d.ts.map +1 -0
  41. package/dist/cli/service-command-records/firestore-rules-simulate.js +3 -0
  42. package/dist/cli/service-command-records/firestore-rules-simulate.js.map +1 -0
  43. package/dist/cli/service-command-records/firestore-rules-validate.d.ts +4 -0
  44. package/dist/cli/service-command-records/firestore-rules-validate.d.ts.map +1 -0
  45. package/dist/cli/service-command-records/firestore-rules-validate.js +3 -0
  46. package/dist/cli/service-command-records/firestore-rules-validate.js.map +1 -0
  47. package/dist/cli/service-command-records/storage-rules-lint.d.ts +4 -0
  48. package/dist/cli/service-command-records/storage-rules-lint.d.ts.map +1 -0
  49. package/dist/cli/service-command-records/storage-rules-lint.js +3 -0
  50. package/dist/cli/service-command-records/storage-rules-lint.js.map +1 -0
  51. package/dist/cli/service-command-records/storage-rules-simulate.d.ts +4 -0
  52. package/dist/cli/service-command-records/storage-rules-simulate.d.ts.map +1 -0
  53. package/dist/cli/service-command-records/storage-rules-simulate.js +3 -0
  54. package/dist/cli/service-command-records/storage-rules-simulate.js.map +1 -0
  55. package/dist/cli/service-commands.d.ts +7 -0
  56. package/dist/cli/service-commands.d.ts.map +1 -1
  57. package/dist/cli/service-commands.generated.d.ts +35 -0
  58. package/dist/cli/service-commands.generated.d.ts.map +1 -0
  59. package/dist/cli/service-commands.generated.js +25 -0
  60. package/dist/cli/service-commands.generated.js.map +1 -0
  61. package/dist/cli/service-commands.js +23 -40
  62. package/dist/cli/service-commands.js.map +1 -1
  63. package/dist/conformance/.generated/can-i-use-browser.d.ts.map +1 -1
  64. package/dist/conformance/.generated/can-i-use-browser.js +1 -1
  65. package/dist/conformance/.generated/can-i-use-browser.js.map +1 -1
  66. package/dist/conformance/.generated/can-i-use.d.ts.map +1 -1
  67. package/dist/conformance/.generated/can-i-use.js +1 -1
  68. package/dist/conformance/.generated/can-i-use.js.map +1 -1
  69. package/dist/conformance/.generated/conformance-docs.d.ts.map +1 -1
  70. package/dist/conformance/.generated/conformance-docs.js +1 -1
  71. package/dist/conformance/.generated/conformance-docs.js.map +1 -1
  72. package/dist/functions-rtdb/development-runtime.d.ts +63 -0
  73. package/dist/functions-rtdb/development-runtime.d.ts.map +1 -0
  74. package/dist/functions-rtdb/development-runtime.js +244 -0
  75. package/dist/functions-rtdb/development-runtime.js.map +1 -0
  76. package/dist/serve/bridge-mount.d.ts +32 -2
  77. package/dist/serve/bridge-mount.d.ts.map +1 -1
  78. package/dist/serve/bridge-mount.js +232 -18
  79. package/dist/serve/bridge-mount.js.map +1 -1
  80. package/dist/serve/bundler.d.ts +2 -18
  81. package/dist/serve/bundler.d.ts.map +1 -1
  82. package/dist/serve/bundler.js +7 -35
  83. package/dist/serve/bundler.js.map +1 -1
  84. package/dist/serve/entries/app-client.d.ts.map +1 -1
  85. package/dist/serve/entries/app-client.js +5 -5
  86. package/dist/serve/entries/app-client.js.map +1 -1
  87. package/dist/serve/entries/auth-helper-core.d.ts +32 -6
  88. package/dist/serve/entries/auth-helper-core.d.ts.map +1 -1
  89. package/dist/serve/entries/auth-helper-core.js +82 -24
  90. package/dist/serve/entries/auth-helper-core.js.map +1 -1
  91. package/dist/serve/entries/auth.d.ts.map +1 -1
  92. package/dist/serve/entries/auth.js +6 -4
  93. package/dist/serve/entries/auth.js.map +1 -1
  94. package/dist/serve/entries/database.d.ts +28 -0
  95. package/dist/serve/entries/database.d.ts.map +1 -1
  96. package/dist/serve/entries/database.js +95 -26
  97. package/dist/serve/entries/database.js.map +1 -1
  98. package/dist/serve/entries/init.d.ts.map +1 -1
  99. package/dist/serve/entries/init.js +21 -12
  100. package/dist/serve/entries/init.js.map +1 -1
  101. package/dist/serve/html-injection.d.ts +5 -0
  102. package/dist/serve/html-injection.d.ts.map +1 -0
  103. package/dist/serve/html-injection.js +59 -0
  104. package/dist/serve/html-injection.js.map +1 -0
  105. package/dist/serve/namespace.d.ts +6 -22
  106. package/dist/serve/namespace.d.ts.map +1 -1
  107. package/dist/serve/namespace.js +23 -145
  108. package/dist/serve/namespace.js.map +1 -1
  109. package/dist/serve/runtime/worker-replacement.d.ts +1 -2
  110. package/dist/serve/runtime/worker-replacement.d.ts.map +1 -1
  111. package/dist/serve/sandbox-session.d.ts +78 -0
  112. package/dist/serve/sandbox-session.d.ts.map +1 -0
  113. package/dist/serve/sandbox-session.js +171 -0
  114. package/dist/serve/sandbox-session.js.map +1 -0
  115. package/dist/serve/server.d.ts +5 -2
  116. package/dist/serve/server.d.ts.map +1 -1
  117. package/dist/serve/server.js +21 -5
  118. package/dist/serve/server.js.map +1 -1
  119. package/dist/serve/site-tree.d.ts +8 -0
  120. package/dist/serve/site-tree.d.ts.map +1 -0
  121. package/dist/serve/site-tree.js +113 -0
  122. package/dist/serve/site-tree.js.map +1 -0
  123. package/dist/serve/site-ui/_astro/RulesCodeEditor.CzwHdCi9.js +23 -0
  124. package/dist/serve/site-ui/_astro/_example_.jevZ7OdV.css +1 -0
  125. package/dist/serve/site-ui/_astro/_slug_.BoKXYrnu.css +1 -0
  126. package/dist/serve/site-ui/_astro/_studio_.BtYpqe1A.css +1 -0
  127. package/dist/serve/site-ui/_astro/app.4HeLP_FA.js +109 -0
  128. package/dist/serve/site-ui/_astro/app.BgSnCR5G.js +1 -0
  129. package/dist/serve/site-ui/_astro/app.BsFsMjn0.css +1 -0
  130. package/dist/serve/site-ui/_astro/chess-showcase.CnoxIle5.js +1 -0
  131. package/dist/serve/site-ui/_astro/chess-source-explorer.C5k9c5yK.js +1 -0
  132. package/dist/serve/site-ui/_astro/chess-v2.CFHmd3UL.js +354 -0
  133. package/dist/serve/site-ui/_astro/client.D2ORs4B-.js +25 -0
  134. package/dist/serve/site-ui/_astro/example-runtime.R1d96L6-.js +291 -0
  135. package/dist/serve/site-ui/_astro/index.BJiOemMX.js +1 -0
  136. package/dist/serve/site-ui/_astro/index.DBy5LfQW.js +9 -0
  137. package/dist/serve/site-ui/_astro/index.DNyk7q8W.js +9 -0
  138. package/dist/serve/site-ui/_astro/jsx-runtime.D_zvdyIk.js +9 -0
  139. package/dist/serve/site-ui/_astro/reads.BrKNdKAa.js +1 -0
  140. package/dist/serve/site-ui/_astro/sandbox-controls.BTb3EbQp.js +1153 -0
  141. package/dist/serve/site-ui/_astro/seed.EyI3VYEu.js +20 -0
  142. package/dist/serve/site-ui/auth/index.html +11 -0
  143. package/dist/serve/site-ui/docs/_rhythm/index.html +100 -0
  144. package/dist/serve/site-ui/docs/agent/set-up-your-agent/index.html +43 -0
  145. package/dist/serve/site-ui/docs/agent/watch-and-review/index.html +26 -0
  146. package/dist/serve/site-ui/docs/agent/work-with-an-agent/index.html +70 -0
  147. package/dist/serve/{docs-ui → site-ui}/docs/ai-compat/index.html +3 -3
  148. package/dist/serve/site-ui/docs/api-reference/index.html +68 -0
  149. package/dist/serve/{docs-ui → site-ui}/docs/app-compat/index.html +3 -3
  150. package/dist/serve/{docs-ui → site-ui}/docs/auth-compat/index.html +3 -3
  151. package/dist/serve/site-ui/docs/build/ai-logic/index.html +64 -0
  152. package/dist/serve/site-ui/docs/build/authentication/index.html +66 -0
  153. package/dist/serve/site-ui/docs/build/cloud-firestore/index.html +84 -0
  154. package/dist/serve/site-ui/docs/build/cloud-messaging/index.html +71 -0
  155. package/dist/serve/site-ui/docs/build/cloud-storage/index.html +66 -0
  156. package/dist/serve/{docs-ui → site-ui}/docs/build/cloud-storage.md +2 -2
  157. package/dist/serve/site-ui/docs/build/realtime-database/index.html +67 -0
  158. package/dist/serve/site-ui/docs/conformance-scores/index.html +50 -0
  159. package/dist/serve/{docs-ui → site-ui}/docs/conformance-scores.md +3 -3
  160. package/dist/serve/site-ui/docs/create-pyric-reference-api/index.html +531 -0
  161. package/dist/serve/{docs-ui → site-ui}/docs/database-compat/index.html +211 -168
  162. package/dist/serve/{docs-ui → site-ui}/docs/database-compat.md +208 -170
  163. package/dist/serve/site-ui/docs/examples/chess/index.html +384 -0
  164. package/dist/serve/site-ui/docs/examples/chess.md +57 -0
  165. package/dist/serve/site-ui/docs/examples/index.html +3 -0
  166. package/dist/serve/site-ui/docs/examples.md +4 -0
  167. package/dist/serve/{docs-ui → site-ui}/docs/firestore-compat/index.html +55 -91
  168. package/dist/serve/{docs-ui → site-ui}/docs/firestore-compat.md +52 -88
  169. package/dist/serve/site-ui/docs/functions-rtdb-compat/index.html +73 -0
  170. package/dist/serve/site-ui/docs/get-started/how-the-swap-works/index.html +29 -0
  171. package/dist/serve/site-ui/docs/get-started/start-building/index.html +33 -0
  172. package/dist/serve/{docs-ui → site-ui}/docs/index.json +595 -26
  173. package/dist/serve/site-ui/docs/messaging-compat/index.html +324 -0
  174. package/dist/serve/{docs-ui → site-ui}/docs/messaging-compat.md +71 -1
  175. package/dist/serve/site-ui/docs/observe/resolve-runtime-status/index.html +28 -0
  176. package/dist/serve/site-ui/docs/observe/see-whats-happening/index.html +74 -0
  177. package/dist/serve/site-ui/docs/observe/shape-your-data/index.html +45 -0
  178. package/dist/serve/site-ui/docs/overview/index.html +17 -0
  179. package/dist/serve/site-ui/docs/pyric-admin-app-reference-api/index.html +186 -0
  180. package/dist/serve/{docs-ui → site-ui}/docs/pyric-admin-auth-reference-api/index.html +4 -4
  181. package/dist/serve/{docs-ui → site-ui}/docs/pyric-admin-database-reference-api/index.html +4 -4
  182. package/dist/serve/{docs-ui → site-ui}/docs/pyric-admin-firestore-reference-api/index.html +318 -202
  183. package/dist/serve/{docs-ui → site-ui}/docs/pyric-admin-firestore-reference-api.md +154 -27
  184. package/dist/serve/{docs-ui → site-ui}/docs/pyric-admin-messaging-reference-api/index.html +5 -5
  185. package/dist/serve/site-ui/docs/pyric-admin-storage-reference-api/index.html +318 -0
  186. package/dist/serve/{docs-ui → site-ui}/docs/pyric-ai-reference-api/index.html +5 -5
  187. package/dist/serve/site-ui/docs/pyric-ai-scripting-reference-api/index.html +160 -0
  188. package/dist/serve/site-ui/docs/pyric-app-reference-api/index.html +425 -0
  189. package/dist/serve/{docs-ui → site-ui}/docs/pyric-auth-reference-api/index.html +6 -6
  190. package/dist/serve/{docs-ui → site-ui}/docs/pyric-auth-reference-api.md +1 -1
  191. package/dist/serve/site-ui/docs/pyric-cli-assurance-browser-reference-api/index.html +60 -0
  192. package/dist/serve/{docs-ui → site-ui}/docs/pyric-cli-assurance-reference-api/index.html +4 -4
  193. package/dist/serve/{docs-ui → site-ui}/docs/pyric-cli-bridge-client-reference-api/index.html +4 -4
  194. package/dist/serve/site-ui/docs/pyric-cli-bridge-reference-api/index.html +507 -0
  195. package/dist/serve/site-ui/docs/pyric-cli-conformance-browser-reference-api/index.html +258 -0
  196. package/dist/serve/site-ui/docs/pyric-cli-conformance-docs-reference-api/index.html +51 -0
  197. package/dist/serve/site-ui/docs/pyric-cli-conformance-reference-api/index.html +308 -0
  198. package/dist/serve/site-ui/docs/pyric-cli-credentials-node-reference-api/index.html +68 -0
  199. package/dist/serve/{docs-ui → site-ui}/docs/pyric-cli-discover-reference-api/index.html +4 -4
  200. package/dist/serve/site-ui/docs/pyric-cli-register-reference-api/index.html +11 -0
  201. package/dist/serve/{docs-ui → site-ui}/docs/pyric-cli-remote-reference-api/index.html +4 -4
  202. package/dist/serve/{docs-ui → site-ui}/docs/pyric-cli-serve-worker-reference-api/index.html +1186 -1384
  203. package/dist/serve/{docs-ui → site-ui}/docs/pyric-cli-serve-worker-reference-api.md +817 -1291
  204. package/dist/serve/{docs-ui → site-ui}/docs/pyric-cli-verify-reference-api/index.html +4 -4
  205. package/dist/serve/site-ui/docs/pyric-cli-vite-reference-api/index.html +126 -0
  206. package/dist/serve/{docs-ui → site-ui}/docs/pyric-cli-vite-reference-api.md +1 -1
  207. package/dist/serve/site-ui/docs/pyric-database-reference-api/index.html +2641 -0
  208. package/dist/serve/{docs-ui → site-ui}/docs/pyric-database-reference-api.md +1055 -158
  209. package/dist/serve/{docs-ui → site-ui}/docs/pyric-firestore-reference-api/index.html +311 -249
  210. package/dist/serve/{docs-ui → site-ui}/docs/pyric-firestore-reference-api.md +72 -54
  211. package/dist/serve/site-ui/docs/pyric-messaging-reference-api/index.html +509 -0
  212. package/dist/serve/site-ui/docs/pyric-messaging-sw-reference-api/index.html +182 -0
  213. package/dist/serve/{docs-ui → site-ui}/docs/pyric-rules-reference-api/index.html +7 -26
  214. package/dist/serve/{docs-ui → site-ui}/docs/pyric-rules-reference-api.md +13 -23
  215. package/dist/serve/site-ui/docs/pyric-sandbox-database-reference-api/index.html +121 -0
  216. package/dist/serve/site-ui/docs/pyric-sandbox-firestore-reference-api/index.html +203 -0
  217. package/dist/serve/{docs-ui → site-ui}/docs/pyric-sandbox-reference-api/index.html +26 -5
  218. package/dist/serve/{docs-ui → site-ui}/docs/pyric-sandbox-reference-api.md +22 -22
  219. package/dist/serve/{docs-ui → site-ui}/docs/pyric-storage-reference-api/index.html +5 -15
  220. package/dist/serve/{docs-ui → site-ui}/docs/pyric-storage-reference-api.md +0 -13
  221. package/dist/serve/site-ui/docs/pyric-ui-agents-reference-api/index.html +639 -0
  222. package/dist/serve/site-ui/docs/pyric-ui-auth-hooks-reference-api/index.html +100 -0
  223. package/dist/serve/{docs-ui → site-ui}/docs/pyric-ui-auth-reference-api/index.html +4 -4
  224. package/dist/serve/site-ui/docs/pyric-ui-events-hooks-reference-api/index.html +24 -0
  225. package/dist/serve/{docs-ui → site-ui}/docs/pyric-ui-events-reference-api/index.html +4 -4
  226. package/dist/serve/site-ui/docs/pyric-ui-firestore-hooks-reference-api/index.html +136 -0
  227. package/dist/serve/{docs-ui → site-ui}/docs/pyric-ui-firestore-reference-api/index.html +7 -7
  228. package/dist/serve/{docs-ui → site-ui}/docs/pyric-ui-firestore-reference-api.md +4 -4
  229. package/dist/serve/{docs-ui → site-ui}/docs/pyric-ui-primitives-reference-api/index.html +4 -4
  230. package/dist/serve/{docs-ui → site-ui}/docs/pyric-ui-rtdb-reference-api/index.html +4 -4
  231. package/dist/serve/site-ui/docs/pyric-ui-rules-hooks-reference-api/index.html +16 -0
  232. package/dist/serve/{docs-ui → site-ui}/docs/pyric-ui-rules-reference-api/index.html +4 -4
  233. package/dist/serve/site-ui/docs/pyric-ui-storage-hooks-reference-api/index.html +176 -0
  234. package/dist/serve/{docs-ui → site-ui}/docs/pyric-ui-storage-reference-api/index.html +10 -11
  235. package/dist/serve/{docs-ui → site-ui}/docs/pyric-ui-storage-reference-api.md +7 -8
  236. package/dist/serve/site-ui/docs/pyric-ui-traffic-hooks-reference-api/index.html +188 -0
  237. package/dist/serve/{docs-ui → site-ui}/docs/pyric-ui-traffic-reference-api/index.html +4 -4
  238. package/dist/serve/{docs-ui → site-ui}/docs/rules-compat/index.html +87 -57
  239. package/dist/serve/{docs-ui → site-ui}/docs/rules-compat.md +84 -54
  240. package/dist/serve/site-ui/docs/secure/audit-your-rules/index.html +51 -0
  241. package/dist/serve/site-ui/docs/secure/firestore-rules-limits/index.html +106 -0
  242. package/dist/serve/site-ui/docs/secure/read-a-denial/index.html +41 -0
  243. package/dist/serve/site-ui/docs/secure/rtdb-rules-in-typescript/index.html +67 -0
  244. package/dist/serve/site-ui/docs/secure/rules-standard-library/index.html +159 -0
  245. package/dist/serve/{docs-ui → site-ui}/docs/secure/rules-standard-library.md +2 -2
  246. package/dist/serve/site-ui/docs/secure/secure-it-with-rules/index.html +47 -0
  247. package/dist/serve/site-ui/docs/secure/simulate-and-lint/index.html +95 -0
  248. package/dist/serve/site-ui/docs/secure/write-a-rules-test-suite/index.html +82 -0
  249. package/dist/serve/site-ui/docs/ship/ship-to-production/index.html +37 -0
  250. package/dist/serve/site-ui/docs/ship/test-in-node/index.html +75 -0
  251. package/dist/serve/{docs-ui → site-ui}/docs/storage-compat/index.html +8 -8
  252. package/dist/serve/{docs-ui → site-ui}/docs/storage-compat.md +5 -5
  253. package/dist/serve/site-ui/docs/trust/how-we-know-it-matches-firebase/index.html +132 -0
  254. package/dist/serve/site-ui/docs/trust/rules-standard-library/index.html +861 -0
  255. package/dist/serve/site-ui/docs/trust/rules-standard-library.md +344 -0
  256. package/dist/serve/site-ui/docs/trust/storage-rules-stdlib-research/index.html +582 -0
  257. package/dist/serve/site-ui/docs/trust/storage-rules-stdlib-research.md +448 -0
  258. package/dist/serve/site-ui/docs/trust/versioning-and-compatibility/index.html +14 -0
  259. package/dist/serve/{docs-ui → site-ui}/docs/tutorial/index.html +4 -4
  260. package/dist/serve/{docs-ui → site-ui}/docs/tutorial.md +1 -1
  261. package/dist/serve/site-ui/examples/chess/index.html +2 -0
  262. package/dist/serve/site-ui/examples/firestore-first-write/index.html +2 -0
  263. package/dist/serve/site-ui/firestore/index.html +11 -0
  264. package/dist/serve/site-ui/index.html +11 -0
  265. package/dist/serve/{docs-ui → site-ui}/llms.txt +6 -2
  266. package/dist/serve/site-ui/rtdb/index.html +11 -0
  267. package/dist/serve/site-ui/settings/index.html +11 -0
  268. package/dist/serve/site-ui/storage/index.html +11 -0
  269. package/dist/serve/site-ui/studio-routes.json +1 -0
  270. package/dist/serve/site-ui/traffic/index.html +11 -0
  271. package/dist/serve/standalone-assets.d.ts +4 -10
  272. package/dist/serve/standalone-assets.d.ts.map +1 -1
  273. package/dist/serve/standalone-assets.js +8 -21
  274. package/dist/serve/standalone-assets.js.map +1 -1
  275. package/dist/serve/vite-functions-development.d.ts +29 -0
  276. package/dist/serve/vite-functions-development.d.ts.map +1 -0
  277. package/dist/serve/vite-functions-development.js +150 -0
  278. package/dist/serve/vite-functions-development.js.map +1 -0
  279. package/dist/serve/vite-generation-bridge.d.ts +17 -0
  280. package/dist/serve/vite-generation-bridge.d.ts.map +1 -0
  281. package/dist/serve/vite-generation-bridge.js +47 -0
  282. package/dist/serve/vite-generation-bridge.js.map +1 -0
  283. package/dist/serve/vite-generation-functions.d.ts +35 -0
  284. package/dist/serve/vite-generation-functions.d.ts.map +1 -0
  285. package/dist/serve/vite-generation-functions.js +46 -0
  286. package/dist/serve/vite-generation-functions.js.map +1 -0
  287. package/dist/serve/vite-generation-middleware.d.ts +10 -0
  288. package/dist/serve/vite-generation-middleware.d.ts.map +1 -0
  289. package/dist/serve/vite-generation-middleware.js +40 -0
  290. package/dist/serve/vite-generation-middleware.js.map +1 -0
  291. package/dist/serve/vite-generation-rules-watch.d.ts +8 -0
  292. package/dist/serve/vite-generation-rules-watch.d.ts.map +1 -0
  293. package/dist/serve/vite-generation-rules-watch.js +33 -0
  294. package/dist/serve/vite-generation-rules-watch.js.map +1 -0
  295. package/dist/serve/vite-module-swap.d.ts +16 -0
  296. package/dist/serve/vite-module-swap.d.ts.map +1 -0
  297. package/dist/serve/vite-module-swap.js +96 -0
  298. package/dist/serve/vite-module-swap.js.map +1 -0
  299. package/dist/serve/vite-page-runtime.d.ts +29 -0
  300. package/dist/serve/vite-page-runtime.d.ts.map +1 -0
  301. package/dist/serve/vite-page-runtime.js +71 -0
  302. package/dist/serve/vite-page-runtime.js.map +1 -0
  303. package/dist/serve/vite-plugin.d.ts +44 -4
  304. package/dist/serve/vite-plugin.d.ts.map +1 -1
  305. package/dist/serve/vite-plugin.js +62 -864
  306. package/dist/serve/vite-plugin.js.map +1 -1
  307. package/dist/serve/vite-sandbox-generation.d.ts +57 -0
  308. package/dist/serve/vite-sandbox-generation.d.ts.map +1 -0
  309. package/dist/serve/vite-sandbox-generation.js +178 -0
  310. package/dist/serve/vite-sandbox-generation.js.map +1 -0
  311. package/dist/serve/worker/client/disconnect.d.ts.map +1 -1
  312. package/dist/serve/worker/client/disconnect.js +2 -0
  313. package/dist/serve/worker/client/disconnect.js.map +1 -1
  314. package/dist/serve/worker/client/handles.d.ts +5 -0
  315. package/dist/serve/worker/client/handles.d.ts.map +1 -1
  316. package/dist/serve/worker/client/handles.js.map +1 -1
  317. package/dist/serve/worker/client/pagehide.d.ts +13 -0
  318. package/dist/serve/worker/client/pagehide.d.ts.map +1 -0
  319. package/dist/serve/worker/client/pagehide.js +19 -0
  320. package/dist/serve/worker/client/pagehide.js.map +1 -0
  321. package/dist/serve/worker/client/rtdb-admin.d.ts +8 -0
  322. package/dist/serve/worker/client/rtdb-admin.d.ts.map +1 -0
  323. package/dist/serve/worker/client/rtdb-admin.js +39 -0
  324. package/dist/serve/worker/client/rtdb-admin.js.map +1 -0
  325. package/dist/serve/worker/client/rtdb-connection-lifecycle.d.ts +15 -0
  326. package/dist/serve/worker/client/rtdb-connection-lifecycle.d.ts.map +1 -0
  327. package/dist/serve/worker/client/rtdb-connection-lifecycle.js +45 -0
  328. package/dist/serve/worker/client/rtdb-connection-lifecycle.js.map +1 -0
  329. package/dist/serve/worker/client/rtdb-controls.d.ts +6 -0
  330. package/dist/serve/worker/client/rtdb-controls.d.ts.map +1 -0
  331. package/dist/serve/worker/client/rtdb-controls.js +8 -0
  332. package/dist/serve/worker/client/rtdb-controls.js.map +1 -0
  333. package/dist/serve/worker/client/rtdb-listeners.d.ts +24 -0
  334. package/dist/serve/worker/client/rtdb-listeners.d.ts.map +1 -0
  335. package/dist/serve/worker/client/rtdb-listeners.js +262 -0
  336. package/dist/serve/worker/client/rtdb-listeners.js.map +1 -0
  337. package/dist/serve/worker/client/rtdb-reads.d.ts +4 -0
  338. package/dist/serve/worker/client/rtdb-reads.d.ts.map +1 -0
  339. package/dist/serve/worker/client/rtdb-reads.js +11 -0
  340. package/dist/serve/worker/client/rtdb-reads.js.map +1 -0
  341. package/dist/serve/worker/client/rtdb-references.d.ts +19 -0
  342. package/dist/serve/worker/client/rtdb-references.d.ts.map +1 -0
  343. package/dist/serve/worker/client/rtdb-references.js +63 -0
  344. package/dist/serve/worker/client/rtdb-references.js.map +1 -0
  345. package/dist/serve/worker/client/rtdb-snapshots.d.ts +20 -0
  346. package/dist/serve/worker/client/rtdb-snapshots.d.ts.map +1 -0
  347. package/dist/serve/worker/client/rtdb-snapshots.js +64 -0
  348. package/dist/serve/worker/client/rtdb-snapshots.js.map +1 -0
  349. package/dist/serve/worker/client/rtdb-transactions.d.ts +14 -0
  350. package/dist/serve/worker/client/rtdb-transactions.d.ts.map +1 -0
  351. package/dist/serve/worker/client/rtdb-transactions.js +34 -0
  352. package/dist/serve/worker/client/rtdb-transactions.js.map +1 -0
  353. package/dist/serve/worker/client/rtdb-writes.d.ts +8 -0
  354. package/dist/serve/worker/client/rtdb-writes.d.ts.map +1 -0
  355. package/dist/serve/worker/client/rtdb-writes.js +65 -0
  356. package/dist/serve/worker/client/rtdb-writes.js.map +1 -0
  357. package/dist/serve/worker/client.d.ts +0 -2
  358. package/dist/serve/worker/client.d.ts.map +1 -1
  359. package/dist/serve/worker/client.js +0 -2
  360. package/dist/serve/worker/client.js.map +1 -1
  361. package/dist/serve/worker/entry.js +2 -2
  362. package/dist/serve/worker/entry.js.map +1 -1
  363. package/dist/serve/worker/host/dispatch.d.ts +2 -0
  364. package/dist/serve/worker/host/dispatch.d.ts.map +1 -1
  365. package/dist/serve/worker/host/dispatch.js +24 -2
  366. package/dist/serve/worker/host/dispatch.js.map +1 -1
  367. package/dist/serve/worker/host/rtdb.d.ts +6 -2
  368. package/dist/serve/worker/host/rtdb.d.ts.map +1 -1
  369. package/dist/serve/worker/host/rtdb.js +224 -2
  370. package/dist/serve/worker/host/rtdb.js.map +1 -1
  371. package/dist/serve/worker/host/studio.d.ts.map +1 -1
  372. package/dist/serve/worker/host/studio.js +2 -0
  373. package/dist/serve/worker/host/studio.js.map +1 -1
  374. package/dist/serve/worker/host/subscriptions.d.ts.map +1 -1
  375. package/dist/serve/worker/host/subscriptions.js +3 -3
  376. package/dist/serve/worker/host/subscriptions.js.map +1 -1
  377. package/dist/serve/worker/host.d.ts +1 -1
  378. package/dist/serve/worker/host.d.ts.map +1 -1
  379. package/dist/serve/worker/host.js +1 -1
  380. package/dist/serve/worker/host.js.map +1 -1
  381. package/dist/serve/worker/index.d.ts +16 -1
  382. package/dist/serve/worker/index.d.ts.map +1 -1
  383. package/dist/serve/worker/index.js +17 -4
  384. package/dist/serve/worker/index.js.map +1 -1
  385. package/dist/serve/worker/protocol.d.ts +57 -0
  386. package/dist/serve/worker/protocol.d.ts.map +1 -1
  387. package/dist/serve/worker/protocol.js.map +1 -1
  388. package/dist/serve/worker/rtdb-value-equality.d.ts +3 -0
  389. package/dist/serve/worker/rtdb-value-equality.d.ts.map +1 -0
  390. package/dist/serve/worker/rtdb-value-equality.js +18 -0
  391. package/dist/serve/worker/rtdb-value-equality.js.map +1 -0
  392. package/dist/serve/worker/serve-init.js +2 -2
  393. package/dist/serve/worker/serve-init.js.map +1 -1
  394. package/dist/serve/worker/service-worker-relay.js +2 -2
  395. package/dist/serve/worker/service-worker-relay.js.map +1 -1
  396. package/package.json +7 -5
  397. package/src/assurance/.generated/conformance-verdicts.ts +120 -75
  398. package/src/bridge/client/dispatch.ts +1 -1
  399. package/src/cli/serve.ts +215 -307
  400. package/src/cli/service-command-records/database-rules-generate.ts +3 -0
  401. package/src/cli/service-command-records/database-rules-lint.ts +3 -0
  402. package/src/cli/service-command-records/database-rules-simulate.ts +3 -0
  403. package/src/cli/service-command-records/database-rules-validate.ts +3 -0
  404. package/src/cli/service-command-records/firestore-indexes-generate.ts +3 -0
  405. package/src/cli/service-command-records/firestore-rules-lint.ts +3 -0
  406. package/src/cli/service-command-records/firestore-rules-resolve.ts +3 -0
  407. package/src/cli/service-command-records/firestore-rules-simulate.ts +3 -0
  408. package/src/cli/service-command-records/firestore-rules-validate.ts +3 -0
  409. package/src/cli/service-command-records/storage-rules-lint.ts +3 -0
  410. package/src/cli/service-command-records/storage-rules-simulate.ts +3 -0
  411. package/src/cli/service-commands.generated.ts +27 -0
  412. package/src/cli/service-commands.test.ts +43 -0
  413. package/src/cli/service-commands.ts +36 -51
  414. package/src/conformance/.generated/can-i-use-browser.ts +1 -1
  415. package/src/conformance/.generated/can-i-use.ts +1 -1
  416. package/src/conformance/.generated/conformance-docs.ts +1 -1
  417. package/src/functions-rtdb/development-runtime.ts +299 -0
  418. package/src/serve/bridge-mount.ts +253 -19
  419. package/src/serve/bundler.ts +8 -34
  420. package/src/serve/entries/app-client.ts +5 -4
  421. package/src/serve/entries/auth-helper-core.ts +117 -30
  422. package/src/serve/entries/auth.ts +8 -4
  423. package/src/serve/entries/database.ts +180 -57
  424. package/src/serve/entries/init.ts +30 -20
  425. package/src/serve/html-injection.ts +65 -0
  426. package/src/serve/namespace.ts +26 -169
  427. package/src/serve/runtime/worker-replacement.ts +1 -1
  428. package/src/serve/sandbox-session.ts +233 -0
  429. package/src/serve/server.ts +20 -5
  430. package/src/serve/site-tree.ts +146 -0
  431. package/src/serve/standalone-assets.ts +9 -26
  432. package/src/serve/vite-functions-development.ts +201 -0
  433. package/src/serve/vite-generation-bridge.ts +66 -0
  434. package/src/serve/vite-generation-functions.ts +78 -0
  435. package/src/serve/vite-generation-middleware.ts +56 -0
  436. package/src/serve/vite-generation-rules-watch.ts +37 -0
  437. package/src/serve/vite-module-swap.ts +119 -0
  438. package/src/serve/vite-page-runtime.ts +100 -0
  439. package/src/serve/vite-plugin.ts +78 -883
  440. package/src/serve/vite-sandbox-generation.ts +255 -0
  441. package/src/serve/worker/client/disconnect.ts +3 -1
  442. package/src/serve/worker/client/handles.ts +5 -0
  443. package/src/serve/worker/client/pagehide.ts +31 -0
  444. package/src/serve/worker/client/rtdb-admin.ts +74 -0
  445. package/src/serve/worker/client/rtdb-connection-lifecycle.ts +52 -0
  446. package/src/serve/worker/client/rtdb-controls.ts +8 -0
  447. package/src/serve/worker/client/rtdb-listeners.ts +337 -0
  448. package/src/serve/worker/client/rtdb-reads.ts +12 -0
  449. package/src/serve/worker/client/rtdb-references.ts +85 -0
  450. package/src/serve/worker/client/rtdb-snapshots.ts +118 -0
  451. package/src/serve/worker/client/rtdb-transactions.ts +51 -0
  452. package/src/serve/worker/client/rtdb-writes.ts +74 -0
  453. package/src/serve/worker/client.ts +0 -2
  454. package/src/serve/worker/entry.ts +2 -2
  455. package/src/serve/worker/host/dispatch.ts +22 -2
  456. package/src/serve/worker/host/rtdb.ts +243 -2
  457. package/src/serve/worker/host/studio.ts +2 -0
  458. package/src/serve/worker/host/subscriptions.ts +8 -4
  459. package/src/serve/worker/host.ts +1 -1
  460. package/src/serve/worker/index.ts +58 -10
  461. package/src/serve/worker/protocol.ts +23 -2
  462. package/src/serve/worker/rtdb-value-equality.ts +17 -0
  463. package/src/serve/worker/serve-init.ts +2 -2
  464. package/src/serve/worker/service-worker-relay.ts +2 -2
  465. package/dist/serve/docs-ui/_astro/_slug_.DUci-duz.css +0 -1
  466. package/dist/serve/docs-ui/docs/_rhythm/index.html +0 -100
  467. package/dist/serve/docs-ui/docs/agent/set-up-your-agent/index.html +0 -43
  468. package/dist/serve/docs-ui/docs/agent/watch-and-review/index.html +0 -26
  469. package/dist/serve/docs-ui/docs/agent/work-with-an-agent/index.html +0 -70
  470. package/dist/serve/docs-ui/docs/api-reference/index.html +0 -68
  471. package/dist/serve/docs-ui/docs/build/ai-logic/index.html +0 -64
  472. package/dist/serve/docs-ui/docs/build/authentication/index.html +0 -66
  473. package/dist/serve/docs-ui/docs/build/cloud-firestore/index.html +0 -70
  474. package/dist/serve/docs-ui/docs/build/cloud-messaging/index.html +0 -71
  475. package/dist/serve/docs-ui/docs/build/cloud-storage/index.html +0 -66
  476. package/dist/serve/docs-ui/docs/build/realtime-database/index.html +0 -67
  477. package/dist/serve/docs-ui/docs/conformance-scores/index.html +0 -50
  478. package/dist/serve/docs-ui/docs/create-pyric-reference-api/index.html +0 -531
  479. package/dist/serve/docs-ui/docs/functions-rtdb-compat/index.html +0 -73
  480. package/dist/serve/docs-ui/docs/get-started/how-the-swap-works/index.html +0 -29
  481. package/dist/serve/docs-ui/docs/get-started/start-building/index.html +0 -33
  482. package/dist/serve/docs-ui/docs/messaging-compat/index.html +0 -265
  483. package/dist/serve/docs-ui/docs/observe/resolve-runtime-status/index.html +0 -28
  484. package/dist/serve/docs-ui/docs/observe/see-whats-happening/index.html +0 -74
  485. package/dist/serve/docs-ui/docs/observe/shape-your-data/index.html +0 -45
  486. package/dist/serve/docs-ui/docs/overview/index.html +0 -17
  487. package/dist/serve/docs-ui/docs/pyric-admin-app-reference-api/index.html +0 -186
  488. package/dist/serve/docs-ui/docs/pyric-admin-storage-reference-api/index.html +0 -318
  489. package/dist/serve/docs-ui/docs/pyric-ai-scripting-reference-api/index.html +0 -160
  490. package/dist/serve/docs-ui/docs/pyric-app-reference-api/index.html +0 -425
  491. package/dist/serve/docs-ui/docs/pyric-cli-assurance-browser-reference-api/index.html +0 -60
  492. package/dist/serve/docs-ui/docs/pyric-cli-bridge-reference-api/index.html +0 -507
  493. package/dist/serve/docs-ui/docs/pyric-cli-conformance-browser-reference-api/index.html +0 -258
  494. package/dist/serve/docs-ui/docs/pyric-cli-conformance-docs-reference-api/index.html +0 -51
  495. package/dist/serve/docs-ui/docs/pyric-cli-conformance-reference-api/index.html +0 -308
  496. package/dist/serve/docs-ui/docs/pyric-cli-credentials-node-reference-api/index.html +0 -68
  497. package/dist/serve/docs-ui/docs/pyric-cli-register-reference-api/index.html +0 -11
  498. package/dist/serve/docs-ui/docs/pyric-cli-vite-reference-api/index.html +0 -126
  499. package/dist/serve/docs-ui/docs/pyric-database-reference-api/index.html +0 -1852
  500. package/dist/serve/docs-ui/docs/pyric-messaging-reference-api/index.html +0 -509
  501. package/dist/serve/docs-ui/docs/pyric-messaging-sw-reference-api/index.html +0 -182
  502. package/dist/serve/docs-ui/docs/pyric-sandbox-database-reference-api/index.html +0 -121
  503. package/dist/serve/docs-ui/docs/pyric-sandbox-firestore-reference-api/index.html +0 -203
  504. package/dist/serve/docs-ui/docs/pyric-ui-agents-reference-api/index.html +0 -639
  505. package/dist/serve/docs-ui/docs/pyric-ui-auth-hooks-reference-api/index.html +0 -100
  506. package/dist/serve/docs-ui/docs/pyric-ui-events-hooks-reference-api/index.html +0 -24
  507. package/dist/serve/docs-ui/docs/pyric-ui-firestore-hooks-reference-api/index.html +0 -136
  508. package/dist/serve/docs-ui/docs/pyric-ui-rules-hooks-reference-api/index.html +0 -16
  509. package/dist/serve/docs-ui/docs/pyric-ui-storage-hooks-reference-api/index.html +0 -176
  510. package/dist/serve/docs-ui/docs/pyric-ui-traffic-hooks-reference-api/index.html +0 -188
  511. package/dist/serve/docs-ui/docs/secure/audit-your-rules/index.html +0 -51
  512. package/dist/serve/docs-ui/docs/secure/firestore-rules-limits/index.html +0 -106
  513. package/dist/serve/docs-ui/docs/secure/read-a-denial/index.html +0 -41
  514. package/dist/serve/docs-ui/docs/secure/rtdb-rules-in-typescript/index.html +0 -67
  515. package/dist/serve/docs-ui/docs/secure/rules-standard-library/index.html +0 -159
  516. package/dist/serve/docs-ui/docs/secure/secure-it-with-rules/index.html +0 -47
  517. package/dist/serve/docs-ui/docs/secure/simulate-and-lint/index.html +0 -95
  518. package/dist/serve/docs-ui/docs/secure/write-a-rules-test-suite/index.html +0 -82
  519. package/dist/serve/docs-ui/docs/ship/ship-to-production/index.html +0 -37
  520. package/dist/serve/docs-ui/docs/ship/test-in-node/index.html +0 -75
  521. package/dist/serve/docs-ui/docs/trust/how-we-know-it-matches-firebase/index.html +0 -132
  522. package/dist/serve/docs-ui/docs/trust/versioning-and-compatibility/index.html +0 -14
  523. package/dist/serve/docs-ui/index.html +0 -1
  524. package/dist/serve/studio-ui/assets/RulesCodeEditor-BDlH-5lp.js +0 -23
  525. package/dist/serve/studio-ui/assets/index-Bf9SSE8L.js +0 -1218
  526. package/dist/serve/studio-ui/assets/index-BlSGru_r.css +0 -1
  527. package/dist/serve/studio-ui/assets/seed-D_UjxfOU.js +0 -20
  528. package/dist/serve/studio-ui/index.html +0 -32
  529. package/dist/serve/worker/client/rtdb.d.ts +0 -36
  530. package/dist/serve/worker/client/rtdb.d.ts.map +0 -1
  531. package/dist/serve/worker/client/rtdb.js +0 -241
  532. package/dist/serve/worker/client/rtdb.js.map +0 -1
  533. package/src/serve/worker/client/rtdb.ts +0 -311
  534. /package/dist/serve/{docs-ui → site-ui}/404.html +0 -0
  535. /package/dist/serve/{docs-ui → site-ui}/_astro/_slug_.CXh9yTP1.css +0 -0
  536. /package/dist/serve/{docs-ui → site-ui}/docs/_rhythm.md +0 -0
  537. /package/dist/serve/{docs-ui → site-ui}/docs/agent/set-up-your-agent.md +0 -0
  538. /package/dist/serve/{docs-ui → site-ui}/docs/agent/watch-and-review.md +0 -0
  539. /package/dist/serve/{docs-ui → site-ui}/docs/agent/work-with-an-agent.md +0 -0
  540. /package/dist/serve/{docs-ui → site-ui}/docs/ai-compat.md +0 -0
  541. /package/dist/serve/{docs-ui → site-ui}/docs/api-reference.md +0 -0
  542. /package/dist/serve/{docs-ui → site-ui}/docs/app-compat.md +0 -0
  543. /package/dist/serve/{docs-ui → site-ui}/docs/auth-compat.md +0 -0
  544. /package/dist/serve/{docs-ui → site-ui}/docs/build/ai-logic.md +0 -0
  545. /package/dist/serve/{docs-ui → site-ui}/docs/build/authentication.md +0 -0
  546. /package/dist/serve/{docs-ui → site-ui}/docs/build/cloud-firestore.md +0 -0
  547. /package/dist/serve/{docs-ui → site-ui}/docs/build/cloud-messaging.md +0 -0
  548. /package/dist/serve/{docs-ui → site-ui}/docs/build/realtime-database.md +0 -0
  549. /package/dist/serve/{docs-ui → site-ui}/docs/create-pyric-reference-api.md +0 -0
  550. /package/dist/serve/{docs-ui → site-ui}/docs/functions-rtdb-compat.md +0 -0
  551. /package/dist/serve/{docs-ui → site-ui}/docs/get-started/how-the-swap-works.md +0 -0
  552. /package/dist/serve/{docs-ui → site-ui}/docs/get-started/start-building.md +0 -0
  553. /package/dist/serve/{docs-ui → site-ui}/docs/index.html +0 -0
  554. /package/dist/serve/{docs-ui → site-ui}/docs/observe/resolve-runtime-status.md +0 -0
  555. /package/dist/serve/{docs-ui → site-ui}/docs/observe/see-whats-happening.md +0 -0
  556. /package/dist/serve/{docs-ui → site-ui}/docs/observe/shape-your-data.md +0 -0
  557. /package/dist/serve/{docs-ui → site-ui}/docs/overview.md +0 -0
  558. /package/dist/serve/{docs-ui → site-ui}/docs/pyric-admin-app-reference-api.md +0 -0
  559. /package/dist/serve/{docs-ui → site-ui}/docs/pyric-admin-auth-reference-api.md +0 -0
  560. /package/dist/serve/{docs-ui → site-ui}/docs/pyric-admin-database-reference-api.md +0 -0
  561. /package/dist/serve/{docs-ui → site-ui}/docs/pyric-admin-messaging-reference-api.md +0 -0
  562. /package/dist/serve/{docs-ui → site-ui}/docs/pyric-admin-storage-reference-api.md +0 -0
  563. /package/dist/serve/{docs-ui → site-ui}/docs/pyric-ai-reference-api.md +0 -0
  564. /package/dist/serve/{docs-ui → site-ui}/docs/pyric-ai-scripting-reference-api.md +0 -0
  565. /package/dist/serve/{docs-ui → site-ui}/docs/pyric-app-reference-api.md +0 -0
  566. /package/dist/serve/{docs-ui → site-ui}/docs/pyric-cli-assurance-browser-reference-api.md +0 -0
  567. /package/dist/serve/{docs-ui → site-ui}/docs/pyric-cli-assurance-reference-api.md +0 -0
  568. /package/dist/serve/{docs-ui → site-ui}/docs/pyric-cli-bridge-client-reference-api.md +0 -0
  569. /package/dist/serve/{docs-ui → site-ui}/docs/pyric-cli-bridge-reference-api.md +0 -0
  570. /package/dist/serve/{docs-ui → site-ui}/docs/pyric-cli-conformance-browser-reference-api.md +0 -0
  571. /package/dist/serve/{docs-ui → site-ui}/docs/pyric-cli-conformance-docs-reference-api.md +0 -0
  572. /package/dist/serve/{docs-ui → site-ui}/docs/pyric-cli-conformance-reference-api.md +0 -0
  573. /package/dist/serve/{docs-ui → site-ui}/docs/pyric-cli-credentials-node-reference-api.md +0 -0
  574. /package/dist/serve/{docs-ui → site-ui}/docs/pyric-cli-discover-reference-api.md +0 -0
  575. /package/dist/serve/{docs-ui → site-ui}/docs/pyric-cli-register-reference-api.md +0 -0
  576. /package/dist/serve/{docs-ui → site-ui}/docs/pyric-cli-remote-reference-api.md +0 -0
  577. /package/dist/serve/{docs-ui → site-ui}/docs/pyric-cli-verify-reference-api.md +0 -0
  578. /package/dist/serve/{docs-ui → site-ui}/docs/pyric-messaging-reference-api.md +0 -0
  579. /package/dist/serve/{docs-ui → site-ui}/docs/pyric-messaging-sw-reference-api.md +0 -0
  580. /package/dist/serve/{docs-ui → site-ui}/docs/pyric-sandbox-database-reference-api.md +0 -0
  581. /package/dist/serve/{docs-ui → site-ui}/docs/pyric-sandbox-firestore-reference-api.md +0 -0
  582. /package/dist/serve/{docs-ui → site-ui}/docs/pyric-ui-agents-reference-api.md +0 -0
  583. /package/dist/serve/{docs-ui → site-ui}/docs/pyric-ui-auth-hooks-reference-api.md +0 -0
  584. /package/dist/serve/{docs-ui → site-ui}/docs/pyric-ui-auth-reference-api.md +0 -0
  585. /package/dist/serve/{docs-ui → site-ui}/docs/pyric-ui-events-hooks-reference-api.md +0 -0
  586. /package/dist/serve/{docs-ui → site-ui}/docs/pyric-ui-events-reference-api.md +0 -0
  587. /package/dist/serve/{docs-ui → site-ui}/docs/pyric-ui-firestore-hooks-reference-api.md +0 -0
  588. /package/dist/serve/{docs-ui → site-ui}/docs/pyric-ui-primitives-reference-api.md +0 -0
  589. /package/dist/serve/{docs-ui → site-ui}/docs/pyric-ui-rtdb-reference-api.md +0 -0
  590. /package/dist/serve/{docs-ui → site-ui}/docs/pyric-ui-rules-hooks-reference-api.md +0 -0
  591. /package/dist/serve/{docs-ui → site-ui}/docs/pyric-ui-rules-reference-api.md +0 -0
  592. /package/dist/serve/{docs-ui → site-ui}/docs/pyric-ui-storage-hooks-reference-api.md +0 -0
  593. /package/dist/serve/{docs-ui → site-ui}/docs/pyric-ui-traffic-hooks-reference-api.md +0 -0
  594. /package/dist/serve/{docs-ui → site-ui}/docs/pyric-ui-traffic-reference-api.md +0 -0
  595. /package/dist/serve/{docs-ui → site-ui}/docs/secure/audit-your-rules.md +0 -0
  596. /package/dist/serve/{docs-ui → site-ui}/docs/secure/firestore-rules-limits.md +0 -0
  597. /package/dist/serve/{docs-ui → site-ui}/docs/secure/read-a-denial.md +0 -0
  598. /package/dist/serve/{docs-ui → site-ui}/docs/secure/rtdb-rules-in-typescript.md +0 -0
  599. /package/dist/serve/{docs-ui → site-ui}/docs/secure/secure-it-with-rules.md +0 -0
  600. /package/dist/serve/{docs-ui → site-ui}/docs/secure/simulate-and-lint.md +0 -0
  601. /package/dist/serve/{docs-ui → site-ui}/docs/secure/write-a-rules-test-suite.md +0 -0
  602. /package/dist/serve/{docs-ui → site-ui}/docs/ship/ship-to-production.md +0 -0
  603. /package/dist/serve/{docs-ui → site-ui}/docs/ship/test-in-node.md +0 -0
  604. /package/dist/serve/{docs-ui → site-ui}/docs/trust/how-we-know-it-matches-firebase.md +0 -0
  605. /package/dist/serve/{docs-ui → site-ui}/docs/trust/versioning-and-compatibility.md +0 -0
  606. /package/dist/serve/{studio-ui → site-ui}/pyric-logo.svg +0 -0
@@ -0,0 +1,337 @@
1
+ /** RTDB value/child listeners and Firebase-compatible `off` registration identity. */
2
+ import type { InboundMessage } from '../protocol.js';
3
+ import { queryIdentifier } from 'pyric/database/internal';
4
+ import { sameRtdbValue } from '../rtdb-value-equality.js';
5
+ import {
6
+ _defaultLens,
7
+ closeSubscription,
8
+ nextSubId,
9
+ openSnapshotSubscription,
10
+ stampIssuer,
11
+ } from './core.js';
12
+ import type { ClientPort, RtdbDataSnapshot, Unsubscribe } from './handles.js';
13
+ import {
14
+ isRtdbQuery,
15
+ rtdbChild,
16
+ targetParts,
17
+ type RtdbTarget,
18
+ } from './rtdb-references.js';
19
+ import {
20
+ hydrateRtdbSnapshot,
21
+ makeRtdbSnapshot,
22
+ valueAt,
23
+ type RtdbWireEntry,
24
+ } from './rtdb-snapshots.js';
25
+
26
+ export type RtdbEventType =
27
+ | 'value'
28
+ | 'child_added'
29
+ | 'child_changed'
30
+ | 'child_removed'
31
+ | 'child_moved';
32
+
33
+ interface ListenerRegistration {
34
+ readonly port: ClientPort;
35
+ readonly path: string;
36
+ readonly scope?: string;
37
+ readonly eventType: RtdbEventType;
38
+ readonly callback: object;
39
+ close(): void;
40
+ }
41
+
42
+ const registrations: ListenerRegistration[] = [];
43
+
44
+ /** Drop client-side registration identity when the owning app port closes. */
45
+ export function dropRtdbListenersForPort(port: ClientPort): void {
46
+ for (const registration of [...registrations]) {
47
+ if (registration.port === port) registration.close();
48
+ }
49
+ }
50
+
51
+ function targetScope(target: RtdbTarget): string {
52
+ if (!isRtdbQuery(target)) return 'default';
53
+ return queryIdentifier(target._spec);
54
+ }
55
+
56
+ function removeRegistration(registration: ListenerRegistration): void {
57
+ const index = registrations.indexOf(registration);
58
+ if (index >= 0) registrations.splice(index, 1);
59
+ }
60
+
61
+ function openValueSubscription(
62
+ target: RtdbTarget,
63
+ next: (snap: RtdbDataSnapshot) => void,
64
+ cancelCallbackOrOptions?: ((err: unknown) => void) | { readonly onlyOnce?: boolean },
65
+ options?: { readonly onlyOnce?: boolean },
66
+ ): Unsubscribe {
67
+ const { ref, query } = targetParts(target);
68
+ const error = typeof cancelCallbackOrOptions === 'function' ? cancelCallbackOrOptions : undefined;
69
+ const listenOptions = typeof cancelCallbackOrOptions === 'function'
70
+ ? options
71
+ : cancelCallbackOrOptions;
72
+ const subId = nextSubId();
73
+ const msg: InboundMessage = _defaultLens
74
+ ? { t: 'sub', subId, target: { service: 'rtdb', path: ref.path, ...(query ? { query } : {}) }, actAs: _defaultLens }
75
+ : { t: 'sub', subId, target: { service: 'rtdb', path: ref.path, ...(query ? { query } : {}) } };
76
+ let fired = false;
77
+ const opened = openSnapshotSubscription(ref.port, subId, {
78
+ port: ref.port,
79
+ next: (wire) => {
80
+ if (listenOptions?.onlyOnce && fired) return;
81
+ fired = true;
82
+ if (listenOptions?.onlyOnce) closeSubscription(ref.port, subId);
83
+ next(hydrateRtdbSnapshot(ref, wire));
84
+ },
85
+ error,
86
+ }, stampIssuer(msg));
87
+ if (!opened && error) {
88
+ queueMicrotask(() => error(new Error('FIREBASE FATAL ERROR: Database has been deleted.')));
89
+ }
90
+ return () => closeSubscription(ref.port, subId);
91
+ }
92
+
93
+ function registerListener(
94
+ target: RtdbTarget,
95
+ eventType: RtdbEventType,
96
+ callback: object,
97
+ unsubscribe: Unsubscribe,
98
+ ): Unsubscribe {
99
+ const { ref } = targetParts(target);
100
+ let closed = false;
101
+ const registration: ListenerRegistration = {
102
+ port: ref.port,
103
+ path: ref.path,
104
+ scope: targetScope(target),
105
+ eventType,
106
+ callback,
107
+ close() {
108
+ if (closed) return;
109
+ closed = true;
110
+ removeRegistration(registration);
111
+ unsubscribe();
112
+ },
113
+ };
114
+ registrations.push(registration);
115
+ return registration.close;
116
+ }
117
+
118
+ export function rtdbOnValue(
119
+ target: RtdbTarget,
120
+ next: (snap: RtdbDataSnapshot) => void,
121
+ cancelCallbackOrOptions?: ((err: unknown) => void) | { readonly onlyOnce?: boolean },
122
+ options?: { readonly onlyOnce?: boolean },
123
+ registryCallback: object = next,
124
+ ): Unsubscribe {
125
+ const listenOptions = typeof cancelCallbackOrOptions === 'function'
126
+ ? options
127
+ : cancelCallbackOrOptions;
128
+ let unsubscribe: Unsubscribe = () => {};
129
+ const rawUnsubscribe = openValueSubscription(target, (snapshot) => {
130
+ try {
131
+ next(snapshot);
132
+ } catch {
133
+ // Firebase isolates listener exceptions from sibling deliveries.
134
+ } finally {
135
+ if (listenOptions?.onlyOnce) queueMicrotask(() => unsubscribe());
136
+ }
137
+ }, cancelCallbackOrOptions, options);
138
+ unsubscribe = registerListener(
139
+ target,
140
+ 'value',
141
+ registryCallback,
142
+ rawUnsubscribe,
143
+ );
144
+ return unsubscribe;
145
+ }
146
+
147
+ type ChildEventKind = 'added' | 'changed' | 'removed' | 'moved';
148
+
149
+ function directChildren(value: unknown): Record<string, unknown> {
150
+ if (Array.isArray(value)) {
151
+ return Object.fromEntries(
152
+ value.flatMap((child, index) => child == null ? [] : [[String(index), child]]),
153
+ );
154
+ }
155
+ if (value === null || typeof value !== 'object') return {};
156
+ return value as Record<string, unknown>;
157
+ }
158
+
159
+ function rtdbKeyCompare(left: string, right: string): number {
160
+ const integerKey = (key: string): number | null => {
161
+ if (!/^(0|[1-9]\d*)$/.test(key)) return null;
162
+ const value = Number(key);
163
+ return Number.isSafeInteger(value) && value <= 2_147_483_647 ? value : null;
164
+ };
165
+ const leftInteger = integerKey(left);
166
+ const rightInteger = integerKey(right);
167
+ if (leftInteger !== null && rightInteger !== null) return leftInteger - rightInteger;
168
+ if (leftInteger !== null) return -1;
169
+ if (rightInteger !== null) return 1;
170
+ return left < right ? -1 : left > right ? 1 : 0;
171
+ }
172
+
173
+ function onChildEvent(
174
+ target: RtdbTarget,
175
+ kind: ChildEventKind,
176
+ next: (snap: RtdbDataSnapshot, previousChildName: string | null) => void,
177
+ error?: (err: unknown) => void,
178
+ reverseInitial = false,
179
+ ): Unsubscribe {
180
+ const { ref, query } = targetParts(target);
181
+ let initialized = false;
182
+ let previous: RtdbWireEntry[] = [];
183
+ return openValueSubscription(target, (parent) => {
184
+ const current: RtdbWireEntry[] = [];
185
+ parent.forEach((childSnap) => {
186
+ if (childSnap.key !== null) {
187
+ current.push({
188
+ key: childSnap.key,
189
+ value: childSnap.val(),
190
+ priority: childSnap.priority,
191
+ exportValue: childSnap.exportVal(),
192
+ });
193
+ }
194
+ });
195
+ if (current.length === 0) {
196
+ for (const key of Object.keys(directChildren(parent.val())).sort(rtdbKeyCompare)) {
197
+ current.push({ key, value: directChildren(parent.val())[key] });
198
+ }
199
+ }
200
+ const emit = (entry: RtdbWireEntry, previousChildName: string | null): void => {
201
+ try {
202
+ next(makeRtdbSnapshot(
203
+ rtdbChild(ref, entry.key),
204
+ entry.value,
205
+ undefined,
206
+ entry.priority ?? null,
207
+ undefined,
208
+ entry.exportValue ?? entry.value,
209
+ ), previousChildName);
210
+ } catch {
211
+ // Firebase isolates listener exceptions from sibling deliveries.
212
+ }
213
+ };
214
+ if (!initialized) {
215
+ initialized = true;
216
+ if (kind === 'added') {
217
+ const indexes = current.map((_, index) => index);
218
+ if (reverseInitial) indexes.reverse();
219
+ for (const index of indexes) {
220
+ emit(current[index]!, current[index - 1]?.key ?? null);
221
+ }
222
+ }
223
+ previous = current;
224
+ return;
225
+ }
226
+ const previousByKey = new Map(previous.map((entry, index) => [entry.key, { entry, index }]));
227
+ const currentByKey = new Map(current.map((entry, index) => [entry.key, { entry, index }]));
228
+ if (kind === 'removed') {
229
+ for (const prior of previous) {
230
+ if (!currentByKey.has(prior.key)) {
231
+ emit(prior, null);
232
+ }
233
+ }
234
+ } else {
235
+ for (let index = 0; index < current.length; index++) {
236
+ const entry = current[index]!;
237
+ const prior = previousByKey.get(entry.key);
238
+ const previousChildName = current[index - 1]?.key ?? null;
239
+ if (kind === 'added' && !prior) emit(entry, previousChildName);
240
+ if (kind === 'changed' && prior && !sameRtdbValue(prior.entry.value, entry.value)) {
241
+ emit(entry, previousChildName);
242
+ }
243
+ if (kind === 'moved' && prior) {
244
+ const orderBy = query?.orderBy ?? { kind: 'priority' as const };
245
+ const indexed = (candidate: RtdbWireEntry): unknown => {
246
+ if (orderBy.kind === 'key') return candidate.key;
247
+ if (orderBy.kind === 'priority') return candidate.priority ?? null;
248
+ if (orderBy.kind === 'value') return candidate.value;
249
+ return valueAt(candidate.value, orderBy.path);
250
+ };
251
+ if (!sameRtdbValue(indexed(prior.entry), indexed(entry))) {
252
+ emit(entry, previousChildName);
253
+ }
254
+ }
255
+ }
256
+ }
257
+ previous = current;
258
+ }, error);
259
+ }
260
+
261
+ function subscribeChild(
262
+ target: RtdbTarget,
263
+ kind: ChildEventKind,
264
+ next: (snap: RtdbDataSnapshot, previousChildName: string | null) => void,
265
+ cancelCallbackOrOptions?: ((err: unknown) => void) | { readonly onlyOnce?: boolean },
266
+ options?: { readonly onlyOnce?: boolean },
267
+ registryCallback: object = next,
268
+ ): Unsubscribe {
269
+ const error = typeof cancelCallbackOrOptions === 'function' ? cancelCallbackOrOptions : undefined;
270
+ const listenOptions = typeof cancelCallbackOrOptions === 'function'
271
+ ? options
272
+ : cancelCallbackOrOptions;
273
+ const eventType = `child_${kind}` as RtdbEventType;
274
+ if (!listenOptions?.onlyOnce) {
275
+ return registerListener(target, eventType, registryCallback, onChildEvent(target, kind, next, error));
276
+ }
277
+ let stopped = false;
278
+ let stopScheduled = false;
279
+ let unsubscribe: Unsubscribe = () => {};
280
+ const rawUnsubscribe = onChildEvent(target, kind, (snapshot, previousChildName) => {
281
+ if (stopped) return;
282
+ try {
283
+ next(snapshot, kind === 'removed' ? null : previousChildName);
284
+ } finally {
285
+ if (kind === 'added') {
286
+ if (!stopScheduled) {
287
+ stopScheduled = true;
288
+ queueMicrotask(() => { stopped = true; unsubscribe(); });
289
+ }
290
+ } else {
291
+ stopped = true;
292
+ unsubscribe();
293
+ }
294
+ }
295
+ }, error, kind === 'added');
296
+ unsubscribe = registerListener(target, eventType, registryCallback, rawUnsubscribe);
297
+ return unsubscribe;
298
+ }
299
+
300
+ type ChildCallback = (snap: RtdbDataSnapshot, previousChildName: string | null) => void;
301
+ type CancelOrOptions = ((err: unknown) => void) | { readonly onlyOnce?: boolean };
302
+ type ListenOptions = { readonly onlyOnce?: boolean };
303
+
304
+ export function rtdbOnChildAdded(target: RtdbTarget, next: ChildCallback, cancel?: CancelOrOptions, options?: ListenOptions, identity: object = next): Unsubscribe {
305
+ return subscribeChild(target, 'added', next, cancel, options, identity);
306
+ }
307
+
308
+ export function rtdbOnChildChanged(target: RtdbTarget, next: ChildCallback, cancel?: CancelOrOptions, options?: ListenOptions, identity: object = next): Unsubscribe {
309
+ return subscribeChild(target, 'changed', next, cancel, options, identity);
310
+ }
311
+
312
+ export function rtdbOnChildRemoved(target: RtdbTarget, next: ChildCallback, cancel?: CancelOrOptions, options?: ListenOptions, identity: object = next): Unsubscribe {
313
+ return subscribeChild(target, 'removed', next, cancel, options, identity);
314
+ }
315
+
316
+ export function rtdbOnChildMoved(target: RtdbTarget, next: ChildCallback, cancel?: CancelOrOptions, options?: ListenOptions, identity: object = next): Unsubscribe {
317
+ return subscribeChild(target, 'moved', next, cancel, options, identity);
318
+ }
319
+
320
+ export function rtdbOff(target: RtdbTarget, eventType?: RtdbEventType, callback?: object): void {
321
+ const { ref } = targetParts(target);
322
+ const scope = targetScope(target);
323
+ const allViews = !isRtdbQuery(target);
324
+ const matches = (registration: ListenerRegistration): boolean =>
325
+ registration.port === ref.port
326
+ && registration.path === ref.path
327
+ && (allViews || registration.scope === scope)
328
+ && (eventType === undefined || registration.eventType === eventType)
329
+ && (callback === undefined || registration.callback === callback);
330
+ if (callback !== undefined && eventType !== undefined) {
331
+ registrations.find(matches)?.close();
332
+ return;
333
+ }
334
+ for (const registration of [...registrations]) {
335
+ if (matches(registration)) registration.close();
336
+ }
337
+ }
@@ -0,0 +1,12 @@
1
+ /** RTDB reads over the worker port. */
2
+ import { dataRpc, nextId } from './core.js';
3
+ import type { RtdbDataSnapshot } from './handles.js';
4
+ import { targetParts, type RtdbTarget } from './rtdb-references.js';
5
+ import { hydrateRtdbSnapshot } from './rtdb-snapshots.js';
6
+
7
+ export async function rtdbGet(target: RtdbTarget): Promise<RtdbDataSnapshot> {
8
+ const { ref, query } = targetParts(target);
9
+ return hydrateRtdbSnapshot(ref, await dataRpc(ref.port, {
10
+ t: 'op', id: nextId(), method: 'rtdb.get', path: ref.path, ...(query ? { query } : {}),
11
+ }));
12
+ }
@@ -0,0 +1,85 @@
1
+ /** RTDB database handles, references, path validation, and query target routing. */
2
+ import type { RtdbQuerySpec } from '../protocol.js';
3
+ import { isDisconnectedPort } from './core.js';
4
+ import { getFirestore } from './connection.js';
5
+ import type { ClientDb, ClientPort, ClientRtdb, RtdbRefHandle } from './handles.js';
6
+
7
+ export type RtdbQueryLike = {
8
+ readonly ref: RtdbRefHandle;
9
+ readonly _spec: RtdbQuerySpec;
10
+ };
11
+
12
+ export type RtdbTarget = RtdbRefHandle | RtdbQueryLike;
13
+
14
+ export function rtdbGetDatabase(source?: ClientDb | string | URL, name?: string): ClientRtdb {
15
+ if (source && typeof source === 'object' && 'port' in source) {
16
+ return { __kind: 'client-rtdb', port: (source as ClientDb).port };
17
+ }
18
+ const firestore = getFirestore(source ?? '/__pyric/sdk/worker.js', name);
19
+ return { __kind: 'client-rtdb', port: firestore.port };
20
+ }
21
+
22
+ export function normalizeRtdbPath(path?: string): string {
23
+ const joined = (path ?? '/').split('/').filter(Boolean).join('/');
24
+ return joined ? `/${joined}` : '/';
25
+ }
26
+
27
+ function rtdbKey(path: string): string | null {
28
+ return path.split('/').filter(Boolean).at(-1) ?? null;
29
+ }
30
+
31
+ export function makeRtdbRef(port: ClientPort, path: string): RtdbRefHandle {
32
+ const normalized = normalizeRtdbPath(path);
33
+ const parts = normalized.split('/').filter(Boolean);
34
+ const parentPath = parts.length > 0 ? `/${parts.slice(0, -1).join('/')}` : '/';
35
+ const self: RtdbRefHandle = {
36
+ __kind: 'rtdb-ref',
37
+ port,
38
+ path: normalized,
39
+ _path: normalized,
40
+ key: rtdbKey(normalized),
41
+ get parent() { return normalized === '/' ? null : makeRtdbRef(port, parentPath); },
42
+ get root() { return makeRtdbRef(port, '/'); },
43
+ isEqual(other) {
44
+ return other !== null && other.__kind === 'rtdb-ref'
45
+ && other.port === port && other.path === normalized;
46
+ },
47
+ toJSON() { return `worker://rtdb${normalized}`; },
48
+ toString() { return `worker://rtdb${normalized}`; },
49
+ };
50
+ return self;
51
+ }
52
+
53
+ function validateRtdbPath(path: string, allowEmpty: boolean): void {
54
+ if ((!allowEmpty && path.length === 0) || /[.#$[\]]/.test(path)) {
55
+ throw new Error(
56
+ `child failed: path argument was an invalid path = "${path}". Paths must be non-empty strings and can't contain ".", "#", "$", "[", or "]"`,
57
+ );
58
+ }
59
+ }
60
+
61
+ export function rtdbRef(db: ClientRtdb, path?: string): RtdbRefHandle {
62
+ if (isDisconnectedPort(db.port)) {
63
+ throw new Error('FIREBASE FATAL ERROR: Cannot call ref on a deleted database. ');
64
+ }
65
+ if (path !== undefined) validateRtdbPath(path, true);
66
+ return makeRtdbRef(db.port, path ?? '/');
67
+ }
68
+
69
+ export function rtdbChild(parent: RtdbRefHandle, path: string): RtdbRefHandle {
70
+ validateRtdbPath(path, false);
71
+ return makeRtdbRef(parent.port, `${parent.path}/${path}`);
72
+ }
73
+
74
+ export function isRtdbQuery(target: RtdbTarget): target is RtdbQueryLike {
75
+ return 'ref' in target && '_spec' in target;
76
+ }
77
+
78
+ export function targetParts(target: RtdbTarget): {
79
+ ref: RtdbRefHandle;
80
+ query?: RtdbQuerySpec;
81
+ } {
82
+ return isRtdbQuery(target)
83
+ ? { ref: target.ref, query: target._spec }
84
+ : { ref: target };
85
+ }
@@ -0,0 +1,118 @@
1
+ /** RTDB snapshot wire shape and Firebase-compatible client hydration. */
2
+ import type { RtdbDataSnapshot, RtdbRefHandle } from './handles.js';
3
+ import { rtdbChild } from './rtdb-references.js';
4
+
5
+ export interface RtdbWireEntry {
6
+ key: string;
7
+ value: unknown;
8
+ priority?: string | number | null;
9
+ exportValue?: unknown;
10
+ }
11
+
12
+ export interface RtdbWireSnapshot {
13
+ value?: unknown;
14
+ exists?: boolean;
15
+ key?: string | null;
16
+ priority?: string | number | null;
17
+ exportValue?: unknown;
18
+ entries?: RtdbWireEntry[];
19
+ }
20
+
21
+ export function valueAt(root: unknown, path: string): unknown {
22
+ let current = root;
23
+ for (const segment of path.split('/').filter(Boolean)) {
24
+ if (current === null || typeof current !== 'object') return null;
25
+ current = (current as Record<string, unknown>)[segment];
26
+ }
27
+ return current === undefined ? null : current;
28
+ }
29
+
30
+ function exportValueAt(root: unknown, path: string): unknown {
31
+ let current = root;
32
+ for (const segment of path.split('/').filter(Boolean)) {
33
+ if (current === null || typeof current !== 'object') return null;
34
+ const record = current as Record<string, unknown>;
35
+ const container = '.value' in record && Object.keys(record).every(
36
+ (key) => key === '.value' || key === '.priority',
37
+ ) ? record['.value'] : current;
38
+ if (container === null || typeof container !== 'object') return null;
39
+ current = (container as Record<string, unknown>)[segment];
40
+ }
41
+ return current === undefined ? null : current;
42
+ }
43
+
44
+ export function makeRtdbSnapshot(
45
+ refHandle: RtdbRefHandle,
46
+ value: unknown,
47
+ exists?: boolean,
48
+ priority: string | number | null = null,
49
+ entries?: RtdbWireEntry[],
50
+ exportValue: unknown = value,
51
+ ): RtdbDataSnapshot {
52
+ const childValue = (path: string) => valueAt(value, path);
53
+ const size = entries?.length ?? (
54
+ value && typeof value === 'object'
55
+ ? Object.keys(value as Record<string, unknown>).filter((key) => valueAt(value, key) !== null).length
56
+ : 0
57
+ );
58
+ return {
59
+ key: refHandle.key,
60
+ size,
61
+ priority,
62
+ exists: () => exists ?? (value !== null && value !== undefined),
63
+ val: () => value ?? null,
64
+ child: (path) => {
65
+ const direct = path.split('/').filter(Boolean);
66
+ const entry = direct.length === 1
67
+ ? entries?.find((candidate) => candidate.key === direct[0])
68
+ : undefined;
69
+ return makeRtdbSnapshot(
70
+ rtdbChild(refHandle, path),
71
+ childValue(path),
72
+ undefined,
73
+ entry?.priority ?? null,
74
+ undefined,
75
+ entry?.exportValue ?? exportValueAt(exportValue, path),
76
+ );
77
+ },
78
+ hasChild: (path) => childValue(path) !== null && childValue(path) !== undefined,
79
+ hasChildren: () => size > 0,
80
+ exportVal: () => exportValue ?? null,
81
+ toJSON: () => exportValue ?? null,
82
+ forEach: (callback) => {
83
+ const orderedEntries: RtdbWireEntry[] = entries ?? (
84
+ !value || typeof value !== 'object' || Array.isArray(value)
85
+ ? []
86
+ : Object.entries(value as Record<string, unknown>)
87
+ .map(([key, child]) => ({ key, value: child }))
88
+ );
89
+ for (const entry of orderedEntries) {
90
+ if (callback(makeRtdbSnapshot(
91
+ rtdbChild(refHandle, entry.key),
92
+ entry.value,
93
+ undefined,
94
+ entry.priority ?? null,
95
+ undefined,
96
+ entry.exportValue ?? entry.value,
97
+ )) === true) return true;
98
+ }
99
+ return false;
100
+ },
101
+ ref: refHandle,
102
+ };
103
+ }
104
+
105
+ export function hydrateRtdbSnapshot(
106
+ refHandle: RtdbRefHandle,
107
+ wire: unknown,
108
+ ): RtdbDataSnapshot {
109
+ const payload = wire as RtdbWireSnapshot;
110
+ return makeRtdbSnapshot(
111
+ refHandle,
112
+ payload.value ?? null,
113
+ payload.exists,
114
+ payload.priority ?? null,
115
+ payload.entries,
116
+ payload.exportValue ?? payload.value ?? null,
117
+ );
118
+ }
@@ -0,0 +1,51 @@
1
+ /** Optimistic RTDB transaction loop over the worker RPC boundary. */
2
+ import { dataRpc, nextId } from './core.js';
3
+ import type { RtdbDataSnapshot, RtdbRefHandle } from './handles.js';
4
+ import { rtdbGet } from './rtdb-reads.js';
5
+ import { hydrateRtdbSnapshot, type RtdbWireSnapshot } from './rtdb-snapshots.js';
6
+
7
+ export interface RtdbTransactionOptions {
8
+ readonly applyLocally?: boolean;
9
+ }
10
+
11
+ export interface RtdbTransactionResult {
12
+ readonly committed: boolean;
13
+ readonly snapshot: RtdbDataSnapshot;
14
+ toJSON(): { committed: boolean; snapshot: unknown };
15
+ }
16
+
17
+ function transactionResult(
18
+ committed: boolean,
19
+ snapshot: RtdbDataSnapshot,
20
+ ): RtdbTransactionResult {
21
+ return {
22
+ committed,
23
+ snapshot,
24
+ toJSON: () => ({ committed, snapshot: snapshot.toJSON() }),
25
+ };
26
+ }
27
+
28
+ export async function rtdbRunTransaction<T>(
29
+ ref: RtdbRefHandle,
30
+ transactionUpdate: (current: T | null) => T | undefined,
31
+ options?: RtdbTransactionOptions,
32
+ ): Promise<RtdbTransactionResult> {
33
+ for (let attempt = 0; attempt < 25; attempt++) {
34
+ const before = await rtdbGet(ref);
35
+ const expected = before.val() as T | null;
36
+ const value = transactionUpdate(expected);
37
+ if (value === undefined) return transactionResult(false, before);
38
+ const wire = await dataRpc(ref.port, {
39
+ t: 'op',
40
+ id: nextId(),
41
+ method: 'rtdb.transactionCommit',
42
+ path: ref.path,
43
+ expected,
44
+ value,
45
+ applyLocally: options?.applyLocally,
46
+ }) as { retry?: boolean; committed: boolean; snapshot: RtdbWireSnapshot };
47
+ const snapshot = hydrateRtdbSnapshot(ref, wire.snapshot);
48
+ if (!wire.retry) return transactionResult(wire.committed, snapshot);
49
+ }
50
+ throw new Error('maxretry');
51
+ }
@@ -0,0 +1,74 @@
1
+ /** RTDB writes, priorities, and push-ID generation over the worker port. */
2
+ import { dataRpc, nextId } from './core.js';
3
+ import type { RtdbRefHandle } from './handles.js';
4
+ import { makeRtdbRef } from './rtdb-references.js';
5
+
6
+ const RTDB_PUSH_CHARS = '-0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ_abcdefghijklmnopqrstuvwxyz';
7
+ let lastRtdbPushTime = 0;
8
+ const lastRtdbRandChars: number[] = new Array(12).fill(0);
9
+
10
+ function generateRtdbPushId(now: number = Date.now()): string {
11
+ const duplicateTime = now === lastRtdbPushTime;
12
+ lastRtdbPushTime = now;
13
+ const timestampChars: string[] = new Array(8);
14
+ let timestamp = now;
15
+ for (let i = 7; i >= 0; i--) {
16
+ timestampChars[i] = RTDB_PUSH_CHARS.charAt(timestamp % 64);
17
+ timestamp = Math.floor(timestamp / 64);
18
+ }
19
+ if (timestamp !== 0) throw new Error('RTDB push-id: timestamp overflow.');
20
+ if (!duplicateTime) {
21
+ for (let i = 0; i < 12; i++) lastRtdbRandChars[i] = Math.floor(Math.random() * 64);
22
+ } else {
23
+ let i: number;
24
+ for (i = 11; i >= 0 && lastRtdbRandChars[i] === 63; i--) lastRtdbRandChars[i] = 0;
25
+ if (i < 0) {
26
+ for (let j = 0; j < 12; j++) lastRtdbRandChars[j] = Math.floor(Math.random() * 64);
27
+ } else {
28
+ lastRtdbRandChars[i] = (lastRtdbRandChars[i] ?? 0) + 1;
29
+ }
30
+ }
31
+ return timestampChars.join('') + lastRtdbRandChars.map((n) => RTDB_PUSH_CHARS.charAt(n)).join('');
32
+ }
33
+
34
+ export async function rtdbSet(ref: RtdbRefHandle, value: unknown): Promise<void> {
35
+ await dataRpc(ref.port, { t: 'op', id: nextId(), method: 'rtdb.set', path: ref.path, value });
36
+ }
37
+
38
+ export async function rtdbSetPriority(ref: RtdbRefHandle, priority: string | number | null): Promise<void> {
39
+ await dataRpc(ref.port, { t: 'op', id: nextId(), method: 'rtdb.setPriority', path: ref.path, priority });
40
+ }
41
+
42
+ export async function rtdbSetWithPriority(
43
+ ref: RtdbRefHandle,
44
+ value: unknown,
45
+ priority: string | number | null,
46
+ ): Promise<void> {
47
+ await dataRpc(ref.port, {
48
+ t: 'op', id: nextId(), method: 'rtdb.setWithPriority', path: ref.path, value, priority,
49
+ });
50
+ }
51
+
52
+ export async function rtdbUpdate(ref: RtdbRefHandle, values: Record<string, unknown>): Promise<void> {
53
+ await dataRpc(ref.port, { t: 'op', id: nextId(), method: 'rtdb.update', path: ref.path, values });
54
+ }
55
+
56
+ export async function rtdbRemove(ref: RtdbRefHandle): Promise<void> {
57
+ await dataRpc(ref.port, { t: 'op', id: nextId(), method: 'rtdb.remove', path: ref.path });
58
+ }
59
+
60
+ export function rtdbPush(
61
+ ref: RtdbRefHandle,
62
+ value?: unknown,
63
+ ): RtdbRefHandle & PromiseLike<RtdbRefHandle> {
64
+ const key = generateRtdbPushId();
65
+ const pushed = makeRtdbRef(ref.port, `${ref.path}/${key}`);
66
+ const settledRef = makeRtdbRef(ref.port, pushed.path);
67
+ const promise = dataRpc(ref.port, {
68
+ t: 'op', id: nextId(), method: 'rtdb.push', path: ref.path, key, value,
69
+ }).then(() => settledRef);
70
+ return Object.assign(pushed, {
71
+ then: promise.then.bind(promise),
72
+ catch: promise.catch.bind(promise),
73
+ });
74
+ }
@@ -16,7 +16,6 @@
16
16
  * - `firestore-writes` writes + `writeBatch` + `runTransaction`
17
17
  * - `rules` Firestore/RTDB rules deploy + status
18
18
  * - `admin-firestore` admin-lens document ops
19
- * - `rtdb` RTDB modular subset
20
19
  * - `studio` event stream, confirm-policy, sandbox snapshot
21
20
  * - `auth` per-port auth surface
22
21
  * - `storage` worker-backed storage mirror
@@ -49,7 +48,6 @@ export * from './client/firestore-reads.js';
49
48
  export * from './client/firestore-writes.js';
50
49
  export * from './client/rules.js';
51
50
  export * from './client/admin-firestore.js';
52
- export * from './client/rtdb.js';
53
51
  export * from './client/studio.js';
54
52
  export * from './client/presence.js';
55
53
  export * from './client/auth.js';