@pyric/cli 0.1.0-alpha.19 → 0.1.0-alpha.21
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/README.md +64 -89
- package/dist/assurance/.generated/conformance-verdicts.d.ts +68 -1
- package/dist/assurance/.generated/conformance-verdicts.d.ts.map +1 -1
- package/dist/assurance/.generated/conformance-verdicts.js +68 -1
- package/dist/assurance/.generated/conformance-verdicts.js.map +1 -1
- package/dist/bridge/client/dispatch.d.ts +25 -19
- package/dist/bridge/client/dispatch.d.ts.map +1 -1
- package/dist/bridge/client/dispatch.js +41 -48
- package/dist/bridge/client/dispatch.js.map +1 -1
- package/dist/bridge/client/tool-family-factories.d.ts +26 -0
- package/dist/bridge/client/tool-family-factories.d.ts.map +1 -0
- package/dist/bridge/client/tool-family-factories.js +10 -0
- package/dist/bridge/client/tool-family-factories.js.map +1 -0
- package/dist/bridge/server/mcp-contract.d.ts +7 -6
- package/dist/bridge/server/mcp-contract.d.ts.map +1 -1
- package/dist/bridge/server/mcp-contract.js +9 -48
- package/dist/bridge/server/mcp-contract.js.map +1 -1
- package/dist/bridge/server/peer.d.ts +11 -1
- package/dist/bridge/server/peer.d.ts.map +1 -1
- package/dist/bridge/server/peer.js +22 -1
- package/dist/bridge/server/peer.js.map +1 -1
- package/dist/bridge/server/tool-family-factories.d.ts +30 -0
- package/dist/bridge/server/tool-family-factories.d.ts.map +1 -0
- package/dist/bridge/server/tool-family-factories.js +22 -0
- package/dist/bridge/server/tool-family-factories.js.map +1 -0
- package/dist/bridge/server/tool-metadata.d.ts +17 -18
- package/dist/bridge/server/tool-metadata.d.ts.map +1 -1
- package/dist/bridge/server/tool-metadata.js +24 -59
- package/dist/bridge/server/tool-metadata.js.map +1 -1
- package/dist/bridge/tool-families.d.ts +48 -0
- package/dist/bridge/tool-families.d.ts.map +1 -0
- package/dist/bridge/tool-families.generated.d.ts +32 -0
- package/dist/bridge/tool-families.generated.d.ts.map +1 -0
- package/dist/bridge/tool-families.generated.js +15 -0
- package/dist/bridge/tool-families.generated.js.map +1 -0
- package/dist/bridge/tool-families.js +51 -0
- package/dist/bridge/tool-families.js.map +1 -0
- package/dist/bridge/tool-family-records/conformance.d.ts +7 -0
- package/dist/bridge/tool-family-records/conformance.d.ts.map +1 -0
- package/dist/bridge/tool-family-records/conformance.js +6 -0
- package/dist/bridge/tool-family-records/conformance.js.map +1 -0
- package/dist/bridge/tool-family-records/firestore-data.d.ts +7 -0
- package/dist/bridge/tool-family-records/firestore-data.d.ts.map +1 -0
- package/dist/bridge/tool-family-records/firestore-data.js +15 -0
- package/dist/bridge/tool-family-records/firestore-data.js.map +1 -0
- package/dist/bridge/tool-family-records/firestore-inspect.d.ts +7 -0
- package/dist/bridge/tool-family-records/firestore-inspect.d.ts.map +1 -0
- package/dist/bridge/tool-family-records/firestore-inspect.js +6 -0
- package/dist/bridge/tool-family-records/firestore-inspect.js.map +1 -0
- package/dist/bridge/tool-family-records/firestore-rules.d.ts +7 -0
- package/dist/bridge/tool-family-records/firestore-rules.d.ts.map +1 -0
- package/dist/bridge/tool-family-records/firestore-rules.js +15 -0
- package/dist/bridge/tool-family-records/firestore-rules.js.map +1 -0
- package/dist/bridge/tool-family-records/firestore-simulator.d.ts +7 -0
- package/dist/bridge/tool-family-records/firestore-simulator.d.ts.map +1 -0
- package/dist/bridge/tool-family-records/firestore-simulator.js +16 -0
- package/dist/bridge/tool-family-records/firestore-simulator.js.map +1 -0
- package/dist/bridge/tool-family-records/rtdb-inspection.d.ts +7 -0
- package/dist/bridge/tool-family-records/rtdb-inspection.d.ts.map +1 -0
- package/dist/bridge/tool-family-records/rtdb-inspection.js +6 -0
- package/dist/bridge/tool-family-records/rtdb-inspection.js.map +1 -0
- package/dist/bundler/externals.d.ts +37 -0
- package/dist/bundler/externals.d.ts.map +1 -0
- package/dist/bundler/externals.js +52 -0
- package/dist/bundler/externals.js.map +1 -0
- package/dist/bundler/index.d.ts +17 -0
- package/dist/bundler/index.d.ts.map +1 -0
- package/dist/bundler/index.js +17 -0
- package/dist/bundler/index.js.map +1 -0
- package/dist/cli/index.d.ts +2 -2
- package/dist/cli/index.d.ts.map +1 -1
- package/dist/cli/index.js +48 -42
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/inlined-sdk-scanner.d.ts +6 -0
- package/dist/cli/inlined-sdk-scanner.d.ts.map +1 -0
- package/dist/cli/inlined-sdk-scanner.js +82 -0
- package/dist/cli/inlined-sdk-scanner.js.map +1 -0
- package/dist/cli/mcp-proxy.js +3 -3
- package/dist/cli/mcp-proxy.js.map +1 -1
- package/dist/cli/parse-args.d.ts +1 -1
- package/dist/cli/parse-args.d.ts.map +1 -1
- package/dist/cli/parse-args.js +51 -15
- package/dist/cli/parse-args.js.map +1 -1
- package/dist/cli/pyric-config.d.ts +24 -0
- package/dist/cli/pyric-config.d.ts.map +1 -0
- package/dist/cli/pyric-config.js +28 -0
- package/dist/cli/pyric-config.js.map +1 -0
- package/dist/cli/sandbox-interlock.d.ts +97 -0
- package/dist/cli/sandbox-interlock.d.ts.map +1 -0
- package/dist/cli/sandbox-interlock.js +112 -0
- package/dist/cli/sandbox-interlock.js.map +1 -0
- package/dist/cli/{dev-runner.d.ts → sandbox-runner.d.ts} +53 -48
- package/dist/cli/sandbox-runner.d.ts.map +1 -0
- package/dist/cli/{dev-runner.js → sandbox-runner.js} +105 -67
- package/dist/cli/sandbox-runner.js.map +1 -0
- package/dist/cli/serve.d.ts +12 -14
- package/dist/cli/serve.d.ts.map +1 -1
- package/dist/cli/serve.js +155 -116
- package/dist/cli/serve.js.map +1 -1
- package/dist/cli/snapshot.js +5 -5
- package/dist/cli/snapshot.js.map +1 -1
- package/dist/cli/unsupported-runtime.d.ts +27 -0
- package/dist/cli/unsupported-runtime.d.ts.map +1 -0
- package/dist/cli/unsupported-runtime.js +63 -0
- package/dist/cli/unsupported-runtime.js.map +1 -0
- package/dist/cli/verify.js +1 -1
- package/dist/cli/verify.js.map +1 -1
- package/dist/conformance/.generated/can-i-use-browser.d.ts +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 +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/child.d.ts +37 -0
- package/dist/functions-rtdb/child.d.ts.map +1 -1
- package/dist/functions-rtdb/child.js +90 -21
- package/dist/functions-rtdb/child.js.map +1 -1
- package/dist/functions-rtdb/development-runtime.d.ts +3 -0
- package/dist/functions-rtdb/development-runtime.d.ts.map +1 -1
- package/dist/functions-rtdb/development-runtime.js +2 -1
- package/dist/functions-rtdb/development-runtime.js.map +1 -1
- package/dist/functions-rtdb/project.js +8 -8
- package/dist/functions-rtdb/project.js.map +1 -1
- package/dist/google-endpoints.d.ts +67 -0
- package/dist/google-endpoints.d.ts.map +1 -0
- package/dist/google-endpoints.js +119 -0
- package/dist/google-endpoints.js.map +1 -0
- package/dist/next/guard.js +1 -1
- package/dist/next/guard.js.map +1 -1
- package/dist/next/runtime-env.d.ts.map +1 -1
- package/dist/next/runtime-env.js +5 -0
- package/dist/next/runtime-env.js.map +1 -1
- package/dist/next/with-pyric.d.ts +1 -1
- package/dist/next/with-pyric.js +1 -1
- package/dist/register/beacon.d.ts +69 -0
- package/dist/register/beacon.d.ts.map +1 -0
- package/dist/register/beacon.js +199 -0
- package/dist/register/beacon.js.map +1 -0
- package/dist/register/index.d.ts.map +1 -1
- package/dist/register/index.js +65 -6
- package/dist/register/index.js.map +1 -1
- package/dist/register/net-guard.d.ts +110 -0
- package/dist/register/net-guard.d.ts.map +1 -0
- package/dist/register/net-guard.js +462 -0
- package/dist/register/net-guard.js.map +1 -0
- package/dist/remote/index.d.ts +1 -1
- package/dist/remote/index.js +9 -9
- package/dist/remote/index.js.map +1 -1
- package/dist/serve/ai-diagnostics-relay.d.ts +63 -0
- package/dist/serve/ai-diagnostics-relay.d.ts.map +1 -0
- package/dist/serve/ai-diagnostics-relay.js +125 -0
- package/dist/serve/ai-diagnostics-relay.js.map +1 -0
- package/dist/serve/ai-proxy.d.ts +92 -0
- package/dist/serve/ai-proxy.d.ts.map +1 -0
- package/dist/serve/ai-proxy.js +269 -0
- package/dist/serve/ai-proxy.js.map +1 -0
- package/dist/serve/ai-status.d.ts +44 -0
- package/dist/serve/ai-status.d.ts.map +1 -0
- package/dist/serve/ai-status.js +77 -0
- package/dist/serve/ai-status.js.map +1 -0
- package/dist/serve/ai-terminal-blocks.d.ts +97 -0
- package/dist/serve/ai-terminal-blocks.d.ts.map +1 -0
- package/dist/serve/ai-terminal-blocks.js +128 -0
- package/dist/serve/ai-terminal-blocks.js.map +1 -0
- package/dist/serve/ai-terminal-text.d.ts +36 -0
- package/dist/serve/ai-terminal-text.d.ts.map +1 -0
- package/dist/serve/ai-terminal-text.js +48 -0
- package/dist/serve/ai-terminal-text.js.map +1 -0
- package/dist/serve/beacon-route.d.ts +53 -0
- package/dist/serve/beacon-route.d.ts.map +1 -0
- package/dist/serve/beacon-route.js +101 -0
- package/dist/serve/beacon-route.js.map +1 -0
- package/dist/serve/bundler.js +10 -10
- package/dist/serve/bundler.js.map +1 -1
- package/dist/serve/entries/active-auth-registry.d.ts +16 -0
- package/dist/serve/entries/active-auth-registry.d.ts.map +1 -0
- package/dist/serve/entries/active-auth-registry.js +48 -0
- package/dist/serve/entries/active-auth-registry.js.map +1 -0
- package/dist/serve/entries/active-auth.d.ts +18 -0
- package/dist/serve/entries/active-auth.d.ts.map +1 -0
- package/dist/serve/entries/active-auth.js +84 -0
- package/dist/serve/entries/active-auth.js.map +1 -0
- package/dist/serve/entries/ai.d.ts.map +1 -1
- package/dist/serve/entries/ai.js +27 -1
- package/dist/serve/entries/ai.js.map +1 -1
- package/dist/serve/entries/auth-helper-core.d.ts +1 -0
- package/dist/serve/entries/auth-helper-core.d.ts.map +1 -1
- package/dist/serve/entries/auth-helper-core.js +4 -0
- package/dist/serve/entries/auth-helper-core.js.map +1 -1
- package/dist/serve/entries/auth-helper-dom.d.ts.map +1 -1
- package/dist/serve/entries/auth-helper-dom.js +29 -3
- package/dist/serve/entries/auth-helper-dom.js.map +1 -1
- package/dist/serve/entries/auth-helper-runtime.js +1 -1
- package/dist/serve/entries/auth-helper-runtime.js.map +1 -1
- package/dist/serve/entries/auth.d.ts.map +1 -1
- package/dist/serve/entries/auth.js +8 -0
- package/dist/serve/entries/auth.js.map +1 -1
- package/dist/serve/entries/bridge-url.d.ts +1 -1
- package/dist/serve/entries/bridge-url.js +1 -1
- package/dist/serve/entries/firestore.js +3 -3
- package/dist/serve/entries/firestore.js.map +1 -1
- package/dist/serve/entries/init.d.ts.map +1 -1
- package/dist/serve/entries/init.js +70 -4
- package/dist/serve/entries/init.js.map +1 -1
- package/dist/serve/entries/keepalive.js +1 -1
- package/dist/serve/entries/keepalive.js.map +1 -1
- package/dist/serve/entries/runtime.d.ts.map +1 -1
- package/dist/serve/entries/runtime.js +30 -14
- package/dist/serve/entries/runtime.js.map +1 -1
- package/dist/serve/entries/storage.js +1 -1
- package/dist/serve/entries/storage.js.map +1 -1
- package/dist/serve/entries/worker-runtime.js +1 -1
- package/dist/serve/entries/worker-runtime.js.map +1 -1
- package/dist/serve/init-payload.d.ts +4 -0
- package/dist/serve/init-payload.d.ts.map +1 -1
- package/dist/serve/namespace.d.ts +20 -5
- package/dist/serve/namespace.d.ts.map +1 -1
- package/dist/serve/namespace.js +93 -129
- package/dist/serve/namespace.js.map +1 -1
- package/dist/serve/rules.d.ts.map +1 -1
- package/dist/serve/rules.js +44 -21
- package/dist/serve/rules.js.map +1 -1
- package/dist/serve/runtime/chip-config.d.ts.map +1 -1
- package/dist/serve/runtime/chip-config.js +16 -2
- package/dist/serve/runtime/chip-config.js.map +1 -1
- package/dist/serve/runtime/chip-dialog.d.ts +18 -0
- package/dist/serve/runtime/chip-dialog.d.ts.map +1 -0
- package/dist/serve/runtime/chip-dialog.js +315 -0
- package/dist/serve/runtime/chip-dialog.js.map +1 -0
- package/dist/serve/runtime/chip-install.d.ts +2 -0
- package/dist/serve/runtime/chip-install.d.ts.map +1 -1
- package/dist/serve/runtime/chip-install.js +9 -4
- package/dist/serve/runtime/chip-install.js.map +1 -1
- package/dist/serve/runtime/chip-user-search.d.ts +16 -0
- package/dist/serve/runtime/chip-user-search.d.ts.map +1 -0
- package/dist/serve/runtime/chip-user-search.js +354 -0
- package/dist/serve/runtime/chip-user-search.js.map +1 -0
- package/dist/serve/runtime/chip.d.ts +10 -0
- package/dist/serve/runtime/chip.d.ts.map +1 -1
- package/dist/serve/runtime/chip.js +149 -15
- package/dist/serve/runtime/chip.js.map +1 -1
- package/dist/serve/runtime/identity.d.ts +17 -0
- package/dist/serve/runtime/identity.d.ts.map +1 -0
- package/dist/serve/runtime/identity.js +10 -0
- package/dist/serve/runtime/identity.js.map +1 -0
- package/dist/serve/runtime/manifest.d.ts +1 -1
- package/dist/serve/runtime/manifest.d.ts.map +1 -1
- package/dist/serve/runtime/manifest.js +1 -1
- package/dist/serve/runtime/manifest.js.map +1 -1
- package/dist/serve/runtime/status.d.ts.map +1 -1
- package/dist/serve/runtime/status.js +23 -0
- package/dist/serve/runtime/status.js.map +1 -1
- package/dist/serve/sandbox-session.d.ts +8 -0
- package/dist/serve/sandbox-session.d.ts.map +1 -1
- package/dist/serve/sandbox-session.js +12 -4
- package/dist/serve/sandbox-session.js.map +1 -1
- package/dist/serve/server.d.ts +7 -0
- package/dist/serve/server.d.ts.map +1 -1
- package/dist/serve/server.js +15 -1
- package/dist/serve/server.js.map +1 -1
- package/dist/serve/site-ui/404.html +1 -1
- package/dist/serve/site-ui/_astro/{RulesCodeEditor.Bl-XMkhD.js → RulesCodeEditor.DsTAsKIa.js} +1 -1
- package/dist/serve/site-ui/_astro/_slug_.Da5VLhW1.css +1 -0
- package/dist/serve/site-ui/_astro/_studio_.BnfYCKoI.css +1 -0
- package/dist/serve/site-ui/_astro/app.BOr2kwae.js +115 -0
- package/dist/serve/site-ui/_astro/app.DhAcImFD.js +1 -0
- package/dist/serve/site-ui/_astro/app.pMSnN6Qw.css +1 -0
- package/dist/serve/site-ui/_astro/{chess-showcase.Dh5D8kqe.js → chess-showcase.Bn_pP6UJ.js} +2 -2
- package/dist/serve/site-ui/_astro/{example-runtime.CuyAjjiG.js → example-runtime.CXopTGv7.js} +1 -1
- package/dist/serve/site-ui/_astro/index.Tb-31efc.css +1 -0
- package/dist/serve/site-ui/_astro/index.UkCBr-_0.css +1 -0
- package/dist/serve/site-ui/_astro/sandbox-controls.rOuZTOUG.js +510 -0
- package/dist/serve/site-ui/_astro/{seed.CSUkloMi.js → seed.03a08f9t.js} +2 -2
- package/dist/serve/site-ui/_astro/writes.BsPBG3dp.js +653 -0
- package/dist/serve/site-ui/auth/index.html +5 -3
- package/dist/serve/site-ui/david-east.jpg +0 -0
- package/dist/serve/site-ui/docs/_rhythm/index.html +6 -3
- package/dist/serve/site-ui/docs/_rhythm.md +1 -1
- package/dist/serve/site-ui/docs/agent/set-up-your-agent/index.html +18 -15
- package/dist/serve/site-ui/docs/agent/set-up-your-agent.md +16 -16
- package/dist/serve/site-ui/docs/agent/watch-and-review/index.html +6 -5
- package/dist/serve/site-ui/docs/agent/watch-and-review.md +1 -5
- package/dist/serve/site-ui/docs/agent/work-with-an-agent/index.html +8 -5
- package/dist/serve/site-ui/docs/agent/work-with-an-agent.md +4 -4
- package/dist/serve/site-ui/docs/ai-compat/index.html +5 -2
- package/dist/serve/site-ui/docs/api-reference/index.html +13 -2
- package/dist/serve/site-ui/docs/api-reference.md +8 -0
- package/dist/serve/site-ui/docs/app-compat/index.html +5 -2
- package/dist/serve/site-ui/docs/auth-compat/index.html +7 -4
- package/dist/serve/site-ui/docs/auth-compat.md +2 -2
- package/dist/serve/site-ui/docs/build/ai-logic/index.html +10 -2
- package/dist/serve/site-ui/docs/build/ai-logic.md +6 -0
- package/dist/serve/site-ui/docs/build/authentication/index.html +7 -4
- package/dist/serve/site-ui/docs/build/authentication.md +2 -2
- package/dist/serve/site-ui/docs/build/cloud-firestore/index.html +5 -2
- package/dist/serve/site-ui/docs/build/cloud-messaging/index.html +5 -2
- package/dist/serve/site-ui/docs/build/cloud-storage/index.html +6 -3
- package/dist/serve/site-ui/docs/build/cloud-storage.md +1 -1
- package/dist/serve/site-ui/docs/build/realtime-database/index.html +9 -6
- package/dist/serve/site-ui/docs/build/realtime-database.md +4 -4
- package/dist/serve/site-ui/docs/conformance-scores/index.html +10 -3
- package/dist/serve/site-ui/docs/conformance-scores.md +5 -1
- package/dist/serve/site-ui/docs/create-pyric-reference-api/index.html +6 -3
- package/dist/serve/site-ui/docs/create-pyric-reference-api.md +1 -1
- package/dist/serve/site-ui/docs/database-compat/index.html +48 -45
- package/dist/serve/site-ui/docs/database-compat.md +43 -43
- package/dist/serve/site-ui/docs/examples/chess/index.html +5 -2
- package/dist/serve/site-ui/docs/examples/index.html +5 -2
- package/dist/serve/site-ui/docs/firestore-compat/index.html +8 -5
- package/dist/serve/site-ui/docs/firestore-compat.md +3 -3
- package/dist/serve/site-ui/docs/firestore-flutter-compat/index.html +319 -0
- package/dist/serve/site-ui/docs/firestore-flutter-compat.md +344 -0
- package/dist/serve/site-ui/docs/functions-rtdb-compat/index.html +5 -2
- package/dist/serve/site-ui/docs/get-started/backend-bundlers/index.html +105 -0
- package/dist/serve/site-ui/docs/get-started/backend-bundlers.md +165 -0
- package/dist/serve/site-ui/docs/get-started/how-the-swap-works/index.html +9 -6
- package/dist/serve/site-ui/docs/get-started/how-the-swap-works.md +5 -5
- package/dist/serve/site-ui/docs/get-started/nextjs/index.html +9 -6
- package/dist/serve/site-ui/docs/get-started/nextjs.md +4 -4
- package/dist/serve/site-ui/docs/get-started/start-building/index.html +14 -9
- package/dist/serve/site-ui/docs/get-started/start-building.md +16 -10
- package/dist/serve/site-ui/docs/get-started/vite/index.html +6 -3
- package/dist/serve/site-ui/docs/get-started/vite.md +1 -1
- package/dist/serve/site-ui/docs/index.json +3128 -1613
- package/dist/serve/site-ui/docs/messaging-compat/index.html +5 -2
- package/dist/serve/site-ui/docs/observe/resolve-runtime-status/index.html +5 -2
- package/dist/serve/site-ui/docs/observe/see-whats-happening/index.html +6 -4
- package/dist/serve/site-ui/docs/observe/see-whats-happening.md +2 -4
- package/dist/serve/site-ui/docs/observe/shape-your-data/index.html +9 -6
- package/dist/serve/site-ui/docs/observe/shape-your-data.md +4 -4
- package/dist/serve/site-ui/docs/overview/index.html +16 -10
- package/dist/serve/site-ui/docs/overview.md +19 -11
- package/dist/serve/site-ui/docs/pyric-admin-app-reference-api/index.html +5 -2
- package/dist/serve/site-ui/docs/pyric-admin-auth-reference-api/index.html +5 -2
- package/dist/serve/site-ui/docs/pyric-admin-database-reference-api/index.html +5 -2
- package/dist/serve/site-ui/docs/pyric-admin-firestore-reference-api/index.html +8 -5
- package/dist/serve/site-ui/docs/pyric-admin-firestore-reference-api.md +3 -3
- package/dist/serve/site-ui/docs/pyric-admin-messaging-reference-api/index.html +5 -2
- package/dist/serve/site-ui/docs/pyric-admin-reference-api/index.html +501 -0
- package/dist/serve/site-ui/docs/pyric-admin-reference-api.md +587 -0
- package/dist/serve/site-ui/docs/pyric-admin-storage-reference-api/index.html +5 -2
- package/dist/serve/site-ui/docs/pyric-ai-reference-api/index.html +5 -2
- package/dist/serve/site-ui/docs/pyric-ai-scripting-reference-api/index.html +5 -2
- package/dist/serve/site-ui/docs/pyric-analytics-reference-api/index.html +124 -0
- package/dist/serve/site-ui/docs/pyric-analytics-reference-api.md +287 -0
- package/dist/serve/site-ui/docs/pyric-app-check-reference-api/index.html +87 -0
- package/dist/serve/site-ui/docs/pyric-app-check-reference-api.md +199 -0
- package/dist/serve/site-ui/docs/pyric-app-reference-api/index.html +5 -2
- package/dist/serve/site-ui/docs/pyric-auth-reference-api/index.html +10 -3
- package/dist/serve/site-ui/docs/pyric-auth-reference-api.md +2 -1
- package/dist/serve/site-ui/docs/pyric-cli-assurance-browser-reference-api/index.html +5 -2
- package/dist/serve/site-ui/docs/pyric-cli-assurance-reference-api/index.html +5 -2
- package/dist/serve/site-ui/docs/pyric-cli-bridge-client-reference-api/index.html +6 -3
- package/dist/serve/site-ui/docs/pyric-cli-bridge-client-reference-api.md +1 -1
- package/dist/serve/site-ui/docs/pyric-cli-bridge-reference-api/index.html +5 -2
- package/dist/serve/site-ui/docs/pyric-cli-bundler-reference-api/index.html +56 -0
- package/dist/serve/site-ui/docs/pyric-cli-bundler-reference-api.md +72 -0
- package/dist/serve/site-ui/docs/pyric-cli-conformance-browser-reference-api/index.html +6 -2
- package/dist/serve/site-ui/docs/pyric-cli-conformance-browser-reference-api.md +1 -0
- package/dist/serve/site-ui/docs/pyric-cli-conformance-docs-reference-api/index.html +5 -2
- package/dist/serve/site-ui/docs/pyric-cli-conformance-reference-api/index.html +6 -2
- package/dist/serve/site-ui/docs/pyric-cli-conformance-reference-api.md +1 -0
- package/dist/serve/site-ui/docs/pyric-cli-credentials-node-reference-api/index.html +5 -2
- package/dist/serve/site-ui/docs/pyric-cli-discover-reference-api/index.html +5 -2
- package/dist/serve/site-ui/docs/pyric-cli-next-reference-api/index.html +6 -3
- package/dist/serve/site-ui/docs/pyric-cli-next-reference-api.md +1 -1
- package/dist/serve/site-ui/docs/pyric-cli-register-app-bridge-reference-api/index.html +5 -2
- package/dist/serve/site-ui/docs/pyric-cli-register-reference-api/index.html +5 -2
- package/dist/serve/site-ui/docs/pyric-cli-remote-reference-api/index.html +39 -11
- package/dist/serve/site-ui/docs/pyric-cli-remote-reference-api.md +17 -9
- package/dist/serve/site-ui/docs/pyric-cli-serve-worker-reference-api/index.html +137 -94
- package/dist/serve/site-ui/docs/pyric-cli-serve-worker-reference-api.md +61 -1
- package/dist/serve/site-ui/docs/pyric-cli-verify-reference-api/index.html +6 -3
- package/dist/serve/site-ui/docs/pyric-cli-verify-reference-api.md +1 -1
- package/dist/serve/site-ui/docs/pyric-cli-vite-reference-api/index.html +6 -3
- package/dist/serve/site-ui/docs/pyric-cli-vite-reference-api.md +2 -2
- package/dist/serve/site-ui/docs/pyric-database-reference-api/index.html +167 -96
- package/dist/serve/site-ui/docs/pyric-database-reference-api.md +108 -2
- package/dist/serve/site-ui/docs/pyric-firestore-lite-reference-api/index.html +559 -0
- package/dist/serve/site-ui/docs/pyric-firestore-lite-reference-api.md +1240 -0
- package/dist/serve/site-ui/docs/pyric-firestore-reference-api/index.html +44 -12
- package/dist/serve/site-ui/docs/pyric-firestore-reference-api.md +18 -8
- package/dist/serve/site-ui/docs/pyric-functions-reference-api/index.html +67 -0
- package/dist/serve/site-ui/docs/pyric-functions-reference-api.md +149 -0
- package/dist/serve/site-ui/docs/pyric-messaging-reference-api/index.html +10 -4
- package/dist/serve/site-ui/docs/pyric-messaging-reference-api.md +5 -2
- package/dist/serve/site-ui/docs/pyric-messaging-sw-reference-api/index.html +10 -4
- package/dist/serve/site-ui/docs/pyric-messaging-sw-reference-api.md +5 -2
- package/dist/serve/site-ui/docs/pyric-performance-reference-api/index.html +35 -0
- package/dist/serve/site-ui/docs/pyric-performance-reference-api.md +69 -0
- package/dist/serve/site-ui/docs/pyric-remote-config-reference-api/index.html +132 -0
- package/dist/serve/site-ui/docs/pyric-remote-config-reference-api.md +307 -0
- package/dist/serve/site-ui/docs/pyric-rules-reference-api/index.html +5 -2
- package/dist/serve/site-ui/docs/pyric-sandbox-database-reference-api/index.html +56 -18
- package/dist/serve/site-ui/docs/pyric-sandbox-database-reference-api.md +48 -9
- package/dist/serve/site-ui/docs/pyric-sandbox-firestore-reference-api/index.html +6 -3
- package/dist/serve/site-ui/docs/pyric-sandbox-firestore-reference-api.md +2 -2
- package/dist/serve/site-ui/docs/pyric-sandbox-reference-api/index.html +243 -50
- package/dist/serve/site-ui/docs/pyric-sandbox-reference-api.md +148 -31
- package/dist/serve/site-ui/docs/pyric-storage-reference-api/index.html +26 -5
- package/dist/serve/site-ui/docs/pyric-storage-reference-api.md +24 -2
- package/dist/serve/site-ui/docs/pyric-ui-agents-reference-api/index.html +30 -97
- package/dist/serve/site-ui/docs/pyric-ui-agents-reference-api.md +20 -51
- package/dist/serve/site-ui/docs/pyric-ui-auth-hooks-reference-api/index.html +5 -2
- package/dist/serve/site-ui/docs/pyric-ui-auth-reference-api/index.html +6 -3
- package/dist/serve/site-ui/docs/pyric-ui-auth-reference-api.md +1 -1
- package/dist/serve/site-ui/docs/pyric-ui-events-hooks-reference-api/index.html +5 -2
- package/dist/serve/site-ui/docs/pyric-ui-events-reference-api/index.html +5 -2
- package/dist/serve/site-ui/docs/pyric-ui-firestore-hooks-reference-api/index.html +5 -2
- package/dist/serve/site-ui/docs/pyric-ui-firestore-reference-api/index.html +6 -3
- package/dist/serve/site-ui/docs/pyric-ui-firestore-reference-api.md +1 -1
- package/dist/serve/site-ui/docs/pyric-ui-primitives-reference-api/index.html +128 -27
- package/dist/serve/site-ui/docs/pyric-ui-primitives-reference-api.md +58 -5
- package/dist/serve/site-ui/docs/pyric-ui-rtdb-reference-api/index.html +5 -2
- package/dist/serve/site-ui/docs/pyric-ui-rules-hooks-reference-api/index.html +5 -2
- package/dist/serve/site-ui/docs/pyric-ui-rules-reference-api/index.html +5 -2
- package/dist/serve/site-ui/docs/pyric-ui-storage-hooks-reference-api/index.html +5 -2
- package/dist/serve/site-ui/docs/pyric-ui-storage-reference-api/index.html +8 -6
- package/dist/serve/site-ui/docs/pyric-ui-storage-reference-api.md +3 -4
- package/dist/serve/site-ui/docs/pyric-ui-traffic-hooks-reference-api/index.html +5 -2
- package/dist/serve/site-ui/docs/pyric-ui-traffic-reference-api/index.html +5 -2
- package/dist/serve/site-ui/docs/reference/cli/index.html +156 -0
- package/dist/serve/site-ui/docs/reference/cli.md +120 -0
- package/dist/serve/site-ui/docs/rules-compat/index.html +14 -3
- package/dist/serve/site-ui/docs/rules-compat.md +9 -1
- package/dist/serve/site-ui/docs/secure/audit-your-rules/index.html +5 -2
- package/dist/serve/site-ui/docs/secure/firestore-rules-limits/index.html +5 -2
- package/dist/serve/site-ui/docs/secure/read-a-denial/index.html +6 -3
- package/dist/serve/site-ui/docs/secure/read-a-denial.md +1 -1
- package/dist/serve/site-ui/docs/secure/rtdb-rules-in-typescript/index.html +5 -2
- package/dist/serve/site-ui/docs/secure/rules-standard-library/index.html +5 -2
- package/dist/serve/site-ui/docs/secure/secure-it-with-rules/index.html +5 -2
- package/dist/serve/site-ui/docs/secure/simulate-and-lint/index.html +5 -2
- package/dist/serve/site-ui/docs/secure/write-a-rules-test-suite/index.html +5 -2
- package/dist/serve/site-ui/docs/ship/ship-to-production/index.html +7 -4
- package/dist/serve/site-ui/docs/ship/ship-to-production.md +2 -2
- package/dist/serve/site-ui/docs/ship/test-in-node/index.html +9 -6
- package/dist/serve/site-ui/docs/ship/test-in-node.md +4 -4
- package/dist/serve/site-ui/docs/storage-compat/index.html +17 -14
- package/dist/serve/site-ui/docs/storage-compat.md +12 -12
- package/dist/serve/site-ui/docs/trust/how-we-know-it-matches-firebase/index.html +5 -2
- package/dist/serve/site-ui/docs/trust/rules-standard-library/index.html +5 -2
- package/dist/serve/site-ui/docs/trust/versioning-and-compatibility/index.html +5 -2
- package/dist/serve/site-ui/docs/tutorial/index.html +10 -7
- package/dist/serve/site-ui/docs/tutorial.md +4 -4
- package/dist/serve/site-ui/examples/chess/index.html +4 -2
- package/dist/serve/site-ui/firestore/index.html +5 -3
- package/dist/serve/site-ui/hero-charcoal.jpg +0 -0
- package/dist/serve/site-ui/index.html +9 -7
- package/dist/serve/site-ui/llms.txt +13 -3
- package/dist/serve/site-ui/pyric-campfire-full.png +0 -0
- package/dist/serve/site-ui/pyric-campfire.png +0 -0
- package/dist/serve/site-ui/rtdb/index.html +5 -3
- package/dist/serve/site-ui/settings/index.html +5 -3
- package/dist/serve/site-ui/storage/index.html +5 -3
- package/dist/serve/site-ui/studio/index.html +13 -0
- package/dist/serve/site-ui/studio-routes.json +1 -1
- package/dist/serve/site-ui/traffic/index.html +5 -3
- package/dist/serve/studio/disk-workspace.d.ts.map +1 -1
- package/dist/serve/studio/disk-workspace.js +64 -2
- package/dist/serve/studio/disk-workspace.js.map +1 -1
- package/dist/serve/studio/routes.d.ts +9 -0
- package/dist/serve/studio/routes.d.ts.map +1 -1
- package/dist/serve/studio/routes.js +47 -7
- package/dist/serve/studio/routes.js.map +1 -1
- package/dist/serve/vite-ai-config.d.ts.map +1 -1
- package/dist/serve/vite-ai-config.js +38 -8
- package/dist/serve/vite-ai-config.js.map +1 -1
- package/dist/serve/vite-module-swap.d.ts.map +1 -1
- package/dist/serve/vite-module-swap.js +0 -28
- package/dist/serve/vite-module-swap.js.map +1 -1
- package/dist/serve/vite-plugin.d.ts +7 -7
- package/dist/serve/vite-plugin.js +1 -1
- package/dist/serve/vite-plugin.js.map +1 -1
- package/dist/serve/vite-sandbox-generation.d.ts +1 -1
- package/dist/serve/vite-sandbox-generation.d.ts.map +1 -1
- package/dist/serve/vite-sandbox-generation.js +13 -1
- package/dist/serve/vite-sandbox-generation.js.map +1 -1
- package/dist/serve/worker/client/auth.js +1 -2
- package/dist/serve/worker/client/auth.js.map +1 -1
- package/dist/serve/worker/client/core.d.ts +21 -1
- package/dist/serve/worker/client/core.d.ts.map +1 -1
- package/dist/serve/worker/client/core.js +79 -3
- package/dist/serve/worker/client/core.js.map +1 -1
- package/dist/serve/worker/client/disconnect.js +1 -1
- package/dist/serve/worker/client/disconnect.js.map +1 -1
- package/dist/serve/worker/client/presence.d.ts.map +1 -1
- package/dist/serve/worker/client/presence.js +18 -5
- package/dist/serve/worker/client/presence.js.map +1 -1
- package/dist/serve/worker/client.d.ts +1 -1
- package/dist/serve/worker/client.d.ts.map +1 -1
- package/dist/serve/worker/client.js +1 -1
- package/dist/serve/worker/client.js.map +1 -1
- package/dist/serve/worker/context-resolver.d.ts +30 -0
- package/dist/serve/worker/context-resolver.d.ts.map +1 -0
- package/dist/serve/worker/context-resolver.js +44 -0
- package/dist/serve/worker/context-resolver.js.map +1 -0
- package/dist/serve/worker/entry.js +23 -19
- package/dist/serve/worker/entry.js.map +1 -1
- package/dist/serve/worker/host/core.d.ts +1 -0
- package/dist/serve/worker/host/core.d.ts.map +1 -1
- package/dist/serve/worker/host/core.js +12 -6
- package/dist/serve/worker/host/core.js.map +1 -1
- package/dist/serve/worker/host/storage.js +2 -2
- package/dist/serve/worker/host-ai.d.ts.map +1 -1
- package/dist/serve/worker/host-ai.js +15 -0
- package/dist/serve/worker/host-ai.js.map +1 -1
- package/dist/serve/worker/host-auth.js +1 -2
- package/dist/serve/worker/host-auth.js.map +1 -1
- package/dist/serve/worker/index.d.ts +1 -1
- package/dist/serve/worker/index.d.ts.map +1 -1
- package/dist/serve/worker/index.js +2 -2
- package/dist/serve/worker/index.js.map +1 -1
- package/dist/serve/worker/port-lifecycle.d.ts +18 -0
- package/dist/serve/worker/port-lifecycle.d.ts.map +1 -0
- package/dist/serve/worker/port-lifecycle.js +28 -0
- package/dist/serve/worker/port-lifecycle.js.map +1 -0
- package/dist/serve/worker/protocol.d.ts +4 -0
- package/dist/serve/worker/protocol.d.ts.map +1 -1
- package/dist/serve/worker/protocol.js.map +1 -1
- package/dist/serve/worker/serve-init.d.ts.map +1 -1
- package/dist/serve/worker/serve-init.js +15 -3
- package/dist/serve/worker/serve-init.js.map +1 -1
- package/dist/verify/fixture.d.ts +1 -1
- package/package.json +17 -6
- package/src/assurance/.generated/conformance-verdicts.ts +68 -1
- package/src/bridge/client/dispatch.ts +52 -56
- package/src/bridge/client/tool-family-factories.ts +34 -0
- package/src/bridge/server/mcp-contract.ts +15 -59
- package/src/bridge/server/peer.ts +24 -1
- package/src/bridge/server/tool-family-factories.ts +40 -0
- package/src/bridge/server/tool-metadata.ts +29 -61
- package/src/bridge/tool-families.generated.ts +17 -0
- package/src/bridge/tool-families.ts +87 -0
- package/src/bridge/tool-family-records/conformance.ts +6 -0
- package/src/bridge/tool-family-records/firestore-data.ts +15 -0
- package/src/bridge/tool-family-records/firestore-inspect.ts +6 -0
- package/src/bridge/tool-family-records/firestore-rules.ts +15 -0
- package/src/bridge/tool-family-records/firestore-simulator.ts +16 -0
- package/src/bridge/tool-family-records/rtdb-inspection.ts +6 -0
- package/src/bundler/externals.ts +55 -0
- package/src/bundler/index.ts +21 -0
- package/src/cli/cli.test.ts +2 -46
- package/src/cli/index.ts +48 -42
- package/src/cli/inlined-sdk-scanner.ts +77 -0
- package/src/cli/mcp-proxy.ts +4 -4
- package/src/cli/parse-args.ts +61 -15
- package/src/cli/pyric-config.ts +45 -0
- package/src/cli/sandbox-interlock.ts +167 -0
- package/src/cli/{dev-runner.ts → sandbox-runner.ts} +142 -86
- package/src/cli/serve.ts +182 -115
- package/src/cli/snapshot.ts +5 -5
- package/src/cli/unsupported-runtime.ts +68 -0
- package/src/cli/verify.ts +1 -1
- package/src/conformance/.generated/can-i-use-browser.ts +2 -2
- package/src/conformance/.generated/can-i-use.ts +2 -2
- package/src/conformance/.generated/conformance-docs.ts +1 -1
- package/src/functions-rtdb/child.ts +115 -21
- package/src/functions-rtdb/development-runtime.ts +5 -1
- package/src/functions-rtdb/project.ts +8 -8
- package/src/google-endpoints.ts +155 -0
- package/src/next/guard.ts +1 -1
- package/src/next/runtime-env.ts +5 -0
- package/src/next/with-pyric.ts +1 -1
- package/src/register/beacon.ts +232 -0
- package/src/register/index.ts +68 -6
- package/src/register/net-guard.ts +567 -0
- package/src/remote/index.ts +9 -9
- package/src/serve/ai-diagnostics-relay.ts +243 -0
- package/src/serve/ai-proxy.ts +327 -0
- package/src/serve/ai-status.ts +109 -0
- package/src/serve/ai-terminal-blocks.ts +210 -0
- package/src/serve/ai-terminal-text.ts +52 -0
- package/src/serve/beacon-route.ts +141 -0
- package/src/serve/bundler.ts +10 -10
- package/src/serve/entries/active-auth-registry.ts +56 -0
- package/src/serve/entries/active-auth.ts +100 -0
- package/src/serve/entries/ai.ts +27 -1
- package/src/serve/entries/auth-helper-core.ts +5 -0
- package/src/serve/entries/auth-helper-dom.ts +27 -3
- package/src/serve/entries/auth-helper-runtime.ts +1 -1
- package/src/serve/entries/auth.ts +8 -0
- package/src/serve/entries/bridge-url.ts +1 -1
- package/src/serve/entries/firestore.ts +3 -3
- package/src/serve/entries/init.ts +78 -3
- package/src/serve/entries/keepalive.ts +1 -1
- package/src/serve/entries/runtime.ts +29 -14
- package/src/serve/entries/storage.ts +1 -1
- package/src/serve/entries/worker-runtime.ts +1 -1
- package/src/serve/init-payload.ts +4 -0
- package/src/serve/namespace.ts +117 -145
- package/src/serve/rules.ts +47 -22
- package/src/serve/runtime/chip-config.ts +16 -2
- package/src/serve/runtime/chip-dialog.ts +366 -0
- package/src/serve/runtime/chip-install.ts +10 -4
- package/src/serve/runtime/chip-user-search.ts +391 -0
- package/src/serve/runtime/chip.ts +177 -15
- package/src/serve/runtime/identity.ts +26 -0
- package/src/serve/runtime/manifest.ts +1 -1
- package/src/serve/runtime/status.ts +24 -0
- package/src/serve/sandbox-session.ts +19 -4
- package/src/serve/server.ts +18 -1
- package/src/serve/studio/disk-workspace.ts +76 -2
- package/src/serve/studio/routes.ts +63 -7
- package/src/serve/vite-ai-config.ts +37 -7
- package/src/serve/vite-module-swap.ts +0 -28
- package/src/serve/vite-plugin.ts +8 -8
- package/src/serve/vite-sandbox-generation.ts +16 -1
- package/src/serve/worker/client/auth.ts +1 -1
- package/src/serve/worker/client/core.ts +80 -3
- package/src/serve/worker/client/disconnect.ts +1 -1
- package/src/serve/worker/client/presence.ts +25 -5
- package/src/serve/worker/client.ts +1 -1
- package/src/serve/worker/context-resolver.ts +60 -0
- package/src/serve/worker/entry.ts +22 -18
- package/src/serve/worker/host/core.ts +9 -7
- package/src/serve/worker/host/storage.ts +2 -2
- package/src/serve/worker/host-ai.ts +15 -0
- package/src/serve/worker/host-auth.ts +1 -1
- package/src/serve/worker/index.ts +4 -1
- package/src/serve/worker/port-lifecycle.ts +45 -0
- package/src/serve/worker/protocol.ts +2 -1
- package/src/serve/worker/serve-init.ts +14 -3
- package/src/verify/fixture.ts +1 -1
- package/README.md.orig +0 -145
- package/dist/cli/dev-runner.d.ts.map +0 -1
- package/dist/cli/dev-runner.js.map +0 -1
- package/dist/serve/site-ui/_astro/_slug_.CXh9yTP1.css +0 -1
- package/dist/serve/site-ui/_astro/_slug_.CupVK4TM.css +0 -1
- package/dist/serve/site-ui/_astro/_studio_.CfxiQWkk.css +0 -1
- package/dist/serve/site-ui/_astro/app.BsFsMjn0.css +0 -1
- package/dist/serve/site-ui/_astro/app.Ce3MTLQm.js +0 -1
- package/dist/serve/site-ui/_astro/app.taqzyjD0.js +0 -11
- package/dist/serve/site-ui/_astro/sandbox-controls.BP4M5f1M.js +0 -1169
- package/dist/serve/site-ui/_astro/writes.C57paAj2.js +0 -99
- package/dist/serve/site-ui/docs/trust/storage-rules-stdlib-research/index.html +0 -582
- package/dist/serve/site-ui/docs/trust/storage-rules-stdlib-research.md +0 -448
package/src/cli/cli.test.ts
CHANGED
|
@@ -412,7 +412,7 @@ describe('runInit', () => {
|
|
|
412
412
|
|
|
413
413
|
// Missing Pyric development scripts + deps added.
|
|
414
414
|
expect(written.scripts.bridge).toBe('pyric bridge');
|
|
415
|
-
expect(written.scripts.dev).toBe('pyric
|
|
415
|
+
expect(written.scripts.dev).toBe('pyric sandbox --no-open -- node --env-file-if-exists=.env --experimental-strip-types src/app.ts');
|
|
416
416
|
expect(Object.keys(written.scripts).some((name) => name.startsWith('deploy'))).toBe(false);
|
|
417
417
|
expect(written.dependencies.firebase).toBe('^12.12.0');
|
|
418
418
|
expect(written.dependencies.pyric).toBeUndefined();
|
|
@@ -437,7 +437,7 @@ describe('runInit', () => {
|
|
|
437
437
|
private: true,
|
|
438
438
|
scripts: {
|
|
439
439
|
start: 'node --env-file-if-exists=.env --experimental-strip-types src/app.ts',
|
|
440
|
-
dev: 'pyric
|
|
440
|
+
dev: 'pyric sandbox --no-open -- node --env-file-if-exists=.env --experimental-strip-types src/app.ts',
|
|
441
441
|
bridge: 'pyric bridge',
|
|
442
442
|
},
|
|
443
443
|
dependencies: { firebase: '^12.12.0' },
|
|
@@ -461,47 +461,3 @@ describe('runInit', () => {
|
|
|
461
461
|
expect(io.getOut()).toContain('skipped package.json'); // unchanged merge
|
|
462
462
|
});
|
|
463
463
|
});
|
|
464
|
-
|
|
465
|
-
describe('scanForInlinedFirebase', () => {
|
|
466
|
-
it('flags a bundled chunk that inlines real-SDK endpoint hosts', async () => {
|
|
467
|
-
const { scanForInlinedFirebase } = await import('./serve.js');
|
|
468
|
-
const { mkdtempSync, mkdirSync, writeFileSync } = await import('node:fs');
|
|
469
|
-
const { tmpdir } = await import('node:os');
|
|
470
|
-
const { join } = await import('node:path');
|
|
471
|
-
const dir = mkdtempSync(join(tmpdir(), 'pyric-inline-scan-'));
|
|
472
|
-
mkdirSync(join(dir, 'assets'));
|
|
473
|
-
writeFileSync(
|
|
474
|
-
join(dir, 'assets', 'index-abc.js'),
|
|
475
|
-
'fetch("https://identitytoolkit.googleapis.com/v1/projects?key="+k)',
|
|
476
|
-
);
|
|
477
|
-
const hits = scanForInlinedFirebase(dir);
|
|
478
|
-
expect(hits).toEqual(['assets/index-abc.js']);
|
|
479
|
-
});
|
|
480
|
-
|
|
481
|
-
it('stays clean for an unbundled app importing firebase by bare specifier', async () => {
|
|
482
|
-
const { scanForInlinedFirebase } = await import('./serve.js');
|
|
483
|
-
const { mkdtempSync, writeFileSync } = await import('node:fs');
|
|
484
|
-
const { tmpdir } = await import('node:os');
|
|
485
|
-
const { join } = await import('node:path');
|
|
486
|
-
const dir = mkdtempSync(join(tmpdir(), 'pyric-inline-clean-'));
|
|
487
|
-
writeFileSync(
|
|
488
|
-
join(dir, 'main.js'),
|
|
489
|
-
"import { getAuth } from 'firebase/auth'; import { getFirestore } from 'firebase/firestore';",
|
|
490
|
-
);
|
|
491
|
-
expect(scanForInlinedFirebase(dir)).toEqual([]);
|
|
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
|
-
});
|
|
507
|
-
});
|
package/src/cli/index.ts
CHANGED
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
/**
|
|
3
|
-
* `pyric` CLI
|
|
3
|
+
* `pyric` CLI front door to the bridge and project tooling.
|
|
4
4
|
*
|
|
5
5
|
* Subcommands:
|
|
6
6
|
* pyric bridge [--port N] [--project ID]
|
|
7
|
-
* pyric
|
|
7
|
+
* pyric sandbox [flags] [--] [command...]
|
|
8
8
|
* pyric init [dir] [--template web|node] [--name N] [--force] [--json]
|
|
9
9
|
* pyric vendor [dir] [--json]
|
|
10
10
|
* pyric snapshot [--out FILE] [--port N] [--force] [--json] [--include-passwords]
|
|
@@ -55,12 +55,12 @@ const VERSION = pyricVersion();
|
|
|
55
55
|
|
|
56
56
|
function printUsage(): void {
|
|
57
57
|
process.stdout.write(`pyric ${VERSION}
|
|
58
|
-
Firebase for agents
|
|
58
|
+
Firebase for agents. Bridge an in-browser Pyric sandbox to external MCP
|
|
59
59
|
clients (Claude Code, Cursor, ...).
|
|
60
60
|
|
|
61
61
|
USAGE
|
|
62
62
|
pyric bridge [flags]
|
|
63
|
-
pyric
|
|
63
|
+
pyric sandbox [flags] [--] [command...]
|
|
64
64
|
pyric init [dir] [--template=web|node]
|
|
65
65
|
pyric snapshot [--out=FILE]
|
|
66
66
|
pyric verify [fixture|dir] [--engine sandbox|rules-test-api|both]
|
|
@@ -83,16 +83,14 @@ USAGE
|
|
|
83
83
|
|
|
84
84
|
COMMANDS
|
|
85
85
|
bridge Start the HTTP+WebSocket bridge external MCP clients point at.
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
sandbox (PYRIC_SANDBOX + \`--import @pyric/cli/register\`). A
|
|
92
|
-
firebase.json Functions source is discovered automatically;
|
|
86
|
+
sandbox [command...] Run an application command or script inside the local Firebase sandbox
|
|
87
|
+
with unmodified firebase/* and firebase-admin/* imports routed to the
|
|
88
|
+
in-memory mirror. When [command...] is omitted, runs the command
|
|
89
|
+
configured in pyric.json; if none is configured, runs the sandbox host only.
|
|
90
|
+
A firebase.json Functions source is discovered automatically;
|
|
93
91
|
supported RTDB onValueCreated exports run in isolated Node.
|
|
94
92
|
init [dir] Scaffold a pyric project. --template=web (default; Vite app
|
|
95
|
-
on \`@pyric/cli/vite\`), static (\`pyric
|
|
93
|
+
on \`@pyric/cli/vite\`), static (\`pyric sandbox\`), or node.
|
|
96
94
|
--name=NAME --force (overwrite scaffold files) --json (machine
|
|
97
95
|
output on stdout). Never prompts; rerunning is safe.
|
|
98
96
|
Greenfield shortcut: \`npm create pyric [dir]\`.
|
|
@@ -102,15 +100,15 @@ COMMANDS
|
|
|
102
100
|
bun install. Standalone binary only.
|
|
103
101
|
mcp Stdio MCP server for editors (Cursor / Claude /
|
|
104
102
|
Antigravity). Hosts a headless in-process sandbox,
|
|
105
|
-
or attaches to a running \`pyric
|
|
103
|
+
or attaches to a running \`pyric sandbox --bridge\`
|
|
106
104
|
(found via .pyric/serve.json) for shared-live Studio.
|
|
107
|
-
snapshot [--out=FILE] Promote lived sandbox state (live
|
|
105
|
+
snapshot [--out=FILE] Promote lived sandbox state (live sandbox --persist, else
|
|
108
106
|
.pyric/state/state.json) to a committable fixture that
|
|
109
|
-
\`pyric
|
|
107
|
+
\`pyric sandbox --seed FILE\` re-serves. Passwords are redacted
|
|
110
108
|
by default (--include-passwords keeps them). --port, --force, --json.
|
|
111
109
|
verify [fixture|dir] Replay a captured sandbox session against candidate rules
|
|
112
110
|
for the Firestore/RTDB services present in the fixture.
|
|
113
|
-
No arg replays the latest \`pyric
|
|
111
|
+
No arg replays the latest \`pyric sandbox\` capture
|
|
114
112
|
(.pyric/last-session.json). --service filters services.
|
|
115
113
|
--engine sandbox (default), rules-test-api, or both.
|
|
116
114
|
Hosted Rules Test API verification is Firestore-only
|
|
@@ -135,59 +133,67 @@ COMMANDS
|
|
|
135
133
|
database rules validate Validate Realtime Database rules expressions.
|
|
136
134
|
database rules simulate Run the local Realtime Database rules simulator.
|
|
137
135
|
database rules generate Compile a constraints module to database.rules.json.
|
|
138
|
-
CORE FLAGS (
|
|
139
|
-
--port Port to serve on. Default 3473
|
|
140
|
-
|
|
136
|
+
CORE FLAGS (sandbox)
|
|
137
|
+
--port Port to serve on. Default 3473. Pyric scans forward when
|
|
138
|
+
the selected port is taken.
|
|
141
139
|
--host Host to bind. Default localhost.
|
|
142
140
|
--no-cache Rebuild the served pyric SDK bundles (skip ~/.pyric/serve-cache).
|
|
143
141
|
--only hosting Accepted for firebase-serve parity (hosting is all v1 serves).
|
|
144
|
-
--bridge Also mount the MCP bridge on the serve origin
|
|
142
|
+
--bridge Also mount the MCP bridge on the serve origin. Agents point
|
|
145
143
|
at http://<host>:<port>/__pyric/mcp and drive the sandbox
|
|
146
144
|
living in the served page. --project labels health/audit.
|
|
147
|
-
--ui
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
--seed FILE JSON map of "collection/doc" → fields, loaded admin-style.
|
|
145
|
+
--ui Open Studio instead of the served page. Studio and docs
|
|
146
|
+
are served by default at <url>/__pyric/ui/.
|
|
147
|
+
--no-ui Do not serve Studio, docs, workspace, or project routes.
|
|
148
|
+
--seed FILE JSON map of "collection/doc" to fields, loaded with admin access.
|
|
152
149
|
Also accepts a pyric state file (from \`pyric snapshot\`,
|
|
153
|
-
detected by its version key)
|
|
154
|
-
|
|
150
|
+
detected by its version key). Seeds documents and auth users
|
|
151
|
+
before application code runs.
|
|
155
152
|
--no-watch Disable firestore.rules hot-reload (on by default).
|
|
156
|
-
--no-open Don't auto-open the browser.
|
|
153
|
+
--no-open Don't auto-open the browser. sandbox opens the served page
|
|
157
154
|
by default (the sandbox is browser-resident); auto-open
|
|
158
155
|
is already suppressed under --json, no TTY, and CI.
|
|
159
|
-
--no-capture Don't write the session capture.
|
|
156
|
+
--no-capture Don't write the session capture. sandbox writes
|
|
160
157
|
.pyric/last-session.json by default so \`pyric verify\`
|
|
161
158
|
can replay your session; --no-capture disables it.
|
|
159
|
+
--permissive Allow unauthenticated Realtime Database reads and writes when no
|
|
160
|
+
rules file is present. For local prototyping only.
|
|
162
161
|
--allowed-host H Allow an extra Host header past the DNS-rebinding guard
|
|
163
162
|
(comma-separated; localhost/127.0.0.1 always allowed).
|
|
164
163
|
--persist Persist sandbox state (docs + auth users) to
|
|
165
|
-
.pyric/state/state.json
|
|
164
|
+
.pyric/state/state.json. It survives reloads and sandbox
|
|
166
165
|
restarts. Once a state file exists it wins; --seed
|
|
167
166
|
applies only on the first (state-less) run. Ephemeral
|
|
168
167
|
is the default.
|
|
169
168
|
--fresh Requires --persist: discard the existing state file and
|
|
170
169
|
re-seed from scratch (escape hatch when you've edited
|
|
171
|
-
seed.json). Without --persist, --fresh errors
|
|
170
|
+
seed.json). Without --persist, --fresh errors because there is
|
|
172
171
|
no state file to discard. Half-reset warning: a browser
|
|
173
172
|
tab that already has sandbox data in IndexedDB keeps it
|
|
174
173
|
and writes it back to the new file; also clear the
|
|
175
|
-
browser store
|
|
174
|
+
browser store in Studio under Settings, Reset, or use an
|
|
176
175
|
incognito window) for a full reset.
|
|
177
|
-
|
|
176
|
+
[command...] Run a command once the host is up, with PYRIC_SANDBOX set and
|
|
178
177
|
NODE_OPTIONS extended with --import @pyric/cli/register
|
|
179
|
-
so firebase-admin/firebase resolve to the sandbox.
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
is given explicitly.
|
|
178
|
+
so firebase-admin/firebase resolve to the sandbox. Put
|
|
179
|
+
Pyric flags before the command. A bare -- separates the
|
|
180
|
+
command and its flags. When omitted, pyric.json#command
|
|
181
|
+
runs. With no configured command, the host runs alone.
|
|
182
|
+
--no-run Don't run an explicit or configured command. A declared
|
|
183
|
+
Functions source still runs.
|
|
186
184
|
--json One machine-readable line on stdout ({url, port, mcpUrl,
|
|
187
185
|
rulesHash, persist, restoredDocs, restoredUsers}); the
|
|
188
|
-
banner moves to stderr.
|
|
186
|
+
banner moves to stderr. A pyric.json command is skipped
|
|
187
|
+
unless a command is supplied explicitly. Readiness probe:
|
|
189
188
|
GET <url>/__pyric/init.json → 200 (live rules hash).
|
|
190
189
|
|
|
190
|
+
PROJECT CONFIG (pyric.json)
|
|
191
|
+
command Default child command. An explicit CLI command overrides it.
|
|
192
|
+
port Default sandbox port. --port overrides it.
|
|
193
|
+
project Project label. --project, then PYRIC_PROJECT, override it.
|
|
194
|
+
rules Firestore rules path, or an object with firestore,
|
|
195
|
+
database, and storage paths.
|
|
196
|
+
|
|
191
197
|
CORE FLAGS (bridge)
|
|
192
198
|
--port Port to bind on 127.0.0.1. Default 5174. Env: PYRIC_PORT.
|
|
193
199
|
--project Project label surfaced in /health + audit output.
|
|
@@ -336,7 +342,7 @@ export async function dispatch(parsed: ParsedArgs): Promise<number> {
|
|
|
336
342
|
return parsed.subcommand === null ? 0 : 1;
|
|
337
343
|
case 'bridge':
|
|
338
344
|
return await runBridge(parsed);
|
|
339
|
-
case '
|
|
345
|
+
case 'sandbox':
|
|
340
346
|
const { runServe } = await import('./serve.js');
|
|
341
347
|
return runServe(parsed);
|
|
342
348
|
case 'snapshot':
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Detect a served frontend build that inlined the real Firebase SDK.
|
|
3
|
+
*
|
|
4
|
+
* The served import map remaps only bare `firebase/*` specifiers, so a plain
|
|
5
|
+
* `vite build` that compiled the SDK into an app chunk cannot be sandboxed:
|
|
6
|
+
* its calls reach real Google endpoints while the injected banner claims
|
|
7
|
+
* otherwise. `cli/serve.ts` refuses such a dist rather than serving it.
|
|
8
|
+
*
|
|
9
|
+
* Only the SDK fingerprint hosts are matched, never the full endpoint catalog.
|
|
10
|
+
* This check throws, and a dist can legitimately carry a bare callable URL, a
|
|
11
|
+
* public asset URL, or a `databaseURL` literal without any Firebase SDK in it.
|
|
12
|
+
*
|
|
13
|
+
* Backend bundles are deliberately out of scope. `withPyric` externalizes
|
|
14
|
+
* firebase and firebase-admin, the backend-bundler docs tell users to mark them
|
|
15
|
+
* external, and the net guard reports real egress at runtime with attribution,
|
|
16
|
+
* which a grep over build output cannot do.
|
|
17
|
+
*/
|
|
18
|
+
import { readdirSync, readFileSync, statSync } from 'node:fs';
|
|
19
|
+
import { join } from 'node:path';
|
|
20
|
+
import { SDK_FINGERPRINT_HOSTS } from '../google-endpoints.js';
|
|
21
|
+
|
|
22
|
+
/** Depth limit for the walk. */
|
|
23
|
+
const MAX_DEPTH = 4;
|
|
24
|
+
|
|
25
|
+
/** Total script files read. */
|
|
26
|
+
const MAX_FILES = 200;
|
|
27
|
+
|
|
28
|
+
/** Script extensions worth reading in served frontend output. */
|
|
29
|
+
const SCRIPT_FILE = /\.(js|mjs)$/;
|
|
30
|
+
|
|
31
|
+
/**
|
|
32
|
+
* Scan `dir` for inlined SDK fingerprints and return the offending paths,
|
|
33
|
+
* relative to `dir`. Bounded: depth 4, 200 script files, first hit per file.
|
|
34
|
+
*/
|
|
35
|
+
export function scanForInlinedFirebase(dir: string): string[] {
|
|
36
|
+
const hits: string[] = [];
|
|
37
|
+
let scanned = 0;
|
|
38
|
+
const walk = (current: string, rel: string, depth: number): void => {
|
|
39
|
+
if (depth > MAX_DEPTH || scanned >= MAX_FILES) return;
|
|
40
|
+
let names: string[];
|
|
41
|
+
try {
|
|
42
|
+
names = readdirSync(current);
|
|
43
|
+
} catch {
|
|
44
|
+
return;
|
|
45
|
+
}
|
|
46
|
+
for (const name of names) {
|
|
47
|
+
if (scanned >= MAX_FILES) return;
|
|
48
|
+
const path = join(current, name);
|
|
49
|
+
const relPath = rel ? `${rel}/${name}` : name;
|
|
50
|
+
let stat;
|
|
51
|
+
try {
|
|
52
|
+
stat = statSync(path);
|
|
53
|
+
} catch {
|
|
54
|
+
continue;
|
|
55
|
+
}
|
|
56
|
+
if (stat.isDirectory()) {
|
|
57
|
+
// The pyric namespace itself never lands in hosting.public, but a
|
|
58
|
+
// node_modules inside a served dir would be a scan-cost trap.
|
|
59
|
+
// Dot-directories (.next, .git, .pyric) are internal caches.
|
|
60
|
+
if (name === 'node_modules' || name.startsWith('.')) continue;
|
|
61
|
+
walk(path, relPath, depth + 1);
|
|
62
|
+
continue;
|
|
63
|
+
}
|
|
64
|
+
if (!SCRIPT_FILE.test(name)) continue;
|
|
65
|
+
scanned++;
|
|
66
|
+
let text: string;
|
|
67
|
+
try {
|
|
68
|
+
text = readFileSync(path, 'utf8');
|
|
69
|
+
} catch {
|
|
70
|
+
continue; // unreadable asset
|
|
71
|
+
}
|
|
72
|
+
if (SDK_FINGERPRINT_HOSTS.some((host) => text.includes(host))) hits.push(relPath);
|
|
73
|
+
}
|
|
74
|
+
};
|
|
75
|
+
walk(dir, '', 0);
|
|
76
|
+
return hits;
|
|
77
|
+
}
|
package/src/cli/mcp-proxy.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* `pyric mcp-proxy` — a stdio MCP server that relays to a RUNNING
|
|
3
|
-
* `pyric
|
|
3
|
+
* the HTTP MCP endpoint from `pyric sandbox --bridge`.
|
|
4
4
|
*
|
|
5
5
|
* Why this exists: the agent plugin declares one static stdio command, while
|
|
6
6
|
* serve's endpoint is `http://localhost:<PORT>/__pyric/mcp` with a runtime
|
|
@@ -84,12 +84,12 @@ export async function runMcpProxy(
|
|
|
84
84
|
if (!found) {
|
|
85
85
|
// Hybrid mode (design rationale): no dev server to attach to, so host the
|
|
86
86
|
// sandbox IN this process. Zero setup, no browser tab required. A running
|
|
87
|
-
// `pyric
|
|
87
|
+
// `pyric sandbox --bridge` upgrades to the shared session on reconnect.
|
|
88
88
|
log(
|
|
89
|
-
'no running `pyric
|
|
89
|
+
'no running `pyric sandbox --bridge` found (looked for .pyric/serve.json and ports ' +
|
|
90
90
|
`${SCAN_PORTS.join(', ')}); starting a headless in-process sandbox (zero-setup).\n` +
|
|
91
91
|
' Data persists to .pyric/state/headless.json. For a shared-live Studio\n' +
|
|
92
|
-
' session, start `pyric
|
|
92
|
+
' session, start `pyric sandbox --bridge` before connecting the agent (a sandbox host\n' +
|
|
93
93
|
' started mid-session does not yet adopt this headless data).',
|
|
94
94
|
);
|
|
95
95
|
const headless =
|
package/src/cli/parse-args.ts
CHANGED
|
@@ -12,17 +12,54 @@ export interface ParsedArgs {
|
|
|
12
12
|
subcommand: string | null;
|
|
13
13
|
flags: Map<string, FlagValue>;
|
|
14
14
|
positional: string[];
|
|
15
|
-
/** Everything after a bare `--`, verbatim (e.g. `pyric
|
|
15
|
+
/** Everything after a bare `--`, verbatim (e.g. `pyric sandbox -- npm start`).
|
|
16
16
|
* Optional so hand-built ParsedArgs literals stay valid. */
|
|
17
17
|
passthrough?: string[];
|
|
18
18
|
}
|
|
19
19
|
|
|
20
20
|
export type FlagValue = string | boolean | Array<string | boolean>;
|
|
21
21
|
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
22
|
+
const BOOLEAN_FLAGS = new Set([
|
|
23
|
+
'json',
|
|
24
|
+
'bridge',
|
|
25
|
+
'ui',
|
|
26
|
+
'no-ui',
|
|
27
|
+
'no-open',
|
|
28
|
+
'no-run',
|
|
29
|
+
'no-cache',
|
|
30
|
+
'no-watch',
|
|
31
|
+
'no-capture',
|
|
32
|
+
'persist',
|
|
33
|
+
'fresh',
|
|
34
|
+
'force',
|
|
35
|
+
'permissive',
|
|
36
|
+
'help',
|
|
37
|
+
'version',
|
|
38
|
+
]);
|
|
39
|
+
|
|
40
|
+
function isBooleanFlag(key: string): boolean {
|
|
41
|
+
return BOOLEAN_FLAGS.has(key) || key.startsWith('no-');
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
const SHORT_VALUE_ALIASES: ReadonlyMap<string, string> = new Map([
|
|
45
|
+
['p', 'port'],
|
|
46
|
+
]);
|
|
47
|
+
|
|
48
|
+
function consumeFlag(
|
|
49
|
+
flags: Map<string, FlagValue>,
|
|
50
|
+
key: string,
|
|
51
|
+
argv: string[],
|
|
52
|
+
currentIndex: number,
|
|
53
|
+
canTakeValue: boolean,
|
|
54
|
+
): number {
|
|
55
|
+
const next = argv[currentIndex + 1];
|
|
56
|
+
if (canTakeValue && next !== undefined && !next.startsWith('-')) {
|
|
57
|
+
setFlag(flags, key, next);
|
|
58
|
+
return currentIndex + 1;
|
|
59
|
+
}
|
|
60
|
+
setFlag(flags, key, true);
|
|
61
|
+
return currentIndex;
|
|
62
|
+
}
|
|
26
63
|
|
|
27
64
|
export function parseArgs(argv: string[]): ParsedArgs {
|
|
28
65
|
const flags = new Map<string, FlagValue>();
|
|
@@ -38,26 +75,31 @@ export function parseArgs(argv: string[]): ParsedArgs {
|
|
|
38
75
|
}
|
|
39
76
|
if (arg === '--') {
|
|
40
77
|
// Everything after a bare `--` belongs to the child command, verbatim
|
|
41
|
-
// — never parsed as flags (`pyric
|
|
78
|
+
// — never parsed as flags (`pyric sandbox -- npm start --port 3000`).
|
|
42
79
|
passthrough.push(...argv.slice(i + 1).filter((a): a is string => a !== undefined));
|
|
43
80
|
break;
|
|
44
81
|
}
|
|
82
|
+
if (isExecutionSubcommand(subcommand) && positional.length > 0) {
|
|
83
|
+
positional.push(arg);
|
|
84
|
+
i += 1;
|
|
85
|
+
continue;
|
|
86
|
+
}
|
|
45
87
|
if (arg.startsWith('--')) {
|
|
46
88
|
const eq = arg.indexOf('=');
|
|
47
89
|
if (eq !== -1) {
|
|
48
90
|
setFlag(flags, arg.slice(2, eq), arg.slice(eq + 1));
|
|
49
91
|
} else {
|
|
50
92
|
const key = arg.slice(2);
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
93
|
+
i = consumeFlag(flags, key, argv, i, !isBooleanFlag(key));
|
|
94
|
+
}
|
|
95
|
+
} else if (arg.startsWith('-') && arg !== '-') {
|
|
96
|
+
const raw = arg.slice(1);
|
|
97
|
+
const longKey = SHORT_VALUE_ALIASES.get(raw);
|
|
98
|
+
if (longKey !== undefined) {
|
|
99
|
+
i = consumeFlag(flags, longKey, argv, i, true);
|
|
100
|
+
} else {
|
|
101
|
+
setFlag(flags, raw, true);
|
|
58
102
|
}
|
|
59
|
-
} else if (arg.startsWith('-')) {
|
|
60
|
-
setFlag(flags, arg.slice(1), true);
|
|
61
103
|
} else if (subcommand === null) {
|
|
62
104
|
subcommand = arg;
|
|
63
105
|
} else {
|
|
@@ -68,6 +110,10 @@ export function parseArgs(argv: string[]): ParsedArgs {
|
|
|
68
110
|
return { subcommand, flags, positional, passthrough };
|
|
69
111
|
}
|
|
70
112
|
|
|
113
|
+
function isExecutionSubcommand(subcommand: string | null): boolean {
|
|
114
|
+
return subcommand === 'sandbox';
|
|
115
|
+
}
|
|
116
|
+
|
|
71
117
|
function setFlag(flags: Map<string, FlagValue>, key: string, value: string | boolean): void {
|
|
72
118
|
const current = flags.get(key);
|
|
73
119
|
if (current === undefined) {
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Reader for the optional project-level `pyric.json` configuration file.
|
|
3
|
+
*
|
|
4
|
+
* Configures defaults for `pyric sandbox` (such as a default `command`,
|
|
5
|
+
* custom `port`, or explicit `rules` paths) without requiring CLI flags
|
|
6
|
+
* or magic process sniffing.
|
|
7
|
+
*/
|
|
8
|
+
|
|
9
|
+
import { readFile } from 'node:fs/promises';
|
|
10
|
+
import { join } from 'node:path';
|
|
11
|
+
|
|
12
|
+
export interface PyricRulesConfig {
|
|
13
|
+
firestore?: string;
|
|
14
|
+
database?: string;
|
|
15
|
+
storage?: string;
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
export interface PyricConfig {
|
|
19
|
+
/** Default command to execute under the sandbox if none is passed on CLI. */
|
|
20
|
+
command?: string;
|
|
21
|
+
/** Local port to bind the Pyric sandbox host. */
|
|
22
|
+
port?: number;
|
|
23
|
+
/** Path to Firestore, RTDB, or Storage rules files. */
|
|
24
|
+
rules?: string | PyricRulesConfig;
|
|
25
|
+
/** Project ID label for emulation. */
|
|
26
|
+
project?: string;
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
export async function readPyricConfig(cwd: string = process.cwd()): Promise<PyricConfig> {
|
|
30
|
+
const path = join(cwd, 'pyric.json');
|
|
31
|
+
let raw: string;
|
|
32
|
+
try {
|
|
33
|
+
raw = await readFile(path, 'utf-8');
|
|
34
|
+
} catch (e) {
|
|
35
|
+
if ((e as NodeJS.ErrnoException).code === 'ENOENT') return {};
|
|
36
|
+
throw e;
|
|
37
|
+
}
|
|
38
|
+
try {
|
|
39
|
+
return JSON.parse(raw) as PyricConfig;
|
|
40
|
+
} catch (e) {
|
|
41
|
+
throw new Error(
|
|
42
|
+
`pyric: failed to parse pyric.json: ${e instanceof Error ? e.message : String(e)}`,
|
|
43
|
+
);
|
|
44
|
+
}
|
|
45
|
+
}
|