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