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

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 (599) 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/cli/serve.d.ts +1 -1
  6. package/dist/cli/serve.d.ts.map +1 -1
  7. package/dist/cli/serve.js +207 -284
  8. package/dist/cli/serve.js.map +1 -1
  9. package/dist/cli/service-command-records/database-rules-generate.d.ts +4 -0
  10. package/dist/cli/service-command-records/database-rules-generate.d.ts.map +1 -0
  11. package/dist/cli/service-command-records/database-rules-generate.js +3 -0
  12. package/dist/cli/service-command-records/database-rules-generate.js.map +1 -0
  13. package/dist/cli/service-command-records/database-rules-lint.d.ts +4 -0
  14. package/dist/cli/service-command-records/database-rules-lint.d.ts.map +1 -0
  15. package/dist/cli/service-command-records/database-rules-lint.js +3 -0
  16. package/dist/cli/service-command-records/database-rules-lint.js.map +1 -0
  17. package/dist/cli/service-command-records/database-rules-simulate.d.ts +4 -0
  18. package/dist/cli/service-command-records/database-rules-simulate.d.ts.map +1 -0
  19. package/dist/cli/service-command-records/database-rules-simulate.js +3 -0
  20. package/dist/cli/service-command-records/database-rules-simulate.js.map +1 -0
  21. package/dist/cli/service-command-records/database-rules-validate.d.ts +4 -0
  22. package/dist/cli/service-command-records/database-rules-validate.d.ts.map +1 -0
  23. package/dist/cli/service-command-records/database-rules-validate.js +3 -0
  24. package/dist/cli/service-command-records/database-rules-validate.js.map +1 -0
  25. package/dist/cli/service-command-records/firestore-indexes-generate.d.ts +4 -0
  26. package/dist/cli/service-command-records/firestore-indexes-generate.d.ts.map +1 -0
  27. package/dist/cli/service-command-records/firestore-indexes-generate.js +3 -0
  28. package/dist/cli/service-command-records/firestore-indexes-generate.js.map +1 -0
  29. package/dist/cli/service-command-records/firestore-rules-lint.d.ts +4 -0
  30. package/dist/cli/service-command-records/firestore-rules-lint.d.ts.map +1 -0
  31. package/dist/cli/service-command-records/firestore-rules-lint.js +3 -0
  32. package/dist/cli/service-command-records/firestore-rules-lint.js.map +1 -0
  33. package/dist/cli/service-command-records/firestore-rules-resolve.d.ts +4 -0
  34. package/dist/cli/service-command-records/firestore-rules-resolve.d.ts.map +1 -0
  35. package/dist/cli/service-command-records/firestore-rules-resolve.js +3 -0
  36. package/dist/cli/service-command-records/firestore-rules-resolve.js.map +1 -0
  37. package/dist/cli/service-command-records/firestore-rules-simulate.d.ts +4 -0
  38. package/dist/cli/service-command-records/firestore-rules-simulate.d.ts.map +1 -0
  39. package/dist/cli/service-command-records/firestore-rules-simulate.js +3 -0
  40. package/dist/cli/service-command-records/firestore-rules-simulate.js.map +1 -0
  41. package/dist/cli/service-command-records/firestore-rules-validate.d.ts +4 -0
  42. package/dist/cli/service-command-records/firestore-rules-validate.d.ts.map +1 -0
  43. package/dist/cli/service-command-records/firestore-rules-validate.js +3 -0
  44. package/dist/cli/service-command-records/firestore-rules-validate.js.map +1 -0
  45. package/dist/cli/service-command-records/storage-rules-lint.d.ts +4 -0
  46. package/dist/cli/service-command-records/storage-rules-lint.d.ts.map +1 -0
  47. package/dist/cli/service-command-records/storage-rules-lint.js +3 -0
  48. package/dist/cli/service-command-records/storage-rules-lint.js.map +1 -0
  49. package/dist/cli/service-command-records/storage-rules-simulate.d.ts +4 -0
  50. package/dist/cli/service-command-records/storage-rules-simulate.d.ts.map +1 -0
  51. package/dist/cli/service-command-records/storage-rules-simulate.js +3 -0
  52. package/dist/cli/service-command-records/storage-rules-simulate.js.map +1 -0
  53. package/dist/cli/service-commands.d.ts +7 -0
  54. package/dist/cli/service-commands.d.ts.map +1 -1
  55. package/dist/cli/service-commands.generated.d.ts +35 -0
  56. package/dist/cli/service-commands.generated.d.ts.map +1 -0
  57. package/dist/cli/service-commands.generated.js +25 -0
  58. package/dist/cli/service-commands.generated.js.map +1 -0
  59. package/dist/cli/service-commands.js +23 -40
  60. package/dist/cli/service-commands.js.map +1 -1
  61. package/dist/conformance/.generated/can-i-use-browser.d.ts.map +1 -1
  62. package/dist/conformance/.generated/can-i-use-browser.js +1 -1
  63. package/dist/conformance/.generated/can-i-use-browser.js.map +1 -1
  64. package/dist/conformance/.generated/can-i-use.d.ts.map +1 -1
  65. package/dist/conformance/.generated/can-i-use.js +1 -1
  66. package/dist/conformance/.generated/can-i-use.js.map +1 -1
  67. package/dist/conformance/.generated/conformance-docs.d.ts.map +1 -1
  68. package/dist/conformance/.generated/conformance-docs.js +1 -1
  69. package/dist/conformance/.generated/conformance-docs.js.map +1 -1
  70. package/dist/functions-rtdb/development-runtime.d.ts +63 -0
  71. package/dist/functions-rtdb/development-runtime.d.ts.map +1 -0
  72. package/dist/functions-rtdb/development-runtime.js +244 -0
  73. package/dist/functions-rtdb/development-runtime.js.map +1 -0
  74. package/dist/serve/bridge-mount.d.ts +32 -2
  75. package/dist/serve/bridge-mount.d.ts.map +1 -1
  76. package/dist/serve/bridge-mount.js +232 -18
  77. package/dist/serve/bridge-mount.js.map +1 -1
  78. package/dist/serve/bundler.d.ts +2 -18
  79. package/dist/serve/bundler.d.ts.map +1 -1
  80. package/dist/serve/bundler.js +7 -35
  81. package/dist/serve/bundler.js.map +1 -1
  82. package/dist/serve/entries/app-client.d.ts.map +1 -1
  83. package/dist/serve/entries/app-client.js +5 -5
  84. package/dist/serve/entries/app-client.js.map +1 -1
  85. package/dist/serve/entries/auth-helper-core.d.ts +23 -6
  86. package/dist/serve/entries/auth-helper-core.d.ts.map +1 -1
  87. package/dist/serve/entries/auth-helper-core.js +55 -24
  88. package/dist/serve/entries/auth-helper-core.js.map +1 -1
  89. package/dist/serve/entries/database.d.ts +28 -0
  90. package/dist/serve/entries/database.d.ts.map +1 -1
  91. package/dist/serve/entries/database.js +95 -26
  92. package/dist/serve/entries/database.js.map +1 -1
  93. package/dist/serve/entries/init.d.ts.map +1 -1
  94. package/dist/serve/entries/init.js +21 -12
  95. package/dist/serve/entries/init.js.map +1 -1
  96. package/dist/serve/html-injection.d.ts +5 -0
  97. package/dist/serve/html-injection.d.ts.map +1 -0
  98. package/dist/serve/html-injection.js +59 -0
  99. package/dist/serve/html-injection.js.map +1 -0
  100. package/dist/serve/namespace.d.ts +6 -22
  101. package/dist/serve/namespace.d.ts.map +1 -1
  102. package/dist/serve/namespace.js +23 -145
  103. package/dist/serve/namespace.js.map +1 -1
  104. package/dist/serve/runtime/worker-replacement.d.ts +1 -2
  105. package/dist/serve/runtime/worker-replacement.d.ts.map +1 -1
  106. package/dist/serve/sandbox-session.d.ts +78 -0
  107. package/dist/serve/sandbox-session.d.ts.map +1 -0
  108. package/dist/serve/sandbox-session.js +171 -0
  109. package/dist/serve/sandbox-session.js.map +1 -0
  110. package/dist/serve/server.d.ts +5 -2
  111. package/dist/serve/server.d.ts.map +1 -1
  112. package/dist/serve/server.js +21 -5
  113. package/dist/serve/server.js.map +1 -1
  114. package/dist/serve/site-tree.d.ts +8 -0
  115. package/dist/serve/site-tree.d.ts.map +1 -0
  116. package/dist/serve/site-tree.js +113 -0
  117. package/dist/serve/site-tree.js.map +1 -0
  118. package/dist/serve/site-ui/_astro/RulesCodeEditor.CzwHdCi9.js +23 -0
  119. package/dist/serve/site-ui/_astro/_example_.jevZ7OdV.css +1 -0
  120. package/dist/serve/site-ui/_astro/_slug_.BoKXYrnu.css +1 -0
  121. package/dist/serve/site-ui/_astro/_studio_.BtYpqe1A.css +1 -0
  122. package/dist/serve/site-ui/_astro/app.BnMC0ywl.js +109 -0
  123. package/dist/serve/site-ui/_astro/app.BsFsMjn0.css +1 -0
  124. package/dist/serve/site-ui/_astro/app.DVXXR-WI.js +1 -0
  125. package/dist/serve/site-ui/_astro/chess-showcase.DzPO6kz0.js +1 -0
  126. package/dist/serve/site-ui/_astro/chess-source-explorer.C5k9c5yK.js +1 -0
  127. package/dist/serve/site-ui/_astro/chess-v2.CFHmd3UL.js +354 -0
  128. package/dist/serve/site-ui/_astro/client.D2ORs4B-.js +25 -0
  129. package/dist/serve/site-ui/_astro/example-runtime.CM0H02rx.js +291 -0
  130. package/dist/serve/site-ui/_astro/index.B4Kh80he.js +1 -0
  131. package/dist/serve/site-ui/_astro/index.DBy5LfQW.js +9 -0
  132. package/dist/serve/site-ui/_astro/index.DNyk7q8W.js +9 -0
  133. package/dist/serve/site-ui/_astro/jsx-runtime.D_zvdyIk.js +9 -0
  134. package/dist/serve/site-ui/_astro/reads.D1exkX1-.js +1 -0
  135. package/dist/serve/site-ui/_astro/sandbox-controls.BqMePr5V.js +1153 -0
  136. package/dist/serve/site-ui/_astro/seed.BCn5DhHS.js +20 -0
  137. package/dist/serve/site-ui/auth/index.html +11 -0
  138. package/dist/serve/site-ui/docs/_rhythm/index.html +100 -0
  139. package/dist/serve/site-ui/docs/agent/set-up-your-agent/index.html +43 -0
  140. package/dist/serve/site-ui/docs/agent/watch-and-review/index.html +26 -0
  141. package/dist/serve/site-ui/docs/agent/work-with-an-agent/index.html +70 -0
  142. package/dist/serve/{docs-ui → site-ui}/docs/ai-compat/index.html +3 -3
  143. package/dist/serve/site-ui/docs/api-reference/index.html +68 -0
  144. package/dist/serve/{docs-ui → site-ui}/docs/app-compat/index.html +3 -3
  145. package/dist/serve/{docs-ui → site-ui}/docs/auth-compat/index.html +3 -3
  146. package/dist/serve/site-ui/docs/build/ai-logic/index.html +64 -0
  147. package/dist/serve/site-ui/docs/build/authentication/index.html +66 -0
  148. package/dist/serve/site-ui/docs/build/cloud-firestore/index.html +84 -0
  149. package/dist/serve/site-ui/docs/build/cloud-messaging/index.html +71 -0
  150. package/dist/serve/site-ui/docs/build/cloud-storage/index.html +66 -0
  151. package/dist/serve/{docs-ui → site-ui}/docs/build/cloud-storage.md +2 -2
  152. package/dist/serve/site-ui/docs/build/realtime-database/index.html +67 -0
  153. package/dist/serve/site-ui/docs/conformance-scores/index.html +50 -0
  154. package/dist/serve/{docs-ui → site-ui}/docs/conformance-scores.md +3 -3
  155. package/dist/serve/site-ui/docs/create-pyric-reference-api/index.html +531 -0
  156. package/dist/serve/{docs-ui → site-ui}/docs/database-compat/index.html +211 -168
  157. package/dist/serve/{docs-ui → site-ui}/docs/database-compat.md +208 -170
  158. package/dist/serve/site-ui/docs/examples/chess/index.html +384 -0
  159. package/dist/serve/site-ui/docs/examples/chess.md +57 -0
  160. package/dist/serve/site-ui/docs/examples/index.html +3 -0
  161. package/dist/serve/site-ui/docs/examples.md +4 -0
  162. package/dist/serve/{docs-ui → site-ui}/docs/firestore-compat/index.html +55 -91
  163. package/dist/serve/{docs-ui → site-ui}/docs/firestore-compat.md +52 -88
  164. package/dist/serve/site-ui/docs/functions-rtdb-compat/index.html +73 -0
  165. package/dist/serve/site-ui/docs/get-started/how-the-swap-works/index.html +29 -0
  166. package/dist/serve/site-ui/docs/get-started/start-building/index.html +33 -0
  167. package/dist/serve/{docs-ui → site-ui}/docs/index.json +595 -26
  168. package/dist/serve/site-ui/docs/messaging-compat/index.html +324 -0
  169. package/dist/serve/{docs-ui → site-ui}/docs/messaging-compat.md +71 -1
  170. package/dist/serve/site-ui/docs/observe/resolve-runtime-status/index.html +28 -0
  171. package/dist/serve/site-ui/docs/observe/see-whats-happening/index.html +74 -0
  172. package/dist/serve/site-ui/docs/observe/shape-your-data/index.html +45 -0
  173. package/dist/serve/site-ui/docs/overview/index.html +17 -0
  174. package/dist/serve/site-ui/docs/pyric-admin-app-reference-api/index.html +186 -0
  175. package/dist/serve/{docs-ui → site-ui}/docs/pyric-admin-auth-reference-api/index.html +4 -4
  176. package/dist/serve/{docs-ui → site-ui}/docs/pyric-admin-database-reference-api/index.html +4 -4
  177. package/dist/serve/{docs-ui → site-ui}/docs/pyric-admin-firestore-reference-api/index.html +318 -202
  178. package/dist/serve/{docs-ui → site-ui}/docs/pyric-admin-firestore-reference-api.md +154 -27
  179. package/dist/serve/{docs-ui → site-ui}/docs/pyric-admin-messaging-reference-api/index.html +5 -5
  180. package/dist/serve/site-ui/docs/pyric-admin-storage-reference-api/index.html +318 -0
  181. package/dist/serve/{docs-ui → site-ui}/docs/pyric-ai-reference-api/index.html +5 -5
  182. package/dist/serve/site-ui/docs/pyric-ai-scripting-reference-api/index.html +160 -0
  183. package/dist/serve/site-ui/docs/pyric-app-reference-api/index.html +425 -0
  184. package/dist/serve/{docs-ui → site-ui}/docs/pyric-auth-reference-api/index.html +5 -5
  185. package/dist/serve/site-ui/docs/pyric-cli-assurance-browser-reference-api/index.html +60 -0
  186. package/dist/serve/{docs-ui → site-ui}/docs/pyric-cli-assurance-reference-api/index.html +4 -4
  187. package/dist/serve/{docs-ui → site-ui}/docs/pyric-cli-bridge-client-reference-api/index.html +4 -4
  188. package/dist/serve/site-ui/docs/pyric-cli-bridge-reference-api/index.html +507 -0
  189. package/dist/serve/site-ui/docs/pyric-cli-conformance-browser-reference-api/index.html +258 -0
  190. package/dist/serve/site-ui/docs/pyric-cli-conformance-docs-reference-api/index.html +51 -0
  191. package/dist/serve/site-ui/docs/pyric-cli-conformance-reference-api/index.html +308 -0
  192. package/dist/serve/site-ui/docs/pyric-cli-credentials-node-reference-api/index.html +68 -0
  193. package/dist/serve/{docs-ui → site-ui}/docs/pyric-cli-discover-reference-api/index.html +4 -4
  194. package/dist/serve/site-ui/docs/pyric-cli-register-reference-api/index.html +11 -0
  195. package/dist/serve/{docs-ui → site-ui}/docs/pyric-cli-remote-reference-api/index.html +4 -4
  196. package/dist/serve/{docs-ui → site-ui}/docs/pyric-cli-serve-worker-reference-api/index.html +1186 -1384
  197. package/dist/serve/{docs-ui → site-ui}/docs/pyric-cli-serve-worker-reference-api.md +817 -1291
  198. package/dist/serve/{docs-ui → site-ui}/docs/pyric-cli-verify-reference-api/index.html +4 -4
  199. package/dist/serve/site-ui/docs/pyric-cli-vite-reference-api/index.html +126 -0
  200. package/dist/serve/{docs-ui → site-ui}/docs/pyric-cli-vite-reference-api.md +1 -1
  201. package/dist/serve/site-ui/docs/pyric-database-reference-api/index.html +2641 -0
  202. package/dist/serve/{docs-ui → site-ui}/docs/pyric-database-reference-api.md +1055 -158
  203. package/dist/serve/{docs-ui → site-ui}/docs/pyric-firestore-reference-api/index.html +311 -249
  204. package/dist/serve/{docs-ui → site-ui}/docs/pyric-firestore-reference-api.md +72 -54
  205. package/dist/serve/site-ui/docs/pyric-messaging-reference-api/index.html +509 -0
  206. package/dist/serve/site-ui/docs/pyric-messaging-sw-reference-api/index.html +182 -0
  207. package/dist/serve/{docs-ui → site-ui}/docs/pyric-rules-reference-api/index.html +7 -26
  208. package/dist/serve/{docs-ui → site-ui}/docs/pyric-rules-reference-api.md +13 -23
  209. package/dist/serve/site-ui/docs/pyric-sandbox-database-reference-api/index.html +121 -0
  210. package/dist/serve/site-ui/docs/pyric-sandbox-firestore-reference-api/index.html +203 -0
  211. package/dist/serve/{docs-ui → site-ui}/docs/pyric-sandbox-reference-api/index.html +26 -5
  212. package/dist/serve/{docs-ui → site-ui}/docs/pyric-sandbox-reference-api.md +22 -22
  213. package/dist/serve/{docs-ui → site-ui}/docs/pyric-storage-reference-api/index.html +5 -15
  214. package/dist/serve/{docs-ui → site-ui}/docs/pyric-storage-reference-api.md +0 -13
  215. package/dist/serve/site-ui/docs/pyric-ui-agents-reference-api/index.html +639 -0
  216. package/dist/serve/site-ui/docs/pyric-ui-auth-hooks-reference-api/index.html +100 -0
  217. package/dist/serve/{docs-ui → site-ui}/docs/pyric-ui-auth-reference-api/index.html +4 -4
  218. package/dist/serve/site-ui/docs/pyric-ui-events-hooks-reference-api/index.html +24 -0
  219. package/dist/serve/{docs-ui → site-ui}/docs/pyric-ui-events-reference-api/index.html +4 -4
  220. package/dist/serve/site-ui/docs/pyric-ui-firestore-hooks-reference-api/index.html +136 -0
  221. package/dist/serve/{docs-ui → site-ui}/docs/pyric-ui-firestore-reference-api/index.html +7 -7
  222. package/dist/serve/{docs-ui → site-ui}/docs/pyric-ui-firestore-reference-api.md +4 -4
  223. package/dist/serve/{docs-ui → site-ui}/docs/pyric-ui-primitives-reference-api/index.html +4 -4
  224. package/dist/serve/{docs-ui → site-ui}/docs/pyric-ui-rtdb-reference-api/index.html +4 -4
  225. package/dist/serve/site-ui/docs/pyric-ui-rules-hooks-reference-api/index.html +16 -0
  226. package/dist/serve/{docs-ui → site-ui}/docs/pyric-ui-rules-reference-api/index.html +4 -4
  227. package/dist/serve/site-ui/docs/pyric-ui-storage-hooks-reference-api/index.html +176 -0
  228. package/dist/serve/{docs-ui → site-ui}/docs/pyric-ui-storage-reference-api/index.html +10 -11
  229. package/dist/serve/{docs-ui → site-ui}/docs/pyric-ui-storage-reference-api.md +7 -8
  230. package/dist/serve/site-ui/docs/pyric-ui-traffic-hooks-reference-api/index.html +188 -0
  231. package/dist/serve/{docs-ui → site-ui}/docs/pyric-ui-traffic-reference-api/index.html +4 -4
  232. package/dist/serve/{docs-ui → site-ui}/docs/rules-compat/index.html +87 -57
  233. package/dist/serve/{docs-ui → site-ui}/docs/rules-compat.md +84 -54
  234. package/dist/serve/site-ui/docs/secure/audit-your-rules/index.html +51 -0
  235. package/dist/serve/site-ui/docs/secure/firestore-rules-limits/index.html +106 -0
  236. package/dist/serve/site-ui/docs/secure/read-a-denial/index.html +41 -0
  237. package/dist/serve/site-ui/docs/secure/rtdb-rules-in-typescript/index.html +67 -0
  238. package/dist/serve/site-ui/docs/secure/rules-standard-library/index.html +159 -0
  239. package/dist/serve/{docs-ui → site-ui}/docs/secure/rules-standard-library.md +2 -2
  240. package/dist/serve/site-ui/docs/secure/secure-it-with-rules/index.html +47 -0
  241. package/dist/serve/site-ui/docs/secure/simulate-and-lint/index.html +95 -0
  242. package/dist/serve/site-ui/docs/secure/write-a-rules-test-suite/index.html +82 -0
  243. package/dist/serve/site-ui/docs/ship/ship-to-production/index.html +37 -0
  244. package/dist/serve/site-ui/docs/ship/test-in-node/index.html +75 -0
  245. package/dist/serve/{docs-ui → site-ui}/docs/storage-compat/index.html +8 -8
  246. package/dist/serve/{docs-ui → site-ui}/docs/storage-compat.md +5 -5
  247. package/dist/serve/site-ui/docs/trust/how-we-know-it-matches-firebase/index.html +132 -0
  248. package/dist/serve/site-ui/docs/trust/rules-standard-library/index.html +861 -0
  249. package/dist/serve/site-ui/docs/trust/rules-standard-library.md +344 -0
  250. package/dist/serve/site-ui/docs/trust/storage-rules-stdlib-research/index.html +582 -0
  251. package/dist/serve/site-ui/docs/trust/storage-rules-stdlib-research.md +448 -0
  252. package/dist/serve/site-ui/docs/trust/versioning-and-compatibility/index.html +14 -0
  253. package/dist/serve/{docs-ui → site-ui}/docs/tutorial/index.html +4 -4
  254. package/dist/serve/{docs-ui → site-ui}/docs/tutorial.md +1 -1
  255. package/dist/serve/site-ui/examples/chess/index.html +2 -0
  256. package/dist/serve/site-ui/examples/firestore-first-write/index.html +2 -0
  257. package/dist/serve/site-ui/firestore/index.html +11 -0
  258. package/dist/serve/site-ui/index.html +11 -0
  259. package/dist/serve/{docs-ui → site-ui}/llms.txt +6 -2
  260. package/dist/serve/site-ui/rtdb/index.html +11 -0
  261. package/dist/serve/site-ui/settings/index.html +11 -0
  262. package/dist/serve/site-ui/storage/index.html +11 -0
  263. package/dist/serve/site-ui/studio-routes.json +1 -0
  264. package/dist/serve/site-ui/traffic/index.html +11 -0
  265. package/dist/serve/standalone-assets.d.ts +4 -10
  266. package/dist/serve/standalone-assets.d.ts.map +1 -1
  267. package/dist/serve/standalone-assets.js +8 -21
  268. package/dist/serve/standalone-assets.js.map +1 -1
  269. package/dist/serve/vite-functions-development.d.ts +29 -0
  270. package/dist/serve/vite-functions-development.d.ts.map +1 -0
  271. package/dist/serve/vite-functions-development.js +150 -0
  272. package/dist/serve/vite-functions-development.js.map +1 -0
  273. package/dist/serve/vite-generation-bridge.d.ts +17 -0
  274. package/dist/serve/vite-generation-bridge.d.ts.map +1 -0
  275. package/dist/serve/vite-generation-bridge.js +47 -0
  276. package/dist/serve/vite-generation-bridge.js.map +1 -0
  277. package/dist/serve/vite-generation-functions.d.ts +35 -0
  278. package/dist/serve/vite-generation-functions.d.ts.map +1 -0
  279. package/dist/serve/vite-generation-functions.js +46 -0
  280. package/dist/serve/vite-generation-functions.js.map +1 -0
  281. package/dist/serve/vite-generation-middleware.d.ts +10 -0
  282. package/dist/serve/vite-generation-middleware.d.ts.map +1 -0
  283. package/dist/serve/vite-generation-middleware.js +40 -0
  284. package/dist/serve/vite-generation-middleware.js.map +1 -0
  285. package/dist/serve/vite-generation-rules-watch.d.ts +8 -0
  286. package/dist/serve/vite-generation-rules-watch.d.ts.map +1 -0
  287. package/dist/serve/vite-generation-rules-watch.js +33 -0
  288. package/dist/serve/vite-generation-rules-watch.js.map +1 -0
  289. package/dist/serve/vite-module-swap.d.ts +16 -0
  290. package/dist/serve/vite-module-swap.d.ts.map +1 -0
  291. package/dist/serve/vite-module-swap.js +96 -0
  292. package/dist/serve/vite-module-swap.js.map +1 -0
  293. package/dist/serve/vite-page-runtime.d.ts +29 -0
  294. package/dist/serve/vite-page-runtime.d.ts.map +1 -0
  295. package/dist/serve/vite-page-runtime.js +71 -0
  296. package/dist/serve/vite-page-runtime.js.map +1 -0
  297. package/dist/serve/vite-plugin.d.ts +44 -4
  298. package/dist/serve/vite-plugin.d.ts.map +1 -1
  299. package/dist/serve/vite-plugin.js +62 -864
  300. package/dist/serve/vite-plugin.js.map +1 -1
  301. package/dist/serve/vite-sandbox-generation.d.ts +57 -0
  302. package/dist/serve/vite-sandbox-generation.d.ts.map +1 -0
  303. package/dist/serve/vite-sandbox-generation.js +178 -0
  304. package/dist/serve/vite-sandbox-generation.js.map +1 -0
  305. package/dist/serve/worker/client/disconnect.d.ts.map +1 -1
  306. package/dist/serve/worker/client/disconnect.js +2 -0
  307. package/dist/serve/worker/client/disconnect.js.map +1 -1
  308. package/dist/serve/worker/client/handles.d.ts +5 -0
  309. package/dist/serve/worker/client/handles.d.ts.map +1 -1
  310. package/dist/serve/worker/client/handles.js.map +1 -1
  311. package/dist/serve/worker/client/pagehide.d.ts +13 -0
  312. package/dist/serve/worker/client/pagehide.d.ts.map +1 -0
  313. package/dist/serve/worker/client/pagehide.js +19 -0
  314. package/dist/serve/worker/client/pagehide.js.map +1 -0
  315. package/dist/serve/worker/client/rtdb-admin.d.ts +8 -0
  316. package/dist/serve/worker/client/rtdb-admin.d.ts.map +1 -0
  317. package/dist/serve/worker/client/rtdb-admin.js +39 -0
  318. package/dist/serve/worker/client/rtdb-admin.js.map +1 -0
  319. package/dist/serve/worker/client/rtdb-connection-lifecycle.d.ts +15 -0
  320. package/dist/serve/worker/client/rtdb-connection-lifecycle.d.ts.map +1 -0
  321. package/dist/serve/worker/client/rtdb-connection-lifecycle.js +45 -0
  322. package/dist/serve/worker/client/rtdb-connection-lifecycle.js.map +1 -0
  323. package/dist/serve/worker/client/rtdb-controls.d.ts +6 -0
  324. package/dist/serve/worker/client/rtdb-controls.d.ts.map +1 -0
  325. package/dist/serve/worker/client/rtdb-controls.js +8 -0
  326. package/dist/serve/worker/client/rtdb-controls.js.map +1 -0
  327. package/dist/serve/worker/client/rtdb-listeners.d.ts +24 -0
  328. package/dist/serve/worker/client/rtdb-listeners.d.ts.map +1 -0
  329. package/dist/serve/worker/client/rtdb-listeners.js +262 -0
  330. package/dist/serve/worker/client/rtdb-listeners.js.map +1 -0
  331. package/dist/serve/worker/client/rtdb-reads.d.ts +4 -0
  332. package/dist/serve/worker/client/rtdb-reads.d.ts.map +1 -0
  333. package/dist/serve/worker/client/rtdb-reads.js +11 -0
  334. package/dist/serve/worker/client/rtdb-reads.js.map +1 -0
  335. package/dist/serve/worker/client/rtdb-references.d.ts +19 -0
  336. package/dist/serve/worker/client/rtdb-references.d.ts.map +1 -0
  337. package/dist/serve/worker/client/rtdb-references.js +63 -0
  338. package/dist/serve/worker/client/rtdb-references.js.map +1 -0
  339. package/dist/serve/worker/client/rtdb-snapshots.d.ts +20 -0
  340. package/dist/serve/worker/client/rtdb-snapshots.d.ts.map +1 -0
  341. package/dist/serve/worker/client/rtdb-snapshots.js +64 -0
  342. package/dist/serve/worker/client/rtdb-snapshots.js.map +1 -0
  343. package/dist/serve/worker/client/rtdb-transactions.d.ts +14 -0
  344. package/dist/serve/worker/client/rtdb-transactions.d.ts.map +1 -0
  345. package/dist/serve/worker/client/rtdb-transactions.js +34 -0
  346. package/dist/serve/worker/client/rtdb-transactions.js.map +1 -0
  347. package/dist/serve/worker/client/rtdb-writes.d.ts +8 -0
  348. package/dist/serve/worker/client/rtdb-writes.d.ts.map +1 -0
  349. package/dist/serve/worker/client/rtdb-writes.js +65 -0
  350. package/dist/serve/worker/client/rtdb-writes.js.map +1 -0
  351. package/dist/serve/worker/client.d.ts +0 -2
  352. package/dist/serve/worker/client.d.ts.map +1 -1
  353. package/dist/serve/worker/client.js +0 -2
  354. package/dist/serve/worker/client.js.map +1 -1
  355. package/dist/serve/worker/entry.js +2 -2
  356. package/dist/serve/worker/entry.js.map +1 -1
  357. package/dist/serve/worker/host/dispatch.d.ts +2 -0
  358. package/dist/serve/worker/host/dispatch.d.ts.map +1 -1
  359. package/dist/serve/worker/host/dispatch.js +24 -2
  360. package/dist/serve/worker/host/dispatch.js.map +1 -1
  361. package/dist/serve/worker/host/rtdb.d.ts +6 -2
  362. package/dist/serve/worker/host/rtdb.d.ts.map +1 -1
  363. package/dist/serve/worker/host/rtdb.js +224 -2
  364. package/dist/serve/worker/host/rtdb.js.map +1 -1
  365. package/dist/serve/worker/host/studio.d.ts.map +1 -1
  366. package/dist/serve/worker/host/studio.js +2 -0
  367. package/dist/serve/worker/host/studio.js.map +1 -1
  368. package/dist/serve/worker/host/subscriptions.d.ts.map +1 -1
  369. package/dist/serve/worker/host/subscriptions.js +3 -3
  370. package/dist/serve/worker/host/subscriptions.js.map +1 -1
  371. package/dist/serve/worker/host.d.ts +1 -1
  372. package/dist/serve/worker/host.d.ts.map +1 -1
  373. package/dist/serve/worker/host.js +1 -1
  374. package/dist/serve/worker/host.js.map +1 -1
  375. package/dist/serve/worker/index.d.ts +16 -1
  376. package/dist/serve/worker/index.d.ts.map +1 -1
  377. package/dist/serve/worker/index.js +17 -4
  378. package/dist/serve/worker/index.js.map +1 -1
  379. package/dist/serve/worker/protocol.d.ts +57 -0
  380. package/dist/serve/worker/protocol.d.ts.map +1 -1
  381. package/dist/serve/worker/protocol.js.map +1 -1
  382. package/dist/serve/worker/rtdb-value-equality.d.ts +3 -0
  383. package/dist/serve/worker/rtdb-value-equality.d.ts.map +1 -0
  384. package/dist/serve/worker/rtdb-value-equality.js +18 -0
  385. package/dist/serve/worker/rtdb-value-equality.js.map +1 -0
  386. package/dist/serve/worker/serve-init.js +2 -2
  387. package/dist/serve/worker/serve-init.js.map +1 -1
  388. package/dist/serve/worker/service-worker-relay.js +2 -2
  389. package/dist/serve/worker/service-worker-relay.js.map +1 -1
  390. package/package.json +7 -5
  391. package/src/assurance/.generated/conformance-verdicts.ts +120 -75
  392. package/src/cli/serve.ts +215 -307
  393. package/src/cli/service-command-records/database-rules-generate.ts +3 -0
  394. package/src/cli/service-command-records/database-rules-lint.ts +3 -0
  395. package/src/cli/service-command-records/database-rules-simulate.ts +3 -0
  396. package/src/cli/service-command-records/database-rules-validate.ts +3 -0
  397. package/src/cli/service-command-records/firestore-indexes-generate.ts +3 -0
  398. package/src/cli/service-command-records/firestore-rules-lint.ts +3 -0
  399. package/src/cli/service-command-records/firestore-rules-resolve.ts +3 -0
  400. package/src/cli/service-command-records/firestore-rules-simulate.ts +3 -0
  401. package/src/cli/service-command-records/firestore-rules-validate.ts +3 -0
  402. package/src/cli/service-command-records/storage-rules-lint.ts +3 -0
  403. package/src/cli/service-command-records/storage-rules-simulate.ts +3 -0
  404. package/src/cli/service-commands.generated.ts +27 -0
  405. package/src/cli/service-commands.test.ts +43 -0
  406. package/src/cli/service-commands.ts +36 -51
  407. package/src/conformance/.generated/can-i-use-browser.ts +1 -1
  408. package/src/conformance/.generated/can-i-use.ts +1 -1
  409. package/src/conformance/.generated/conformance-docs.ts +1 -1
  410. package/src/functions-rtdb/development-runtime.ts +299 -0
  411. package/src/serve/bridge-mount.ts +253 -19
  412. package/src/serve/bundler.ts +8 -34
  413. package/src/serve/entries/app-client.ts +5 -4
  414. package/src/serve/entries/auth-helper-core.ts +83 -30
  415. package/src/serve/entries/database.ts +180 -57
  416. package/src/serve/entries/init.ts +30 -20
  417. package/src/serve/html-injection.ts +65 -0
  418. package/src/serve/namespace.ts +26 -169
  419. package/src/serve/runtime/worker-replacement.ts +1 -1
  420. package/src/serve/sandbox-session.ts +233 -0
  421. package/src/serve/server.ts +20 -5
  422. package/src/serve/site-tree.ts +146 -0
  423. package/src/serve/standalone-assets.ts +9 -26
  424. package/src/serve/vite-functions-development.ts +201 -0
  425. package/src/serve/vite-generation-bridge.ts +66 -0
  426. package/src/serve/vite-generation-functions.ts +78 -0
  427. package/src/serve/vite-generation-middleware.ts +56 -0
  428. package/src/serve/vite-generation-rules-watch.ts +37 -0
  429. package/src/serve/vite-module-swap.ts +119 -0
  430. package/src/serve/vite-page-runtime.ts +100 -0
  431. package/src/serve/vite-plugin.ts +78 -883
  432. package/src/serve/vite-sandbox-generation.ts +255 -0
  433. package/src/serve/worker/client/disconnect.ts +3 -1
  434. package/src/serve/worker/client/handles.ts +5 -0
  435. package/src/serve/worker/client/pagehide.ts +31 -0
  436. package/src/serve/worker/client/rtdb-admin.ts +74 -0
  437. package/src/serve/worker/client/rtdb-connection-lifecycle.ts +52 -0
  438. package/src/serve/worker/client/rtdb-controls.ts +8 -0
  439. package/src/serve/worker/client/rtdb-listeners.ts +337 -0
  440. package/src/serve/worker/client/rtdb-reads.ts +12 -0
  441. package/src/serve/worker/client/rtdb-references.ts +85 -0
  442. package/src/serve/worker/client/rtdb-snapshots.ts +118 -0
  443. package/src/serve/worker/client/rtdb-transactions.ts +51 -0
  444. package/src/serve/worker/client/rtdb-writes.ts +74 -0
  445. package/src/serve/worker/client.ts +0 -2
  446. package/src/serve/worker/entry.ts +2 -2
  447. package/src/serve/worker/host/dispatch.ts +22 -2
  448. package/src/serve/worker/host/rtdb.ts +243 -2
  449. package/src/serve/worker/host/studio.ts +2 -0
  450. package/src/serve/worker/host/subscriptions.ts +8 -4
  451. package/src/serve/worker/host.ts +1 -1
  452. package/src/serve/worker/index.ts +58 -10
  453. package/src/serve/worker/protocol.ts +23 -2
  454. package/src/serve/worker/rtdb-value-equality.ts +17 -0
  455. package/src/serve/worker/serve-init.ts +2 -2
  456. package/src/serve/worker/service-worker-relay.ts +2 -2
  457. package/dist/serve/docs-ui/_astro/_slug_.DUci-duz.css +0 -1
  458. package/dist/serve/docs-ui/docs/_rhythm/index.html +0 -100
  459. package/dist/serve/docs-ui/docs/agent/set-up-your-agent/index.html +0 -43
  460. package/dist/serve/docs-ui/docs/agent/watch-and-review/index.html +0 -26
  461. package/dist/serve/docs-ui/docs/agent/work-with-an-agent/index.html +0 -70
  462. package/dist/serve/docs-ui/docs/api-reference/index.html +0 -68
  463. package/dist/serve/docs-ui/docs/build/ai-logic/index.html +0 -64
  464. package/dist/serve/docs-ui/docs/build/authentication/index.html +0 -66
  465. package/dist/serve/docs-ui/docs/build/cloud-firestore/index.html +0 -70
  466. package/dist/serve/docs-ui/docs/build/cloud-messaging/index.html +0 -71
  467. package/dist/serve/docs-ui/docs/build/cloud-storage/index.html +0 -66
  468. package/dist/serve/docs-ui/docs/build/realtime-database/index.html +0 -67
  469. package/dist/serve/docs-ui/docs/conformance-scores/index.html +0 -50
  470. package/dist/serve/docs-ui/docs/create-pyric-reference-api/index.html +0 -531
  471. package/dist/serve/docs-ui/docs/functions-rtdb-compat/index.html +0 -73
  472. package/dist/serve/docs-ui/docs/get-started/how-the-swap-works/index.html +0 -29
  473. package/dist/serve/docs-ui/docs/get-started/start-building/index.html +0 -33
  474. package/dist/serve/docs-ui/docs/messaging-compat/index.html +0 -265
  475. package/dist/serve/docs-ui/docs/observe/resolve-runtime-status/index.html +0 -28
  476. package/dist/serve/docs-ui/docs/observe/see-whats-happening/index.html +0 -74
  477. package/dist/serve/docs-ui/docs/observe/shape-your-data/index.html +0 -45
  478. package/dist/serve/docs-ui/docs/overview/index.html +0 -17
  479. package/dist/serve/docs-ui/docs/pyric-admin-app-reference-api/index.html +0 -186
  480. package/dist/serve/docs-ui/docs/pyric-admin-storage-reference-api/index.html +0 -318
  481. package/dist/serve/docs-ui/docs/pyric-ai-scripting-reference-api/index.html +0 -160
  482. package/dist/serve/docs-ui/docs/pyric-app-reference-api/index.html +0 -425
  483. package/dist/serve/docs-ui/docs/pyric-cli-assurance-browser-reference-api/index.html +0 -60
  484. package/dist/serve/docs-ui/docs/pyric-cli-bridge-reference-api/index.html +0 -507
  485. package/dist/serve/docs-ui/docs/pyric-cli-conformance-browser-reference-api/index.html +0 -258
  486. package/dist/serve/docs-ui/docs/pyric-cli-conformance-docs-reference-api/index.html +0 -51
  487. package/dist/serve/docs-ui/docs/pyric-cli-conformance-reference-api/index.html +0 -308
  488. package/dist/serve/docs-ui/docs/pyric-cli-credentials-node-reference-api/index.html +0 -68
  489. package/dist/serve/docs-ui/docs/pyric-cli-register-reference-api/index.html +0 -11
  490. package/dist/serve/docs-ui/docs/pyric-cli-vite-reference-api/index.html +0 -126
  491. package/dist/serve/docs-ui/docs/pyric-database-reference-api/index.html +0 -1852
  492. package/dist/serve/docs-ui/docs/pyric-messaging-reference-api/index.html +0 -509
  493. package/dist/serve/docs-ui/docs/pyric-messaging-sw-reference-api/index.html +0 -182
  494. package/dist/serve/docs-ui/docs/pyric-sandbox-database-reference-api/index.html +0 -121
  495. package/dist/serve/docs-ui/docs/pyric-sandbox-firestore-reference-api/index.html +0 -203
  496. package/dist/serve/docs-ui/docs/pyric-ui-agents-reference-api/index.html +0 -639
  497. package/dist/serve/docs-ui/docs/pyric-ui-auth-hooks-reference-api/index.html +0 -100
  498. package/dist/serve/docs-ui/docs/pyric-ui-events-hooks-reference-api/index.html +0 -24
  499. package/dist/serve/docs-ui/docs/pyric-ui-firestore-hooks-reference-api/index.html +0 -136
  500. package/dist/serve/docs-ui/docs/pyric-ui-rules-hooks-reference-api/index.html +0 -16
  501. package/dist/serve/docs-ui/docs/pyric-ui-storage-hooks-reference-api/index.html +0 -176
  502. package/dist/serve/docs-ui/docs/pyric-ui-traffic-hooks-reference-api/index.html +0 -188
  503. package/dist/serve/docs-ui/docs/secure/audit-your-rules/index.html +0 -51
  504. package/dist/serve/docs-ui/docs/secure/firestore-rules-limits/index.html +0 -106
  505. package/dist/serve/docs-ui/docs/secure/read-a-denial/index.html +0 -41
  506. package/dist/serve/docs-ui/docs/secure/rtdb-rules-in-typescript/index.html +0 -67
  507. package/dist/serve/docs-ui/docs/secure/rules-standard-library/index.html +0 -159
  508. package/dist/serve/docs-ui/docs/secure/secure-it-with-rules/index.html +0 -47
  509. package/dist/serve/docs-ui/docs/secure/simulate-and-lint/index.html +0 -95
  510. package/dist/serve/docs-ui/docs/secure/write-a-rules-test-suite/index.html +0 -82
  511. package/dist/serve/docs-ui/docs/ship/ship-to-production/index.html +0 -37
  512. package/dist/serve/docs-ui/docs/ship/test-in-node/index.html +0 -75
  513. package/dist/serve/docs-ui/docs/trust/how-we-know-it-matches-firebase/index.html +0 -132
  514. package/dist/serve/docs-ui/docs/trust/versioning-and-compatibility/index.html +0 -14
  515. package/dist/serve/docs-ui/index.html +0 -1
  516. package/dist/serve/studio-ui/assets/RulesCodeEditor-BDlH-5lp.js +0 -23
  517. package/dist/serve/studio-ui/assets/index-Bf9SSE8L.js +0 -1218
  518. package/dist/serve/studio-ui/assets/index-BlSGru_r.css +0 -1
  519. package/dist/serve/studio-ui/assets/seed-D_UjxfOU.js +0 -20
  520. package/dist/serve/studio-ui/index.html +0 -32
  521. package/dist/serve/worker/client/rtdb.d.ts +0 -36
  522. package/dist/serve/worker/client/rtdb.d.ts.map +0 -1
  523. package/dist/serve/worker/client/rtdb.js +0 -241
  524. package/dist/serve/worker/client/rtdb.js.map +0 -1
  525. package/src/serve/worker/client/rtdb.ts +0 -311
  526. /package/dist/serve/{docs-ui → site-ui}/404.html +0 -0
  527. /package/dist/serve/{docs-ui → site-ui}/_astro/_slug_.CXh9yTP1.css +0 -0
  528. /package/dist/serve/{docs-ui → site-ui}/docs/_rhythm.md +0 -0
  529. /package/dist/serve/{docs-ui → site-ui}/docs/agent/set-up-your-agent.md +0 -0
  530. /package/dist/serve/{docs-ui → site-ui}/docs/agent/watch-and-review.md +0 -0
  531. /package/dist/serve/{docs-ui → site-ui}/docs/agent/work-with-an-agent.md +0 -0
  532. /package/dist/serve/{docs-ui → site-ui}/docs/ai-compat.md +0 -0
  533. /package/dist/serve/{docs-ui → site-ui}/docs/api-reference.md +0 -0
  534. /package/dist/serve/{docs-ui → site-ui}/docs/app-compat.md +0 -0
  535. /package/dist/serve/{docs-ui → site-ui}/docs/auth-compat.md +0 -0
  536. /package/dist/serve/{docs-ui → site-ui}/docs/build/ai-logic.md +0 -0
  537. /package/dist/serve/{docs-ui → site-ui}/docs/build/authentication.md +0 -0
  538. /package/dist/serve/{docs-ui → site-ui}/docs/build/cloud-firestore.md +0 -0
  539. /package/dist/serve/{docs-ui → site-ui}/docs/build/cloud-messaging.md +0 -0
  540. /package/dist/serve/{docs-ui → site-ui}/docs/build/realtime-database.md +0 -0
  541. /package/dist/serve/{docs-ui → site-ui}/docs/create-pyric-reference-api.md +0 -0
  542. /package/dist/serve/{docs-ui → site-ui}/docs/functions-rtdb-compat.md +0 -0
  543. /package/dist/serve/{docs-ui → site-ui}/docs/get-started/how-the-swap-works.md +0 -0
  544. /package/dist/serve/{docs-ui → site-ui}/docs/get-started/start-building.md +0 -0
  545. /package/dist/serve/{docs-ui → site-ui}/docs/index.html +0 -0
  546. /package/dist/serve/{docs-ui → site-ui}/docs/observe/resolve-runtime-status.md +0 -0
  547. /package/dist/serve/{docs-ui → site-ui}/docs/observe/see-whats-happening.md +0 -0
  548. /package/dist/serve/{docs-ui → site-ui}/docs/observe/shape-your-data.md +0 -0
  549. /package/dist/serve/{docs-ui → site-ui}/docs/overview.md +0 -0
  550. /package/dist/serve/{docs-ui → site-ui}/docs/pyric-admin-app-reference-api.md +0 -0
  551. /package/dist/serve/{docs-ui → site-ui}/docs/pyric-admin-auth-reference-api.md +0 -0
  552. /package/dist/serve/{docs-ui → site-ui}/docs/pyric-admin-database-reference-api.md +0 -0
  553. /package/dist/serve/{docs-ui → site-ui}/docs/pyric-admin-messaging-reference-api.md +0 -0
  554. /package/dist/serve/{docs-ui → site-ui}/docs/pyric-admin-storage-reference-api.md +0 -0
  555. /package/dist/serve/{docs-ui → site-ui}/docs/pyric-ai-reference-api.md +0 -0
  556. /package/dist/serve/{docs-ui → site-ui}/docs/pyric-ai-scripting-reference-api.md +0 -0
  557. /package/dist/serve/{docs-ui → site-ui}/docs/pyric-app-reference-api.md +0 -0
  558. /package/dist/serve/{docs-ui → site-ui}/docs/pyric-auth-reference-api.md +0 -0
  559. /package/dist/serve/{docs-ui → site-ui}/docs/pyric-cli-assurance-browser-reference-api.md +0 -0
  560. /package/dist/serve/{docs-ui → site-ui}/docs/pyric-cli-assurance-reference-api.md +0 -0
  561. /package/dist/serve/{docs-ui → site-ui}/docs/pyric-cli-bridge-client-reference-api.md +0 -0
  562. /package/dist/serve/{docs-ui → site-ui}/docs/pyric-cli-bridge-reference-api.md +0 -0
  563. /package/dist/serve/{docs-ui → site-ui}/docs/pyric-cli-conformance-browser-reference-api.md +0 -0
  564. /package/dist/serve/{docs-ui → site-ui}/docs/pyric-cli-conformance-docs-reference-api.md +0 -0
  565. /package/dist/serve/{docs-ui → site-ui}/docs/pyric-cli-conformance-reference-api.md +0 -0
  566. /package/dist/serve/{docs-ui → site-ui}/docs/pyric-cli-credentials-node-reference-api.md +0 -0
  567. /package/dist/serve/{docs-ui → site-ui}/docs/pyric-cli-discover-reference-api.md +0 -0
  568. /package/dist/serve/{docs-ui → site-ui}/docs/pyric-cli-register-reference-api.md +0 -0
  569. /package/dist/serve/{docs-ui → site-ui}/docs/pyric-cli-remote-reference-api.md +0 -0
  570. /package/dist/serve/{docs-ui → site-ui}/docs/pyric-cli-verify-reference-api.md +0 -0
  571. /package/dist/serve/{docs-ui → site-ui}/docs/pyric-messaging-reference-api.md +0 -0
  572. /package/dist/serve/{docs-ui → site-ui}/docs/pyric-messaging-sw-reference-api.md +0 -0
  573. /package/dist/serve/{docs-ui → site-ui}/docs/pyric-sandbox-database-reference-api.md +0 -0
  574. /package/dist/serve/{docs-ui → site-ui}/docs/pyric-sandbox-firestore-reference-api.md +0 -0
  575. /package/dist/serve/{docs-ui → site-ui}/docs/pyric-ui-agents-reference-api.md +0 -0
  576. /package/dist/serve/{docs-ui → site-ui}/docs/pyric-ui-auth-hooks-reference-api.md +0 -0
  577. /package/dist/serve/{docs-ui → site-ui}/docs/pyric-ui-auth-reference-api.md +0 -0
  578. /package/dist/serve/{docs-ui → site-ui}/docs/pyric-ui-events-hooks-reference-api.md +0 -0
  579. /package/dist/serve/{docs-ui → site-ui}/docs/pyric-ui-events-reference-api.md +0 -0
  580. /package/dist/serve/{docs-ui → site-ui}/docs/pyric-ui-firestore-hooks-reference-api.md +0 -0
  581. /package/dist/serve/{docs-ui → site-ui}/docs/pyric-ui-primitives-reference-api.md +0 -0
  582. /package/dist/serve/{docs-ui → site-ui}/docs/pyric-ui-rtdb-reference-api.md +0 -0
  583. /package/dist/serve/{docs-ui → site-ui}/docs/pyric-ui-rules-hooks-reference-api.md +0 -0
  584. /package/dist/serve/{docs-ui → site-ui}/docs/pyric-ui-rules-reference-api.md +0 -0
  585. /package/dist/serve/{docs-ui → site-ui}/docs/pyric-ui-storage-hooks-reference-api.md +0 -0
  586. /package/dist/serve/{docs-ui → site-ui}/docs/pyric-ui-traffic-hooks-reference-api.md +0 -0
  587. /package/dist/serve/{docs-ui → site-ui}/docs/pyric-ui-traffic-reference-api.md +0 -0
  588. /package/dist/serve/{docs-ui → site-ui}/docs/secure/audit-your-rules.md +0 -0
  589. /package/dist/serve/{docs-ui → site-ui}/docs/secure/firestore-rules-limits.md +0 -0
  590. /package/dist/serve/{docs-ui → site-ui}/docs/secure/read-a-denial.md +0 -0
  591. /package/dist/serve/{docs-ui → site-ui}/docs/secure/rtdb-rules-in-typescript.md +0 -0
  592. /package/dist/serve/{docs-ui → site-ui}/docs/secure/secure-it-with-rules.md +0 -0
  593. /package/dist/serve/{docs-ui → site-ui}/docs/secure/simulate-and-lint.md +0 -0
  594. /package/dist/serve/{docs-ui → site-ui}/docs/secure/write-a-rules-test-suite.md +0 -0
  595. /package/dist/serve/{docs-ui → site-ui}/docs/ship/ship-to-production.md +0 -0
  596. /package/dist/serve/{docs-ui → site-ui}/docs/ship/test-in-node.md +0 -0
  597. /package/dist/serve/{docs-ui → site-ui}/docs/trust/how-we-know-it-matches-firebase.md +0 -0
  598. /package/dist/serve/{docs-ui → site-ui}/docs/trust/versioning-and-compatibility.md +0 -0
  599. /package/dist/serve/{studio-ui → site-ui}/pyric-logo.svg +0 -0
