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

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 (419) hide show
  1. package/README.md +42 -12
  2. package/dist/assurance/.generated/conformance-verdicts.d.ts +80 -72
  3. package/dist/assurance/.generated/conformance-verdicts.d.ts.map +1 -1
  4. package/dist/assurance/.generated/conformance-verdicts.js +80 -72
  5. package/dist/assurance/.generated/conformance-verdicts.js.map +1 -1
  6. package/dist/bridge/server/bridge.d.ts.map +1 -1
  7. package/dist/bridge/server/bridge.js +4 -2
  8. package/dist/bridge/server/bridge.js.map +1 -1
  9. package/dist/bridge/server/peer.d.ts.map +1 -1
  10. package/dist/bridge/server/peer.js +1 -0
  11. package/dist/bridge/server/peer.js.map +1 -1
  12. package/dist/cli/database-rules.d.ts.map +1 -1
  13. package/dist/cli/database-rules.js +6 -4
  14. package/dist/cli/database-rules.js.map +1 -1
  15. package/dist/cli/dev-runner.d.ts +9 -0
  16. package/dist/cli/dev-runner.d.ts.map +1 -1
  17. package/dist/cli/dev-runner.js +18 -0
  18. package/dist/cli/dev-runner.js.map +1 -1
  19. package/dist/cli/serve.d.ts.map +1 -1
  20. package/dist/cli/serve.js +62 -6
  21. package/dist/cli/serve.js.map +1 -1
  22. package/dist/cli/verify.js +2 -2
  23. package/dist/cli/verify.js.map +1 -1
  24. package/dist/conformance/.generated/can-i-use-browser.d.ts.map +1 -1
  25. package/dist/conformance/.generated/can-i-use-browser.js +1 -1
  26. package/dist/conformance/.generated/can-i-use-browser.js.map +1 -1
  27. package/dist/conformance/.generated/can-i-use.d.ts.map +1 -1
  28. package/dist/conformance/.generated/can-i-use.js +1 -1
  29. package/dist/conformance/.generated/can-i-use.js.map +1 -1
  30. package/dist/conformance/.generated/conformance-docs.d.ts.map +1 -1
  31. package/dist/conformance/.generated/conformance-docs.js +1 -1
  32. package/dist/conformance/.generated/conformance-docs.js.map +1 -1
  33. package/dist/functions-rtdb/child.d.ts +1 -0
  34. package/dist/functions-rtdb/child.d.ts.map +1 -1
  35. package/dist/functions-rtdb/child.js +11 -1
  36. package/dist/functions-rtdb/child.js.map +1 -1
  37. package/dist/functions-rtdb/development-runtime.d.ts +1 -0
  38. package/dist/functions-rtdb/development-runtime.d.ts.map +1 -1
  39. package/dist/functions-rtdb/development-runtime.js +1 -0
  40. package/dist/functions-rtdb/development-runtime.js.map +1 -1
  41. package/dist/next/client-aliases.d.ts +11 -0
  42. package/dist/next/client-aliases.d.ts.map +1 -0
  43. package/dist/next/client-aliases.js +38 -0
  44. package/dist/next/client-aliases.js.map +1 -0
  45. package/dist/next/dev-rewrites.d.ts +9 -0
  46. package/dist/next/dev-rewrites.d.ts.map +1 -0
  47. package/dist/next/dev-rewrites.js +53 -0
  48. package/dist/next/dev-rewrites.js.map +1 -0
  49. package/dist/next/guard.d.ts +15 -0
  50. package/dist/next/guard.d.ts.map +1 -0
  51. package/dist/next/guard.js +52 -0
  52. package/dist/next/guard.js.map +1 -0
  53. package/dist/next/index.d.ts +12 -0
  54. package/dist/next/index.d.ts.map +1 -0
  55. package/dist/next/index.js +11 -0
  56. package/dist/next/index.js.map +1 -0
  57. package/dist/next/runtime-env.d.ts +7 -0
  58. package/dist/next/runtime-env.d.ts.map +1 -0
  59. package/dist/next/runtime-env.js +13 -0
  60. package/dist/next/runtime-env.js.map +1 -0
  61. package/dist/next/server-external-packages.d.ts +10 -0
  62. package/dist/next/server-external-packages.d.ts.map +1 -0
  63. package/dist/next/server-external-packages.js +34 -0
  64. package/dist/next/server-external-packages.js.map +1 -0
  65. package/dist/next/target-url.d.ts +11 -0
  66. package/dist/next/target-url.d.ts.map +1 -0
  67. package/dist/next/target-url.js +36 -0
  68. package/dist/next/target-url.js.map +1 -0
  69. package/dist/next/turbopack-config.d.ts +9 -0
  70. package/dist/next/turbopack-config.d.ts.map +1 -0
  71. package/dist/next/turbopack-config.js +39 -0
  72. package/dist/next/turbopack-config.js.map +1 -0
  73. package/dist/next/types.d.ts +40 -0
  74. package/dist/next/types.d.ts.map +1 -0
  75. package/dist/next/types.js +5 -0
  76. package/dist/next/types.js.map +1 -0
  77. package/dist/next/webpack-config.d.ts +11 -0
  78. package/dist/next/webpack-config.d.ts.map +1 -0
  79. package/dist/next/webpack-config.js +51 -0
  80. package/dist/next/webpack-config.js.map +1 -0
  81. package/dist/next/with-pyric.d.ts +22 -0
  82. package/dist/next/with-pyric.d.ts.map +1 -0
  83. package/dist/next/with-pyric.js +49 -0
  84. package/dist/next/with-pyric.js.map +1 -0
  85. package/dist/register/app-bridge.d.ts +9 -0
  86. package/dist/register/app-bridge.d.ts.map +1 -0
  87. package/dist/register/app-bridge.js +56 -0
  88. package/dist/register/app-bridge.js.map +1 -0
  89. package/dist/register/hooks.d.ts.map +1 -1
  90. package/dist/register/hooks.js +6 -1
  91. package/dist/register/hooks.js.map +1 -1
  92. package/dist/register/index.js +1 -1
  93. package/dist/register/index.js.map +1 -1
  94. package/dist/register/mapping.d.ts +3 -1
  95. package/dist/register/mapping.d.ts.map +1 -1
  96. package/dist/register/mapping.js +41 -5
  97. package/dist/register/mapping.js.map +1 -1
  98. package/dist/remote/index.d.ts.map +1 -1
  99. package/dist/remote/index.js +5 -3
  100. package/dist/remote/index.js.map +1 -1
  101. package/dist/rtdb/rules-json.d.ts +12 -0
  102. package/dist/rtdb/rules-json.d.ts.map +1 -1
  103. package/dist/rtdb/rules-json.js +98 -0
  104. package/dist/rtdb/rules-json.js.map +1 -1
  105. package/dist/serve/bundler.d.ts.map +1 -1
  106. package/dist/serve/bundler.js +2 -0
  107. package/dist/serve/bundler.js.map +1 -1
  108. package/dist/serve/discovery.d.ts +4 -4
  109. package/dist/serve/discovery.d.ts.map +1 -1
  110. package/dist/serve/discovery.js +59 -38
  111. package/dist/serve/discovery.js.map +1 -1
  112. package/dist/serve/entries/app-ai-passthrough.d.ts +8 -0
  113. package/dist/serve/entries/app-ai-passthrough.d.ts.map +1 -0
  114. package/dist/serve/entries/app-ai-passthrough.js +59 -0
  115. package/dist/serve/entries/app-ai-passthrough.js.map +1 -0
  116. package/dist/serve/entries/auth-helper-core.js +9 -7
  117. package/dist/serve/entries/auth-helper-core.js.map +1 -1
  118. package/dist/serve/entries/auth.d.ts +1 -0
  119. package/dist/serve/entries/auth.d.ts.map +1 -1
  120. package/dist/serve/entries/auth.js +1 -0
  121. package/dist/serve/entries/auth.js.map +1 -1
  122. package/dist/serve/entries/bridge-url.d.ts.map +1 -1
  123. package/dist/serve/entries/bridge-url.js +7 -2
  124. package/dist/serve/entries/bridge-url.js.map +1 -1
  125. package/dist/serve/entries/database.d.ts +1 -0
  126. package/dist/serve/entries/database.d.ts.map +1 -1
  127. package/dist/serve/entries/database.js +1 -0
  128. package/dist/serve/entries/database.js.map +1 -1
  129. package/dist/serve/entries/firestore.d.ts +1 -0
  130. package/dist/serve/entries/firestore.d.ts.map +1 -1
  131. package/dist/serve/entries/firestore.js +1 -0
  132. package/dist/serve/entries/firestore.js.map +1 -1
  133. package/dist/serve/entries/init.d.ts.map +1 -1
  134. package/dist/serve/entries/init.js +4 -2
  135. package/dist/serve/entries/init.js.map +1 -1
  136. package/dist/serve/entries/runtime.js +23 -0
  137. package/dist/serve/entries/runtime.js.map +1 -1
  138. package/dist/serve/entries/storage.d.ts +2 -0
  139. package/dist/serve/entries/storage.d.ts.map +1 -1
  140. package/dist/serve/entries/storage.js +9 -2
  141. package/dist/serve/entries/storage.js.map +1 -1
  142. package/dist/serve/html-injection.d.ts +3 -1
  143. package/dist/serve/html-injection.d.ts.map +1 -1
  144. package/dist/serve/html-injection.js +27 -1
  145. package/dist/serve/html-injection.js.map +1 -1
  146. package/dist/serve/rules.js +2 -2
  147. package/dist/serve/rules.js.map +1 -1
  148. package/dist/serve/runtime/chip-config.d.ts +1 -1
  149. package/dist/serve/runtime/chip-config.d.ts.map +1 -1
  150. package/dist/serve/runtime/chip-config.js +16 -8
  151. package/dist/serve/runtime/chip-config.js.map +1 -1
  152. package/dist/serve/runtime/chip.d.ts.map +1 -1
  153. package/dist/serve/runtime/chip.js +24 -3
  154. package/dist/serve/runtime/chip.js.map +1 -1
  155. package/dist/serve/runtime/status.d.ts +1 -0
  156. package/dist/serve/runtime/status.d.ts.map +1 -1
  157. package/dist/serve/runtime/status.js +71 -13
  158. package/dist/serve/runtime/status.js.map +1 -1
  159. package/dist/serve/sandbox-session.d.ts +1 -0
  160. package/dist/serve/sandbox-session.d.ts.map +1 -1
  161. package/dist/serve/sandbox-session.js +30 -2
  162. package/dist/serve/sandbox-session.js.map +1 -1
  163. package/dist/serve/site-ui/_astro/_slug_.C6QfVOxJ.css +1 -0
  164. package/dist/serve/site-ui/_astro/_studio_.B6b_G1ev.css +1 -0
  165. package/dist/serve/site-ui/_astro/app.B7pBzz5N.js +11 -0
  166. package/dist/serve/site-ui/_astro/app.boex5SnQ.js +1 -0
  167. package/dist/serve/site-ui/_astro/{chess-showcase.CnoxIle5.js → chess-showcase.DDqE-QGe.js} +1 -1
  168. package/dist/serve/site-ui/_astro/{example-runtime.R1d96L6-.js → example-runtime.B0byNQOl.js} +1 -1
  169. package/dist/serve/site-ui/_astro/index.uwPvjH_1.js +1 -0
  170. package/dist/serve/site-ui/_astro/reads.Dh3z0fJy.js +1 -0
  171. package/dist/serve/site-ui/_astro/sandbox-controls.C2IqtoSw.js +1252 -0
  172. package/dist/serve/site-ui/_astro/{seed.EyI3VYEu.js → seed.CCmj00su.js} +1 -1
  173. package/dist/serve/site-ui/auth/index.html +2 -2
  174. package/dist/serve/site-ui/docs/_rhythm/index.html +1 -1
  175. package/dist/serve/site-ui/docs/agent/set-up-your-agent/index.html +48 -13
  176. package/dist/serve/site-ui/docs/agent/set-up-your-agent.md +74 -11
  177. package/dist/serve/site-ui/docs/agent/watch-and-review/index.html +1 -1
  178. package/dist/serve/site-ui/docs/agent/work-with-an-agent/index.html +1 -1
  179. package/dist/serve/site-ui/docs/ai-compat/index.html +85 -85
  180. package/dist/serve/site-ui/docs/ai-compat.md +84 -84
  181. package/dist/serve/site-ui/docs/api-reference/index.html +3 -1
  182. package/dist/serve/site-ui/docs/api-reference.md +2 -0
  183. package/dist/serve/site-ui/docs/app-compat/index.html +28 -28
  184. package/dist/serve/site-ui/docs/app-compat.md +27 -27
  185. package/dist/serve/site-ui/docs/auth-compat/index.html +122 -122
  186. package/dist/serve/site-ui/docs/auth-compat.md +121 -121
  187. package/dist/serve/site-ui/docs/build/ai-logic/index.html +19 -2
  188. package/dist/serve/site-ui/docs/build/ai-logic.md +28 -0
  189. package/dist/serve/site-ui/docs/build/authentication/index.html +1 -1
  190. package/dist/serve/site-ui/docs/build/cloud-firestore/index.html +1 -1
  191. package/dist/serve/site-ui/docs/build/cloud-messaging/index.html +1 -1
  192. package/dist/serve/site-ui/docs/build/cloud-storage/index.html +1 -1
  193. package/dist/serve/site-ui/docs/build/realtime-database/index.html +1 -1
  194. package/dist/serve/site-ui/docs/conformance-scores/index.html +25 -10
  195. package/dist/serve/site-ui/docs/conformance-scores.md +23 -8
  196. package/dist/serve/site-ui/docs/create-pyric-reference-api/index.html +6 -6
  197. package/dist/serve/site-ui/docs/create-pyric-reference-api.md +5 -5
  198. package/dist/serve/site-ui/docs/database-compat/index.html +200 -448
  199. package/dist/serve/site-ui/docs/database-compat.md +198 -461
  200. package/dist/serve/site-ui/docs/examples/chess/index.html +2 -2
  201. package/dist/serve/site-ui/docs/examples/index.html +1 -1
  202. package/dist/serve/site-ui/docs/firestore-compat/index.html +186 -195
  203. package/dist/serve/site-ui/docs/firestore-compat.md +184 -195
  204. package/dist/serve/site-ui/docs/functions-rtdb-compat/index.html +15 -15
  205. package/dist/serve/site-ui/docs/functions-rtdb-compat.md +14 -14
  206. package/dist/serve/site-ui/docs/get-started/how-the-swap-works/index.html +1 -1
  207. package/dist/serve/site-ui/docs/get-started/nextjs/index.html +57 -0
  208. package/dist/serve/site-ui/docs/get-started/nextjs.md +86 -0
  209. package/dist/serve/site-ui/docs/get-started/start-building/index.html +38 -9
  210. package/dist/serve/site-ui/docs/get-started/start-building.md +62 -7
  211. package/dist/serve/site-ui/docs/get-started/vite/index.html +26 -0
  212. package/dist/serve/site-ui/docs/get-started/vite.md +45 -0
  213. package/dist/serve/site-ui/docs/index.json +711 -111
  214. package/dist/serve/site-ui/docs/messaging-compat/index.html +56 -56
  215. package/dist/serve/site-ui/docs/messaging-compat.md +55 -55
  216. package/dist/serve/site-ui/docs/observe/resolve-runtime-status/index.html +1 -1
  217. package/dist/serve/site-ui/docs/observe/see-whats-happening/index.html +1 -1
  218. package/dist/serve/site-ui/docs/observe/shape-your-data/index.html +1 -1
  219. package/dist/serve/site-ui/docs/overview/index.html +1 -1
  220. package/dist/serve/site-ui/docs/pyric-admin-app-reference-api/index.html +39 -13
  221. package/dist/serve/site-ui/docs/pyric-admin-app-reference-api.md +28 -2
  222. package/dist/serve/site-ui/docs/pyric-admin-auth-reference-api/index.html +1 -1
  223. package/dist/serve/site-ui/docs/pyric-admin-database-reference-api/index.html +38 -6
  224. package/dist/serve/site-ui/docs/pyric-admin-database-reference-api.md +43 -0
  225. package/dist/serve/site-ui/docs/pyric-admin-firestore-reference-api/index.html +9 -1
  226. package/dist/serve/site-ui/docs/pyric-admin-firestore-reference-api.md +8 -0
  227. package/dist/serve/site-ui/docs/pyric-admin-messaging-reference-api/index.html +1 -1
  228. package/dist/serve/site-ui/docs/pyric-admin-storage-reference-api/index.html +27 -4
  229. package/dist/serve/site-ui/docs/pyric-admin-storage-reference-api.md +23 -0
  230. package/dist/serve/site-ui/docs/pyric-ai-reference-api/index.html +1 -1
  231. package/dist/serve/site-ui/docs/pyric-ai-scripting-reference-api/index.html +1 -1
  232. package/dist/serve/site-ui/docs/pyric-app-reference-api/index.html +1 -1
  233. package/dist/serve/site-ui/docs/pyric-auth-reference-api/index.html +1 -1
  234. package/dist/serve/site-ui/docs/pyric-cli-assurance-browser-reference-api/index.html +1 -1
  235. package/dist/serve/site-ui/docs/pyric-cli-assurance-reference-api/index.html +1 -1
  236. package/dist/serve/site-ui/docs/pyric-cli-bridge-client-reference-api/index.html +1 -1
  237. package/dist/serve/site-ui/docs/pyric-cli-bridge-reference-api/index.html +1 -1
  238. package/dist/serve/site-ui/docs/pyric-cli-conformance-browser-reference-api/index.html +1 -1
  239. package/dist/serve/site-ui/docs/pyric-cli-conformance-docs-reference-api/index.html +1 -1
  240. package/dist/serve/site-ui/docs/pyric-cli-conformance-reference-api/index.html +1 -1
  241. package/dist/serve/site-ui/docs/pyric-cli-credentials-node-reference-api/index.html +1 -1
  242. package/dist/serve/site-ui/docs/pyric-cli-discover-reference-api/index.html +1 -1
  243. package/dist/serve/site-ui/docs/pyric-cli-next-reference-api/index.html +123 -0
  244. package/dist/serve/site-ui/docs/pyric-cli-next-reference-api.md +99 -0
  245. package/dist/serve/site-ui/docs/pyric-cli-register-app-bridge-reference-api/index.html +127 -0
  246. package/dist/serve/site-ui/docs/pyric-cli-register-app-bridge-reference-api.md +174 -0
  247. package/dist/serve/site-ui/docs/pyric-cli-register-reference-api/index.html +1 -1
  248. package/dist/serve/site-ui/docs/pyric-cli-remote-reference-api/index.html +1 -1
  249. package/dist/serve/site-ui/docs/pyric-cli-serve-worker-reference-api/index.html +570 -326
  250. package/dist/serve/site-ui/docs/pyric-cli-serve-worker-reference-api.md +198 -6
  251. package/dist/serve/site-ui/docs/pyric-cli-verify-reference-api/index.html +1 -1
  252. package/dist/serve/site-ui/docs/pyric-cli-vite-reference-api/index.html +1 -1
  253. package/dist/serve/site-ui/docs/pyric-database-reference-api/index.html +1 -1
  254. package/dist/serve/site-ui/docs/pyric-firestore-reference-api/index.html +2971 -627
  255. package/dist/serve/site-ui/docs/pyric-firestore-reference-api.md +2873 -517
  256. package/dist/serve/site-ui/docs/pyric-messaging-reference-api/index.html +1 -1
  257. package/dist/serve/site-ui/docs/pyric-messaging-sw-reference-api/index.html +1 -1
  258. package/dist/serve/site-ui/docs/pyric-rules-reference-api/index.html +43 -3
  259. package/dist/serve/site-ui/docs/pyric-rules-reference-api.md +8 -0
  260. package/dist/serve/site-ui/docs/pyric-sandbox-database-reference-api/index.html +26 -2
  261. package/dist/serve/site-ui/docs/pyric-sandbox-database-reference-api.md +24 -0
  262. package/dist/serve/site-ui/docs/pyric-sandbox-firestore-reference-api/index.html +1 -1
  263. package/dist/serve/site-ui/docs/pyric-sandbox-reference-api/index.html +77 -9
  264. package/dist/serve/site-ui/docs/pyric-sandbox-reference-api.md +28 -13
  265. package/dist/serve/site-ui/docs/pyric-storage-reference-api/index.html +240 -63
  266. package/dist/serve/site-ui/docs/pyric-storage-reference-api.md +164 -5
  267. package/dist/serve/site-ui/docs/pyric-ui-agents-reference-api/index.html +1 -1
  268. package/dist/serve/site-ui/docs/pyric-ui-auth-hooks-reference-api/index.html +1 -1
  269. package/dist/serve/site-ui/docs/pyric-ui-auth-reference-api/index.html +1 -1
  270. package/dist/serve/site-ui/docs/pyric-ui-events-hooks-reference-api/index.html +1 -1
  271. package/dist/serve/site-ui/docs/pyric-ui-events-reference-api/index.html +1 -1
  272. package/dist/serve/site-ui/docs/pyric-ui-firestore-hooks-reference-api/index.html +1 -1
  273. package/dist/serve/site-ui/docs/pyric-ui-firestore-reference-api/index.html +1 -1
  274. package/dist/serve/site-ui/docs/pyric-ui-primitives-reference-api/index.html +1 -1
  275. package/dist/serve/site-ui/docs/pyric-ui-rtdb-reference-api/index.html +1 -1
  276. package/dist/serve/site-ui/docs/pyric-ui-rules-hooks-reference-api/index.html +1 -1
  277. package/dist/serve/site-ui/docs/pyric-ui-rules-reference-api/index.html +1 -10
  278. package/dist/serve/site-ui/docs/pyric-ui-rules-reference-api.md +0 -9
  279. package/dist/serve/site-ui/docs/pyric-ui-storage-hooks-reference-api/index.html +1 -1
  280. package/dist/serve/site-ui/docs/pyric-ui-storage-reference-api/index.html +2 -1
  281. package/dist/serve/site-ui/docs/pyric-ui-storage-reference-api.md +1 -0
  282. package/dist/serve/site-ui/docs/pyric-ui-traffic-hooks-reference-api/index.html +1 -1
  283. package/dist/serve/site-ui/docs/pyric-ui-traffic-reference-api/index.html +1 -1
  284. package/dist/serve/site-ui/docs/rules-compat/index.html +87 -79
  285. package/dist/serve/site-ui/docs/rules-compat.md +86 -78
  286. package/dist/serve/site-ui/docs/secure/audit-your-rules/index.html +1 -1
  287. package/dist/serve/site-ui/docs/secure/firestore-rules-limits/index.html +1 -1
  288. package/dist/serve/site-ui/docs/secure/read-a-denial/index.html +1 -1
  289. package/dist/serve/site-ui/docs/secure/rtdb-rules-in-typescript/index.html +1 -1
  290. package/dist/serve/site-ui/docs/secure/rules-standard-library/index.html +1 -1
  291. package/dist/serve/site-ui/docs/secure/secure-it-with-rules/index.html +1 -1
  292. package/dist/serve/site-ui/docs/secure/simulate-and-lint/index.html +1 -1
  293. package/dist/serve/site-ui/docs/secure/write-a-rules-test-suite/index.html +1 -1
  294. package/dist/serve/site-ui/docs/ship/ship-to-production/index.html +1 -1
  295. package/dist/serve/site-ui/docs/ship/test-in-node/index.html +1 -1
  296. package/dist/serve/site-ui/docs/storage-compat/index.html +119 -125
  297. package/dist/serve/site-ui/docs/storage-compat.md +118 -124
  298. package/dist/serve/site-ui/docs/trust/how-we-know-it-matches-firebase/index.html +1 -1
  299. package/dist/serve/site-ui/docs/trust/rules-standard-library/index.html +1 -1
  300. package/dist/serve/site-ui/docs/trust/storage-rules-stdlib-research/index.html +1 -1
  301. package/dist/serve/site-ui/docs/trust/versioning-and-compatibility/index.html +1 -1
  302. package/dist/serve/site-ui/docs/tutorial/index.html +2 -1
  303. package/dist/serve/site-ui/docs/tutorial.md +2 -0
  304. package/dist/serve/site-ui/examples/chess/index.html +1 -1
  305. package/dist/serve/site-ui/examples/firestore-first-write/index.html +1 -1
  306. package/dist/serve/site-ui/firestore/index.html +2 -2
  307. package/dist/serve/site-ui/index.html +2 -2
  308. package/dist/serve/site-ui/llms.txt +8 -4
  309. package/dist/serve/site-ui/rtdb/index.html +2 -2
  310. package/dist/serve/site-ui/settings/index.html +2 -2
  311. package/dist/serve/site-ui/storage/index.html +2 -2
  312. package/dist/serve/site-ui/traffic/index.html +2 -2
  313. package/dist/serve/vite-ai-config.d.ts +4 -1
  314. package/dist/serve/vite-ai-config.d.ts.map +1 -1
  315. package/dist/serve/vite-ai-config.js +83 -19
  316. package/dist/serve/vite-ai-config.js.map +1 -1
  317. package/dist/serve/vite-functions-development.d.ts.map +1 -1
  318. package/dist/serve/vite-functions-development.js +1 -0
  319. package/dist/serve/vite-functions-development.js.map +1 -1
  320. package/dist/serve/vite-generation-rules-watch.d.ts.map +1 -1
  321. package/dist/serve/vite-generation-rules-watch.js +61 -14
  322. package/dist/serve/vite-generation-rules-watch.js.map +1 -1
  323. package/dist/serve/vite-module-swap.d.ts +4 -1
  324. package/dist/serve/vite-module-swap.d.ts.map +1 -1
  325. package/dist/serve/vite-module-swap.js +106 -21
  326. package/dist/serve/vite-module-swap.js.map +1 -1
  327. package/dist/serve/vite-plugin.d.ts.map +1 -1
  328. package/dist/serve/vite-plugin.js +45 -5
  329. package/dist/serve/vite-plugin.js.map +1 -1
  330. package/dist/serve/vite-sandbox-generation.js +1 -1
  331. package/dist/serve/vite-sandbox-generation.js.map +1 -1
  332. package/dist/serve/worker/client/resumable.d.ts +30 -0
  333. package/dist/serve/worker/client/resumable.d.ts.map +1 -0
  334. package/dist/serve/worker/client/resumable.js +416 -0
  335. package/dist/serve/worker/client/resumable.js.map +1 -0
  336. package/dist/serve/worker/client/rtdb-references.d.ts.map +1 -1
  337. package/dist/serve/worker/client/rtdb-references.js +4 -1
  338. package/dist/serve/worker/client/rtdb-references.js.map +1 -1
  339. package/dist/serve/worker/client/storage.d.ts +16 -2
  340. package/dist/serve/worker/client/storage.d.ts.map +1 -1
  341. package/dist/serve/worker/client/storage.js +57 -6
  342. package/dist/serve/worker/client/storage.js.map +1 -1
  343. package/dist/serve/worker/host/rules.d.ts.map +1 -1
  344. package/dist/serve/worker/host/rules.js +2 -1
  345. package/dist/serve/worker/host/rules.js.map +1 -1
  346. package/dist/serve/worker/index.d.ts +1 -1
  347. package/dist/serve/worker/index.d.ts.map +1 -1
  348. package/dist/serve/worker/index.js +1 -1
  349. package/dist/serve/worker/index.js.map +1 -1
  350. package/dist/serve/worker/serve-init.d.ts.map +1 -1
  351. package/dist/serve/worker/serve-init.js +31 -0
  352. package/dist/serve/worker/serve-init.js.map +1 -1
  353. package/package.json +15 -4
  354. package/src/assurance/.generated/conformance-verdicts.ts +80 -72
  355. package/src/bridge/server/bridge.ts +5 -2
  356. package/src/bridge/server/peer.ts +2 -1
  357. package/src/cli/cli.test.ts +14 -0
  358. package/src/cli/database-rules.ts +6 -4
  359. package/src/cli/dev-runner.ts +21 -0
  360. package/src/cli/serve.ts +63 -5
  361. package/src/cli/verify.ts +2 -2
  362. package/src/conformance/.generated/can-i-use-browser.ts +1 -1
  363. package/src/conformance/.generated/can-i-use.ts +1 -1
  364. package/src/conformance/.generated/conformance-docs.ts +1 -1
  365. package/src/functions-rtdb/child.ts +12 -1
  366. package/src/functions-rtdb/development-runtime.ts +2 -0
  367. package/src/next/client-aliases.ts +39 -0
  368. package/src/next/dev-rewrites.ts +77 -0
  369. package/src/next/guard.ts +61 -0
  370. package/src/next/index.ts +16 -0
  371. package/src/next/runtime-env.ts +18 -0
  372. package/src/next/server-external-packages.ts +43 -0
  373. package/src/next/target-url.ts +46 -0
  374. package/src/next/turbopack-config.ts +54 -0
  375. package/src/next/types.ts +47 -0
  376. package/src/next/webpack-config.ts +71 -0
  377. package/src/next/with-pyric.ts +58 -0
  378. package/src/register/app-bridge.ts +79 -0
  379. package/src/register/hooks.ts +6 -1
  380. package/src/register/index.ts +1 -1
  381. package/src/register/mapping.ts +50 -4
  382. package/src/remote/index.ts +7 -5
  383. package/src/rtdb/rules-json.ts +110 -0
  384. package/src/serve/bundler.ts +2 -0
  385. package/src/serve/discovery.ts +65 -44
  386. package/src/serve/entries/app-ai-passthrough.ts +83 -0
  387. package/src/serve/entries/auth-helper-core.ts +9 -7
  388. package/src/serve/entries/auth.ts +1 -0
  389. package/src/serve/entries/bridge-url.ts +9 -2
  390. package/src/serve/entries/database.ts +1 -0
  391. package/src/serve/entries/firestore.ts +1 -0
  392. package/src/serve/entries/init.ts +5 -2
  393. package/src/serve/entries/runtime.ts +25 -0
  394. package/src/serve/entries/storage.ts +12 -1
  395. package/src/serve/html-injection.ts +26 -1
  396. package/src/serve/rules.ts +2 -2
  397. package/src/serve/runtime/chip-config.ts +19 -6
  398. package/src/serve/runtime/chip.ts +24 -3
  399. package/src/serve/runtime/status.ts +76 -13
  400. package/src/serve/sandbox-session.ts +31 -2
  401. package/src/serve/vite-ai-config.ts +86 -19
  402. package/src/serve/vite-functions-development.ts +1 -0
  403. package/src/serve/vite-generation-rules-watch.ts +67 -15
  404. package/src/serve/vite-module-swap.ts +121 -21
  405. package/src/serve/vite-plugin.ts +44 -6
  406. package/src/serve/vite-sandbox-generation.ts +1 -1
  407. package/src/serve/worker/client/resumable.ts +506 -0
  408. package/src/serve/worker/client/rtdb-references.ts +4 -1
  409. package/src/serve/worker/client/storage.ts +77 -7
  410. package/src/serve/worker/host/rules.ts +2 -1
  411. package/src/serve/worker/index.ts +4 -0
  412. package/src/serve/worker/serve-init.ts +30 -0
  413. package/dist/serve/site-ui/_astro/_slug_.BoKXYrnu.css +0 -1
  414. package/dist/serve/site-ui/_astro/_studio_.BtYpqe1A.css +0 -1
  415. package/dist/serve/site-ui/_astro/app.4HeLP_FA.js +0 -109
  416. package/dist/serve/site-ui/_astro/app.BgSnCR5G.js +0 -1
  417. package/dist/serve/site-ui/_astro/index.BJiOemMX.js +0 -1
  418. package/dist/serve/site-ui/_astro/reads.BrKNdKAa.js +0 -1
  419. package/dist/serve/site-ui/_astro/sandbox-controls.BTb3EbQp.js +0 -1153
