@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.
- package/dist/assurance/.generated/conformance-verdicts.d.ts +120 -75
- package/dist/assurance/.generated/conformance-verdicts.d.ts.map +1 -1
- package/dist/assurance/.generated/conformance-verdicts.js +120 -75
- package/dist/assurance/.generated/conformance-verdicts.js.map +1 -1
- package/dist/cli/serve.d.ts +1 -1
- package/dist/cli/serve.d.ts.map +1 -1
- package/dist/cli/serve.js +208 -285
- package/dist/cli/serve.js.map +1 -1
- package/dist/cli/service-command-records/database-rules-generate.d.ts +4 -0
- package/dist/cli/service-command-records/database-rules-generate.d.ts.map +1 -0
- package/dist/cli/service-command-records/database-rules-generate.js +3 -0
- package/dist/cli/service-command-records/database-rules-generate.js.map +1 -0
- package/dist/cli/service-command-records/database-rules-lint.d.ts +4 -0
- package/dist/cli/service-command-records/database-rules-lint.d.ts.map +1 -0
- package/dist/cli/service-command-records/database-rules-lint.js +3 -0
- package/dist/cli/service-command-records/database-rules-lint.js.map +1 -0
- package/dist/cli/service-command-records/database-rules-simulate.d.ts +4 -0
- package/dist/cli/service-command-records/database-rules-simulate.d.ts.map +1 -0
- package/dist/cli/service-command-records/database-rules-simulate.js +3 -0
- package/dist/cli/service-command-records/database-rules-simulate.js.map +1 -0
- package/dist/cli/service-command-records/database-rules-validate.d.ts +4 -0
- package/dist/cli/service-command-records/database-rules-validate.d.ts.map +1 -0
- package/dist/cli/service-command-records/database-rules-validate.js +3 -0
- package/dist/cli/service-command-records/database-rules-validate.js.map +1 -0
- package/dist/cli/service-command-records/firestore-indexes-generate.d.ts +4 -0
- package/dist/cli/service-command-records/firestore-indexes-generate.d.ts.map +1 -0
- package/dist/cli/service-command-records/firestore-indexes-generate.js +3 -0
- package/dist/cli/service-command-records/firestore-indexes-generate.js.map +1 -0
- package/dist/cli/service-command-records/firestore-rules-lint.d.ts +4 -0
- package/dist/cli/service-command-records/firestore-rules-lint.d.ts.map +1 -0
- package/dist/cli/service-command-records/firestore-rules-lint.js +3 -0
- package/dist/cli/service-command-records/firestore-rules-lint.js.map +1 -0
- package/dist/cli/service-command-records/firestore-rules-resolve.d.ts +4 -0
- package/dist/cli/service-command-records/firestore-rules-resolve.d.ts.map +1 -0
- package/dist/cli/service-command-records/firestore-rules-resolve.js +3 -0
- package/dist/cli/service-command-records/firestore-rules-resolve.js.map +1 -0
- package/dist/cli/service-command-records/firestore-rules-simulate.d.ts +4 -0
- package/dist/cli/service-command-records/firestore-rules-simulate.d.ts.map +1 -0
- package/dist/cli/service-command-records/firestore-rules-simulate.js +3 -0
- package/dist/cli/service-command-records/firestore-rules-simulate.js.map +1 -0
- package/dist/cli/service-command-records/firestore-rules-validate.d.ts +4 -0
- package/dist/cli/service-command-records/firestore-rules-validate.d.ts.map +1 -0
- package/dist/cli/service-command-records/firestore-rules-validate.js +3 -0
- package/dist/cli/service-command-records/firestore-rules-validate.js.map +1 -0
- package/dist/cli/service-command-records/storage-rules-lint.d.ts +4 -0
- package/dist/cli/service-command-records/storage-rules-lint.d.ts.map +1 -0
- package/dist/cli/service-command-records/storage-rules-lint.js +3 -0
- package/dist/cli/service-command-records/storage-rules-lint.js.map +1 -0
- package/dist/cli/service-command-records/storage-rules-simulate.d.ts +4 -0
- package/dist/cli/service-command-records/storage-rules-simulate.d.ts.map +1 -0
- package/dist/cli/service-command-records/storage-rules-simulate.js +3 -0
- package/dist/cli/service-command-records/storage-rules-simulate.js.map +1 -0
- package/dist/cli/service-commands.d.ts +7 -0
- package/dist/cli/service-commands.d.ts.map +1 -1
- package/dist/cli/service-commands.generated.d.ts +35 -0
- package/dist/cli/service-commands.generated.d.ts.map +1 -0
- package/dist/cli/service-commands.generated.js +25 -0
- package/dist/cli/service-commands.generated.js.map +1 -0
- package/dist/cli/service-commands.js +23 -40
- package/dist/cli/service-commands.js.map +1 -1
- package/dist/conformance/.generated/can-i-use-browser.d.ts.map +1 -1
- package/dist/conformance/.generated/can-i-use-browser.js +1 -1
- package/dist/conformance/.generated/can-i-use-browser.js.map +1 -1
- package/dist/conformance/.generated/can-i-use.d.ts.map +1 -1
- package/dist/conformance/.generated/can-i-use.js +1 -1
- package/dist/conformance/.generated/can-i-use.js.map +1 -1
- package/dist/conformance/.generated/conformance-docs.d.ts.map +1 -1
- package/dist/conformance/.generated/conformance-docs.js +1 -1
- package/dist/conformance/.generated/conformance-docs.js.map +1 -1
- package/dist/functions-rtdb/development-runtime.d.ts +63 -0
- package/dist/functions-rtdb/development-runtime.d.ts.map +1 -0
- package/dist/functions-rtdb/development-runtime.js +244 -0
- package/dist/functions-rtdb/development-runtime.js.map +1 -0
- package/dist/serve/bridge-mount.d.ts +32 -2
- package/dist/serve/bridge-mount.d.ts.map +1 -1
- package/dist/serve/bridge-mount.js +232 -18
- package/dist/serve/bridge-mount.js.map +1 -1
- package/dist/serve/bundler.d.ts +4 -18
- package/dist/serve/bundler.d.ts.map +1 -1
- package/dist/serve/bundler.js +15 -37
- package/dist/serve/bundler.js.map +1 -1
- package/dist/serve/entries/app-client.d.ts.map +1 -1
- package/dist/serve/entries/app-client.js +5 -5
- package/dist/serve/entries/app-client.js.map +1 -1
- package/dist/serve/entries/auth-helper-core.d.ts +23 -6
- package/dist/serve/entries/auth-helper-core.d.ts.map +1 -1
- package/dist/serve/entries/auth-helper-core.js +55 -24
- package/dist/serve/entries/auth-helper-core.js.map +1 -1
- package/dist/serve/entries/database.d.ts +28 -0
- package/dist/serve/entries/database.d.ts.map +1 -1
- package/dist/serve/entries/database.js +95 -26
- package/dist/serve/entries/database.js.map +1 -1
- package/dist/serve/entries/init.d.ts.map +1 -1
- package/dist/serve/entries/init.js +21 -12
- package/dist/serve/entries/init.js.map +1 -1
- package/dist/serve/html-injection.d.ts +5 -0
- package/dist/serve/html-injection.d.ts.map +1 -0
- package/dist/serve/html-injection.js +59 -0
- package/dist/serve/html-injection.js.map +1 -0
- package/dist/serve/namespace.d.ts +6 -22
- package/dist/serve/namespace.d.ts.map +1 -1
- package/dist/serve/namespace.js +23 -145
- package/dist/serve/namespace.js.map +1 -1
- package/dist/serve/runtime/worker-generation.d.ts +10 -2
- package/dist/serve/runtime/worker-generation.d.ts.map +1 -1
- package/dist/serve/runtime/worker-generation.js +29 -8
- package/dist/serve/runtime/worker-generation.js.map +1 -1
- package/dist/serve/runtime/worker-replacement.d.ts +1 -2
- package/dist/serve/runtime/worker-replacement.d.ts.map +1 -1
- package/dist/serve/sandbox-session.d.ts +78 -0
- package/dist/serve/sandbox-session.d.ts.map +1 -0
- package/dist/serve/sandbox-session.js +171 -0
- package/dist/serve/sandbox-session.js.map +1 -0
- package/dist/serve/server.d.ts +5 -2
- package/dist/serve/server.d.ts.map +1 -1
- package/dist/serve/server.js +21 -5
- package/dist/serve/server.js.map +1 -1
- package/dist/serve/site-tree.d.ts +8 -0
- package/dist/serve/site-tree.d.ts.map +1 -0
- package/dist/serve/site-tree.js +113 -0
- package/dist/serve/site-tree.js.map +1 -0
- package/dist/serve/site-ui/_astro/RulesCodeEditor.CzwHdCi9.js +23 -0
- package/dist/serve/site-ui/_astro/_example_.jevZ7OdV.css +1 -0
- package/dist/serve/site-ui/_astro/_slug_.BoKXYrnu.css +1 -0
- package/dist/serve/site-ui/_astro/_studio_.BtYpqe1A.css +1 -0
- package/dist/serve/site-ui/_astro/app.BnMC0ywl.js +109 -0
- package/dist/serve/site-ui/_astro/app.BsFsMjn0.css +1 -0
- package/dist/serve/site-ui/_astro/app.DVXXR-WI.js +1 -0
- package/dist/serve/site-ui/_astro/chess-showcase.DzPO6kz0.js +1 -0
- package/dist/serve/site-ui/_astro/chess-source-explorer.C5k9c5yK.js +1 -0
- package/dist/serve/site-ui/_astro/chess-v2.CFHmd3UL.js +354 -0
- package/dist/serve/site-ui/_astro/client.D2ORs4B-.js +25 -0
- package/dist/serve/site-ui/_astro/example-runtime.CM0H02rx.js +291 -0
- package/dist/serve/site-ui/_astro/index.B4Kh80he.js +1 -0
- package/dist/serve/site-ui/_astro/index.DBy5LfQW.js +9 -0
- package/dist/serve/site-ui/_astro/index.DNyk7q8W.js +9 -0
- package/dist/serve/site-ui/_astro/jsx-runtime.D_zvdyIk.js +9 -0
- package/dist/serve/site-ui/_astro/reads.D1exkX1-.js +1 -0
- package/dist/serve/site-ui/_astro/sandbox-controls.BqMePr5V.js +1153 -0
- package/dist/serve/site-ui/_astro/seed.BCn5DhHS.js +20 -0
- package/dist/serve/site-ui/auth/index.html +11 -0
- package/dist/serve/site-ui/docs/_rhythm/index.html +100 -0
- package/dist/serve/site-ui/docs/agent/set-up-your-agent/index.html +43 -0
- package/dist/serve/site-ui/docs/agent/watch-and-review/index.html +26 -0
- package/dist/serve/site-ui/docs/agent/work-with-an-agent/index.html +70 -0
- package/dist/serve/{docs-ui → site-ui}/docs/ai-compat/index.html +3 -3
- package/dist/serve/site-ui/docs/api-reference/index.html +68 -0
- package/dist/serve/{docs-ui → site-ui}/docs/app-compat/index.html +3 -3
- package/dist/serve/{docs-ui → site-ui}/docs/auth-compat/index.html +3 -3
- package/dist/serve/site-ui/docs/build/ai-logic/index.html +64 -0
- package/dist/serve/site-ui/docs/build/authentication/index.html +66 -0
- package/dist/serve/site-ui/docs/build/cloud-firestore/index.html +84 -0
- package/dist/serve/site-ui/docs/build/cloud-messaging/index.html +71 -0
- package/dist/serve/site-ui/docs/build/cloud-storage/index.html +66 -0
- package/dist/serve/{docs-ui → site-ui}/docs/build/cloud-storage.md +2 -2
- package/dist/serve/site-ui/docs/build/realtime-database/index.html +67 -0
- package/dist/serve/site-ui/docs/conformance-scores/index.html +50 -0
- package/dist/serve/{docs-ui → site-ui}/docs/conformance-scores.md +3 -3
- package/dist/serve/site-ui/docs/create-pyric-reference-api/index.html +531 -0
- package/dist/serve/{docs-ui → site-ui}/docs/database-compat/index.html +211 -168
- package/dist/serve/{docs-ui → site-ui}/docs/database-compat.md +208 -170
- package/dist/serve/site-ui/docs/examples/chess/index.html +384 -0
- package/dist/serve/site-ui/docs/examples/chess.md +57 -0
- package/dist/serve/site-ui/docs/examples/index.html +3 -0
- package/dist/serve/site-ui/docs/examples.md +4 -0
- package/dist/serve/{docs-ui → site-ui}/docs/firestore-compat/index.html +55 -91
- package/dist/serve/{docs-ui → site-ui}/docs/firestore-compat.md +52 -88
- package/dist/serve/site-ui/docs/functions-rtdb-compat/index.html +73 -0
- package/dist/serve/site-ui/docs/get-started/how-the-swap-works/index.html +29 -0
- package/dist/serve/site-ui/docs/get-started/start-building/index.html +33 -0
- package/dist/serve/{docs-ui → site-ui}/docs/index.json +595 -26
- package/dist/serve/site-ui/docs/messaging-compat/index.html +324 -0
- package/dist/serve/{docs-ui → site-ui}/docs/messaging-compat.md +71 -1
- package/dist/serve/site-ui/docs/observe/resolve-runtime-status/index.html +28 -0
- package/dist/serve/site-ui/docs/observe/see-whats-happening/index.html +74 -0
- package/dist/serve/site-ui/docs/observe/shape-your-data/index.html +45 -0
- package/dist/serve/site-ui/docs/overview/index.html +17 -0
- package/dist/serve/site-ui/docs/pyric-admin-app-reference-api/index.html +186 -0
- package/dist/serve/{docs-ui → site-ui}/docs/pyric-admin-auth-reference-api/index.html +4 -4
- package/dist/serve/{docs-ui → site-ui}/docs/pyric-admin-database-reference-api/index.html +4 -4
- package/dist/serve/{docs-ui → site-ui}/docs/pyric-admin-firestore-reference-api/index.html +318 -202
- package/dist/serve/{docs-ui → site-ui}/docs/pyric-admin-firestore-reference-api.md +154 -27
- package/dist/serve/{docs-ui → site-ui}/docs/pyric-admin-messaging-reference-api/index.html +5 -5
- package/dist/serve/site-ui/docs/pyric-admin-storage-reference-api/index.html +318 -0
- package/dist/serve/{docs-ui → site-ui}/docs/pyric-ai-reference-api/index.html +5 -5
- package/dist/serve/site-ui/docs/pyric-ai-scripting-reference-api/index.html +160 -0
- package/dist/serve/site-ui/docs/pyric-app-reference-api/index.html +425 -0
- package/dist/serve/{docs-ui → site-ui}/docs/pyric-auth-reference-api/index.html +5 -5
- package/dist/serve/site-ui/docs/pyric-cli-assurance-browser-reference-api/index.html +60 -0
- package/dist/serve/{docs-ui → site-ui}/docs/pyric-cli-assurance-reference-api/index.html +4 -4
- package/dist/serve/{docs-ui → site-ui}/docs/pyric-cli-bridge-client-reference-api/index.html +4 -4
- package/dist/serve/site-ui/docs/pyric-cli-bridge-reference-api/index.html +507 -0
- package/dist/serve/site-ui/docs/pyric-cli-conformance-browser-reference-api/index.html +258 -0
- package/dist/serve/site-ui/docs/pyric-cli-conformance-docs-reference-api/index.html +51 -0
- package/dist/serve/site-ui/docs/pyric-cli-conformance-reference-api/index.html +308 -0
- package/dist/serve/site-ui/docs/pyric-cli-credentials-node-reference-api/index.html +68 -0
- package/dist/serve/{docs-ui → site-ui}/docs/pyric-cli-discover-reference-api/index.html +4 -4
- package/dist/serve/site-ui/docs/pyric-cli-register-reference-api/index.html +11 -0
- package/dist/serve/{docs-ui → site-ui}/docs/pyric-cli-remote-reference-api/index.html +4 -4
- package/dist/serve/{docs-ui → site-ui}/docs/pyric-cli-serve-worker-reference-api/index.html +1186 -1384
- package/dist/serve/{docs-ui → site-ui}/docs/pyric-cli-serve-worker-reference-api.md +817 -1291
- package/dist/serve/{docs-ui → site-ui}/docs/pyric-cli-verify-reference-api/index.html +4 -4
- package/dist/serve/site-ui/docs/pyric-cli-vite-reference-api/index.html +126 -0
- package/dist/serve/{docs-ui → site-ui}/docs/pyric-cli-vite-reference-api.md +1 -1
- package/dist/serve/site-ui/docs/pyric-database-reference-api/index.html +2641 -0
- package/dist/serve/{docs-ui → site-ui}/docs/pyric-database-reference-api.md +1055 -158
- package/dist/serve/{docs-ui → site-ui}/docs/pyric-firestore-reference-api/index.html +311 -249
- package/dist/serve/{docs-ui → site-ui}/docs/pyric-firestore-reference-api.md +72 -54
- package/dist/serve/site-ui/docs/pyric-messaging-reference-api/index.html +509 -0
- package/dist/serve/site-ui/docs/pyric-messaging-sw-reference-api/index.html +182 -0
- package/dist/serve/{docs-ui → site-ui}/docs/pyric-rules-reference-api/index.html +7 -26
- package/dist/serve/{docs-ui → site-ui}/docs/pyric-rules-reference-api.md +13 -23
- package/dist/serve/site-ui/docs/pyric-sandbox-database-reference-api/index.html +121 -0
- package/dist/serve/site-ui/docs/pyric-sandbox-firestore-reference-api/index.html +203 -0
- package/dist/serve/{docs-ui → site-ui}/docs/pyric-sandbox-reference-api/index.html +26 -5
- package/dist/serve/{docs-ui → site-ui}/docs/pyric-sandbox-reference-api.md +22 -22
- package/dist/serve/{docs-ui → site-ui}/docs/pyric-storage-reference-api/index.html +5 -15
- package/dist/serve/{docs-ui → site-ui}/docs/pyric-storage-reference-api.md +0 -13
- package/dist/serve/site-ui/docs/pyric-ui-agents-reference-api/index.html +639 -0
- package/dist/serve/site-ui/docs/pyric-ui-auth-hooks-reference-api/index.html +100 -0
- package/dist/serve/{docs-ui → site-ui}/docs/pyric-ui-auth-reference-api/index.html +4 -4
- package/dist/serve/site-ui/docs/pyric-ui-events-hooks-reference-api/index.html +24 -0
- package/dist/serve/{docs-ui → site-ui}/docs/pyric-ui-events-reference-api/index.html +4 -4
- package/dist/serve/site-ui/docs/pyric-ui-firestore-hooks-reference-api/index.html +136 -0
- package/dist/serve/{docs-ui → site-ui}/docs/pyric-ui-firestore-reference-api/index.html +7 -7
- package/dist/serve/{docs-ui → site-ui}/docs/pyric-ui-firestore-reference-api.md +4 -4
- package/dist/serve/{docs-ui → site-ui}/docs/pyric-ui-primitives-reference-api/index.html +4 -4
- package/dist/serve/{docs-ui → site-ui}/docs/pyric-ui-rtdb-reference-api/index.html +4 -4
- package/dist/serve/site-ui/docs/pyric-ui-rules-hooks-reference-api/index.html +16 -0
- package/dist/serve/{docs-ui → site-ui}/docs/pyric-ui-rules-reference-api/index.html +4 -4
- package/dist/serve/site-ui/docs/pyric-ui-storage-hooks-reference-api/index.html +176 -0
- package/dist/serve/{docs-ui → site-ui}/docs/pyric-ui-storage-reference-api/index.html +10 -11
- package/dist/serve/{docs-ui → site-ui}/docs/pyric-ui-storage-reference-api.md +7 -8
- package/dist/serve/site-ui/docs/pyric-ui-traffic-hooks-reference-api/index.html +188 -0
- package/dist/serve/{docs-ui → site-ui}/docs/pyric-ui-traffic-reference-api/index.html +4 -4
- package/dist/serve/{docs-ui → site-ui}/docs/rules-compat/index.html +87 -57
- package/dist/serve/{docs-ui → site-ui}/docs/rules-compat.md +84 -54
- package/dist/serve/site-ui/docs/secure/audit-your-rules/index.html +51 -0
- package/dist/serve/site-ui/docs/secure/firestore-rules-limits/index.html +106 -0
- package/dist/serve/site-ui/docs/secure/read-a-denial/index.html +41 -0
- package/dist/serve/site-ui/docs/secure/rtdb-rules-in-typescript/index.html +67 -0
- package/dist/serve/site-ui/docs/secure/rules-standard-library/index.html +159 -0
- package/dist/serve/{docs-ui → site-ui}/docs/secure/rules-standard-library.md +2 -2
- package/dist/serve/site-ui/docs/secure/secure-it-with-rules/index.html +47 -0
- package/dist/serve/site-ui/docs/secure/simulate-and-lint/index.html +95 -0
- package/dist/serve/site-ui/docs/secure/write-a-rules-test-suite/index.html +82 -0
- package/dist/serve/site-ui/docs/ship/ship-to-production/index.html +37 -0
- package/dist/serve/site-ui/docs/ship/test-in-node/index.html +75 -0
- package/dist/serve/{docs-ui → site-ui}/docs/storage-compat/index.html +8 -8
- package/dist/serve/{docs-ui → site-ui}/docs/storage-compat.md +5 -5
- package/dist/serve/site-ui/docs/trust/how-we-know-it-matches-firebase/index.html +132 -0
- package/dist/serve/site-ui/docs/trust/rules-standard-library/index.html +861 -0
- package/dist/serve/site-ui/docs/trust/rules-standard-library.md +344 -0
- package/dist/serve/site-ui/docs/trust/storage-rules-stdlib-research/index.html +582 -0
- package/dist/serve/site-ui/docs/trust/storage-rules-stdlib-research.md +448 -0
- package/dist/serve/site-ui/docs/trust/versioning-and-compatibility/index.html +14 -0
- package/dist/serve/{docs-ui → site-ui}/docs/tutorial/index.html +4 -4
- package/dist/serve/{docs-ui → site-ui}/docs/tutorial.md +1 -1
- package/dist/serve/site-ui/examples/chess/index.html +2 -0
- package/dist/serve/site-ui/examples/firestore-first-write/index.html +2 -0
- package/dist/serve/site-ui/firestore/index.html +11 -0
- package/dist/serve/site-ui/index.html +11 -0
- package/dist/serve/{docs-ui → site-ui}/llms.txt +6 -2
- package/dist/serve/site-ui/rtdb/index.html +11 -0
- package/dist/serve/site-ui/settings/index.html +11 -0
- package/dist/serve/site-ui/storage/index.html +11 -0
- package/dist/serve/site-ui/studio-routes.json +1 -0
- package/dist/serve/site-ui/traffic/index.html +11 -0
- package/dist/serve/standalone-assets.d.ts +4 -10
- package/dist/serve/standalone-assets.d.ts.map +1 -1
- package/dist/serve/standalone-assets.js +8 -21
- package/dist/serve/standalone-assets.js.map +1 -1
- package/dist/serve/vite-ai-config.d.ts +2 -0
- package/dist/serve/vite-ai-config.d.ts.map +1 -1
- package/dist/serve/vite-ai-config.js +4 -0
- package/dist/serve/vite-ai-config.js.map +1 -1
- package/dist/serve/vite-functions-development.d.ts +29 -0
- package/dist/serve/vite-functions-development.d.ts.map +1 -0
- package/dist/serve/vite-functions-development.js +150 -0
- package/dist/serve/vite-functions-development.js.map +1 -0
- package/dist/serve/vite-generation-bridge.d.ts +17 -0
- package/dist/serve/vite-generation-bridge.d.ts.map +1 -0
- package/dist/serve/vite-generation-bridge.js +47 -0
- package/dist/serve/vite-generation-bridge.js.map +1 -0
- package/dist/serve/vite-generation-functions.d.ts +35 -0
- package/dist/serve/vite-generation-functions.d.ts.map +1 -0
- package/dist/serve/vite-generation-functions.js +46 -0
- package/dist/serve/vite-generation-functions.js.map +1 -0
- package/dist/serve/vite-generation-middleware.d.ts +10 -0
- package/dist/serve/vite-generation-middleware.d.ts.map +1 -0
- package/dist/serve/vite-generation-middleware.js +40 -0
- package/dist/serve/vite-generation-middleware.js.map +1 -0
- package/dist/serve/vite-generation-rules-watch.d.ts +8 -0
- package/dist/serve/vite-generation-rules-watch.d.ts.map +1 -0
- package/dist/serve/vite-generation-rules-watch.js +33 -0
- package/dist/serve/vite-generation-rules-watch.js.map +1 -0
- package/dist/serve/vite-module-swap.d.ts +16 -0
- package/dist/serve/vite-module-swap.d.ts.map +1 -0
- package/dist/serve/vite-module-swap.js +96 -0
- package/dist/serve/vite-module-swap.js.map +1 -0
- package/dist/serve/vite-page-runtime.d.ts +29 -0
- package/dist/serve/vite-page-runtime.d.ts.map +1 -0
- package/dist/serve/vite-page-runtime.js +71 -0
- package/dist/serve/vite-page-runtime.js.map +1 -0
- package/dist/serve/vite-plugin.d.ts +44 -4
- package/dist/serve/vite-plugin.d.ts.map +1 -1
- package/dist/serve/vite-plugin.js +62 -864
- package/dist/serve/vite-plugin.js.map +1 -1
- package/dist/serve/vite-sandbox-generation.d.ts +57 -0
- package/dist/serve/vite-sandbox-generation.d.ts.map +1 -0
- package/dist/serve/vite-sandbox-generation.js +178 -0
- package/dist/serve/vite-sandbox-generation.js.map +1 -0
- package/dist/serve/vite-worker-runtime.d.ts +1 -1
- package/dist/serve/vite-worker-runtime.d.ts.map +1 -1
- package/dist/serve/vite-worker-runtime.js +8 -4
- package/dist/serve/vite-worker-runtime.js.map +1 -1
- package/dist/serve/worker/client/disconnect.d.ts.map +1 -1
- package/dist/serve/worker/client/disconnect.js +2 -0
- package/dist/serve/worker/client/disconnect.js.map +1 -1
- package/dist/serve/worker/client/handles.d.ts +5 -0
- package/dist/serve/worker/client/handles.d.ts.map +1 -1
- package/dist/serve/worker/client/handles.js.map +1 -1
- package/dist/serve/worker/client/pagehide.d.ts +13 -0
- package/dist/serve/worker/client/pagehide.d.ts.map +1 -0
- package/dist/serve/worker/client/pagehide.js +19 -0
- package/dist/serve/worker/client/pagehide.js.map +1 -0
- package/dist/serve/worker/client/rtdb-admin.d.ts +8 -0
- package/dist/serve/worker/client/rtdb-admin.d.ts.map +1 -0
- package/dist/serve/worker/client/rtdb-admin.js +39 -0
- package/dist/serve/worker/client/rtdb-admin.js.map +1 -0
- package/dist/serve/worker/client/rtdb-connection-lifecycle.d.ts +15 -0
- package/dist/serve/worker/client/rtdb-connection-lifecycle.d.ts.map +1 -0
- package/dist/serve/worker/client/rtdb-connection-lifecycle.js +45 -0
- package/dist/serve/worker/client/rtdb-connection-lifecycle.js.map +1 -0
- package/dist/serve/worker/client/rtdb-controls.d.ts +6 -0
- package/dist/serve/worker/client/rtdb-controls.d.ts.map +1 -0
- package/dist/serve/worker/client/rtdb-controls.js +8 -0
- package/dist/serve/worker/client/rtdb-controls.js.map +1 -0
- package/dist/serve/worker/client/rtdb-listeners.d.ts +24 -0
- package/dist/serve/worker/client/rtdb-listeners.d.ts.map +1 -0
- package/dist/serve/worker/client/rtdb-listeners.js +262 -0
- package/dist/serve/worker/client/rtdb-listeners.js.map +1 -0
- package/dist/serve/worker/client/rtdb-reads.d.ts +4 -0
- package/dist/serve/worker/client/rtdb-reads.d.ts.map +1 -0
- package/dist/serve/worker/client/rtdb-reads.js +11 -0
- package/dist/serve/worker/client/rtdb-reads.js.map +1 -0
- package/dist/serve/worker/client/rtdb-references.d.ts +19 -0
- package/dist/serve/worker/client/rtdb-references.d.ts.map +1 -0
- package/dist/serve/worker/client/rtdb-references.js +63 -0
- package/dist/serve/worker/client/rtdb-references.js.map +1 -0
- package/dist/serve/worker/client/rtdb-snapshots.d.ts +20 -0
- package/dist/serve/worker/client/rtdb-snapshots.d.ts.map +1 -0
- package/dist/serve/worker/client/rtdb-snapshots.js +64 -0
- package/dist/serve/worker/client/rtdb-snapshots.js.map +1 -0
- package/dist/serve/worker/client/rtdb-transactions.d.ts +14 -0
- package/dist/serve/worker/client/rtdb-transactions.d.ts.map +1 -0
- package/dist/serve/worker/client/rtdb-transactions.js +34 -0
- package/dist/serve/worker/client/rtdb-transactions.js.map +1 -0
- package/dist/serve/worker/client/rtdb-writes.d.ts +8 -0
- package/dist/serve/worker/client/rtdb-writes.d.ts.map +1 -0
- package/dist/serve/worker/client/rtdb-writes.js +65 -0
- package/dist/serve/worker/client/rtdb-writes.js.map +1 -0
- package/dist/serve/worker/client.d.ts +0 -2
- package/dist/serve/worker/client.d.ts.map +1 -1
- package/dist/serve/worker/client.js +0 -2
- package/dist/serve/worker/client.js.map +1 -1
- package/dist/serve/worker/entry.js +2 -2
- package/dist/serve/worker/entry.js.map +1 -1
- package/dist/serve/worker/host/dispatch.d.ts +2 -0
- package/dist/serve/worker/host/dispatch.d.ts.map +1 -1
- package/dist/serve/worker/host/dispatch.js +24 -2
- package/dist/serve/worker/host/dispatch.js.map +1 -1
- package/dist/serve/worker/host/rtdb.d.ts +6 -2
- package/dist/serve/worker/host/rtdb.d.ts.map +1 -1
- package/dist/serve/worker/host/rtdb.js +224 -2
- package/dist/serve/worker/host/rtdb.js.map +1 -1
- package/dist/serve/worker/host/studio.d.ts.map +1 -1
- package/dist/serve/worker/host/studio.js +2 -0
- package/dist/serve/worker/host/studio.js.map +1 -1
- package/dist/serve/worker/host/subscriptions.d.ts.map +1 -1
- package/dist/serve/worker/host/subscriptions.js +3 -3
- package/dist/serve/worker/host/subscriptions.js.map +1 -1
- package/dist/serve/worker/host.d.ts +1 -1
- package/dist/serve/worker/host.d.ts.map +1 -1
- package/dist/serve/worker/host.js +1 -1
- package/dist/serve/worker/host.js.map +1 -1
- package/dist/serve/worker/index.d.ts +16 -1
- package/dist/serve/worker/index.d.ts.map +1 -1
- package/dist/serve/worker/index.js +17 -4
- package/dist/serve/worker/index.js.map +1 -1
- package/dist/serve/worker/protocol.d.ts +57 -0
- package/dist/serve/worker/protocol.d.ts.map +1 -1
- package/dist/serve/worker/protocol.js.map +1 -1
- package/dist/serve/worker/rtdb-value-equality.d.ts +3 -0
- package/dist/serve/worker/rtdb-value-equality.d.ts.map +1 -0
- package/dist/serve/worker/rtdb-value-equality.js +18 -0
- package/dist/serve/worker/rtdb-value-equality.js.map +1 -0
- package/dist/serve/worker/serve-init.js +2 -2
- package/dist/serve/worker/serve-init.js.map +1 -1
- package/dist/serve/worker/service-worker-relay.js +2 -2
- package/dist/serve/worker/service-worker-relay.js.map +1 -1
- package/package.json +7 -5
- package/src/assurance/.generated/conformance-verdicts.ts +120 -75
- package/src/cli/serve.ts +216 -308
- package/src/cli/service-command-records/database-rules-generate.ts +3 -0
- package/src/cli/service-command-records/database-rules-lint.ts +3 -0
- package/src/cli/service-command-records/database-rules-simulate.ts +3 -0
- package/src/cli/service-command-records/database-rules-validate.ts +3 -0
- package/src/cli/service-command-records/firestore-indexes-generate.ts +3 -0
- package/src/cli/service-command-records/firestore-rules-lint.ts +3 -0
- package/src/cli/service-command-records/firestore-rules-resolve.ts +3 -0
- package/src/cli/service-command-records/firestore-rules-simulate.ts +3 -0
- package/src/cli/service-command-records/firestore-rules-validate.ts +3 -0
- package/src/cli/service-command-records/storage-rules-lint.ts +3 -0
- package/src/cli/service-command-records/storage-rules-simulate.ts +3 -0
- package/src/cli/service-commands.generated.ts +27 -0
- package/src/cli/service-commands.test.ts +43 -0
- package/src/cli/service-commands.ts +36 -51
- package/src/conformance/.generated/can-i-use-browser.ts +1 -1
- package/src/conformance/.generated/can-i-use.ts +1 -1
- package/src/conformance/.generated/conformance-docs.ts +1 -1
- package/src/functions-rtdb/development-runtime.ts +299 -0
- package/src/serve/bridge-mount.ts +253 -19
- package/src/serve/bundler.ts +17 -36
- package/src/serve/entries/app-client.ts +5 -4
- package/src/serve/entries/auth-helper-core.ts +83 -30
- package/src/serve/entries/database.ts +180 -57
- package/src/serve/entries/init.ts +30 -20
- package/src/serve/html-injection.ts +65 -0
- package/src/serve/namespace.ts +26 -169
- package/src/serve/runtime/worker-generation.ts +29 -7
- package/src/serve/runtime/worker-replacement.ts +1 -1
- package/src/serve/sandbox-session.ts +233 -0
- package/src/serve/server.ts +20 -5
- package/src/serve/site-tree.ts +146 -0
- package/src/serve/standalone-assets.ts +9 -26
- package/src/serve/vite-ai-config.ts +8 -0
- package/src/serve/vite-functions-development.ts +201 -0
- package/src/serve/vite-generation-bridge.ts +66 -0
- package/src/serve/vite-generation-functions.ts +78 -0
- package/src/serve/vite-generation-middleware.ts +56 -0
- package/src/serve/vite-generation-rules-watch.ts +37 -0
- package/src/serve/vite-module-swap.ts +119 -0
- package/src/serve/vite-page-runtime.ts +100 -0
- package/src/serve/vite-plugin.ts +78 -882
- package/src/serve/vite-sandbox-generation.ts +255 -0
- package/src/serve/vite-worker-runtime.ts +12 -5
- package/src/serve/worker/client/disconnect.ts +3 -1
- package/src/serve/worker/client/handles.ts +5 -0
- package/src/serve/worker/client/pagehide.ts +31 -0
- package/src/serve/worker/client/rtdb-admin.ts +74 -0
- package/src/serve/worker/client/rtdb-connection-lifecycle.ts +52 -0
- package/src/serve/worker/client/rtdb-controls.ts +8 -0
- package/src/serve/worker/client/rtdb-listeners.ts +337 -0
- package/src/serve/worker/client/rtdb-reads.ts +12 -0
- package/src/serve/worker/client/rtdb-references.ts +85 -0
- package/src/serve/worker/client/rtdb-snapshots.ts +118 -0
- package/src/serve/worker/client/rtdb-transactions.ts +51 -0
- package/src/serve/worker/client/rtdb-writes.ts +74 -0
- package/src/serve/worker/client.ts +0 -2
- package/src/serve/worker/entry.ts +2 -2
- package/src/serve/worker/host/dispatch.ts +22 -2
- package/src/serve/worker/host/rtdb.ts +243 -2
- package/src/serve/worker/host/studio.ts +2 -0
- package/src/serve/worker/host/subscriptions.ts +8 -4
- package/src/serve/worker/host.ts +1 -1
- package/src/serve/worker/index.ts +58 -10
- package/src/serve/worker/protocol.ts +23 -2
- package/src/serve/worker/rtdb-value-equality.ts +17 -0
- package/src/serve/worker/serve-init.ts +2 -2
- package/src/serve/worker/service-worker-relay.ts +2 -2
- package/dist/serve/docs-ui/_astro/_slug_.DUci-duz.css +0 -1
- package/dist/serve/docs-ui/docs/_rhythm/index.html +0 -100
- package/dist/serve/docs-ui/docs/agent/set-up-your-agent/index.html +0 -43
- package/dist/serve/docs-ui/docs/agent/watch-and-review/index.html +0 -26
- package/dist/serve/docs-ui/docs/agent/work-with-an-agent/index.html +0 -70
- package/dist/serve/docs-ui/docs/api-reference/index.html +0 -68
- package/dist/serve/docs-ui/docs/build/ai-logic/index.html +0 -64
- package/dist/serve/docs-ui/docs/build/authentication/index.html +0 -66
- package/dist/serve/docs-ui/docs/build/cloud-firestore/index.html +0 -70
- package/dist/serve/docs-ui/docs/build/cloud-messaging/index.html +0 -71
- package/dist/serve/docs-ui/docs/build/cloud-storage/index.html +0 -66
- package/dist/serve/docs-ui/docs/build/realtime-database/index.html +0 -67
- package/dist/serve/docs-ui/docs/conformance-scores/index.html +0 -50
- package/dist/serve/docs-ui/docs/create-pyric-reference-api/index.html +0 -531
- package/dist/serve/docs-ui/docs/functions-rtdb-compat/index.html +0 -73
- package/dist/serve/docs-ui/docs/get-started/how-the-swap-works/index.html +0 -29
- package/dist/serve/docs-ui/docs/get-started/start-building/index.html +0 -33
- package/dist/serve/docs-ui/docs/messaging-compat/index.html +0 -265
- package/dist/serve/docs-ui/docs/observe/resolve-runtime-status/index.html +0 -28
- package/dist/serve/docs-ui/docs/observe/see-whats-happening/index.html +0 -74
- package/dist/serve/docs-ui/docs/observe/shape-your-data/index.html +0 -45
- package/dist/serve/docs-ui/docs/overview/index.html +0 -17
- package/dist/serve/docs-ui/docs/pyric-admin-app-reference-api/index.html +0 -186
- package/dist/serve/docs-ui/docs/pyric-admin-storage-reference-api/index.html +0 -318
- package/dist/serve/docs-ui/docs/pyric-ai-scripting-reference-api/index.html +0 -160
- package/dist/serve/docs-ui/docs/pyric-app-reference-api/index.html +0 -425
- package/dist/serve/docs-ui/docs/pyric-cli-assurance-browser-reference-api/index.html +0 -60
- package/dist/serve/docs-ui/docs/pyric-cli-bridge-reference-api/index.html +0 -507
- package/dist/serve/docs-ui/docs/pyric-cli-conformance-browser-reference-api/index.html +0 -258
- package/dist/serve/docs-ui/docs/pyric-cli-conformance-docs-reference-api/index.html +0 -51
- package/dist/serve/docs-ui/docs/pyric-cli-conformance-reference-api/index.html +0 -308
- package/dist/serve/docs-ui/docs/pyric-cli-credentials-node-reference-api/index.html +0 -68
- package/dist/serve/docs-ui/docs/pyric-cli-register-reference-api/index.html +0 -11
- package/dist/serve/docs-ui/docs/pyric-cli-vite-reference-api/index.html +0 -126
- package/dist/serve/docs-ui/docs/pyric-database-reference-api/index.html +0 -1852
- package/dist/serve/docs-ui/docs/pyric-messaging-reference-api/index.html +0 -509
- package/dist/serve/docs-ui/docs/pyric-messaging-sw-reference-api/index.html +0 -182
- package/dist/serve/docs-ui/docs/pyric-sandbox-database-reference-api/index.html +0 -121
- package/dist/serve/docs-ui/docs/pyric-sandbox-firestore-reference-api/index.html +0 -203
- package/dist/serve/docs-ui/docs/pyric-ui-agents-reference-api/index.html +0 -639
- package/dist/serve/docs-ui/docs/pyric-ui-auth-hooks-reference-api/index.html +0 -100
- package/dist/serve/docs-ui/docs/pyric-ui-events-hooks-reference-api/index.html +0 -24
- package/dist/serve/docs-ui/docs/pyric-ui-firestore-hooks-reference-api/index.html +0 -136
- package/dist/serve/docs-ui/docs/pyric-ui-rules-hooks-reference-api/index.html +0 -16
- package/dist/serve/docs-ui/docs/pyric-ui-storage-hooks-reference-api/index.html +0 -176
- package/dist/serve/docs-ui/docs/pyric-ui-traffic-hooks-reference-api/index.html +0 -188
- package/dist/serve/docs-ui/docs/secure/audit-your-rules/index.html +0 -51
- package/dist/serve/docs-ui/docs/secure/firestore-rules-limits/index.html +0 -106
- package/dist/serve/docs-ui/docs/secure/read-a-denial/index.html +0 -41
- package/dist/serve/docs-ui/docs/secure/rtdb-rules-in-typescript/index.html +0 -67
- package/dist/serve/docs-ui/docs/secure/rules-standard-library/index.html +0 -159
- package/dist/serve/docs-ui/docs/secure/secure-it-with-rules/index.html +0 -47
- package/dist/serve/docs-ui/docs/secure/simulate-and-lint/index.html +0 -95
- package/dist/serve/docs-ui/docs/secure/write-a-rules-test-suite/index.html +0 -82
- package/dist/serve/docs-ui/docs/ship/ship-to-production/index.html +0 -37
- package/dist/serve/docs-ui/docs/ship/test-in-node/index.html +0 -75
- package/dist/serve/docs-ui/docs/trust/how-we-know-it-matches-firebase/index.html +0 -132
- package/dist/serve/docs-ui/docs/trust/versioning-and-compatibility/index.html +0 -14
- package/dist/serve/docs-ui/index.html +0 -1
- package/dist/serve/studio-ui/assets/RulesCodeEditor-BDlH-5lp.js +0 -23
- package/dist/serve/studio-ui/assets/index-Bf9SSE8L.js +0 -1218
- package/dist/serve/studio-ui/assets/index-BlSGru_r.css +0 -1
- package/dist/serve/studio-ui/assets/seed-D_UjxfOU.js +0 -20
- package/dist/serve/studio-ui/index.html +0 -32
- package/dist/serve/worker/client/rtdb.d.ts +0 -36
- package/dist/serve/worker/client/rtdb.d.ts.map +0 -1
- package/dist/serve/worker/client/rtdb.js +0 -241
- package/dist/serve/worker/client/rtdb.js.map +0 -1
- package/src/serve/worker/client/rtdb.ts +0 -311
- /package/dist/serve/{docs-ui → site-ui}/404.html +0 -0
- /package/dist/serve/{docs-ui → site-ui}/_astro/_slug_.CXh9yTP1.css +0 -0
- /package/dist/serve/{docs-ui → site-ui}/docs/_rhythm.md +0 -0
- /package/dist/serve/{docs-ui → site-ui}/docs/agent/set-up-your-agent.md +0 -0
- /package/dist/serve/{docs-ui → site-ui}/docs/agent/watch-and-review.md +0 -0
- /package/dist/serve/{docs-ui → site-ui}/docs/agent/work-with-an-agent.md +0 -0
- /package/dist/serve/{docs-ui → site-ui}/docs/ai-compat.md +0 -0
- /package/dist/serve/{docs-ui → site-ui}/docs/api-reference.md +0 -0
- /package/dist/serve/{docs-ui → site-ui}/docs/app-compat.md +0 -0
- /package/dist/serve/{docs-ui → site-ui}/docs/auth-compat.md +0 -0
- /package/dist/serve/{docs-ui → site-ui}/docs/build/ai-logic.md +0 -0
- /package/dist/serve/{docs-ui → site-ui}/docs/build/authentication.md +0 -0
- /package/dist/serve/{docs-ui → site-ui}/docs/build/cloud-firestore.md +0 -0
- /package/dist/serve/{docs-ui → site-ui}/docs/build/cloud-messaging.md +0 -0
- /package/dist/serve/{docs-ui → site-ui}/docs/build/realtime-database.md +0 -0
- /package/dist/serve/{docs-ui → site-ui}/docs/create-pyric-reference-api.md +0 -0
- /package/dist/serve/{docs-ui → site-ui}/docs/functions-rtdb-compat.md +0 -0
- /package/dist/serve/{docs-ui → site-ui}/docs/get-started/how-the-swap-works.md +0 -0
- /package/dist/serve/{docs-ui → site-ui}/docs/get-started/start-building.md +0 -0
- /package/dist/serve/{docs-ui → site-ui}/docs/index.html +0 -0
- /package/dist/serve/{docs-ui → site-ui}/docs/observe/resolve-runtime-status.md +0 -0
- /package/dist/serve/{docs-ui → site-ui}/docs/observe/see-whats-happening.md +0 -0
- /package/dist/serve/{docs-ui → site-ui}/docs/observe/shape-your-data.md +0 -0
- /package/dist/serve/{docs-ui → site-ui}/docs/overview.md +0 -0
- /package/dist/serve/{docs-ui → site-ui}/docs/pyric-admin-app-reference-api.md +0 -0
- /package/dist/serve/{docs-ui → site-ui}/docs/pyric-admin-auth-reference-api.md +0 -0
- /package/dist/serve/{docs-ui → site-ui}/docs/pyric-admin-database-reference-api.md +0 -0
- /package/dist/serve/{docs-ui → site-ui}/docs/pyric-admin-messaging-reference-api.md +0 -0
- /package/dist/serve/{docs-ui → site-ui}/docs/pyric-admin-storage-reference-api.md +0 -0
- /package/dist/serve/{docs-ui → site-ui}/docs/pyric-ai-reference-api.md +0 -0
- /package/dist/serve/{docs-ui → site-ui}/docs/pyric-ai-scripting-reference-api.md +0 -0
- /package/dist/serve/{docs-ui → site-ui}/docs/pyric-app-reference-api.md +0 -0
- /package/dist/serve/{docs-ui → site-ui}/docs/pyric-auth-reference-api.md +0 -0
- /package/dist/serve/{docs-ui → site-ui}/docs/pyric-cli-assurance-browser-reference-api.md +0 -0
- /package/dist/serve/{docs-ui → site-ui}/docs/pyric-cli-assurance-reference-api.md +0 -0
- /package/dist/serve/{docs-ui → site-ui}/docs/pyric-cli-bridge-client-reference-api.md +0 -0
- /package/dist/serve/{docs-ui → site-ui}/docs/pyric-cli-bridge-reference-api.md +0 -0
- /package/dist/serve/{docs-ui → site-ui}/docs/pyric-cli-conformance-browser-reference-api.md +0 -0
- /package/dist/serve/{docs-ui → site-ui}/docs/pyric-cli-conformance-docs-reference-api.md +0 -0
- /package/dist/serve/{docs-ui → site-ui}/docs/pyric-cli-conformance-reference-api.md +0 -0
- /package/dist/serve/{docs-ui → site-ui}/docs/pyric-cli-credentials-node-reference-api.md +0 -0
- /package/dist/serve/{docs-ui → site-ui}/docs/pyric-cli-discover-reference-api.md +0 -0
- /package/dist/serve/{docs-ui → site-ui}/docs/pyric-cli-register-reference-api.md +0 -0
- /package/dist/serve/{docs-ui → site-ui}/docs/pyric-cli-remote-reference-api.md +0 -0
- /package/dist/serve/{docs-ui → site-ui}/docs/pyric-cli-verify-reference-api.md +0 -0
- /package/dist/serve/{docs-ui → site-ui}/docs/pyric-messaging-reference-api.md +0 -0
- /package/dist/serve/{docs-ui → site-ui}/docs/pyric-messaging-sw-reference-api.md +0 -0
- /package/dist/serve/{docs-ui → site-ui}/docs/pyric-sandbox-database-reference-api.md +0 -0
- /package/dist/serve/{docs-ui → site-ui}/docs/pyric-sandbox-firestore-reference-api.md +0 -0
- /package/dist/serve/{docs-ui → site-ui}/docs/pyric-ui-agents-reference-api.md +0 -0
- /package/dist/serve/{docs-ui → site-ui}/docs/pyric-ui-auth-hooks-reference-api.md +0 -0
- /package/dist/serve/{docs-ui → site-ui}/docs/pyric-ui-auth-reference-api.md +0 -0
- /package/dist/serve/{docs-ui → site-ui}/docs/pyric-ui-events-hooks-reference-api.md +0 -0
- /package/dist/serve/{docs-ui → site-ui}/docs/pyric-ui-events-reference-api.md +0 -0
- /package/dist/serve/{docs-ui → site-ui}/docs/pyric-ui-firestore-hooks-reference-api.md +0 -0
- /package/dist/serve/{docs-ui → site-ui}/docs/pyric-ui-primitives-reference-api.md +0 -0
- /package/dist/serve/{docs-ui → site-ui}/docs/pyric-ui-rtdb-reference-api.md +0 -0
- /package/dist/serve/{docs-ui → site-ui}/docs/pyric-ui-rules-hooks-reference-api.md +0 -0
- /package/dist/serve/{docs-ui → site-ui}/docs/pyric-ui-rules-reference-api.md +0 -0
- /package/dist/serve/{docs-ui → site-ui}/docs/pyric-ui-storage-hooks-reference-api.md +0 -0
- /package/dist/serve/{docs-ui → site-ui}/docs/pyric-ui-traffic-hooks-reference-api.md +0 -0
- /package/dist/serve/{docs-ui → site-ui}/docs/pyric-ui-traffic-reference-api.md +0 -0
- /package/dist/serve/{docs-ui → site-ui}/docs/secure/audit-your-rules.md +0 -0
- /package/dist/serve/{docs-ui → site-ui}/docs/secure/firestore-rules-limits.md +0 -0
- /package/dist/serve/{docs-ui → site-ui}/docs/secure/read-a-denial.md +0 -0
- /package/dist/serve/{docs-ui → site-ui}/docs/secure/rtdb-rules-in-typescript.md +0 -0
- /package/dist/serve/{docs-ui → site-ui}/docs/secure/secure-it-with-rules.md +0 -0
- /package/dist/serve/{docs-ui → site-ui}/docs/secure/simulate-and-lint.md +0 -0
- /package/dist/serve/{docs-ui → site-ui}/docs/secure/write-a-rules-test-suite.md +0 -0
- /package/dist/serve/{docs-ui → site-ui}/docs/ship/ship-to-production.md +0 -0
- /package/dist/serve/{docs-ui → site-ui}/docs/ship/test-in-node.md +0 -0
- /package/dist/serve/{docs-ui → site-ui}/docs/trust/how-we-know-it-matches-firebase.md +0 -0
- /package/dist/serve/{docs-ui → site-ui}/docs/trust/versioning-and-compatibility.md +0 -0
- /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 {
|
|
14
|
-
import { existsSync,
|
|
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,
|
|
17
|
+
import { bundleSdk, bundleWorker, defaultSdkEntries, resolveSiteUiDir } from '../serve/bundler.js';
|
|
18
18
|
import {
|
|
19
19
|
isStandalone,
|
|
20
|
-
materializeDocsUi,
|
|
21
20
|
materializeServeAssets,
|
|
22
|
-
|
|
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
|
-
|
|
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
|
-
|
|
53
|
-
|
|
54
|
-
|
|
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
|
|
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
|
-
|
|
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
|
|
398
|
-
let docsUiDir: string | undefined;
|
|
263
|
+
let siteUiDir: string | undefined;
|
|
399
264
|
if (opts.ui) {
|
|
400
|
-
|
|
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
|
-
|
|
267
|
+
siteUiDir = dir;
|
|
405
268
|
} else {
|
|
406
269
|
logger.note(
|
|
407
|
-
' ⚠ --ui: built
|
|
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
|
-
|
|
412
|
-
|
|
413
|
-
|
|
414
|
-
|
|
415
|
-
|
|
416
|
-
|
|
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
|
-
|
|
421
|
-
|
|
422
|
-
|
|
423
|
-
|
|
424
|
-
|
|
425
|
-
|
|
426
|
-
|
|
427
|
-
|
|
428
|
-
|
|
429
|
-
|
|
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)) ||
|
|
441
|
-
:
|
|
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
|
-
//
|
|
456
|
-
//
|
|
457
|
-
|
|
458
|
-
|
|
459
|
-
|
|
460
|
-
|
|
461
|
-
|
|
462
|
-
|
|
463
|
-
|
|
464
|
-
|
|
465
|
-
|
|
466
|
-
|
|
467
|
-
|
|
468
|
-
|
|
469
|
-
|
|
470
|
-
|
|
471
|
-
|
|
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
|
-
|
|
481
|
-
const
|
|
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
|
-
|
|
484
|
-
|
|
485
|
-
(
|
|
486
|
-
|
|
487
|
-
|
|
488
|
-
|
|
489
|
-
|
|
490
|
-
|
|
491
|
-
|
|
492
|
-
|
|
493
|
-
|
|
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
|
-
|
|
509
|
-
? `✔ rules ${
|
|
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
|
-
|
|
514
|
-
? `✔ rules ${
|
|
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
|
-
|
|
519
|
-
? `✔ rules ${
|
|
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
|
-
|
|
534
|
-
|
|
535
|
-
|
|
536
|
-
|
|
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
|
-
|
|
541
|
-
? `✔ persist ${
|
|
542
|
-
: `✔ persist new state file at ${
|
|
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(
|
|
455
|
+
if (existsSync(persistence.backupPath)) {
|
|
545
456
|
logger.note(
|
|
546
|
-
` ⓘ a recovery backup exists at ${
|
|
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 (
|
|
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 (
|
|
566
|
-
logger.info(`✔ capture session → ${
|
|
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 ${
|
|
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
|
|
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
|
|
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
|
|
789
|
-
|
|
790
|
-
|
|
791
|
-
|
|
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
|
-
|
|
798
|
-
|
|
799
|
-
|
|
800
|
-
|
|
801
|
-
|
|
802
|
-
|
|
803
|
-
|
|
804
|
-
|
|
805
|
-
|
|
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
|
|
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
|
|
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 (
|
|
931
|
-
void
|
|
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);
|