package/dist/cli/serve.js CHANGED
@@ -10,24 +10,21 @@
10
10
  * rules load (fail fast on broken rules) → SDK bundle (cached per pyric
11
11
  * version) → static server with the `/__pyric/` namespace + HTML injection.
12
12
  */
13
- import { dirname, join, relative, resolve } from 'node:path';
14
- import { existsSync, mkdirSync, readdirSync, readFileSync, rmSync, statSync, writeFileSync } from 'node:fs';
13
+ import { join, relative, resolve } from 'node:path';
14
+ import { existsSync, readdirSync, readFileSync, statSync, watch as watchFile } from 'node:fs';
15
15
  import { readFirebaseJson, readFirebaseRc } from './firebase-json.js';
16
- import { bundleSdk, bundleWorker, defaultSdkEntries, resolveDocsUiDir, resolveStudioUiDir } from '../serve/bundler.js';
17
- import { isStandalone, materializeDocsUi, materializeServeAssets, materializeStudioUi, embeddedWorkerVersion, } from '../serve/standalone-assets.js';
18
- import { loadProjectDatabaseRules, loadProjectRules, loadProjectStorageRules, watchProjectRules } from '../serve/rules.js';
16
+ import { bundleSdk, bundleWorker, defaultSdkEntries, resolveSiteUiDir } from '../serve/bundler.js';
17
+ import { isStandalone, materializeServeAssets, materializeSiteUi, embeddedWorkerVersion, } from '../serve/standalone-assets.js';
19
18
  import { hasSandboxBuildMarker } from '../serve/sandbox-marker.js';
