@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
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sandbox-runner.js","sourceRoot":"","sources":["../../src/cli/sandbox-runner.ts"],"names":[],"mappings":"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"}
|
package/dist/cli/serve.d.ts
CHANGED
|
@@ -9,7 +9,7 @@ interface HostingConfig {
|
|
|
9
9
|
destination?: string;
|
|
10
10
|
}>;
|
|
11
11
|
}
|
|
12
|
-
/** Extract the single hosting config `pyric
|
|
12
|
+
/** Extract the single hosting config `pyric sandbox` supports. Arrays
|
|
13
13
|
* (multi-site) take the first entry with a warning — multi-site is out of
|
|
14
14
|
* scope (plan section 6). */
|
|
15
15
|
export declare function extractHosting(config: FirebaseJson | null): HostingConfig | null;
|
|
@@ -21,7 +21,7 @@ export interface ServeRuntime {
|
|
|
21
21
|
payload: () => InitPayload;
|
|
22
22
|
/** HTTP MCP endpoint when `--bridge` is on; null otherwise. */
|
|
23
23
|
mcpUrl: string | null;
|
|
24
|
-
/** The Studio
|
|
24
|
+
/** The Studio hub URL (`/__pyric/ui/studio`) when `--ui` is on and the build is
|
|
25
25
|
* present; null otherwise. */
|
|
26
26
|
uiUrl: string | null;
|
|
27
27
|
/** Persistence summary (null when `--persist` is off). */
|
|
@@ -29,6 +29,12 @@ export interface ServeRuntime {
|
|
|
29
29
|
restoredDocs: number;
|
|
30
30
|
restoredUsers: number;
|
|
31
31
|
} | null;
|
|
32
|
+
/** Handshake beacons posted to `/__pyric/beacon` so far, the interlock
|
|
33
|
+
* watchdog's only input. */
|
|
34
|
+
beaconCount: () => number;
|
|
35
|
+
/** The per-launch secret a beacon must present, placed in every child's
|
|
36
|
+
* `PYRIC_BEACON_TOKEN`. */
|
|
37
|
+
beaconToken: string;
|
|
32
38
|
}
|
|
33
39
|
/** The `--json` stdout contract — one line, keep stable; agents parse this.
|
|
34
40
|
* Readiness probe: GET {url}/__pyric/init.json → 200 (body carries the live
|
|
@@ -73,6 +79,8 @@ export declare function startServe(opts: {
|
|
|
73
79
|
* (the served project's file tree) + `/__pyric/projects` (single-project
|
|
74
80
|
* store over `cwd`). The Studio app's `local` mode talks to these. */
|
|
75
81
|
ui?: boolean;
|
|
82
|
+
/** Explicit opt-in to permissive mode (default-allow RTDB rules when unconfigured). */
|
|
83
|
+
permissive?: boolean;
|
|
76
84
|
logger?: Parameters<typeof startStaticServer>[0]['logger'];
|
|
77
85
|
}): Promise<ServeRuntime>;
|
|
78
86
|
/**
|
|
@@ -87,7 +95,7 @@ export declare function bridgeEnabledFromFlags(flags: {
|
|
|
87
95
|
* A dev child also implies the bridge: the runner injects
|
|
88
96
|
* `PYRIC_SANDBOX=remote:<url>` into the child, whose remote client dials the
|
|
89
97
|
* `/__pyric/sandbox` WS — without the bridge mount that upgrade 404s and
|
|
90
|
-
*
|
|
98
|
+
* `pyric sandbox -- <cmd>` breaks its own
|
|
91
99
|
* child. Pure + exported for unit coverage.
|
|
92
100
|
*/
|
|
93
101
|
export declare function bridgeEnabledFor(flags: {
|
|
@@ -95,7 +103,7 @@ export declare function bridgeEnabledFor(flags: {
|
|
|
95
103
|
}, childPlan: unknown, functionsProject?: unknown): boolean;
|
|
96
104
|
/**
|
|
97
105
|
* Process-level last line of defense for the dev server: a single bad
|
|
98
|
-
* request/WS interaction must never take `pyric
|
|
106
|
+
* request/WS interaction must never take `pyric sandbox` down. Node kills the
|
|
99
107
|
* process on an unhandled rejection (default `--unhandled-rejections=throw`
|
|
100
108
|
* since v15) and on any uncaught exception — and the serve process hosts
|
|
101
109
|
* long-lived, browser-driven machinery (WS peers, SSE streams, file watchers,
|
|
@@ -108,15 +116,5 @@ export declare function bridgeEnabledFor(flags: {
|
|
|
108
116
|
export declare function installServeProcessGuard(log: (message: string) => void, proc?: Pick<NodeJS.Process, 'on' | 'off'>): () => void;
|
|
109
117
|
/** CLI entry. Resolves on SIGINT/SIGTERM after a clean stop. */
|
|
110
118
|
export declare function runServe(parsed: ParsedArgs): Promise<number>;
|
|
111
|
-
/**
|
|
112
|
-
* Detect a bundler build that INLINED the real firebase SDK into its served
|
|
113
|
-
* assets (`vite build` output). The served import map remaps only bare
|
|
114
|
-
* `firebase/*` specifiers, so such a build cannot be sandboxed — its calls
|
|
115
|
-
* reach real Google endpoints. Fingerprints are real-SDK-only endpoint hosts
|
|
116
|
-
* that never appear in a sandbox-clean app (whose calls all route to
|
|
117
|
-
* `/__pyric/*`). Bounded: depth ≤ 4, ≤ 200 script files, first hit per file.
|
|
118
|
-
* Returns publicDir-relative paths of offending assets.
|
|
119
|
-
*/
|
|
120
|
-
export declare function scanForInlinedFirebase(dir: string): string[];
|
|
121
119
|
export {};
|
|
122
120
|
//# sourceMappingURL=serve.d.ts.map
|
package/dist/cli/serve.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"serve.d.ts","sourceRoot":"","sources":["../../src/cli/serve.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"serve.d.ts","sourceRoot":"","sources":["../../src/cli/serve.ts"],"names":[],"mappings":"AAeA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAClD,OAAO,EAAoC,KAAK,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAUzF,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AAIzD,OAAO,EAAsB,iBAAiB,EAAqB,KAAK,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAmChH,UAAU,aAAa;IACrB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,KAAK,CAAC;QAAE,MAAM,CAAC,EAAE,MAAM,CAAC;QAAC,WAAW,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CAC7D;AAED;;8BAE8B;AAC9B,wBAAgB,cAAc,CAAC,MAAM,EAAE,YAAY,GAAG,IAAI,GAAG,aAAa,GAAG,IAAI,CAKhF;AAED,gEAAgE;AAChE,wBAAgB,eAAe,CAAC,OAAO,EAAE,aAAa,GAAG,IAAI,GAAG,OAAO,CAItE;AAGD,MAAM,WAAW,YAAY;IAC3B,MAAM,EAAE,WAAW,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,WAAW,CAAC;IAC3B,+DAA+D;IAC/D,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB;mCAC+B;IAC/B,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,0DAA0D;IAC1D,OAAO,EAAE;QAAE,YAAY,EAAE,MAAM,CAAC;QAAC,aAAa,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI,CAAC;IAChE;iCAC6B;IAC7B,WAAW,EAAE,MAAM,MAAM,CAAC;IAC1B;gCAC4B;IAC5B,WAAW,EAAE,MAAM,CAAC;CACrB;AAED;;mBAEmB;AACnB,wBAAgB,aAAa,CAAC,OAAO,EAAE,YAAY,GAAG,MAAM,CAY3D;AAED;;;GAGG;AACH,wBAAsB,UAAU,CAAC,IAAI,EAAE;IACrC,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,8CAA8C;IAC9C,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,6DAA6D;IAC7D,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,0DAA0D;IAC1D,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,+CAA+C;IAC/C,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,0EAA0E;IAC1E,IAAI,CAAC,EAAE,MAAM,CAAC;IACd;6BACyB;IACzB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB;yCACqC;IACrC,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB;4EACwE;IACxE,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,4DAA4D;IAC5D,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;IACxB;;;gFAG4E;IAC5E,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB;;2EAEuE;IACvE,EAAE,CAAC,EAAE,OAAO,CAAC;IACb,uFAAuF;IACvF,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,MAAM,CAAC,EAAE,UAAU,CAAC,OAAO,iBAAiB,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC;CAC5D,GAAG,OAAO,CAAC,YAAY,CAAC,CAwaxB;AAED;;;;GAIG;AACH,wBAAgB,sBAAsB,CAAC,KAAK,EAAE;IAAE,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAA;CAAE,GAAG,OAAO,CAEpF;AAED;;;;;;GAMG;AACH,wBAAgB,gBAAgB,CAC9B,KAAK,EAAE;IAAE,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAA;CAAE,EACpC,SAAS,EAAE,OAAO,EAClB,gBAAgB,GAAE,OAAc,GAC/B,OAAO,CAET;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,wBAAwB,CACtC,GAAG,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,EAC9B,IAAI,GAAE,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,IAAI,GAAG,KAAK,CAAW,GACjD,MAAM,IAAI,CAqBZ;AAgCD,gEAAgE;AAChE,wBAAsB,QAAQ,CAAC,MAAM,EAAE,UAAU,GAAG,OAAO,CAAC,MAAM,CAAC,CAuVlE"}
|
package/dist/cli/serve.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* `pyric
|
|
2
|
+
* `pyric sandbox` is the local server with the Pyric sandbox standing in for
|
|
3
3
|
* Firebase. Feels like `firebase serve` (banner, labeled lines, port 3473,
|
|
4
4
|
* SIGINT shutdown) with the sandbox-flavored extras firebase can't do: the
|
|
5
5
|
* served page runs an in-browser backend, your `firestore.rules` deploy into
|
|
@@ -10,22 +10,28 @@
|
|
|
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 {
|
|
13
|
+
import { randomBytes } from 'node:crypto';
|
|
14
|
+
import { relative, resolve } from 'node:path';
|
|
15
|
+
import { existsSync, watch as watchFile } from 'node:fs';
|
|
15
16
|
import { readFirebaseJson, readFirebaseRc } from './firebase-json.js';
|
|
16
17
|
import { bundleSdk, bundleWorker, defaultSdkEntries, resolveSiteUiDir } from '../serve/bundler.js';
|
|
17
18
|
import { isStandalone, materializeServeAssets, materializeSiteUi, embeddedWorkerVersion, } from '../serve/standalone-assets.js';
|
|
18
19
|
import { hasSandboxBuildMarker } from '../serve/sandbox-marker.js';
|
|
20
|
+
import { formatBeaconReceipt } from '../serve/beacon-route.js';
|
|
21
|
+
import { formatAiStatusLine } from '../serve/ai-status.js';
|
|
19
22
|
import { injectServeTags } from '../serve/html-injection.js';
|
|
20
23
|
import { formatActivityWarning } from '../serve/activity-warning.js';
|
|
21
24
|
import { consoleServeLogger, startStaticServer, stderrServeLogger } from '../serve/server.js';
|
|
22
25
|
import { createBridgeMount } from '../serve/bridge-mount.js';
|
|
23
26
|
import { openBrowser, shouldAutoOpen } from '../serve/open-browser.js';
|
|
24
|
-
import {
|
|
27
|
+
import { readPyricConfig } from './pyric-config.js';
|
|
28
|
+
import { buildChildEnv, formatStartupEnvExport, registerModuleUrl, resolveSandboxChild, spawnSandboxChild, waitForSandboxPeer, } from './sandbox-runner.js';
|
|
29
|
+
import { reportLaunchChecks, startBeaconWatchdog, } from './sandbox-interlock.js';
|
|
30
|
+
import { scanForInlinedFirebase } from './inlined-sdk-scanner.js';
|
|
25
31
|
import { createFunctionsDevelopmentRuntime, createHttpFunctionsPeerReadiness, } from '../functions-rtdb/development-runtime.js';
|
|
26
32
|
import { discoverFunctionsRtdbProject, } from '../functions-rtdb/project.js';
|
|
27
33
|
import { createSandboxSession, SandboxSeedError, } from '../serve/sandbox-session.js';
|
|
28
|
-
/** Extract the single hosting config `pyric
|
|
34
|
+
/** Extract the single hosting config `pyric sandbox` supports. Arrays
|
|
29
35
|
* (multi-site) take the first entry with a warning — multi-site is out of
|
|
30
36
|
* scope (plan section 6). */
|
|
31
37
|
export function extractHosting(config) {
|
|
@@ -62,12 +68,17 @@ export function serveJsonLine(runtime) {
|
|
|
62
68
|
*/
|
|
63
69
|
export async function startServe(opts) {
|
|
64
70
|
const logger = opts.logger ?? consoleServeLogger();
|
|
71
|
+
// Handshake beacons from pyric-launched children, plus the per-launch secret
|
|
72
|
+
// that authorizes one. Both live here because the route does.
|
|
73
|
+
let beaconsSeen = 0;
|
|
74
|
+
const beaconCount = () => beaconsSeen;
|
|
75
|
+
const beaconToken = randomBytes(24).toString('base64url');
|
|
65
76
|
// --fresh only means anything against the state.json file `--persist`
|
|
66
77
|
// maintains — without `--persist` there is no file to discard, so
|
|
67
78
|
// `--fresh` alone was a silent no-op (nothing happened, nothing said so).
|
|
68
79
|
// Fail fast instead of pretending to reset something.
|
|
69
80
|
if (opts.fresh && !opts.persist) {
|
|
70
|
-
throw new Error('pyric
|
|
81
|
+
throw new Error('pyric sandbox: --fresh requires --persist (it discards .pyric/state/state.json). ' +
|
|
71
82
|
'Browser-stored data is cleared from Studio → Settings → Reset, or DevTools → Clear site data.');
|
|
72
83
|
}
|
|
73
84
|
// firebase.json is optional for serving (firebase-serve parity: warn, then
|
|
@@ -81,9 +92,29 @@ export async function startServe(opts) {
|
|
|
81
92
|
throw e;
|
|
82
93
|
logger.note(' ⚠ no firebase.json found — serving the current directory without hosting config');
|
|
83
94
|
}
|
|
95
|
+
const pyricConfig = await readPyricConfig(opts.cwd);
|
|
96
|
+
if (pyricConfig.rules) {
|
|
97
|
+
if (!config)
|
|
98
|
+
config = {};
|
|
99
|
+
if (typeof pyricConfig.rules === 'string') {
|
|
100
|
+
config.firestore = { ...config.firestore, rules: pyricConfig.rules };
|
|
101
|
+
}
|
|
102
|
+
else {
|
|
103
|
+
if (pyricConfig.rules.firestore) {
|
|
104
|
+
config.firestore = { ...config.firestore, rules: pyricConfig.rules.firestore };
|
|
105
|
+
}
|
|
106
|
+
if (pyricConfig.rules.database) {
|
|
107
|
+
config.database = { ...config.database, rules: pyricConfig.rules.database };
|
|
108
|
+
}
|
|
109
|
+
if (pyricConfig.rules.storage) {
|
|
110
|
+
const baseStorage = typeof config.storage === 'object' && !Array.isArray(config.storage) ? config.storage : {};
|
|
111
|
+
config.storage = { ...baseStorage, rules: pyricConfig.rules.storage };
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
}
|
|
84
115
|
const hosting = extractHosting(config);
|
|
85
116
|
if (Array.isArray(config?.hosting) && config.hosting.length > 1) {
|
|
86
|
-
logger.note(' ⚠ multiple hosting sites configured
|
|
117
|
+
logger.note(' ⚠ multiple hosting sites configured. pyric sandbox serves the first entry only');
|
|
87
118
|
}
|
|
88
119
|
const publicDir = resolve(opts.cwd, hosting?.public ?? '.');
|
|
89
120
|
if (!existsSync(publicDir)) {
|
|
@@ -93,29 +124,29 @@ export async function startServe(opts) {
|
|
|
93
124
|
const looksLikeBuildOutput = /(^|[\\/])(dist|build|out)$/.test(publicDir);
|
|
94
125
|
const hint = looksLikeBuildOutput
|
|
95
126
|
? `\n No build yet? Run \`bun run dev\` for the live sandbox dev server, ` +
|
|
96
|
-
`or \`bun run build\` then \`pyric
|
|
127
|
+
`or \`bun run build\` then \`pyric sandbox\` to preview the production build.`
|
|
97
128
|
: '';
|
|
98
|
-
throw new Error(`pyric
|
|
129
|
+
throw new Error(`pyric sandbox: hosting.public directory does not exist: ${publicDir}${hint}`);
|
|
99
130
|
}
|
|
100
131
|
// The import map can only remap BARE `firebase/*` specifiers. A plain bundler
|
|
101
132
|
// build (`vite build`) inlines the real SDK into the app chunk, leaving
|
|
102
|
-
// nothing to intercept
|
|
133
|
+
// nothing to intercept: the page would then talk to REAL Firebase endpoints
|
|
103
134
|
// with the sandbox's fake credentials while the injected banner claims
|
|
104
|
-
// otherwise. That hole is structural, so `pyric
|
|
135
|
+
// otherwise. That hole is structural, so `pyric sandbox` refuses such a dist
|
|
105
136
|
// rather than serving it. A pyric SANDBOX build (`vite build --mode
|
|
106
137
|
// development`) carries the marker and bundles pyric's in-page adapters, so it
|
|
107
|
-
// is trusted and the scan is skipped (marker present
|
|
138
|
+
// is trusted and the scan is skipped (marker present, no real SDK to find).
|
|
108
139
|
if (!hasSandboxBuildMarker(publicDir)) {
|
|
109
140
|
const inlined = scanForInlinedFirebase(publicDir);
|
|
110
141
|
if (inlined.length > 0) {
|
|
111
|
-
throw new Error(`pyric
|
|
142
|
+
throw new Error(`pyric sandbox: ${inlined[0]} bundles the real Firebase SDK, so this dist cannot be ` +
|
|
112
143
|
`sandboxed — its firebase/* calls would reach LIVE Google endpoints, not the ` +
|
|
113
144
|
`pyric sandbox. Two ways forward:\n` +
|
|
114
|
-
` (a)
|
|
145
|
+
` (a) \`pyric sandbox -- <command>\` runs the child server with the @pyric/cli/vite ` +
|
|
115
146
|
`plugin swaps firebase/* live) — use \`bun run dev\`;\n` +
|
|
116
147
|
` (b) rebuild as a self-contained sandbox bundle and serve THAT: ` +
|
|
117
148
|
`\`vite build --mode development\` (or pyric({ swapInBuild: true })) then ` +
|
|
118
|
-
`\`pyric
|
|
149
|
+
`\`pyric sandbox\`.\n` +
|
|
119
150
|
`A plain \`vite build\` is your production build — deploy it, don't sandbox it.`);
|
|
120
151
|
}
|
|
121
152
|
}
|
|
@@ -189,6 +220,12 @@ export async function startServe(opts) {
|
|
|
189
220
|
studio: opts.ui ? { siteUiDir } : false,
|
|
190
221
|
bridgeUrl: () => mount && origin.port > 0 ? mount.wsUrl(origin) : null,
|
|
191
222
|
activity: (incident) => logger.note(formatActivityWarning(incident)),
|
|
223
|
+
beaconToken,
|
|
224
|
+
beacon: (report) => {
|
|
225
|
+
beaconsSeen += 1;
|
|
226
|
+
logger.note(formatBeaconReceipt(report));
|
|
227
|
+
},
|
|
228
|
+
permissive: opts.permissive,
|
|
192
229
|
logger,
|
|
193
230
|
});
|
|
194
231
|
}
|
|
@@ -196,9 +233,9 @@ export async function startServe(opts) {
|
|
|
196
233
|
bundle.dispose?.();
|
|
197
234
|
if (error instanceof SandboxSeedError) {
|
|
198
235
|
if (error.kind === 'read') {
|
|
199
|
-
throw new Error(`pyric
|
|
236
|
+
throw new Error(`pyric sandbox: failed to read --seed ${error.path}: ${error.detail}`);
|
|
200
237
|
}
|
|
201
|
-
throw new Error(`pyric
|
|
238
|
+
throw new Error(`pyric sandbox: --seed must be a JSON object of "collection/doc" to fields, ${error.detail}`);
|
|
202
239
|
}
|
|
203
240
|
throw error;
|
|
204
241
|
}
|
|
@@ -283,7 +320,7 @@ export async function startServe(opts) {
|
|
|
283
320
|
if (bundle.dispose)
|
|
284
321
|
handle.server.once('close', bundle.dispose);
|
|
285
322
|
handle.server.once('close', () => void closeOwnedResources());
|
|
286
|
-
const uiUrl = siteUiDir ? `${handle.url}/__pyric/ui
|
|
323
|
+
const uiUrl = siteUiDir ? `${handle.url}/__pyric/ui/studio` : null;
|
|
287
324
|
const docsUrl = siteUiDir ? `${handle.url}/__pyric/ui/docs/` : null;
|
|
288
325
|
// Hot-reload: the static adapter observes the filesystem; the session owns
|
|
289
326
|
// read/prepare/last-good replacement and event broadcast.
|
|
@@ -374,7 +411,7 @@ export async function startServe(opts) {
|
|
|
374
411
|
logger.info(session.payload().storageRules
|
|
375
412
|
? `✔ rules ${session.summary.rules.storage.sourcePath} → deployed to the storage sandbox (hash ${session.summary.rules.storage.hash}; ` +
|
|
376
413
|
`edits require a restart — storage rules do not hot-reload)`
|
|
377
|
-
: `• rules no storage.rules — storage sandbox
|
|
414
|
+
: `• rules no storage.rules — storage sandbox denies client operations by default`);
|
|
378
415
|
if (uiUrl) {
|
|
379
416
|
logger.info(`✔ studio Pyric Studio: ${uiUrl}`);
|
|
380
417
|
}
|
|
@@ -384,6 +421,13 @@ export async function startServe(opts) {
|
|
|
384
421
|
if (mount) {
|
|
385
422
|
logger.info(`✔ bridge MCP endpoint: ${mount.mcpUrl(origin)} (sandbox peers over ws at /__pyric/sandbox)`);
|
|
386
423
|
}
|
|
424
|
+
// AI is a mounted service like the bridge: `/__pyric/ai-proxy` answers from
|
|
425
|
+
// the first request on, whether or not anything is configured. `pyric
|
|
426
|
+
// sandbox` has no AI flag, so the ENGINE is always the page's own `getAI()`
|
|
427
|
+
// choice (resolved lazily in the browser, since nothing here instantiates a
|
|
428
|
+
// broker to find out); what this server does decide is where the proxy
|
|
429
|
+
// forwards, and that is what the line reports.
|
|
430
|
+
logger.info(formatAiStatusLine({}));
|
|
387
431
|
let persistSummary = null;
|
|
388
432
|
const persistence = session.summary.persistence;
|
|
389
433
|
if (persistence) {
|
|
@@ -427,7 +471,8 @@ export async function startServe(opts) {
|
|
|
427
471
|
logger.note('');
|
|
428
472
|
logger.note(' ⚠ the pyric sandbox runs IN the served page — keep the browser tab open.');
|
|
429
473
|
logger.note(' Firestore/auth data and persistence stop when no page is open.');
|
|
430
|
-
|
|
474
|
+
const mcpUrl = mount ? mount.mcpUrl(origin) : null;
|
|
475
|
+
return { handle, publicDir, payload, uiUrl, mcpUrl, persist: persistSummary, beaconCount, beaconToken };
|
|
431
476
|
}
|
|
432
477
|
/**
|
|
433
478
|
* `--ui` implies `--bridge` (hybrid-MCP plan Phase 3): a Studio user almost
|
|
@@ -441,7 +486,7 @@ export function bridgeEnabledFromFlags(flags) {
|
|
|
441
486
|
* A dev child also implies the bridge: the runner injects
|
|
442
487
|
* `PYRIC_SANDBOX=remote:<url>` into the child, whose remote client dials the
|
|
443
488
|
* `/__pyric/sandbox` WS — without the bridge mount that upgrade 404s and
|
|
444
|
-
*
|
|
489
|
+
* `pyric sandbox -- <cmd>` breaks its own
|
|
445
490
|
* child. Pure + exported for unit coverage.
|
|
446
491
|
*/
|
|
447
492
|
export function bridgeEnabledFor(flags, childPlan, functionsProject = null) {
|
|
@@ -449,7 +494,7 @@ export function bridgeEnabledFor(flags, childPlan, functionsProject = null) {
|
|
|
449
494
|
}
|
|
450
495
|
/**
|
|
451
496
|
* Process-level last line of defense for the dev server: a single bad
|
|
452
|
-
* request/WS interaction must never take `pyric
|
|
497
|
+
* request/WS interaction must never take `pyric sandbox` down. Node kills the
|
|
453
498
|
* process on an unhandled rejection (default `--unhandled-rejections=throw`
|
|
454
499
|
* since v15) and on any uncaught exception — and the serve process hosts
|
|
455
500
|
* long-lived, browser-driven machinery (WS peers, SSE streams, file watchers,
|
|
@@ -462,11 +507,11 @@ export function bridgeEnabledFor(flags, childPlan, functionsProject = null) {
|
|
|
462
507
|
export function installServeProcessGuard(log, proc = process) {
|
|
463
508
|
const describe = (reason) => reason instanceof Error ? (reason.stack ?? reason.message) : String(reason);
|
|
464
509
|
const onRejection = (reason) => {
|
|
465
|
-
log(` ✖ pyric
|
|
510
|
+
log(` ✖ pyric sandbox: unhandled rejection. The server was kept alive. Please report this:\n` +
|
|
466
511
|
` ${describe(reason).split('\n').join('\n ')}`);
|
|
467
512
|
};
|
|
468
513
|
const onException = (err) => {
|
|
469
|
-
log(` ✖ pyric
|
|
514
|
+
log(` ✖ pyric sandbox: uncaught exception. The server was kept alive. Please report this:\n` +
|
|
470
515
|
` ${describe(err).split('\n').join('\n ')}`);
|
|
471
516
|
};
|
|
472
517
|
proc.on('unhandledRejection', onRejection);
|
|
@@ -476,10 +521,48 @@ export function installServeProcessGuard(log, proc = process) {
|
|
|
476
521
|
proc.off('uncaughtException', onException);
|
|
477
522
|
};
|
|
478
523
|
}
|
|
524
|
+
function resolveServePort(flagPort, configPort) {
|
|
525
|
+
if (typeof flagPort === 'string')
|
|
526
|
+
return Number(flagPort);
|
|
527
|
+
if (typeof flagPort === 'number')
|
|
528
|
+
return flagPort;
|
|
529
|
+
if (typeof configPort === 'number')
|
|
530
|
+
return configPort;
|
|
531
|
+
return 3473;
|
|
532
|
+
}
|
|
533
|
+
function resolveProjectIdentifier(flagProject, envProject, configProject, rcDefault) {
|
|
534
|
+
if (typeof flagProject === 'string' && flagProject.length > 0)
|
|
535
|
+
return flagProject;
|
|
536
|
+
if (typeof envProject === 'string' && envProject.length > 0)
|
|
537
|
+
return envProject;
|
|
538
|
+
if (typeof configProject === 'string' && configProject.length > 0)
|
|
539
|
+
return configProject;
|
|
540
|
+
if (typeof rcDefault === 'string' && rcDefault.length > 0)
|
|
541
|
+
return rcDefault;
|
|
542
|
+
return 'demo-project';
|
|
543
|
+
}
|
|
544
|
+
function resolveExplicitCommand(parsed) {
|
|
545
|
+
if (parsed.passthrough && parsed.passthrough.length > 0) {
|
|
546
|
+
return parsed.passthrough;
|
|
547
|
+
}
|
|
548
|
+
if (parsed.positional.length > 0) {
|
|
549
|
+
return parsed.positional;
|
|
550
|
+
}
|
|
551
|
+
return null;
|
|
552
|
+
}
|
|
479
553
|
/** CLI entry. Resolves on SIGINT/SIGTERM after a clean stop. */
|
|
480
554
|
export async function runServe(parsed) {
|
|
555
|
+
const cwd = process.cwd();
|
|
556
|
+
let pyricConfig = {};
|
|
557
|
+
try {
|
|
558
|
+
pyricConfig = await readPyricConfig(cwd);
|
|
559
|
+
}
|
|
560
|
+
catch (error) {
|
|
561
|
+
process.stderr.write(`${error instanceof Error ? error.message : String(error)}\n`);
|
|
562
|
+
return 2;
|
|
563
|
+
}
|
|
481
564
|
const flagPort = parsed.flags.get('port');
|
|
482
|
-
const port =
|
|
565
|
+
const port = resolveServePort(flagPort, pyricConfig.port);
|
|
483
566
|
if (!Number.isFinite(port) || port < 0 || port > 65535) {
|
|
484
567
|
process.stderr.write(`pyric: invalid --port '${flagPort}'.\n`);
|
|
485
568
|
return 1;
|
|
@@ -488,7 +571,7 @@ export async function runServe(parsed) {
|
|
|
488
571
|
const host = typeof flagHost === 'string' ? flagHost : 'localhost';
|
|
489
572
|
const only = parsed.flags.get('only');
|
|
490
573
|
if (typeof only === 'string' && only !== 'hosting') {
|
|
491
|
-
process.stderr.write(`pyric: --only '${only}' is not supported
|
|
574
|
+
process.stderr.write(`pyric: --only '${only}' is not supported. pyric sandbox serves hosting with the in-page sandbox standing in for Firestore and Auth.\n`);
|
|
492
575
|
return 1;
|
|
493
576
|
}
|
|
494
577
|
const json = Boolean(parsed.flags.get('json'));
|
|
@@ -497,7 +580,6 @@ export async function runServe(parsed) {
|
|
|
497
580
|
// Resolve the child plan BEFORE the server starts: a planned child implies
|
|
498
581
|
// the bridge (see bridgeEnabledFor) — the child's injected PYRIC_SANDBOX
|
|
499
582
|
// is useless without the /__pyric/sandbox WS mount.
|
|
500
|
-
const cwd = process.cwd();
|
|
501
583
|
let functionsProject;
|
|
502
584
|
let functionsProjectId = null;
|
|
503
585
|
try {
|
|
@@ -505,23 +587,19 @@ export async function runServe(parsed) {
|
|
|
505
587
|
if (functionsProject) {
|
|
506
588
|
const flagProject = parsed.flags.get('project');
|
|
507
589
|
const rc = await readFirebaseRc(cwd);
|
|
508
|
-
functionsProjectId =
|
|
509
|
-
(typeof flagProject === 'string' ? flagProject : undefined) ??
|
|
510
|
-
process.env.PYRIC_PROJECT ??
|
|
511
|
-
rc?.projects?.default ??
|
|
512
|
-
'demo-project';
|
|
590
|
+
functionsProjectId = resolveProjectIdentifier(flagProject, process.env.PYRIC_PROJECT, pyricConfig.project, rc?.projects?.default);
|
|
513
591
|
}
|
|
514
592
|
}
|
|
515
593
|
catch (error) {
|
|
516
594
|
process.stderr.write(`${error instanceof Error ? error.message : String(error)}\n`);
|
|
517
595
|
return 2;
|
|
518
596
|
}
|
|
519
|
-
const
|
|
520
|
-
|
|
597
|
+
const explicitCommand = resolveExplicitCommand(parsed);
|
|
598
|
+
const plan = resolveSandboxChild({
|
|
599
|
+
explicitCommand,
|
|
600
|
+
configCommand: pyricConfig.command,
|
|
521
601
|
noRun: Boolean(parsed.flags.get('no-run')),
|
|
522
602
|
json,
|
|
523
|
-
devScript: readDevScript(cwd),
|
|
524
|
-
packageManager: detectPackageManager(cwd),
|
|
525
603
|
});
|
|
526
604
|
const bridgeOn = bridgeEnabledFor(parsed.flags, plan, functionsProject);
|
|
527
605
|
let runtime;
|
|
@@ -537,6 +615,7 @@ export async function runServe(parsed) {
|
|
|
537
615
|
watch: parsed.flags.get('no-watch') ? false : undefined,
|
|
538
616
|
persist: Boolean(parsed.flags.get('persist')),
|
|
539
617
|
fresh: Boolean(parsed.flags.get('fresh')),
|
|
618
|
+
permissive: Boolean(parsed.flags.get('permissive')),
|
|
540
619
|
// --ui mounts the Pyric Studio storage routes (workspace + projects).
|
|
541
620
|
ui: uiOn,
|
|
542
621
|
// --no-capture disables the default-on session capture. The pattern
|
|
@@ -547,7 +626,7 @@ export async function runServe(parsed) {
|
|
|
547
626
|
: undefined,
|
|
548
627
|
project: typeof parsed.flags.get('project') === 'string'
|
|
549
628
|
? parsed.flags.get('project')
|
|
550
|
-
: process.env.PYRIC_PROJECT ?? functionsProjectId ?? undefined,
|
|
629
|
+
: process.env.PYRIC_PROJECT ?? pyricConfig.project ?? functionsProjectId ?? undefined,
|
|
551
630
|
});
|
|
552
631
|
}
|
|
553
632
|
catch (e) {
|
|
@@ -562,7 +641,7 @@ export async function runServe(parsed) {
|
|
|
562
641
|
// (the banner went to stderr). Readiness probe: GET /__pyric/init.json.
|
|
563
642
|
if (json)
|
|
564
643
|
process.stdout.write(serveJsonLine(runtime) + '\n');
|
|
565
|
-
//
|
|
644
|
+
// A host-only sandbox mounts no MCP bridge unless one is needed.
|
|
566
645
|
// so a `pyric mcp-proxy` in an editor cannot attach. Nudge toward --bridge.
|
|
567
646
|
if (!bridgeOn && !json) {
|
|
568
647
|
process.stderr.write(' tip MCP? re-run with --bridge so an editor (Cursor / Claude / Antigravity) can attach via `pyric mcp-proxy`.\n');
|
|
@@ -582,6 +661,7 @@ export async function runServe(parsed) {
|
|
|
582
661
|
void openBrowser(targetUrl);
|
|
583
662
|
}
|
|
584
663
|
let devChild = null;
|
|
664
|
+
let beaconWatchdog = null;
|
|
585
665
|
let functionsRuntime = null;
|
|
586
666
|
let resolveFunctionsExit;
|
|
587
667
|
const functionsExited = new Promise((resolve) => { resolveFunctionsExit = resolve; });
|
|
@@ -603,6 +683,7 @@ export async function runServe(parsed) {
|
|
|
603
683
|
]);
|
|
604
684
|
const stopAfterSignal = async () => {
|
|
605
685
|
(json ? process.stderr : process.stdout).write('\nShutting down...\n');
|
|
686
|
+
beaconWatchdog?.stop();
|
|
606
687
|
if (devChild && devChild.child.exitCode === null)
|
|
607
688
|
devChild.signal(await signal);
|
|
608
689
|
await functionsRuntime?.close().catch(() => undefined);
|
|
@@ -645,6 +726,7 @@ export async function runServe(parsed) {
|
|
|
645
726
|
baseEnv: process.env,
|
|
646
727
|
serveUrl: runtime.handle.url,
|
|
647
728
|
registerUrl: registerModuleUrl(),
|
|
729
|
+
beaconToken: runtime.beaconToken,
|
|
648
730
|
instance: `${functionsProjectId}-default-rtdb`,
|
|
649
731
|
location: process.env.PYRIC_FUNCTIONS_RTDB_REGION ?? 'us-central1',
|
|
650
732
|
projectId: functionsProjectId ?? 'demo-project',
|
|
@@ -657,7 +739,7 @@ export async function runServe(parsed) {
|
|
|
657
739
|
const result = startOutcome.value;
|
|
658
740
|
if (result.kind === 'no-peer') {
|
|
659
741
|
process.stderr.write(` ⚠ functions not started — no browser tab connected after 30s. ` +
|
|
660
|
-
`Open ${runtime.handle.url} and restart pyric
|
|
742
|
+
`Open ${runtime.handle.url} and restart pyric sandbox.\n`);
|
|
661
743
|
}
|
|
662
744
|
else if (result.kind === 'failed') {
|
|
663
745
|
process.stderr.write(`${result.error.message}\n`);
|
|
@@ -672,14 +754,13 @@ export async function runServe(parsed) {
|
|
|
672
754
|
`from ${relative(cwd, functionsProject.entry)}\n`);
|
|
673
755
|
for (const unsupported of ready.unsupportedTriggers) {
|
|
674
756
|
process.stderr.write(` ⚠ functions export ${unsupported.exportName} uses unsupported trigger ` +
|
|
675
|
-
`${unsupported.eventType}; it will not run in pyric
|
|
757
|
+
`${unsupported.eventType}; it will not run in pyric sandbox.\n`);
|
|
676
758
|
}
|
|
677
759
|
}
|
|
678
760
|
}
|
|
679
|
-
//
|
|
680
|
-
//
|
|
681
|
-
//
|
|
682
|
-
// host-only; --json defaults to host-only (explicit `--` still wins).
|
|
761
|
+
// Run the explicit or configured command with the sandbox environment.
|
|
762
|
+
// `--no-run` forces host-only. `--json` skips the configured command, but an
|
|
763
|
+
// explicit command still runs.
|
|
683
764
|
// (`plan` was resolved above so it could imply the bridge mount.)
|
|
684
765
|
if (plan) {
|
|
685
766
|
const info = json ? process.stderr : process.stdout;
|
|
@@ -698,20 +779,41 @@ export async function runServe(parsed) {
|
|
|
698
779
|
info.write(` ⚠ no browser tab connected after 30s — starting your command anyway; sandbox ops will fail until ${runtime.handle.url} is open.\n`);
|
|
699
780
|
}
|
|
700
781
|
}
|
|
782
|
+
else if (!json) {
|
|
783
|
+
info.write(` ⓘ Auto-open is disabled (--no-open/CI). The pyric sandbox is browser-resident: ` +
|
|
784
|
+
`open ${runtime.handle.url} to connect if your command performs Firebase operations.\n`);
|
|
785
|
+
}
|
|
701
786
|
info.write(`✔ run \`${plan.label}\` — firebase-admin/firebase imports are routed to the sandbox at ${runtime.handle.url}\n`);
|
|
702
|
-
|
|
703
|
-
|
|
704
|
-
|
|
705
|
-
|
|
706
|
-
|
|
707
|
-
|
|
708
|
-
|
|
787
|
+
const childEnv = buildChildEnv(process.env, {
|
|
788
|
+
serveUrl: runtime.handle.url,
|
|
789
|
+
registerUrl: registerModuleUrl(),
|
|
790
|
+
beaconToken: runtime.beaconToken,
|
|
791
|
+
});
|
|
792
|
+
// What we are handing the child, stated before it starts: the interlock
|
|
793
|
+
// line and the unsupported-runtime check.
|
|
794
|
+
const interlock = reportLaunchChecks({
|
|
795
|
+
childEnv,
|
|
796
|
+
registerUrl: registerModuleUrl(),
|
|
797
|
+
argv: plan.argv,
|
|
798
|
+
write: (line) => info.write(line),
|
|
799
|
+
});
|
|
800
|
+
devChild = spawnSandboxChild(plan, { cwd, json, env: childEnv });
|
|
801
|
+
// A child still alive well after launch that never posted a beacon is very
|
|
802
|
+
// likely not intercepted. `startBeaconWatchdog` says why this only warns.
|
|
803
|
+
const beaconsAtSpawn = runtime.beaconCount();
|
|
804
|
+
beaconWatchdog = startBeaconWatchdog({
|
|
805
|
+
label: plan.label,
|
|
806
|
+
beacon: interlock.beacon,
|
|
807
|
+
sawBeacon: () => runtime.beaconCount() > beaconsAtSpawn,
|
|
808
|
+
isAlive: () => devChild !== null && devChild.child.exitCode === null,
|
|
809
|
+
warn: (line) => void process.stderr.write(`${line}\n`),
|
|
709
810
|
});
|
|
710
811
|
}
|
|
711
812
|
else if (!json) {
|
|
712
813
|
process.stdout.write(formatStartupEnvExport({
|
|
713
814
|
serveUrl: runtime.handle.url,
|
|
714
815
|
registerUrl: registerModuleUrl(),
|
|
816
|
+
beaconToken: runtime.beaconToken,
|
|
715
817
|
}));
|
|
716
818
|
}
|
|
717
819
|
return await new Promise((resolveExit) => {
|
|
@@ -722,6 +824,7 @@ export async function runServe(parsed) {
|
|
|
722
824
|
return;
|
|
723
825
|
settled = true;
|
|
724
826
|
void (async () => {
|
|
827
|
+
beaconWatchdog?.stop();
|
|
725
828
|
await functionsRuntime?.close().catch(() => undefined);
|
|
726
829
|
if (devChild && devChild.child.exitCode === null) {
|
|
727
830
|
devChild.signal('SIGTERM');
|
|
@@ -754,7 +857,7 @@ export async function runServe(parsed) {
|
|
|
754
857
|
if (functionsRuntime) {
|
|
755
858
|
void functionsExited.then((code) => {
|
|
756
859
|
if (!settled && !shuttingDown) {
|
|
757
|
-
process.stderr.write(`pyric
|
|
860
|
+
process.stderr.write(`pyric sandbox: Functions child exited unexpectedly (code ${code}).\n`);
|
|
758
861
|
finish(code === 0 ? 1 : code);
|
|
759
862
|
}
|
|
760
863
|
});
|
|
@@ -762,68 +865,4 @@ export async function runServe(parsed) {
|
|
|
762
865
|
void signal.then(shutdown);
|
|
763
866
|
});
|
|
764
867
|
}
|
|
765
|
-
/**
|
|
766
|
-
* Detect a bundler build that INLINED the real firebase SDK into its served
|
|
767
|
-
* assets (`vite build` output). The served import map remaps only bare
|
|
768
|
-
* `firebase/*` specifiers, so such a build cannot be sandboxed — its calls
|
|
769
|
-
* reach real Google endpoints. Fingerprints are real-SDK-only endpoint hosts
|
|
770
|
-
* that never appear in a sandbox-clean app (whose calls all route to
|
|
771
|
-
* `/__pyric/*`). Bounded: depth ≤ 4, ≤ 200 script files, first hit per file.
|
|
772
|
-
* Returns publicDir-relative paths of offending assets.
|
|
773
|
-
*/
|
|
774
|
-
export function scanForInlinedFirebase(dir) {
|
|
775
|
-
const FINGERPRINTS = [
|
|
776
|
-
'identitytoolkit.googleapis.com',
|
|
777
|
-
'firestore.googleapis.com',
|
|
778
|
-
'securetoken.googleapis.com',
|
|
779
|
-
'firebasedatabase.app',
|
|
780
|
-
];
|
|
781
|
-
const hits = [];
|
|
782
|
-
let scanned = 0;
|
|
783
|
-
const walk = (d, rel, depth) => {
|
|
784
|
-
if (depth > 4 || scanned >= 200)
|
|
785
|
-
return;
|
|
786
|
-
let names;
|
|
787
|
-
try {
|
|
788
|
-
names = readdirSync(d);
|
|
789
|
-
}
|
|
790
|
-
catch {
|
|
791
|
-
return;
|
|
792
|
-
}
|
|
793
|
-
for (const name of names) {
|
|
794
|
-
if (scanned >= 200)
|
|
795
|
-
return;
|
|
796
|
-
const p = join(d, name);
|
|
797
|
-
const r = rel ? `${rel}/${name}` : name;
|
|
798
|
-
let st;
|
|
799
|
-
try {
|
|
800
|
-
st = statSync(p);
|
|
801
|
-
}
|
|
802
|
-
catch {
|
|
803
|
-
continue;
|
|
804
|
-
}
|
|
805
|
-
if (st.isDirectory()) {
|
|
806
|
-
// The pyric namespace itself never lands in hosting.public, but a
|
|
807
|
-
// node_modules inside a served dir would be a scan-cost trap.
|
|
808
|
-
// Dot-directories (.next, .git, .pyric) are internal caches and must be ignored.
|
|
809
|
-
if (name === 'node_modules' || name.startsWith('.'))
|
|
810
|
-
continue;
|
|
811
|
-
walk(p, r, depth + 1);
|
|
812
|
-
}
|
|
813
|
-
else if (/\.(js|mjs)$/.test(name)) {
|
|
814
|
-
scanned++;
|
|
815
|
-
try {
|
|
816
|
-
const text = readFileSync(p, 'utf8');
|
|
817
|
-
if (FINGERPRINTS.some((f) => text.includes(f)))
|
|
818
|
-
hits.push(r);
|
|
819
|
-
}
|
|
820
|
-
catch {
|
|
821
|
-
// unreadable asset: skip
|
|
822
|
-
}
|
|
823
|
-
}
|
|
824
|
-
}
|
|
825
|
-
};
|
|
826
|
-
walk(dir, '', 0);
|
|
827
|
-
return hits;
|
|
828
|
-
}
|
|
829
868
|
//# sourceMappingURL=serve.js.map
|