@@ -289,7 +289,13 @@ export const CONFORMANCE_VERDICTS = {
289
289
  "firestore#149": "qualified",
290
290
  "firestore#15": "supported",
291
291
  "firestore#150": "supported",
292
+ "firestore#151": "supported",
292
293
  "firestore#152": "supported",
294
+ "firestore#153": "supported",
295
+ "firestore#154": "supported",
296
+ "firestore#155": "supported",
297
+ "firestore#156": "supported",
298
+ "firestore#157": "supported",
293
299
  "firestore#16": "supported",
294
300
  "firestore#17": "supported",
295
301
  "firestore#18": "supported",
@@ -421,6 +427,8 @@ export const CONFORMANCE_VERDICTS = {
421
427
  "firestore-rules#187": "supported",
422
428
  "firestore-rules#188": "supported",
423
429
  "firestore-rules#189": "supported",
430
+ "firestore-rules#190": "supported",
431
+ "firestore-rules#191": "supported",
424
432
  "firestore.binding.path-variable": "supported",
425
433
  "firestore.binding.request": "supported",
426
434
  "firestore.binding.request.auth": "supported",
@@ -437,7 +445,7 @@ export const CONFORMANCE_VERDICTS = {
437
445
  "firestore.binding.resource.__name__": "supported",
438
446
  "firestore.binding.resource.data": "supported",
439
447
  "firestore.binding.resource.id": "supported",
440
- "firestore.function.cast.bool": "unsupported",
448
+ "firestore.function.cast.bool": "supported",
441
449
  "firestore.function.cast.float": "supported",
442
450
  "firestore.function.cast.int": "supported",
443
451
  "firestore.function.cast.path": "supported",
@@ -458,7 +466,7 @@ export const CONFORMANCE_VERDICTS = {
458
466
  "firestore.function.math.abs": "supported",
459
467
  "firestore.function.math.ceil": "supported",
460
468
  "firestore.function.math.floor": "supported",
461
- "firestore.function.math.isInfinite": "unsupported",
469
+ "firestore.function.math.isInfinite": "supported",
462
470
  "firestore.function.math.isNaN": "supported",
463
471
  "firestore.function.math.pow": "supported",
464
472
  "firestore.function.math.round": "supported",
@@ -483,9 +491,9 @@ export const CONFORMANCE_VERDICTS = {
483
491
  "firestore.method.list.toSet": "supported",
484
492
  "firestore.method.map.diff": "supported",
485
493
  "firestore.method.map.get": "supported",
486
- "firestore.method.map.hasAll": "unsupported",
487
- "firestore.method.map.hasAny": "unsupported",
488
- "firestore.method.map.hasOnly": "unsupported",
494
+ "firestore.method.map.hasAll": "supported",
495
+ "firestore.method.map.hasAny": "supported",
496
+ "firestore.method.map.hasOnly": "supported",
489
497
  "firestore.method.map.keys": "supported",
490
498
  "firestore.method.map.size": "supported",
491
499
  "firestore.method.map.values": "supported",
@@ -875,62 +883,62 @@ export const CONFORMANCE_VERDICTS = {
875
883
  "rtdb-rules#7": "supported",
876
884
  "rtdb-rules#8": "supported",
877
885
  "rtdb-rules#9": "supported",
878
- "rtdb.binding.auth": "qualified",
879
- "rtdb.binding.auth.token": "qualified",
880
- "rtdb.binding.auth.uid": "qualified",
881
- "rtdb.binding.data": "qualified",
882
- "rtdb.binding.newData": "qualified",
883
- "rtdb.binding.now": "qualified",
884
- "rtdb.binding.path-variable": "qualified",
885
- "rtdb.binding.root": "qualified",
886
- "rtdb.method.snapshot.child": "qualified",
887
- "rtdb.method.snapshot.exists": "qualified",
888
- "rtdb.method.snapshot.getPriority": "qualified",
889
- "rtdb.method.snapshot.hasChild": "qualified",
890
- "rtdb.method.snapshot.hasChildren": "qualified",
891
- "rtdb.method.snapshot.isBoolean": "qualified",
892
- "rtdb.method.snapshot.isNumber": "qualified",
893
- "rtdb.method.snapshot.isString": "qualified",
894
- "rtdb.method.snapshot.parent": "qualified",
895
- "rtdb.method.snapshot.val": "qualified",
896
- "rtdb.method.string.beginsWith": "qualified",
897
- "rtdb.method.string.contains": "qualified",
898
- "rtdb.method.string.endsWith": "qualified",
899
- "rtdb.method.string.length": "qualified",
900
- "rtdb.method.string.matches": "qualified",
901
- "rtdb.method.string.replace": "qualified",
902
- "rtdb.method.string.toLowerCase": "qualified",
903
- "rtdb.method.string.toUpperCase": "qualified",
904
- "rtdb.operator.add": "qualified",
905
- "rtdb.operator.and": "qualified",
906
- "rtdb.operator.div": "qualified",
907
- "rtdb.operator.gt": "qualified",
908
- "rtdb.operator.gte": "qualified",
909
- "rtdb.operator.index": "qualified",
910
- "rtdb.operator.looseEq": "qualified",
911
- "rtdb.operator.looseNeq": "qualified",
912
- "rtdb.operator.lt": "qualified",
913
- "rtdb.operator.lte": "qualified",
914
- "rtdb.operator.member": "qualified",
915
- "rtdb.operator.mod": "qualified",
916
- "rtdb.operator.mul": "qualified",
917
- "rtdb.operator.neg": "qualified",
918
- "rtdb.operator.not": "qualified",
919
- "rtdb.operator.or": "qualified",
920
- "rtdb.operator.strictEq": "qualified",
921
- "rtdb.operator.strictNeq": "qualified",
922
- "rtdb.operator.sub": "qualified",
923
- "rtdb.operator.ternary": "qualified",
924
- "rtdb.rule-kind.indexOn": "qualified",
925
- "rtdb.rule-kind.location-wildcard": "qualified",
926
- "rtdb.rule-kind.read": "qualified",
927
- "rtdb.rule-kind.validate": "qualified",
928
- "rtdb.rule-kind.write": "qualified",
886
+ "rtdb.binding.auth": "supported",
887
+ "rtdb.binding.auth.token": "supported",
888
+ "rtdb.binding.auth.uid": "supported",
889
+ "rtdb.binding.data": "supported",
890
+ "rtdb.binding.newData": "supported",
891
+ "rtdb.binding.now": "supported",
892
+ "rtdb.binding.path-variable": "supported",
893
+ "rtdb.binding.root": "supported",
894
+ "rtdb.method.snapshot.child": "supported",
895
+ "rtdb.method.snapshot.exists": "supported",
896
+ "rtdb.method.snapshot.getPriority": "supported",
897
+ "rtdb.method.snapshot.hasChild": "supported",
898
+ "rtdb.method.snapshot.hasChildren": "supported",
899
+ "rtdb.method.snapshot.isBoolean": "supported",
900
+ "rtdb.method.snapshot.isNumber": "supported",
901
+ "rtdb.method.snapshot.isString": "supported",
902
+ "rtdb.method.snapshot.parent": "supported",
903
+ "rtdb.method.snapshot.val": "supported",
904
+ "rtdb.method.string.beginsWith": "supported",
905
+ "rtdb.method.string.contains": "supported",
906
+ "rtdb.method.string.endsWith": "supported",
907
+ "rtdb.method.string.length": "supported",
908
+ "rtdb.method.string.matches": "supported",
909
+ "rtdb.method.string.replace": "supported",
910
+ "rtdb.method.string.toLowerCase": "supported",
911
+ "rtdb.method.string.toUpperCase": "supported",
912
+ "rtdb.operator.add": "supported",
913
+ "rtdb.operator.and": "supported",
914
+ "rtdb.operator.div": "supported",
915
+ "rtdb.operator.gt": "supported",
916
+ "rtdb.operator.gte": "supported",
917
+ "rtdb.operator.index": "supported",
918
+ "rtdb.operator.looseEq": "supported",
919
+ "rtdb.operator.looseNeq": "supported",
920
+ "rtdb.operator.lt": "supported",
921
+ "rtdb.operator.lte": "supported",
922
+ "rtdb.operator.member": "supported",
923
+ "rtdb.operator.mod": "supported",
924
+ "rtdb.operator.mul": "supported",
925
+ "rtdb.operator.neg": "supported",
926
+ "rtdb.operator.not": "supported",
927
+ "rtdb.operator.or": "supported",
928
+ "rtdb.operator.strictEq": "supported",
929
+ "rtdb.operator.strictNeq": "supported",
930
+ "rtdb.operator.sub": "supported",
931
+ "rtdb.operator.ternary": "supported",
932
+ "rtdb.rule-kind.indexOn": "supported",
933
+ "rtdb.rule-kind.location-wildcard": "supported",
934
+ "rtdb.rule-kind.read": "supported",
935
+ "rtdb.rule-kind.validate": "supported",
936
+ "rtdb.rule-kind.write": "supported",
929
937
  "rtdb.semantic.deny-by-default": "qualified",
930
- "rtdb.semantic.read-cascade": "qualified",
931
- "rtdb.semantic.regex-literal": "qualified",
932
- "rtdb.semantic.validate-non-cascade": "qualified",
933
- "rtdb.semantic.write-cascade": "qualified",
938
+ "rtdb.semantic.read-cascade": "supported",
939
+ "rtdb.semantic.regex-literal": "supported",
940
+ "rtdb.semantic.validate-non-cascade": "supported",
941
+ "rtdb.semantic.write-cascade": "supported",
934
942
  "storage#1": "supported",
935
943
  "storage#10": "supported",
936
944
  "storage#105": "supported",
@@ -977,12 +985,12 @@ export const CONFORMANCE_VERDICTS = {
977
985
  "storage#44": "supported",
978
986
  "storage#45": "supported",
979
987
  "storage#46": "supported",
980
- "storage#47": "unsupported",
981
- "storage#48": "unsupported",
982
- "storage#49": "unsupported",
988
+ "storage#47": "qualified",
989
+ "storage#48": "qualified",
990
+ "storage#49": "qualified",
983
991
  "storage#4a": "supported",
984
992
  "storage#5": "supported",
985
- "storage#50": "unsupported",
993
+ "storage#50": "qualified",
986
994
  "storage#51": "qualified",
987
995
  "storage#52": "supported",
988
996
  "storage#53": "supported",
@@ -1093,30 +1101,30 @@ export const CONFORMANCE_VERDICTS = {
1093
1101
  "storage.method.map.get": "supported",
1094
1102
  "storage.method.map.keys": "supported",
1095
1103
  "storage.method.set.hasAll": "supported",
1096
- "storage.method.size": "qualified",
1104
+ "storage.method.size": "supported",
1097
1105
  "storage.method.string.matches": "supported",
1098
- "storage.method.string.split": "qualified",
1106
+ "storage.method.string.split": "supported",
1099
1107
  "storage.operator.add": "supported",
1100
1108
  "storage.operator.and": "supported",
1101
1109
  "storage.operator.div": "supported",
1102
1110
  "storage.operator.eq": "supported",
1103
1111
  "storage.operator.gt": "supported",
1104
1112
  "storage.operator.gte": "supported",
1105
- "storage.operator.in": "qualified",
1113
+ "storage.operator.in": "supported",
1106
1114
  "storage.operator.index": "supported",
1107
- "storage.operator.is": "qualified",
1115
+ "storage.operator.is": "supported",
1108
1116
  "storage.operator.lt": "supported",
1109
1117
  "storage.operator.lte": "supported",
1110
1118
  "storage.operator.member": "supported",
1111
- "storage.operator.mod": "qualified",
1119
+ "storage.operator.mod": "supported",
1112
1120
  "storage.operator.mul": "supported",
1113
1121
  "storage.operator.neq": "supported",
1114
1122
  "storage.operator.not": "supported",
1115
1123
  "storage.operator.or": "supported",
1116
- "storage.operator.slice": "qualified",
1124
+ "storage.operator.slice": "supported",
1117
1125
  "storage.operator.sub": "supported",
1118
- "storage.operator.ternary": "qualified",
1119
- "storage.operator.unary-minus": "qualified",
1126
+ "storage.operator.ternary": "supported",
1127
+ "storage.operator.unary-minus": "supported",
1120
1128
  "storage.rule-kind.allow-create": "supported",
1121
1129
  "storage.rule-kind.allow-delete": "supported",
1122
1130
  "storage.rule-kind.allow-get": "supported",
@@ -206,10 +206,12 @@ function workerOpError(
206
206
  code: string,
207
207
  message: string,
208
208
  denialContext?: unknown,
209
- ): Error & { code: string; denialContext?: unknown } {
210
- const err = new Error(message) as Error & { code: string; denialContext?: unknown };
209
+ envelope?: unknown,
210
+ ): Error & { code: string; denialContext?: unknown; envelope?: unknown } {
211
+ const err = new Error(message) as Error & { code: string; denialContext?: unknown; envelope?: unknown };
211
212
  err.code = code;
212
213
  if (denialContext !== undefined) err.denialContext = denialContext;
214
+ if (envelope !== undefined) err.envelope = envelope;
213
215
  return err;
214
216
  }
215
217
 
@@ -481,6 +483,7 @@ export function createBridge(opts: BridgeOptions): Bridge {
481
483
  res.error?.code ?? 'unknown',
482
484
  res.error?.message ?? 'unknown sandbox error',
483
485
  res.error?.denialContext,
486
+ (res.error as any)?.envelope,
484
487
  ),
485
488
  );
486
489
  }
@@ -162,7 +162,7 @@ export function createConsumerSession(
162
162
  case 'worker-op': {
163
163
  bridge.dispatchWorkerOp(msg.op).then(
164
164
  (value) => send({ type: 'worker-res', id: msg.id, ok: true, value }),
165
- (err: Error & { code?: string; denialContext?: unknown }) =>
165
+ (err: Error & { code?: string; denialContext?: unknown; envelope?: unknown }) =>
166
166
  send({
167
167
  type: 'worker-res',
168
168
  id: msg.id,
@@ -173,6 +173,7 @@ export function createConsumerSession(
173
173
  // Structured denial context (spike gap 6) — plain JSON,
174
174
  // relayed verbatim so the Node side re-attaches it.
175
175
  ...(err.denialContext !== undefined ? { denialContext: err.denialContext } : {}),
176
+ ...(err.envelope !== undefined ? { envelope: err.envelope } : {}),
176
177
  },
177
178
  }),
178
179
  );
@@ -490,4 +490,18 @@ describe('scanForInlinedFirebase', () => {
490
490
  );
491
491
  expect(scanForInlinedFirebase(dir)).toEqual([]);
492
492
  });
493
+
494
+ it('ignores hidden frameworks and build cache directories like .next and .git', async () => {
495
+ const { scanForInlinedFirebase } = await import('./serve.js');
496
+ const { mkdtempSync, mkdirSync, writeFileSync } = await import('node:fs');
497
+ const { tmpdir } = await import('node:os');
498
+ const { join } = await import('node:path');
499
+ const dir = mkdtempSync(join(tmpdir(), 'pyric-inline-ignore-'));
500
+ mkdirSync(join(dir, '.next'));
501
+ writeFileSync(
502
+ join(dir, '.next', 'bundle.js'),
503
+ 'fetch("https://identitytoolkit.googleapis.com/v1/projects?key="+k)',
504
+ );
505
+ expect(scanForInlinedFirebase(dir)).toEqual([]);
506
+ });
493
507
  });
@@ -19,6 +19,7 @@ import {
19
19
  loadRtdbRulesDocument,
20
20
  type LoadRtdbRulesDocumentResult,
21
21
  } from '../rtdb/load-rules-document.js';
22
+ import { stripJsonComments } from '../rtdb/rules-json.js';
22
23
 
23
24
  export interface DatabaseRulesDeps {
24
25
  readFile?: typeof readFile;
@@ -53,7 +54,7 @@ function defaultReadStdin(): Promise<string> {
53
54
  }
54
55
 
55
56
  function parseRulesJson(raw: string): CompiledRtdbRules {
56
- return compileRtdbRules(JSON.parse(raw));
57
+ return compileRtdbRules(JSON.parse(stripJsonComments(raw)));
57
58
  }
58
59
 
59
60
  function collectFindings(node: RtdbNode, kind: 'errors' | 'warnings'): RuleFinding[] {
@@ -215,7 +216,8 @@ export async function runDatabaseRulesSimulate(
215
216
  rulesJson = payload.rulesJson ?? payload.rules;
216
217
  } else if (payload.rulesPath) {
217
218
  try {
218
- rulesJson = JSON.parse(await readFileFn(resolvePath(deps.cwd ?? process.cwd(), payload.rulesPath), 'utf-8'));
219
+ const rawContent = await readFileFn(resolvePath(deps.cwd ?? process.cwd(), payload.rulesPath), 'utf-8');
220
+ rulesJson = JSON.parse(stripJsonComments(rawContent));
219
221
  } catch (e) {
220
222
  err.write(`pyric database rules simulate: ${e instanceof Error ? e.message : String(e)}\n`);
221
223
  return 1;
@@ -227,7 +229,7 @@ export async function runDatabaseRulesSimulate(
227
229
  return 1;
228
230
  }
229
231
  try {
230
- rulesJson = JSON.parse(file.raw);
232
+ rulesJson = JSON.parse(stripJsonComments(file.raw));
231
233
  } catch (e) {
232
234
  err.write(`pyric database rules simulate: ${e instanceof Error ? e.message : String(e)}\n`);
233
235
  return 2;
@@ -247,7 +249,7 @@ export async function runDatabaseRulesSimulate(
247
249
  return 1;
248
250
  }
249
251
  try {
250
- rulesJson = JSON.parse(file.raw);
252
+ rulesJson = JSON.parse(stripJsonComments(file.raw));
251
253
  } catch (e) {
252
254
  err.write(`pyric database rules simulate: ${e instanceof Error ? e.message : String(e)}\n`);
253
255
  return 2;
@@ -163,6 +163,27 @@ export function buildChildEnv(
163
163
  };
164
164
  }
165
165
 
166
+ /**
167
+ * Format copy-pasteable POSIX export statements for host-only startup.
168
+ * Grouped in a cleanly formatted console block for easy selection and copying
169
+ * into a separate terminal (for example, when running Next.js independently).
170
+ */
171
+ export function formatStartupEnvExport(opts: { serveUrl: string; registerUrl: string }): string {
172
+ const pyricSandbox = `remote:${opts.serveUrl}`;
173
+ const nodeOptions = `--import ${opts.registerUrl}`;
174
+ const line1 = `export PYRIC_SANDBOX="${pyricSandbox}"`;
175
+ const line2 = `export NODE_OPTIONS="${nodeOptions}"`;
176
+ const divider = '─'.repeat(Math.max(line1.length, line2.length) + 4);
177
+ return (
178
+ '\n' +
179
+ ' To run external commands against this sandbox, paste in another terminal:\n' +
180
+ ` ${divider}\n` +
181
+ ` ${line1}\n` +
182
+ ` ${line2}\n` +
183
+ ` ${divider}\n`
184
+ );
185
+ }
186
+
166
187
  // ─── Line prefixing (pure core) ────────────────────────────────────────────
167
188
 
168
189
  /**
package/src/cli/serve.ts CHANGED
@@ -31,6 +31,7 @@ import { openBrowser, shouldAutoOpen } from '../serve/open-browser.js';
31
31
  import {
32
32
  buildChildEnv,
33
33
  detectPackageManager,
34
+ formatStartupEnvExport,
34
35
  readDevScript,
35
36
  registerModuleUrl,
36
37
  resolveDevChild,
@@ -404,6 +405,47 @@ export async function startServe(opts: {
404
405
  watcher.close();
405
406
  });
406
407
  }
408
+ const dbRulesSourcePath = session.summary.rules.database.sourcePath;
409
+ const isWatchEnabled = opts.watch !== false;
410
+ const hasDbRulesPath = dbRulesSourcePath !== null;
411
+ const watchingDb = isWatchEnabled && hasDbRulesPath;
412
+ if (watchingDb) {
413
+ let debounceDb: ReturnType<typeof setTimeout> | null = null;
414
+ const dbWatcher = watchFile(dbRulesSourcePath as string, () => {
415
+ const hasDebounceDb = debounceDb !== null;
416
+ if (hasDebounceDb) {
417
+ clearTimeout(debounceDb as ReturnType<typeof setTimeout>);
418
+ }
419
+ debounceDb = setTimeout(() => {
420
+ void session.reloadDatabaseRules().then((result) => {
421
+ const isReloaded = result.kind === 'reloaded';
422
+ if (isReloaded) {
423
+ logger.note(` ↻ rtdb rules reloaded (hash ${result.rulesHash}) → ${result.clients} page(s)`);
424
+ } else {
425
+ const isRejected = result.kind === 'rejected';
426
+ if (isRejected) {
427
+ logger.note(` ⚠ rtdb rules NOT reloaded (last-good stays live): ${result.error.message}`);
428
+ }
429
+ }
430
+ });
431
+ }, 150);
432
+ });
433
+ dbWatcher.on('error', (error) => {
434
+ const isErrorInstance = error instanceof Error;
435
+ let errorMsg = String(error);
436
+ if (isErrorInstance) {
437
+ errorMsg = (error as Error).message;
438
+ }
439
+ logger.note(` ⚠ rtdb rules watcher failed (hot reload off): ${errorMsg}`);
440
+ });
441
+ handle.server.once('close', () => {
442
+ const hasDebounceDb = debounceDb !== null;
443
+ if (hasDebounceDb) {
444
+ clearTimeout(debounceDb as ReturnType<typeof setTimeout>);
445
+ }
446
+ dbWatcher.close();
447
+ });
448
+ }
407
449
 
408
450
  logger.info(`=== Serving from '${opts.cwd}'...`);
409
451
  logger.info('');
@@ -476,7 +518,12 @@ export async function startServe(opts: {
476
518
  if (session.summary.capturePath) {
477
519
  logger.info(`✔ capture session → ${session.summary.capturePath} (run \`pyric verify\` to replay it)`);
478
520
  }
479
- if (watching) logger.info(`✔ watch hot-reloading ${rulesSourcePath} over /__pyric/events`);
521
+ if (watching) {
522
+ logger.info(`✔ watch hot-reloading ${rulesSourcePath} over /__pyric/events`);
523
+ }
524
+ if (watchingDb) {
525
+ logger.info(`✔ watch hot-reloading ${dbRulesSourcePath} over /__pyric/events`);
526
+ }
480
527
  // Browser-honesty: the sandbox is browser-resident — firestore/auth and
481
528
  // persistence run IN the served page. With no page open, data ops silently
482
529
  // no-op. This warning (paired with auto-open in runServe) is the fix for the
@@ -570,7 +617,8 @@ export async function runServe(parsed: ParsedArgs): Promise<number> {
570
617
 
571
618
  const json = Boolean(parsed.flags.get('json'));
572
619
 
573
- const uiOn = Boolean(parsed.flags.get('ui'));
620
+ const explicitUi = Boolean(parsed.flags.get('ui'));
621
+ const uiOn = !parsed.flags.get('no-ui');
574
622
 
575
623
  // Resolve the child plan BEFORE the server starts: a planned child implies
576
624
  // the bridge (see bridgeEnabledFor) — the child's injected PYRIC_SANDBOX
@@ -661,8 +709,9 @@ export async function runServe(parsed: ParsedArgs): Promise<number> {
661
709
  env: process.env,
662
710
  });
663
711
  if (opened) {
664
- // With --ui, open Studio directly; the served page is still available.
665
- void openBrowser(runtime.uiUrl ?? runtime.handle.url);
712
+ // When explicit --ui is passed, open Studio directly; otherwise open the served page.
713
+ const targetUrl = explicitUi && runtime.uiUrl !== null ? runtime.uiUrl : runtime.handle.url;
714
+ void openBrowser(targetUrl);
666
715
  }
667
716
 
668
717
  let devChild: DevChildHandle | null = null;
@@ -734,6 +783,7 @@ export async function runServe(parsed: ParsedArgs): Promise<number> {
734
783
  registerUrl: registerModuleUrl(),
735
784
  instance: `${functionsProjectId}-default-rtdb`,
736
785
  location: process.env.PYRIC_FUNCTIONS_RTDB_REGION ?? 'us-central1',
786
+ projectId: functionsProjectId ?? 'demo-project',
737
787
  readiness: createHttpFunctionsPeerReadiness(runtime.handle.url),
738
788
  onEvent: reportFunctionsEvent,
739
789
  });
@@ -800,6 +850,13 @@ export async function runServe(parsed: ParsedArgs): Promise<number> {
800
850
  registerUrl: registerModuleUrl(),
801
851
  }),
802
852
  });
853
+ } else if (!json) {
854
+ process.stdout.write(
855
+ formatStartupEnvExport({
856
+ serveUrl: runtime.handle.url,
857
+ registerUrl: registerModuleUrl(),
858
+ }),
859
+ );
803
860
  }
804
861
 
805
862
  return await new Promise<number>((resolveExit) => {
@@ -886,7 +943,8 @@ export function scanForInlinedFirebase(dir: string): string[] {
886
943
  if (st.isDirectory()) {
887
944
  // The pyric namespace itself never lands in hosting.public, but a
888
945
  // node_modules inside a served dir would be a scan-cost trap.
889
- if (name === 'node_modules') continue;
946
+ // Dot-directories (.next, .git, .pyric) are internal caches and must be ignored.
947
+ if (name === 'node_modules' || name.startsWith('.')) continue;
890
948
  walk(p, r, depth + 1);
891
949
  } else if (/\.(js|mjs)$/.test(name)) {
892
950
  scanned++;
package/src/cli/verify.ts CHANGED
@@ -18,7 +18,7 @@ import {
18
18
  import { readFirebaseJson, type FirebaseJson } from './firebase-json.js';
19
19
  import type { FlagValue, ParsedArgs } from './parse-args.js';
20
20
  import { resolveScope } from './scope.js';
21
- import { parseRtdbRulesJson } from '../rtdb/rules-json.js';
21
+ import { parseRtdbRulesJson, stripJsonComments } from '../rtdb/rules-json.js';
22
22
 
23
23
  export type Fixture = PyricVerifyFixture;
24
24
 
@@ -358,7 +358,7 @@ async function readFirebaseJsonOrNull(cwd: string): Promise<FirebaseJson | null>
358
358
  function parseRtdbRulesFile(path: string): { rules: Record<string, unknown> } {
359
359
  let parsed: unknown;
360
360
  try {
361
- parsed = JSON.parse(readFileSync(path, 'utf8'));
361
+ parsed = JSON.parse(stripJsonComments(readFileSync(path, 'utf8')));
362
362
  } catch (e) {
363
363
  throw new Error(`failed to parse RTDB rules JSON at ${path}: ${messageOf(e)}`);
364
364
  }