20
- import { createEventHub, createPyricNamespace, injectServeTags, } from '../serve/namespace.js';
19
+ import { injectServeTags } from '../serve/html-injection.js';
21
20
  import { formatActivityWarning } from '../serve/activity-warning.js';
22
- import { createStateStore, STATE_FILE_VERSION } from '../serve/state-store.js';
23
- import { diskProjectStore, diskWorkspace } from '../serve/studio/index.js';
24
- import { createCaptureStore } from '../serve/capture-store.js';
25
21
  import { consoleServeLogger, startStaticServer, stderrServeLogger } from '../serve/server.js';
26
22
  import { createBridgeMount } from '../serve/bridge-mount.js';
27
23
  import { openBrowser, shouldAutoOpen } from '../serve/open-browser.js';
28
- import { buildChildEnv, createLinePrefixer, detectPackageManager, readDevScript, registerModuleUrl, resolveDevChild, spawnDevChild, waitForSandboxPeer, } from './dev-runner.js';
29
- import { spawnFunctionsRtdbChild, } from '../functions-rtdb/child.js';
24
+ import { buildChildEnv, detectPackageManager, readDevScript, registerModuleUrl, resolveDevChild, spawnDevChild, waitForSandboxPeer, } from './dev-runner.js';
25
+ import { createFunctionsDevelopmentRuntime, createHttpFunctionsPeerReadiness, } from '../functions-rtdb/development-runtime.js';
30
26
  import { discoverFunctionsRtdbProject, } from '../functions-rtdb/project.js';
27
+ import { createSandboxSession, SandboxSeedError, } from '../serve/sandbox-session.js';
31
28
  /** Extract the single hosting config `pyric dev` v1 supports. Arrays
32
29
  * (multi-site) take the first entry with a warning — multi-site is out of
33
30
  * scope (plan section 6). */
@@ -122,99 +119,6 @@ export async function startServe(opts) {
122
119
  `A plain \`vite build\` is your production build — deploy it, don't sandbox it.`);
123
120
  }
124
121
  }
125
- // Rules: fail fast on broken rules; serve rule-less only when genuinely absent.
126
- // Held in a mutable box — the watcher swaps it and the payload producer
127
- // always serves the live version.
128
- const loaded = await loadProjectRules(opts.cwd, config);
129
- const loadedDatabase = await loadProjectDatabaseRules(opts.cwd, config);
130
- // Storage rules deploy ONCE at boot — see the `storageRules` doc on
131
- // `InitPayload`: `pyric/storage` only honors rules on the FIRST storage
132
- // call per Sandbox, so unlike firestore/database rules there is no live
133
- // "live" box to swap here; a storage.rules edit needs a restart.
134
- const loadedStorage = await loadProjectStorageRules(opts.cwd, config);
135
- const live = {
136
- rules: loaded.rules,
137
- rulesHash: loaded.rulesHash,
138
- databaseRules: loadedDatabase.rules,
139
- databaseRulesHash: loadedDatabase.rulesHash,
140
- databaseUrl: loadedDatabase.databaseUrl,
141
- };
142
- // --capture (default on): the capture store writes .pyric/last-session.json
143
- // whenever the page pushes its session fixture via POST /__pyric/capture.
144
- // pyric verify (no-arg) reads that file. Independent of --persist — capture
145
- // records for the verify loop, persist is for cross-reload durability.
146
- const capture = (opts.capture ?? true) ? createCaptureStore(opts.cwd) : null;
147
- // --persist: the state store IS the durable sandbox (section 3c). Load eagerly so
148
- // a corrupt/mismatched file fails the start (inspect-or-delete message)
149
- // instead of silently serving ephemeral.
150
- const state = opts.persist ? createStateStore(opts.cwd) : null;
151
- // --fresh: the escape hatch from "state wins after the first run" — drop
152
- // the existing state (+ its backup) so this run re-seeds from scratch.
153
- if (state && opts.fresh) {
154
- for (const p of [state.path, state.backupPath])
155
- if (existsSync(p))
156
- rmSync(p);
157
- logger.note(' ⓘ --fresh: discarded the existing state file; re-seeding');
158
- // Half-reset warning: --fresh only deletes the SERVER file. The worker's
159
- // durable store is browser IndexedDB, and prime-once only fills an EMPTY
160
- // IDB (createWorkerDurableBackend) — a browser that already holds sandbox
161
- // data KEEPS it and its next flush repopulates the supposedly-fresh file.
162
- // The reset handshake (making --fresh actually clear the browser store) is
163
- // future work; until then, say so loudly rather than let the file quietly
164
- // refill.
165
- logger.note(' ⚠ --fresh only resets the server-side state file — a browser tab that already has ' +
166
- 'sandbox data in IndexedDB keeps it and will write it straight back on its next flush. ' +
167
- 'For a full reset, also clear the browser store: Studio → Settings → Reset, or open an ' +
168
- 'incognito/private window.');
169
- }
170
- let persistedEnvelope = state?.load() ?? null;
171
- // --seed accepts BOTH shapes: a bare path→fields map, or a PyricStateFile
172
- // envelope (detected by its `version` key — what `pyric snapshot` emits).
173
- let seed = null;
174
- /** Ephemeral fixture restore: the controller blob from a state-file seed,
175
- * restored in-page through the persistence deserializer (wrapper
176
- * re-hydration) via a read-only backend. */
177
- let seedState = null;
178
- let seedUsers = null;
179
- let seedLabel = '';
180
- if (opts.seed) {
181
- const seedPath = resolve(opts.cwd, opts.seed);
182
- let parsed;
183
- try {
184
- parsed = JSON.parse(readFileSync(seedPath, 'utf8'));
185
- }
186
- catch (e) {
187
- throw new Error(`pyric dev: failed to read --seed ${seedPath}: ${e instanceof Error ? e.message : String(e)}`);
188
- }
189
- if (!parsed || typeof parsed !== 'object' || Array.isArray(parsed)) {
190
- throw new Error(`pyric dev: --seed must be a JSON object of "collection/doc" → fields, got ${Array.isArray(parsed) ? 'array' : typeof parsed}`);
191
- }
192
- const obj = parsed;
193
- if (obj.version === STATE_FILE_VERSION && ('firestore' in obj || 'auth' in obj)) {
194
- const fixture = obj;
195
- const docCount = Object.keys((fixture.firestore?.firestore) ?? {}).length;
196
- const userCount = fixture.auth?.users?.length ?? 0;
197
- seedLabel = `${docCount} doc(s) + ${userCount} user(s) from state fixture`;
198
- if (state && !state.exists()) {
199
- // Persist first run seeded from a fixture: prime the store, then the
200
- // normal persist path restores it like any lived state.
201
- if (fixture.firestore != null)
202
- state.writeSection('firestore', fixture.firestore);
203
- if (fixture.auth != null)
204
- state.writeSection('auth', fixture.auth);
205
- persistedEnvelope = state.load();
206
- }
207
- else if (!state) {
208
- seedState = fixture.firestore ?? null;
209
- seedUsers = fixture.auth?.users ?? null;
210
- }
211
- // persist + existing state: the lived state wins; the fixture is inert.
212
- }
213
- else {
214
- seed = parsed;
215
- seedLabel = `${Object.keys(seed).length} document(s)`;
216
- }
217
- }
218
122
  // SDK bundles (cached per pyric version + entry hash). In a standalone
219
123
  // binary the runtime esbuild bundler is unavailable, so the deterministic
220
124
  // bundles were built at compile time and embedded; materialize them to a
@@ -259,78 +163,53 @@ export async function startServe(opts) {
259
163
  : null;
260
164
  // bridgeUrl needs the BOUND port; resolved after listen via this box.
261
165
  const origin = { host: opts.host ?? 'localhost', port: 0 };
262
- const payload = () => ({
263
- rules: live.rules,
264
- rulesHash: live.rulesHash,
265
- databaseRules: live.databaseRules,
266
- databaseRulesHash: live.databaseRulesHash,
267
- databaseUrl: live.databaseUrl,
268
- storageRules: loadedStorage.rules,
269
- storageRulesHash: loadedStorage.rulesHash,
270
- // Project identity: scopes the storage IDB name per served project
271
- // (issue #359). Local-only — a dev path never leaves the machine.
272
- projectKey: opts.cwd,
273
- bridgeUrl: mount && origin.port > 0 ? mount.wsUrl(origin) : null,
274
- // Precedence: once a state file exists, the lived state is the truth —
275
- // --seed applies only on the first (state-less) run.
276
- seed: state?.exists() ? null : seed,
277
- seedState,
278
- persist: Boolean(state),
279
- capture: Boolean(capture),
280
- authUsers: state
281
- ? (state.readSection('auth')?.users ?? null)
282
- : seedUsers,
283
- // Served firebase/messaging is part of the canonical swap, so the worker
284
- // broker must be available whenever the SDK entries are served.
285
- messaging: true,
286
- });
287
- const events = createEventHub();
288
- // --ui (Pyric Studio): serve the disk-backed workspace + project routes.
289
- // Single-project mode: the served `cwd` IS the one project's file tree; the
290
- // project store roots at `.pyric/projects` (multi-project ready) but the
291
- // current served tree is also reachable directly via /__pyric/workspace.
292
- const studio = opts.ui
293
- ? {
294
- workspace: diskWorkspace(opts.cwd),
295
- projects: diskProjectStore(join(opts.cwd, '.pyric', 'projects')),
296
- }
297
- : undefined;
298
- // --ui also serves the BUILT Studio app under /__pyric/ui/. The dir is
166
+ // --ui also serves the unified Astro site under /__pyric/ui/. The dir is
299
167
  // resolved by file path (never imported), so a missing build is a clear
300
168
  // warning rather than a crash; the data routes still mount.
301
- let studioUiDir;
302
- let docsUiDir;
169
+ let siteUiDir;
303
170
  if (opts.ui) {
304
- // Standalone: the Studio app was embedded at compile time; materialize it.
305
- const dir = isStandalone() ? await materializeStudioUi() : resolveStudioUiDir();
306
- const docsDir = isStandalone() ? await materializeDocsUi() : resolveDocsUiDir();
171
+ const dir = isStandalone() ? await materializeSiteUi() : resolveSiteUiDir();
307
172
  if (dir) {
308
- studioUiDir = dir;
173
+ siteUiDir = dir;
309
174
  }
310
175
  else {
311
- logger.note(' ⚠ --ui: built Studio app not found (run the full build first). ' +
176
+ logger.note(' ⚠ --ui: built Astro site not found (run the full build first). ' +
312
177
  'The data routes are mounted, but /__pyric/ui/ will 404.');
313
178
  }
314
- if (docsDir) {
315
- docsUiDir = docsDir;
316
- }
317
- else {
318
- logger.note(' ⚠ --ui: built docs site not found (run the full build first). ' +
319
- 'Studio is mounted, but /__pyric/ui/docs/ will 404.');
179
+ }
180
+ let session;
181
+ try {
182
+ session = await createSandboxSession({
183
+ projectDir: opts.cwd,
184
+ firebaseConfig: config,
185
+ sdk: { dir: bundle.outDir, workerVersion },
186
+ seedFile: opts.seed,
187
+ persistence: opts.persist ? { fresh: opts.fresh } : undefined,
188
+ capture: opts.capture,
189
+ studio: opts.ui ? { siteUiDir } : false,
190
+ bridgeUrl: () => mount && origin.port > 0 ? mount.wsUrl(origin) : null,
191
+ activity: (incident) => logger.note(formatActivityWarning(incident)),
192
+ logger,
193
+ });
194
+ }
195
+ catch (error) {
196
+ bundle.dispose?.();
197
+ if (error instanceof SandboxSeedError) {
198
+ if (error.kind === 'read') {
199
+ throw new Error(`pyric dev: failed to read --seed ${error.path}: ${error.detail}`);
200
+ }
201
+ throw new Error(`pyric dev: --seed must be a JSON object of "collection/doc" → fields, ${error.detail}`);
320
202
  }
203
+ throw error;
321
204
  }
322
- const sdkNamespace = createPyricNamespace({
323
- sdkDir: bundle.outDir,
324
- initPayload: payload,
325
- events,
326
- activity: (incident) => logger.note(formatActivityWarning(incident)),
327
- state: state ?? undefined,
328
- capture: capture ?? undefined,
329
- studio,
330
- studioUiDir,
331
- docsUiDir,
332
- logger,
333
- });
205
+ if (opts.persist && opts.fresh) {
206
+ logger.note(' ⓘ --fresh: discarded the existing state file; re-seeding');
207
+ logger.note(' ⚠ --fresh only resets the server-side state file — a browser tab that already has ' +
208
+ 'sandbox data in IndexedDB keeps it and will write it straight back on its next flush. ' +
209
+ 'For a full reset, also clear the browser store: Studio Settings → Reset, or open an ' +
210
+ 'incognito/private window.');
211
+ }
212
+ const payload = session.payload;
334
213
  let handle;
335
214
  try {
336
215
  handle = await startStaticServer({
@@ -339,8 +218,8 @@ export async function startServe(opts) {
339
218
  host: opts.host ?? 'localhost',
340
219
  spaRewrite: wantsSpaRewrite(hosting),
341
220
  namespaceHandler: mount
342
- ? async (req, res, url) => (await mount.handler(req, res, url)) || sdkNamespace(req, res, url)
343
- : sdkNamespace,
221
+ ? async (req, res, url) => (await mount.handler(req, res, url)) || session.handle(req, res, url)
222
+ : session.handle,
344
223
  // Never force in-page: serve always serves the worker, and the bridge peer
345
224
  // routes agent tool-calls THROUGH the worker (see connectBridgePeer), so app
346
225
  // + Studio + agent share the one sandbox even under --bridge.
@@ -350,44 +229,90 @@ export async function startServe(opts) {
350
229
  });
351
230
  }
352
231
  catch (error) {
232
+ await mount?.close();
233
+ await session.close();
353
234
  bundle.dispose?.();
354
235
  throw error;
355
236
  }
356
- if (bundle.dispose)
357
- handle.server.once('close', bundle.dispose);
358
237
  origin.port = handle.port;
359
- // Attach the WS upgrade to EVERY bound server so the sandbox peer connects on
360
- // whichever loopback family the page resolved (localhost binds both now).
361
- if (mount)
362
- for (const s of handle.servers)
363
- mount.attachUpgrade(s);
364
- const uiUrl = studioUiDir ? `${handle.url}/__pyric/ui/` : null;
365
- const docsUrl = docsUiDir ? `${handle.url}/__pyric/ui/docs/` : null;
366
- // Discovery pointer (the Claude Code plugin's stdio proxy reads this so it
367
- // never has to guess the dynamic port). Written next to the project state
368
- // when --bridge is on; removed on clean shutdown. plans/pyric-plugin.
369
- if (mount) {
370
- const pointer = join(opts.cwd, '.pyric', 'serve.json');
371
- try {
372
- mkdirSync(dirname(pointer), { recursive: true });
373
- writeFileSync(pointer, JSON.stringify({ url: handle.url, mcpUrl: mount.mcpUrl(origin), port: handle.port, pid: process.pid, instanceId: mount.instanceId, project: opts.project ?? 'sandbox' }, null, 2) + '\n');
374
- handle.server.once('close', () => { try {
375
- rmSync(pointer);
376
- }
377
- catch { /* gone already */ } });
378
- }
379
- catch { /* best-effort: discovery falls back to a port scan */ }
238
+ // The bridge attachment owns upgrades on every bound family plus discovery.
239
+ // Its explicit close handle is also folded into stop() below, before the
240
+ // sandbox session is released.
241
+ let bridgeAttachment;
242
+ try {
243
+ bridgeAttachment = mount?.attachHost({
244
+ servers: handle.servers,
245
+ lifecycleServer: handle.server,
246
+ projectDir: opts.cwd,
247
+ origin: () => origin.port > 0 ? origin : null,
248
+ });
380
249
  }
381
- // Hot-reload: watch the rules file, swap the live ruleset, broadcast.
382
- const watching = (opts.watch ?? true) && loaded.sourcePath !== null;
250
+ catch (error) {
251
+ await mount?.close();
252
+ await session.close();
253
+ await handle.stop().catch(() => undefined);
254
+ bundle.dispose?.();
255
+ throw error;
256
+ }
257
+ const stopServer = handle.stop.bind(handle);
258
+ let closeResources = null;
259
+ const closeOwnedResources = () => {
260
+ closeResources ??= (async () => {
261
+ await bridgeAttachment?.close();
262
+ await mount?.close();
263
+ await session.close();
264
+ })();
265
+ return closeResources;
266
+ };
267
+ handle = {
268
+ ...handle,
269
+ async stop() {
270
+ // Initiate listener shutdown before terminating upgraded sockets. Bun's
271
+ // node:http compatibility layer can strand close callbacks when an
272
+ // upgraded socket is destroyed first. Resource teardown remains ordered
273
+ // bridge → sandbox, and the server close is awaited last.
274
+ const serverStop = stopServer();
275
+ try {
276
+ await closeOwnedResources();
277
+ }
278
+ finally {
279
+ await serverStop;
280
+ }
281
+ },
282
+ };
283
+ if (bundle.dispose)
284
+ handle.server.once('close', bundle.dispose);
285
+ handle.server.once('close', () => void closeOwnedResources());
286
+ const uiUrl = siteUiDir ? `${handle.url}/__pyric/ui/` : null;
287
+ const docsUrl = siteUiDir ? `${handle.url}/__pyric/ui/docs/` : null;
288
+ // Hot-reload: the static adapter observes the filesystem; the session owns
289
+ // read/prepare/last-good replacement and event broadcast.
290
+ const rulesSourcePath = session.summary.rules.firestore.sourcePath;
291
+ const watching = (opts.watch ?? true) && rulesSourcePath !== null;
383
292
  if (watching) {
384
- const watcher = watchProjectRules(loaded.sourcePath, (next) => {
385
- live.rules = next.rules;
386
- live.rulesHash = next.rulesHash;
387
- events.broadcast('rules-changed', next);
388
- logger.note(` ↻ rules reloaded (hash ${next.rulesHash}) ${events.clientCount()} page(s)`);
389
- }, (message) => logger.note(` ⚠ rules NOT reloaded (last-good stays live): ${message}`));
390
- handle.server.once('close', () => watcher.close());
293
+ let debounce = null;
294
+ const watcher = watchFile(rulesSourcePath, () => {
295
+ if (debounce)
296
+ clearTimeout(debounce);
297
+ debounce = setTimeout(() => {
298
+ void session.reloadFirestoreRules().then((result) => {
299
+ if (result.kind === 'reloaded') {
300
+ logger.note(` ↻ rules reloaded (hash ${result.rulesHash}) → ${result.clients} page(s)`);
301
+ }
302
+ else if (result.kind === 'rejected') {
303
+ logger.note(` ⚠ rules NOT reloaded (last-good stays live): ${result.error.message}`);
304
+ }
305
+ });
306
+ }, 150);
307
+ });
308
+ watcher.on('error', (error) => {
309
+ logger.note(` ⚠ rules watcher failed (hot reload off): ${error instanceof Error ? error.message : String(error)}`);
310
+ });
311
+ handle.server.once('close', () => {
312
+ if (debounce)
313
+ clearTimeout(debounce);
314
+ watcher.close();
315
+ });
391
316
  }
392
317
  logger.info(`=== Serving from '${opts.cwd}'...`);
393
318
  logger.info('');
@@ -398,14 +323,14 @@ export async function startServe(opts) {
398
323
  : bundle.cached
399
324
  ? `✔ sandbox pyric SDK bundles ready (cache)`
400
325
  : `✔ sandbox pyric SDK bundles built in ${bundleMs}ms`);
401
- logger.info(loaded.rules
402
- ? `✔ rules ${loaded.sourcePath} → deployed to the in-page sandbox (hash ${loaded.rulesHash})`
326
+ logger.info(session.payload().rules
327
+ ? `✔ rules ${session.summary.rules.firestore.sourcePath} → deployed to the in-page sandbox (hash ${session.summary.rules.firestore.hash})`
403
328
  : `• rules no firestore.rules — sandbox runs with default rules`);
404
- logger.info(loadedDatabase.rules
405
- ? `✔ rules ${loadedDatabase.sourcePath} → deployed to the RTDB sandbox (hash ${loadedDatabase.rulesHash})`
329
+ logger.info(session.payload().databaseRules
330
+ ? `✔ rules ${session.summary.rules.database.sourcePath} → deployed to the RTDB sandbox (hash ${session.summary.rules.database.hash})`
406
331
  : `• rules no database.rules — RTDB sandbox runs with default rules`);
407
- logger.info(loadedStorage.rules
408
- ? `✔ rules ${loadedStorage.sourcePath} → deployed to the storage sandbox (hash ${loadedStorage.rulesHash}; ` +
332
+ logger.info(session.payload().storageRules
333
+ ? `✔ rules ${session.summary.rules.storage.sourcePath} → deployed to the storage sandbox (hash ${session.summary.rules.storage.hash}; ` +
409
334
  `edits require a restart — storage rules do not hot-reload)`
410
335
  : `• rules no storage.rules — storage sandbox runs open (no rules configured)`);
411
336
  if (uiUrl) {
@@ -418,17 +343,16 @@ export async function startServe(opts) {
418
343
  logger.info(`✔ bridge MCP endpoint: ${mount.mcpUrl(origin)} (sandbox peers over ws at /__pyric/sandbox)`);
419
344
  }
420
345
  let persistSummary = null;
421
- if (state) {
422
- const fsDocs = persistedEnvelope?.firestore
423
- ? Object.keys(persistedEnvelope.firestore.firestore ?? {}).length
424
- : 0;
425
- const users = persistedEnvelope?.auth?.users?.length ?? 0;
346
+ const persistence = session.summary.persistence;
347
+ if (persistence) {
348
+ const fsDocs = persistence.restoredDocs;
349
+ const users = persistence.restoredUsers;
426
350
  persistSummary = { restoredDocs: fsDocs, restoredUsers: users };
427
- logger.info(persistedEnvelope
428
- ? `✔ persist ${state.path} (${fsDocs} doc(s), ${users} user(s) restored; --seed skipped)`
429
- : `✔ persist new state file at ${state.path} (first run — seed applies)`);
430
- if (existsSync(state.backupPath)) {
431
- logger.note(` ⓘ a recovery backup exists at ${state.backupPath} (prior non-empty state was ` +
351
+ logger.info(persistence.restored
352
+ ? `✔ persist ${persistence.path} (${fsDocs} doc(s), ${users} user(s) restored; --seed skipped)`
353
+ : `✔ persist new state file at ${persistence.path} (first run — seed applies)`);
354
+ if (existsSync(persistence.backupPath)) {
355
+ logger.note(` ⓘ a recovery backup exists at ${persistence.backupPath} (prior non-empty state was ` +
432
356
  'replaced by an empty one — e.g. a reset). Restore: mv it back over state.json.');
433
357
  }
434
358
  }
@@ -442,14 +366,14 @@ export async function startServe(opts) {
442
366
  // (A fixture that primed the persist store is reported by the persist
443
367
  // line; a fixture ignored because lived state exists is intentionally
444
368
  // silent about staging.)
445
- if ((seed && !state?.exists()) || seedState || seedUsers) {
446
- logger.info(`✔ seed ${seedLabel} staged for page init`);
369
+ if (session.summary.seedStaged) {
370
+ logger.info(`✔ seed ${session.summary.seedLabel} staged for page init`);
447
371
  }
448
- if (capture) {
449
- logger.info(`✔ capture session → ${capture.path} (run \`pyric verify\` to replay it)`);
372
+ if (session.summary.capturePath) {
373
+ logger.info(`✔ capture session → ${session.summary.capturePath} (run \`pyric verify\` to replay it)`);
450
374
  }
451
375
  if (watching)
452
- logger.info(`✔ watch hot-reloading ${loaded.sourcePath} over /__pyric/events`);
376
+ logger.info(`✔ watch hot-reloading ${rulesSourcePath} over /__pyric/events`);
453
377
  // Browser-honesty: the sandbox is browser-resident — firestore/auth and
454
378
  // persistence run IN the served page. With no page open, data ops silently
455
379
  // no-op. This warning (paired with auto-open in runServe) is the fix for the
@@ -610,7 +534,9 @@ export async function runServe(parsed) {
610
534
  void openBrowser(runtime.uiUrl ?? runtime.handle.url);
611
535
  }
612
536
  let devChild = null;
613
- let functionsChild = null;
537
+ let functionsRuntime = null;
538
+ let resolveFunctionsExit;
539
+ const functionsExited = new Promise((resolve) => { resolveFunctionsExit = resolve; });
614
540
  let resolveSignal;
615
541
  const signal = new Promise((resolve) => {
616
542
  resolveSignal = resolve;
@@ -631,7 +557,7 @@ export async function runServe(parsed) {
631
557
  (json ? process.stderr : process.stdout).write('\nShutting down...\n');
632
558
  if (devChild && devChild.child.exitCode === null)
633
559
  devChild.signal(await signal);
634
- await functionsChild?.stop().catch(() => undefined);
560
+ await functionsRuntime?.close().catch(() => undefined);
635
561
  await runtime.handle.stop().catch(() => undefined);
636
562
  removeSignalHandlers();
637
563
  return 0;
@@ -639,68 +565,65 @@ export async function runServe(parsed) {
639
565
  if (functionsProject && functionsProjectId) {
640
566
  const info = json ? process.stderr : process.stdout;
641
567
  info.write('• functions waiting for the browser tab to connect the sandbox…\n');
642
- const connectedOutcome = await waitOrSignal(waitForSandboxPeer(runtime.handle.url));
643
- if ('signal' in connectedOutcome)
568
+ const reportFunctionsEvent = (event) => {
569
+ if (event.type === 'output') {
570
+ (event.stream === 'stdout' ? info : process.stderr).write(event.line);
571
+ return;
572
+ }
573
+ if (event.type === 'unexpected-exit') {
574
+ resolveFunctionsExit(event.code);
575
+ return;
576
+ }
577
+ const childEvent = event.event;
578
+ if (childEvent.type === 'execution') {
579
+ const params = Object.entries(childEvent.params)
580
+ .map(([name, value]) => `${name}=${value}`)
581
+ .join(', ');
582
+ const paramsSuffix = params ? ` (${params})` : '';
583
+ if (childEvent.status === 'fulfilled') {
584
+ info.write(`✔ function ${childEvent.exportName} ← /${childEvent.ref}${paramsSuffix}\n`);
585
+ }
586
+ else {
587
+ process.stderr.write(`✖ function ${childEvent.exportName} ← /${childEvent.ref}${paramsSuffix}: ${childEvent.error.message}\n`);
588
+ }
589
+ }
590
+ else {
591
+ process.stderr.write(`✖ functions delivery for ${childEvent.exportName}: ${childEvent.error.message}\n`);
592
+ }
593
+ };
594
+ functionsRuntime = createFunctionsDevelopmentRuntime({
595
+ sourceDir: functionsProject.sourceDir,
596
+ entry: functionsProject.entry,
597
+ baseEnv: process.env,
598
+ serveUrl: runtime.handle.url,
599
+ registerUrl: registerModuleUrl(),
600
+ instance: `${functionsProjectId}-default-rtdb`,
601
+ location: process.env.PYRIC_FUNCTIONS_RTDB_REGION ?? 'us-central1',
602
+ readiness: createHttpFunctionsPeerReadiness(runtime.handle.url),
603
+ onEvent: reportFunctionsEvent,
604
+ });
605
+ const startOutcome = await waitOrSignal(functionsRuntime.start());
606
+ if ('signal' in startOutcome)
644
607
  return stopAfterSignal();
645
- const connected = connectedOutcome.value;
646
- if (!connected) {
608
+ const result = startOutcome.value;
609
+ if (result.kind === 'no-peer') {
647
610
  process.stderr.write(` ⚠ functions not started — no browser tab connected after 30s. ` +
648
611
  `Open ${runtime.handle.url} and restart pyric dev.\n`);
649
612
  }
613
+ else if (result.kind === 'failed') {
614
+ process.stderr.write(`${result.error.message}\n`);
615
+ await functionsRuntime.close();
616
+ await runtime.handle.stop();
617
+ removeSignalHandlers();
618
+ return 2;
619
+ }
650
620
  else {
651
- functionsChild = spawnFunctionsRtdbChild({
652
- cwd: functionsProject.sourceDir,
653
- entry: functionsProject.entry,
654
- env: buildChildEnv(process.env, {
655
- serveUrl: runtime.handle.url,
656
- registerUrl: registerModuleUrl(),
657
- }),
658
- instance: `${functionsProjectId}-default-rtdb`,
659
- location: process.env.PYRIC_FUNCTIONS_RTDB_REGION ?? 'us-central1',
660
- onEvent(event) {
661
- if (event.type === 'execution') {
662
- const params = Object.entries(event.params)
663
- .map(([name, value]) => `${name}=${value}`)
664
- .join(', ');
665
- const paramsSuffix = params ? ` (${params})` : '';
666
- if (event.status === 'fulfilled') {
667
- info.write(`✔ function ${event.exportName} ← /${event.ref}${paramsSuffix}\n`);
668
- }
669
- else {
670
- process.stderr.write(`✖ function ${event.exportName} ← /${event.ref}${paramsSuffix}: ${event.error.message}\n`);
671
- }
672
- }
673
- else {
674
- process.stderr.write(`✖ functions delivery for ${event.exportName}: ${event.error.message}\n`);
675
- }
676
- },
677
- });
678
- const stdout = createLinePrefixer('[functions] ', (line) => (json ? process.stderr : process.stdout).write(line));
679
- const stderr = createLinePrefixer('[functions] ', (line) => process.stderr.write(line));
680
- functionsChild.child.stdout?.setEncoding('utf8');
681
- functionsChild.child.stderr?.setEncoding('utf8');
682
- functionsChild.child.stdout?.on('data', (chunk) => stdout.push(chunk));
683
- functionsChild.child.stderr?.on('data', (chunk) => stderr.push(chunk));
684
- functionsChild.child.stdout?.once('end', () => stdout.flush());
685
- functionsChild.child.stderr?.once('end', () => stderr.flush());
686
- try {
687
- const readyOutcome = await waitOrSignal(functionsChild.ready);
688
- if ('signal' in readyOutcome)
689
- return stopAfterSignal();
690
- const ready = readyOutcome.value;
691
- info.write(`✔ functions ${ready.triggerCount} onValueCreated trigger${ready.triggerCount === 1 ? '' : 's'} ` +
692
- `from ${relative(cwd, functionsProject.entry)}\n`);
693
- for (const unsupported of ready.unsupportedTriggers) {
694
- process.stderr.write(` ⚠ functions export ${unsupported.exportName} uses unsupported trigger ` +
695
- `${unsupported.eventType}; it will not run in pyric dev.\n`);
696
- }
697
- }
698
- catch (error) {
699
- process.stderr.write(`${error instanceof Error ? error.message : String(error)}\n`);
700
- await functionsChild.stop();
701
- await runtime.handle.stop();
702
- removeSignalHandlers();
703
- return 2;
621
+ const ready = result.ready;
622
+ info.write(`✔ functions ${ready.triggerCount} onValueCreated trigger${ready.triggerCount === 1 ? '' : 's'} ` +
623
+ `from ${relative(cwd, functionsProject.entry)}\n`);
624
+ for (const unsupported of ready.unsupportedTriggers) {
625
+ process.stderr.write(` ⚠ functions export ${unsupported.exportName} uses unsupported trigger ` +
626
+ `${unsupported.eventType}; it will not run in pyric dev.\n`);
704
627
  }
705
628
  }
706
629
  }
@@ -744,7 +667,7 @@ export async function runServe(parsed) {
744
667
  return;
745
668
  settled = true;
746
669
  void (async () => {
747
- await functionsChild?.stop().catch(() => undefined);
670
+ await functionsRuntime?.close().catch(() => undefined);
748
671
  if (devChild && devChild.child.exitCode === null) {
749
672
  devChild.signal('SIGTERM');
750
673
  await devChild.exited.catch(() => undefined);
@@ -759,7 +682,7 @@ export async function runServe(parsed) {
759
682
  return;
760
683
  shuttingDown = true;
761
684
  (json ? process.stderr : process.stdout).write('\nShutting down...\n');
762
- void functionsChild?.stop();
685
+ void functionsRuntime?.close();
763
686
  if (devChild && devChild.child.exitCode === null) {
764
687
  // Forward the signal; the child's exit (below) closes the host.
765
688
  // (The terminal delivers Ctrl-C to the whole group too — the
@@ -773,8 +696,8 @@ export async function runServe(parsed) {
773
696
  // Child exits → close the host and propagate its code (Ctrl-C → 0).
774
697
  if (devChild)
775
698
  void devChild.exited.then((code) => finish(code));
776
- if (functionsChild) {
777
- void functionsChild.exited.then((code) => {
699
+ if (functionsRuntime) {
700
+ void functionsExited.then((code) => {
778
701
  if (!settled && !shuttingDown) {
779
702
  process.stderr.write(`pyric dev: Functions child exited unexpectedly (code ${code}).\n`);
780
703
  finish(code === 0 ? 1 : code);