@pyric/cli 0.1.0-alpha.20 → 0.1.0-alpha.22
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 +238 -1
- package/dist/assurance/.generated/conformance-verdicts.d.ts.map +1 -1
- package/dist/assurance/.generated/conformance-verdicts.js +238 -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/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/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/sandbox-runner.d.ts +20 -12
- package/dist/cli/sandbox-runner.d.ts.map +1 -1
- package/dist/cli/sandbox-runner.js +24 -21
- package/dist/cli/sandbox-runner.js.map +1 -1
- package/dist/cli/serve.d.ts +6 -10
- package/dist/cli/serve.d.ts.map +1 -1
- package/dist/cli/serve.js +57 -77
- package/dist/cli/serve.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/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 +1 -0
- package/dist/functions-rtdb/development-runtime.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/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/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/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/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 +28 -2
- package/dist/serve/entries/auth-helper-dom.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/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/runtime.d.ts.map +1 -1
- package/dist/serve/entries/runtime.js +9 -0
- package/dist/serve/entries/runtime.js.map +1 -1
- package/dist/serve/namespace.d.ts +14 -5
- package/dist/serve/namespace.d.ts.map +1 -1
- package/dist/serve/namespace.js +57 -124
- package/dist/serve/namespace.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 +118 -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/sandbox-session.d.ts +7 -0
- package/dist/serve/sandbox-session.d.ts.map +1 -1
- package/dist/serve/sandbox-session.js +2 -0
- package/dist/serve/sandbox-session.js.map +1 -1
- package/dist/serve/site-ui/_astro/{RulesCodeEditor.XtDmHOlN.js → RulesCodeEditor.DsTAsKIa.js} +1 -1
- package/dist/serve/site-ui/_astro/app.CMmTxyhL.js +1 -0
- package/dist/serve/site-ui/_astro/app.DhALsVii.js +115 -0
- package/dist/serve/site-ui/_astro/{chess-showcase.B72XYeoh.js → chess-showcase.Bn_pP6UJ.js} +2 -2
- package/dist/serve/site-ui/_astro/{example-runtime.C25_lx6Z.js → example-runtime.CXopTGv7.js} +1 -1
- package/dist/serve/site-ui/_astro/sandbox-controls.rOuZTOUG.js +510 -0
- package/dist/serve/site-ui/_astro/{seed.Co0yUJY5.js → seed.lywYbXZ0.js} +2 -2
- package/dist/serve/site-ui/_astro/writes.BsPBG3dp.js +653 -0
- package/dist/serve/site-ui/auth/index.html +1 -1
- package/dist/serve/site-ui/docs/_rhythm/index.html +1 -1
- package/dist/serve/site-ui/docs/agent/set-up-your-agent/index.html +1 -1
- package/dist/serve/site-ui/docs/agent/watch-and-review/index.html +1 -1
- package/dist/serve/site-ui/docs/agent/work-with-an-agent/index.html +1 -1
- package/dist/serve/site-ui/docs/ai-compat/index.html +1 -1
- package/dist/serve/site-ui/docs/api-reference/index.html +8 -1
- package/dist/serve/site-ui/docs/api-reference.md +7 -0
- package/dist/serve/site-ui/docs/app-compat/index.html +1 -1
- package/dist/serve/site-ui/docs/auth-compat/index.html +3 -3
- package/dist/serve/site-ui/docs/auth-compat.md +2 -2
- package/dist/serve/site-ui/docs/build/ai-logic/index.html +6 -1
- package/dist/serve/site-ui/docs/build/ai-logic.md +6 -0
- package/dist/serve/site-ui/docs/build/authentication/index.html +2 -2
- package/dist/serve/site-ui/docs/build/authentication.md +1 -1
- package/dist/serve/site-ui/docs/build/cloud-firestore/index.html +4 -2
- package/dist/serve/site-ui/docs/build/cloud-firestore.md +4 -0
- package/dist/serve/site-ui/docs/build/cloud-messaging/index.html +1 -1
- package/dist/serve/site-ui/docs/build/cloud-storage/index.html +1 -1
- package/dist/serve/site-ui/docs/build/realtime-database/index.html +1 -1
- package/dist/serve/site-ui/docs/conformance-scores/index.html +14 -2
- package/dist/serve/site-ui/docs/conformance-scores.md +13 -1
- package/dist/serve/site-ui/docs/create-pyric-reference-api/index.html +1 -1
- package/dist/serve/site-ui/docs/database-compat/index.html +44 -44
- package/dist/serve/site-ui/docs/database-compat.md +43 -43
- package/dist/serve/site-ui/docs/examples/chess/index.html +1 -1
- package/dist/serve/site-ui/docs/examples/index.html +1 -1
- package/dist/serve/site-ui/docs/firestore-compat/index.html +4 -4
- 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/firestore-kotlin-compat/index.html +319 -0
- package/dist/serve/site-ui/docs/firestore-kotlin-compat.md +344 -0
- package/dist/serve/site-ui/docs/firestore-swift-compat/index.html +490 -0
- package/dist/serve/site-ui/docs/firestore-swift-compat.md +517 -0
- package/dist/serve/site-ui/docs/functions-rtdb-compat/index.html +1 -1
- 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/flutter/index.html +98 -0
- package/dist/serve/site-ui/docs/get-started/flutter.md +105 -0
- package/dist/serve/site-ui/docs/get-started/how-the-swap-works/index.html +1 -1
- package/dist/serve/site-ui/docs/get-started/nextjs/index.html +1 -1
- package/dist/serve/site-ui/docs/get-started/start-building/index.html +1 -1
- package/dist/serve/site-ui/docs/get-started/vite/index.html +1 -1
- package/dist/serve/site-ui/docs/index.json +3211 -1471
- package/dist/serve/site-ui/docs/messaging-compat/index.html +1 -1
- package/dist/serve/site-ui/docs/observe/resolve-runtime-status/index.html +4 -3
- package/dist/serve/site-ui/docs/observe/resolve-runtime-status.md +3 -1
- package/dist/serve/site-ui/docs/observe/see-whats-happening/index.html +1 -1
- package/dist/serve/site-ui/docs/observe/shape-your-data/index.html +1 -1
- package/dist/serve/site-ui/docs/observe/switch-and-impersonate-identities/index.html +110 -0
- package/dist/serve/site-ui/docs/observe/switch-and-impersonate-identities.md +134 -0
- package/dist/serve/site-ui/docs/overview/index.html +1 -1
- package/dist/serve/site-ui/docs/pyric-admin-app-reference-api/index.html +1 -1
- package/dist/serve/site-ui/docs/pyric-admin-auth-reference-api/index.html +1 -1
- package/dist/serve/site-ui/docs/pyric-admin-database-reference-api/index.html +1 -1
- package/dist/serve/site-ui/docs/pyric-admin-firestore-reference-api/index.html +1 -1
- package/dist/serve/site-ui/docs/pyric-admin-messaging-reference-api/index.html +1 -1
- package/dist/serve/site-ui/docs/pyric-admin-reference-api/index.html +1 -1
- package/dist/serve/site-ui/docs/pyric-admin-storage-reference-api/index.html +1 -1
- package/dist/serve/site-ui/docs/pyric-ai-reference-api/index.html +1 -1
- package/dist/serve/site-ui/docs/pyric-ai-scripting-reference-api/index.html +1 -1
- 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 +1 -1
- package/dist/serve/site-ui/docs/pyric-auth-reference-api/index.html +6 -2
- 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 +1 -1
- package/dist/serve/site-ui/docs/pyric-cli-assurance-reference-api/index.html +1 -1
- package/dist/serve/site-ui/docs/pyric-cli-bridge-client-reference-api/index.html +2 -2
- 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 +1 -1
- 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 +4 -1
- package/dist/serve/site-ui/docs/pyric-cli-conformance-browser-reference-api.md +3 -0
- package/dist/serve/site-ui/docs/pyric-cli-conformance-docs-reference-api/index.html +1 -1
- package/dist/serve/site-ui/docs/pyric-cli-conformance-reference-api/index.html +4 -1
- package/dist/serve/site-ui/docs/pyric-cli-conformance-reference-api.md +3 -0
- package/dist/serve/site-ui/docs/pyric-cli-credentials-node-reference-api/index.html +1 -1
- package/dist/serve/site-ui/docs/pyric-cli-discover-reference-api/index.html +1 -1
- package/dist/serve/site-ui/docs/pyric-cli-next-reference-api/index.html +2 -2
- 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 +1 -1
- package/dist/serve/site-ui/docs/pyric-cli-register-reference-api/index.html +1 -1
- package/dist/serve/site-ui/docs/pyric-cli-remote-reference-api/index.html +34 -9
- package/dist/serve/site-ui/docs/pyric-cli-remote-reference-api.md +16 -8
- package/dist/serve/site-ui/docs/pyric-cli-serve-worker-reference-api/index.html +133 -93
- 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 +2 -2
- 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 +2 -2
- 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 +2 -2
- package/dist/serve/site-ui/docs/pyric-database-reference-api.md +1 -1
- 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 +40 -11
- 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 +1 -1
- package/dist/serve/site-ui/docs/pyric-messaging-sw-reference-api/index.html +1 -1
- 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 +1 -1
- package/dist/serve/site-ui/docs/pyric-sandbox-database-reference-api/index.html +52 -17
- 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 +1 -1
- package/dist/serve/site-ui/docs/pyric-sandbox-reference-api/index.html +239 -49
- 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 +22 -4
- package/dist/serve/site-ui/docs/pyric-storage-reference-api.md +25 -3
- package/dist/serve/site-ui/docs/pyric-ui-agents-reference-api/index.html +26 -96
- 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 +1 -1
- package/dist/serve/site-ui/docs/pyric-ui-auth-reference-api/index.html +2 -2
- 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 +1 -1
- package/dist/serve/site-ui/docs/pyric-ui-events-reference-api/index.html +1 -1
- package/dist/serve/site-ui/docs/pyric-ui-firestore-hooks-reference-api/index.html +1 -1
- package/dist/serve/site-ui/docs/pyric-ui-firestore-reference-api/index.html +2 -2
- 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 +124 -26
- 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 +1 -1
- package/dist/serve/site-ui/docs/pyric-ui-rules-hooks-reference-api/index.html +1 -1
- package/dist/serve/site-ui/docs/pyric-ui-rules-reference-api/index.html +1 -1
- package/dist/serve/site-ui/docs/pyric-ui-storage-hooks-reference-api/index.html +1 -1
- package/dist/serve/site-ui/docs/pyric-ui-storage-reference-api/index.html +4 -5
- 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 +1 -1
- package/dist/serve/site-ui/docs/pyric-ui-traffic-reference-api/index.html +1 -1
- package/dist/serve/site-ui/docs/reference/cli/index.html +6 -3
- package/dist/serve/site-ui/docs/reference/cli.md +8 -2
- package/dist/serve/site-ui/docs/rules-compat/index.html +10 -2
- package/dist/serve/site-ui/docs/rules-compat.md +9 -1
- package/dist/serve/site-ui/docs/secure/audit-your-rules/index.html +1 -1
- package/dist/serve/site-ui/docs/secure/firestore-rules-limits/index.html +1 -1
- package/dist/serve/site-ui/docs/secure/read-a-denial/index.html +1 -1
- package/dist/serve/site-ui/docs/secure/rtdb-rules-in-typescript/index.html +1 -1
- package/dist/serve/site-ui/docs/secure/rules-standard-library/index.html +1 -1
- package/dist/serve/site-ui/docs/secure/secure-it-with-rules/index.html +1 -1
- package/dist/serve/site-ui/docs/secure/simulate-and-lint/index.html +1 -1
- package/dist/serve/site-ui/docs/secure/write-a-rules-test-suite/index.html +1 -1
- package/dist/serve/site-ui/docs/ship/ship-to-production/index.html +1 -1
- package/dist/serve/site-ui/docs/ship/test-in-node/index.html +1 -1
- package/dist/serve/site-ui/docs/storage-compat/index.html +13 -13
- 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 +1 -1
- package/dist/serve/site-ui/docs/trust/rules-standard-library/index.html +1 -1
- package/dist/serve/site-ui/docs/trust/versioning-and-compatibility/index.html +1 -1
- package/dist/serve/site-ui/docs/tutorial/index.html +1 -1
- package/dist/serve/site-ui/examples/chess/index.html +1 -1
- package/dist/serve/site-ui/firestore/index.html +1 -1
- package/dist/serve/site-ui/llms.txt +13 -0
- package/dist/serve/site-ui/rtdb/index.html +1 -1
- package/dist/serve/site-ui/settings/index.html +1 -1
- package/dist/serve/site-ui/storage/index.html +1 -1
- package/dist/serve/site-ui/studio/index.html +1 -1
- package/dist/serve/site-ui/traffic/index.html +1 -1
- 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/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.map +1 -1
- package/dist/serve/vite-sandbox-generation.js +12 -0
- 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.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-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/serve-init.d.ts.map +1 -1
- package/dist/serve/worker/serve-init.js +8 -2
- package/dist/serve/worker/serve-init.js.map +1 -1
- package/dist/verify/fixture.d.ts +1 -1
- package/package.json +16 -5
- package/src/assurance/.generated/conformance-verdicts.ts +238 -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 +0 -44
- package/src/cli/inlined-sdk-scanner.ts +77 -0
- package/src/cli/sandbox-interlock.ts +167 -0
- package/src/cli/sandbox-runner.ts +37 -26
- package/src/cli/serve.ts +68 -69
- package/src/cli/unsupported-runtime.ts +68 -0
- 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 +4 -0
- package/src/google-endpoints.ts +155 -0
- 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/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/entries/active-auth-registry.ts +56 -0
- package/src/serve/entries/active-auth.ts +100 -0
- package/src/serve/entries/auth-helper-core.ts +5 -0
- package/src/serve/entries/auth-helper-dom.ts +26 -2
- package/src/serve/entries/auth.ts +8 -0
- package/src/serve/entries/bridge-url.ts +1 -1
- package/src/serve/entries/init.ts +78 -3
- package/src/serve/entries/runtime.ts +10 -0
- package/src/serve/namespace.ts +73 -140
- 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 +140 -15
- package/src/serve/runtime/identity.ts +26 -0
- package/src/serve/sandbox-session.ts +9 -0
- package/src/serve/studio/disk-workspace.ts +76 -2
- package/src/serve/vite-plugin.ts +8 -8
- package/src/serve/vite-sandbox-generation.ts +15 -0
- package/src/serve/worker/client/auth.ts +1 -1
- package/src/serve/worker/client/core.ts +80 -3
- 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-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/serve-init.ts +9 -2
- package/src/verify/fixture.ts +1 -1
- package/dist/serve/site-ui/_astro/app.B52xr-DK.js +0 -1
- package/dist/serve/site-ui/_astro/app.DWBraPUw.js +0 -12
- package/dist/serve/site-ui/_astro/sandbox-controls.DEpnKg-O.js +0 -1169
- package/dist/serve/site-ui/_astro/writes.rpjrFzmu.js +0 -102
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The interlock: the launcher's statement about interception in the child it
|
|
3
|
+
* is about to start, plus the warn-only watchdog for the child's answer.
|
|
4
|
+
*
|
|
5
|
+
* The status line is knowable synchronously from the env `pyric sandbox` just
|
|
6
|
+
* assembled: guard mode, whether NODE_OPTIONS really carries the register
|
|
7
|
+
* import, and where the child's handshake beacon will land. The watchdog is
|
|
8
|
+
* the other half: a child still alive well after launch that never posted a
|
|
9
|
+
* beacon is probably not intercepted.
|
|
10
|
+
*/
|
|
11
|
+
import { beaconEndpoint } from '../register/beacon.js';
|
|
12
|
+
import { parseGuardMode } from '../register/net-guard.js';
|
|
13
|
+
import { detectUnsupportedRuntime, formatUnsupportedRuntimeWarning } from './unsupported-runtime.js';
|
|
14
|
+
/**
|
|
15
|
+
* Read the interlock off the child env. Everything here is synchronous by
|
|
16
|
+
* construction: it is a statement about the launch, printed before anything at
|
|
17
|
+
* runtime has had a chance to go wrong.
|
|
18
|
+
*/
|
|
19
|
+
export function describeInterlock(childEnv, registerUrl) {
|
|
20
|
+
return {
|
|
21
|
+
guard: parseGuardMode(childEnv.PYRIC_GUARD),
|
|
22
|
+
registerImported: (childEnv.NODE_OPTIONS ?? '').includes(`--import ${registerUrl}`),
|
|
23
|
+
beacon: beaconEndpoint(childEnv.PYRIC_SANDBOX),
|
|
24
|
+
};
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* The startup status line, alongside the other `✔ <service>` checks.
|
|
28
|
+
*
|
|
29
|
+
* The healthy line is deliberately short: one fact per field and nothing the
|
|
30
|
+
* reader has to skim past. The degraded line is long because it reports a
|
|
31
|
+
* broken launch, which is worth every word.
|
|
32
|
+
*/
|
|
33
|
+
export function formatInterlockLine(status) {
|
|
34
|
+
if (!status.registerImported) {
|
|
35
|
+
return (`⚠ interlock guard=${status.guard}, register is NOT in the child's NODE_OPTIONS. ` +
|
|
36
|
+
`Its firebase-admin/firebase imports will NOT be rewritten and would reach LIVE Firebase.\n`);
|
|
37
|
+
}
|
|
38
|
+
return `✔ interlock guard=${status.guard}, register loaded via NODE_OPTIONS\n`;
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Every statement the launcher makes about the child, printed in one block
|
|
42
|
+
* before the spawn, and the interlock status it derived on the way.
|
|
43
|
+
*
|
|
44
|
+
* Two checks: the interlock status line, from the env alone, and the
|
|
45
|
+
* unsupported-runtime warning for the other way interception can be absent, a
|
|
46
|
+
* child runtime that never evaluates Node loader hooks at all.
|
|
47
|
+
*/
|
|
48
|
+
export function reportLaunchChecks(opts) {
|
|
49
|
+
const interlock = describeInterlock(opts.childEnv, opts.registerUrl);
|
|
50
|
+
opts.write(formatInterlockLine(interlock));
|
|
51
|
+
const unsupportedRuntime = detectUnsupportedRuntime(opts.argv);
|
|
52
|
+
if (unsupportedRuntime !== null)
|
|
53
|
+
opts.write(formatUnsupportedRuntimeWarning(unsupportedRuntime));
|
|
54
|
+
return interlock;
|
|
55
|
+
}
|
|
56
|
+
/** How long a child may live without its beacon before we say something. */
|
|
57
|
+
const BEACON_GRACE_MS = 15_000;
|
|
58
|
+
/** The warning itself: one paragraph naming what the silence means and what
|
|
59
|
+
* to check. Kept separate so its exact wording is testable. */
|
|
60
|
+
export function formatMissingBeaconWarning(opts) {
|
|
61
|
+
const seconds = Math.round(opts.graceMs / 1000);
|
|
62
|
+
return (` ⚠ interlock: \`${opts.label}\` has been running ${seconds}s without posting a register ` +
|
|
63
|
+
`beacon to ${opts.beacon}. Its firebase-admin/firebase imports are probably NOT routed to ` +
|
|
64
|
+
`the pyric sandbox, which means they would reach LIVE Firebase. Check that the command starts ` +
|
|
65
|
+
`a Node process (bun and deno do not evaluate Node loader hooks), that it does not overwrite ` +
|
|
66
|
+
`NODE_OPTIONS, and that NODE_ENV is not production. Warning only: nothing was blocked, and ` +
|
|
67
|
+
`this is reported once per child.`);
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* The warn-only interlock watchdog.
|
|
71
|
+
*
|
|
72
|
+
* It never kills the child and never blocks a request. The reason is the
|
|
73
|
+
* signal's own honesty: beacon delivery is best-effort (see
|
|
74
|
+
* `register/beacon.ts`), and a plausible silent child is not the same thing as
|
|
75
|
+
* a broken one. A short-lived script that exits before its POST lands, a child
|
|
76
|
+
* that reaches the sandbox only through a grandchild, a dev server slow to
|
|
77
|
+
* boot: each would be killed by a fail-closed version of this check, and each
|
|
78
|
+
* is fine.
|
|
79
|
+
*
|
|
80
|
+
* So the heuristic is the simple, attributable one: the child is still alive
|
|
81
|
+
* `graceMs` after launch and no beacon has arrived. Both halves matter. An
|
|
82
|
+
* exited child was never expected to say anything, and a child whose beacon
|
|
83
|
+
* landed has already proved the point. One warning per child, guaranteed by
|
|
84
|
+
* the one-shot timer; the timer is unref'd so a watchdog can never be the
|
|
85
|
+
* reason a process stays up.
|
|
86
|
+
*
|
|
87
|
+
* `sawBeacon` is a count delta rather than a pid match, deliberately. The
|
|
88
|
+
* process that loads register is often a grandchild (`npm run dev` starts
|
|
89
|
+
* node, `next dev` starts its worker), so the spawned child's own pid is
|
|
90
|
+
* frequently not the pid in the beacon, and matching on it would warn about
|
|
91
|
+
* perfectly healthy launches. The delta's known imprecision runs the other
|
|
92
|
+
* way: a sibling runtime's beacon that lands inside the grace window can mask
|
|
93
|
+
* a real miss. Erring toward silence is the right bias for a warn-only check.
|
|
94
|
+
*/
|
|
95
|
+
export function startBeaconWatchdog(opts) {
|
|
96
|
+
const beacon = opts.beacon;
|
|
97
|
+
if (beacon === null)
|
|
98
|
+
return { stop: () => { } };
|
|
99
|
+
const graceMs = opts.graceMs ?? BEACON_GRACE_MS;
|
|
100
|
+
const timer = setTimeout(() => {
|
|
101
|
+
if (opts.sawBeacon() || !opts.isAlive())
|
|
102
|
+
return;
|
|
103
|
+
opts.warn(formatMissingBeaconWarning({ label: opts.label, graceMs, beacon }));
|
|
104
|
+
}, graceMs);
|
|
105
|
+
timer.unref?.();
|
|
106
|
+
return {
|
|
107
|
+
stop() {
|
|
108
|
+
clearTimeout(timer);
|
|
109
|
+
},
|
|
110
|
+
};
|
|
111
|
+
}
|
|
112
|
+
//# sourceMappingURL=sandbox-interlock.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sandbox-interlock.js","sourceRoot":"","sources":["../../src/cli/sandbox-interlock.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AACH,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,cAAc,EAAkB,MAAM,0BAA0B,CAAC;AAC1E,OAAO,EAAE,wBAAwB,EAAE,+BAA+B,EAAE,MAAM,0BAA0B,CAAC;AAgBrG;;;;GAIG;AACH,MAAM,UAAU,iBAAiB,CAC/B,QAA2B,EAC3B,WAAmB;IAEnB,OAAO;QACL,KAAK,EAAE,cAAc,CAAC,QAAQ,CAAC,WAAW,CAAC;QAC3C,gBAAgB,EAAE,CAAC,QAAQ,CAAC,YAAY,IAAI,EAAE,CAAC,CAAC,QAAQ,CAAC,YAAY,WAAW,EAAE,CAAC;QACnF,MAAM,EAAE,cAAc,CAAC,QAAQ,CAAC,aAAa,CAAC;KAC/C,CAAC;AACJ,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,mBAAmB,CAAC,MAAuB;IACzD,IAAI,CAAC,MAAM,CAAC,gBAAgB,EAAE,CAAC;QAC7B,OAAO,CACL,qBAAqB,MAAM,CAAC,KAAK,iDAAiD;YAClF,4FAA4F,CAC7F,CAAC;IACJ,CAAC;IACD,OAAO,qBAAqB,MAAM,CAAC,KAAK,sCAAsC,CAAC;AACjF,CAAC;AAYD;;;;;;;GAOG;AACH,MAAM,UAAU,kBAAkB,CAAC,IAAwB;IACzD,MAAM,SAAS,GAAG,iBAAiB,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,WAAW,CAAC,CAAC;IACrE,IAAI,CAAC,KAAK,CAAC,mBAAmB,CAAC,SAAS,CAAC,CAAC,CAAC;IAC3C,MAAM,kBAAkB,GAAG,wBAAwB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC/D,IAAI,kBAAkB,KAAK,IAAI;QAAE,IAAI,CAAC,KAAK,CAAC,+BAA+B,CAAC,kBAAkB,CAAC,CAAC,CAAC;IACjG,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,4EAA4E;AAC5E,MAAM,eAAe,GAAG,MAAM,CAAC;AAoB/B;gEACgE;AAChE,MAAM,UAAU,0BAA0B,CAAC,IAI1C;IACC,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,CAAC;IAChD,OAAO,CACL,oBAAoB,IAAI,CAAC,KAAK,uBAAuB,OAAO,+BAA+B;QAC3F,aAAa,IAAI,CAAC,MAAM,mEAAmE;QAC3F,+FAA+F;QAC/F,8FAA8F;QAC9F,4FAA4F;QAC5F,kCAAkC,CACnC,CAAC;AACJ,CAAC;AAED;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AACH,MAAM,UAAU,mBAAmB,CAAC,IAA2B;IAC7D,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC;IAC3B,IAAI,MAAM,KAAK,IAAI;QAAE,OAAO,EAAE,IAAI,EAAE,GAAG,EAAE,GAAE,CAAC,EAAE,CAAC;IAC/C,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,IAAI,eAAe,CAAC;IAChD,MAAM,KAAK,GAAG,UAAU,CAAC,GAAG,EAAE;QAC5B,IAAI,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE;YAAE,OAAO;QAChD,IAAI,CAAC,IAAI,CAAC,0BAA0B,CAAC,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC;IAChF,CAAC,EAAE,OAAO,CAAC,CAAC;IACZ,KAAK,CAAC,KAAK,EAAE,EAAE,CAAC;IAChB,OAAO;QACL,IAAI;YACF,YAAY,CAAC,KAAK,CAAC,CAAC;QACtB,CAAC;KACF,CAAC;AACJ,CAAC"}
|
|
@@ -71,25 +71,33 @@ export declare function resolveSandboxChild(opts: ResolveSandboxChildOptions): S
|
|
|
71
71
|
* dist/register/), for runtimes without a usable import.meta.resolve.
|
|
72
72
|
*/
|
|
73
73
|
export declare function registerModuleUrl(): string;
|
|
74
|
+
/** What the launcher has to put in a child's environment for interception. */
|
|
75
|
+
export interface ChildActivation {
|
|
76
|
+
/** The serve host the child's sandbox calls reach. */
|
|
77
|
+
readonly serveUrl: string;
|
|
78
|
+
/** Absolute `file:` URL of the register module. */
|
|
79
|
+
readonly registerUrl: string;
|
|
80
|
+
/** The per-launch secret the child's handshake beacon must present.
|
|
81
|
+
* Absent when the launcher runs no beacon receiver, as the Vite plugin's
|
|
82
|
+
* Functions runtime does; the child then reports on stderr only. */
|
|
83
|
+
readonly beaconToken?: string | undefined;
|
|
84
|
+
}
|
|
74
85
|
/**
|
|
75
|
-
* Child env: sets the activator and APPENDS the loader
|
|
76
|
-
*
|
|
77
|
-
* must survive). `file:` URLs are
|
|
78
|
-
* even for paths with spaces.
|
|
86
|
+
* Child env: sets the activator and the beacon secret, and APPENDS the loader
|
|
87
|
+
* to NODE_OPTIONS rather than replacing it (the user's own --inspect /
|
|
88
|
+
* --max-old-space-size and so on must survive). `file:` URLs are
|
|
89
|
+
* percent-encoded, so no quoting is needed even for paths with spaces.
|
|
79
90
|
*/
|
|
80
|
-
export declare function buildChildEnv(base: NodeJS.ProcessEnv, opts:
|
|
81
|
-
serveUrl: string;
|
|
82
|
-
registerUrl: string;
|
|
83
|
-
}): NodeJS.ProcessEnv;
|
|
91
|
+
export declare function buildChildEnv(base: NodeJS.ProcessEnv, opts: ChildActivation): NodeJS.ProcessEnv;
|
|
84
92
|
/**
|
|
85
93
|
* Format copy-pasteable POSIX export statements for host-only startup.
|
|
86
94
|
* Grouped in a cleanly formatted console block for easy selection and copying
|
|
87
95
|
* into a separate terminal (for example, when running Next.js independently).
|
|
96
|
+
*
|
|
97
|
+
* The beacon secret is part of the block: without it a process started this
|
|
98
|
+
* way still intercepts, but the dev server cannot confirm that it did.
|
|
88
99
|
*/
|
|
89
|
-
export declare function formatStartupEnvExport(opts:
|
|
90
|
-
serveUrl: string;
|
|
91
|
-
registerUrl: string;
|
|
92
|
-
}): string;
|
|
100
|
+
export declare function formatStartupEnvExport(opts: ChildActivation): string;
|
|
93
101
|
/**
|
|
94
102
|
* Incremental line prefixer: every child output line gets `[dev] `, partial
|
|
95
103
|
* lines are buffered until their newline (or flush at stream end).
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sandbox-runner.d.ts","sourceRoot":"","sources":["../../src/cli/sandbox-runner.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AACH,OAAO,EAAS,KAAK,YAAY,EAAE,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"sandbox-runner.d.ts","sourceRoot":"","sources":["../../src/cli/sandbox-runner.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AACH,OAAO,EAAS,KAAK,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAK9D;;;;;;;;;;GAUG;AACH,wBAAsB,kBAAkB,CACtC,QAAQ,EAAE,MAAM,EAChB,IAAI,GAAE;IACJ,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,EAAE,OAAO,KAAK,CAAC;IACzB,KAAK,CAAC,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;CAClC,GACL,OAAO,CAAC,OAAO,CAAC,CAmBlB;AAID,MAAM,WAAW,gBAAgB;IAC/B,iDAAiD;IACjD,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,qDAAqD;IACrD,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,MAAM,YAAY,GAAG,gBAAgB,CAAC;AAE5C;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,EAAE,CAcxD;AAED,MAAM,WAAW,0BAA0B;IACzC,eAAe,CAAC,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC;IAClC,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;IACvB,aAAa,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,IAAI,CAAC,EAAE,OAAO,CAAC;CAChB;AAED;;;;;;;;;GASG;AACH,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,0BAA0B,GAAG,gBAAgB,GAAG,IAAI,CAuB7F;AAID;;;;;;;GAOG;AACH,wBAAgB,iBAAiB,IAAI,MAAM,CAQ1C;AAED,8EAA8E;AAC9E,MAAM,WAAW,eAAe;IAC9B,sDAAsD;IACtD,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,mDAAmD;IACnD,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B;;yEAEqE;IACrE,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CAC3C;AAED;;;;;GAKG;AACH,wBAAgB,aAAa,CAC3B,IAAI,EAAE,MAAM,CAAC,UAAU,EACvB,IAAI,EAAE,eAAe,GACpB,MAAM,CAAC,UAAU,CASnB;AAED;;;;;;;GAOG;AACH,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,eAAe,GAAG,MAAM,CAgBpE;AAID;;;GAGG;AACH,wBAAgB,kBAAkB,CAChC,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,GAC5B;IAAE,IAAI,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IAAC,KAAK,IAAI,IAAI,CAAA;CAAE,CAkB9C;AAOD,MAAM,WAAW,kBAAkB;IACjC,MAAM,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC;IACxB,MAAM,CAAC,GAAG,EAAE,MAAM,CAAC,OAAO,GAAG,IAAI,CAAC;IAClC,KAAK,EAAE,YAAY,CAAC;CACrB;AAED,MAAM,MAAM,cAAc,GAAG,kBAAkB,CAAC;AAEhD;;;;GAIG;AACH,wBAAgB,iBAAiB,CAC/B,IAAI,EAAE,gBAAgB,EACtB,IAAI,EAAE;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAC,UAAU,CAAC;IAAC,IAAI,EAAE,OAAO,CAAA;CAAE,GAC3D,kBAAkB,CA6FpB;AAED,eAAO,MAAM,aAAa,0BAAoB,CAAC"}
|
|
@@ -16,6 +16,7 @@
|
|
|
16
16
|
* only `spawnDevChild` touches the process table.
|
|
17
17
|
*/
|
|
18
18
|
import { spawn } from 'node:child_process';
|
|
19
|
+
import { SHELL_OPERATORS } from './unsupported-runtime.js';
|
|
19
20
|
// ─── First-run race guard ───────────────────────────────────────────────────
|
|
20
21
|
/**
|
|
21
22
|
* Wait (bounded) for a browser tab to register as the bridge's sandbox peer
|
|
@@ -124,35 +125,43 @@ export function registerModuleUrl() {
|
|
|
124
125
|
return new URL('../register/index.js', import.meta.url).href;
|
|
125
126
|
}
|
|
126
127
|
/**
|
|
127
|
-
* Child env: sets the activator and APPENDS the loader
|
|
128
|
-
*
|
|
129
|
-
* must survive). `file:` URLs are
|
|
130
|
-
* even for paths with spaces.
|
|
128
|
+
* Child env: sets the activator and the beacon secret, and APPENDS the loader
|
|
129
|
+
* to NODE_OPTIONS rather than replacing it (the user's own --inspect /
|
|
130
|
+
* --max-old-space-size and so on must survive). `file:` URLs are
|
|
131
|
+
* percent-encoded, so no quoting is needed even for paths with spaces.
|
|
131
132
|
*/
|
|
132
133
|
export function buildChildEnv(base, opts) {
|
|
133
134
|
const importFlag = `--import ${opts.registerUrl}`;
|
|
134
|
-
|
|
135
|
+
const env = {
|
|
135
136
|
...base,
|
|
136
137
|
PYRIC_SANDBOX: `remote:${opts.serveUrl}`,
|
|
137
138
|
NODE_OPTIONS: base.NODE_OPTIONS ? `${base.NODE_OPTIONS} ${importFlag}` : importFlag,
|
|
138
139
|
};
|
|
140
|
+
if (opts.beaconToken !== undefined)
|
|
141
|
+
env.PYRIC_BEACON_TOKEN = opts.beaconToken;
|
|
142
|
+
return env;
|
|
139
143
|
}
|
|
140
144
|
/**
|
|
141
145
|
* Format copy-pasteable POSIX export statements for host-only startup.
|
|
142
146
|
* Grouped in a cleanly formatted console block for easy selection and copying
|
|
143
147
|
* into a separate terminal (for example, when running Next.js independently).
|
|
148
|
+
*
|
|
149
|
+
* The beacon secret is part of the block: without it a process started this
|
|
150
|
+
* way still intercepts, but the dev server cannot confirm that it did.
|
|
144
151
|
*/
|
|
145
152
|
export function formatStartupEnvExport(opts) {
|
|
146
|
-
const
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
153
|
+
const lines = [`export PYRIC_SANDBOX="remote:${opts.serveUrl}"`];
|
|
154
|
+
if (opts.beaconToken !== undefined) {
|
|
155
|
+
lines.push(`export PYRIC_BEACON_TOKEN="${opts.beaconToken}"`);
|
|
156
|
+
}
|
|
157
|
+
lines.push(`export NODE_OPTIONS="--import ${opts.registerUrl}"`);
|
|
158
|
+
const width = Math.max(...lines.map((line) => line.length));
|
|
159
|
+
const divider = '─'.repeat(width + 4);
|
|
160
|
+
const body = lines.map((line) => ` ${line}\n`).join('');
|
|
151
161
|
return ('\n' +
|
|
152
162
|
' To run external commands against this sandbox, paste in another terminal:\n' +
|
|
153
163
|
` ${divider}\n` +
|
|
154
|
-
|
|
155
|
-
` ${line2}\n` +
|
|
164
|
+
body +
|
|
156
165
|
` ${divider}\n`);
|
|
157
166
|
}
|
|
158
167
|
// ─── Line prefixing (pure core) ────────────────────────────────────────────
|
|
@@ -182,7 +191,6 @@ export function createLinePrefixer(prefix, write) {
|
|
|
182
191
|
// ─── Spawn + lifecycle ─────────────────────────────────────────────────────
|
|
183
192
|
/** How long a signalled child may linger before SIGKILL. */
|
|
184
193
|
const FORCE_KILL_AFTER_MS = 2_000;
|
|
185
|
-
const SHELL_OPERATORS = new Set(['&&', '||', '|', ';', '&']);
|
|
186
194
|
/**
|
|
187
195
|
* Spawn the child with inherited stdin and `[dev]`-prefixed stdout/stderr.
|
|
188
196
|
* In `--json` mode ALL child output goes to stderr — stdout carries exactly
|
|
@@ -201,14 +209,9 @@ export function spawnSandboxChild(plan, opts) {
|
|
|
201
209
|
}
|
|
202
210
|
// 2. Check for discrete shell operators (&&, ||, |, ;) among top-level tokens
|
|
203
211
|
const hasShellOperators = parts.some((token) => SHELL_OPERATORS.has(token));
|
|
204
|
-
//
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
const target = opts.json ? process.stderr : process.stdout;
|
|
208
|
-
target.write(` ⚠ ${runner} detected: pyric intercepts Firebase imports via Node.js module loader hooks (NODE_OPTIONS="--import ..."). ` +
|
|
209
|
-
`${runner} does not evaluate Node loader hooks — SDK calls in this process will not reach the pyric sandbox. ` +
|
|
210
|
-
`Use \`node\` (or \`npx tsx\`) to run with the sandbox swap.\n`);
|
|
211
|
-
}
|
|
212
|
+
// The bun/deno warning is emitted by the launch seam in serve.ts, alongside
|
|
213
|
+
// the interlock line, so every pre-spawn statement about the child prints in
|
|
214
|
+
// one block and in order.
|
|
212
215
|
const [command, ...args] = parts;
|
|
213
216
|
let child;
|
|
214
217
|
if (hasShellOperators) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sandbox-runner.js","sourceRoot":"","sources":["../../src/cli/sandbox-runner.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AACH,OAAO,EAAE,KAAK,EAAqB,MAAM,oBAAoB,CAAC;
|
|
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
|
@@ -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
|
|
@@ -110,15 +116,5 @@ export declare function bridgeEnabledFor(flags: {
|
|
|
110
116
|
export declare function installServeProcessGuard(log: (message: string) => void, proc?: Pick<NodeJS.Process, 'on' | 'off'>): () => void;
|
|
111
117
|
/** CLI entry. Resolves on SIGINT/SIGTERM after a clean stop. */
|
|
112
118
|
export declare function runServe(parsed: ParsedArgs): Promise<number>;
|
|
113
|
-
/**
|
|
114
|
-
* Detect a bundler build that INLINED the real firebase SDK into its served
|
|
115
|
-
* assets (`vite build` output). The served import map remaps only bare
|
|
116
|
-
* `firebase/*` specifiers, so such a build cannot be sandboxed — its calls
|
|
117
|
-
* reach real Google endpoints. Fingerprints are real-SDK-only endpoint hosts
|
|
118
|
-
* that never appear in a sandbox-clean app (whose calls all route to
|
|
119
|
-
* `/__pyric/*`). Bounded: depth ≤ 4, ≤ 200 script files, first hit per file.
|
|
120
|
-
* Returns publicDir-relative paths of offending assets.
|
|
121
|
-
*/
|
|
122
|
-
export declare function scanForInlinedFirebase(dir: string): string[];
|
|
123
119
|
export {};
|
|
124
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":"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"}
|
package/dist/cli/serve.js
CHANGED
|
@@ -10,12 +10,15 @@
|
|
|
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';
|
|
@@ -23,6 +26,8 @@ import { createBridgeMount } from '../serve/bridge-mount.js';
|
|
|
23
26
|
import { openBrowser, shouldAutoOpen } from '../serve/open-browser.js';
|
|
24
27
|
import { readPyricConfig } from './pyric-config.js';
|
|
25
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';
|
|
26
31
|
import { createFunctionsDevelopmentRuntime, createHttpFunctionsPeerReadiness, } from '../functions-rtdb/development-runtime.js';
|
|
27
32
|
import { discoverFunctionsRtdbProject, } from '../functions-rtdb/project.js';
|
|
28
33
|
import { createSandboxSession, SandboxSeedError, } from '../serve/sandbox-session.js';
|
|
@@ -63,6 +68,11 @@ export function serveJsonLine(runtime) {
|
|
|
63
68
|
*/
|
|
64
69
|
export async function startServe(opts) {
|
|
65
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');
|
|
66
76
|
// --fresh only means anything against the state.json file `--persist`
|
|
67
77
|
// maintains — without `--persist` there is no file to discard, so
|
|
68
78
|
// `--fresh` alone was a silent no-op (nothing happened, nothing said so).
|
|
@@ -120,12 +130,12 @@ export async function startServe(opts) {
|
|
|
120
130
|
}
|
|
121
131
|
// The import map can only remap BARE `firebase/*` specifiers. A plain bundler
|
|
122
132
|
// build (`vite build`) inlines the real SDK into the app chunk, leaving
|
|
123
|
-
// nothing to intercept
|
|
133
|
+
// nothing to intercept: the page would then talk to REAL Firebase endpoints
|
|
124
134
|
// with the sandbox's fake credentials while the injected banner claims
|
|
125
135
|
// otherwise. That hole is structural, so `pyric sandbox` refuses such a dist
|
|
126
136
|
// rather than serving it. A pyric SANDBOX build (`vite build --mode
|
|
127
137
|
// development`) carries the marker and bundles pyric's in-page adapters, so it
|
|
128
|
-
// is trusted and the scan is skipped (marker present
|
|
138
|
+
// is trusted and the scan is skipped (marker present, no real SDK to find).
|
|
129
139
|
if (!hasSandboxBuildMarker(publicDir)) {
|
|
130
140
|
const inlined = scanForInlinedFirebase(publicDir);
|
|
131
141
|
if (inlined.length > 0) {
|
|
@@ -210,6 +220,11 @@ export async function startServe(opts) {
|
|
|
210
220
|
studio: opts.ui ? { siteUiDir } : false,
|
|
211
221
|
bridgeUrl: () => mount && origin.port > 0 ? mount.wsUrl(origin) : null,
|
|
212
222
|
activity: (incident) => logger.note(formatActivityWarning(incident)),
|
|
223
|
+
beaconToken,
|
|
224
|
+
beacon: (report) => {
|
|
225
|
+
beaconsSeen += 1;
|
|
226
|
+
logger.note(formatBeaconReceipt(report));
|
|
227
|
+
},
|
|
213
228
|
permissive: opts.permissive,
|
|
214
229
|
logger,
|
|
215
230
|
});
|
|
@@ -396,7 +411,7 @@ export async function startServe(opts) {
|
|
|
396
411
|
logger.info(session.payload().storageRules
|
|
397
412
|
? `✔ rules ${session.summary.rules.storage.sourcePath} → deployed to the storage sandbox (hash ${session.summary.rules.storage.hash}; ` +
|
|
398
413
|
`edits require a restart — storage rules do not hot-reload)`
|
|
399
|
-
: `• rules no storage.rules — storage sandbox
|
|
414
|
+
: `• rules no storage.rules — storage sandbox denies client operations by default`);
|
|
400
415
|
if (uiUrl) {
|
|
401
416
|
logger.info(`✔ studio Pyric Studio: ${uiUrl}`);
|
|
402
417
|
}
|
|
@@ -406,6 +421,13 @@ export async function startServe(opts) {
|
|
|
406
421
|
if (mount) {
|
|
407
422
|
logger.info(`✔ bridge MCP endpoint: ${mount.mcpUrl(origin)} (sandbox peers over ws at /__pyric/sandbox)`);
|
|
408
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({}));
|
|
409
431
|
let persistSummary = null;
|
|
410
432
|
const persistence = session.summary.persistence;
|
|
411
433
|
if (persistence) {
|
|
@@ -449,7 +471,8 @@ export async function startServe(opts) {
|
|
|
449
471
|
logger.note('');
|
|
450
472
|
logger.note(' ⚠ the pyric sandbox runs IN the served page — keep the browser tab open.');
|
|
451
473
|
logger.note(' Firestore/auth data and persistence stop when no page is open.');
|
|
452
|
-
|
|
474
|
+
const mcpUrl = mount ? mount.mcpUrl(origin) : null;
|
|
475
|
+
return { handle, publicDir, payload, uiUrl, mcpUrl, persist: persistSummary, beaconCount, beaconToken };
|
|
453
476
|
}
|
|
454
477
|
/**
|
|
455
478
|
* `--ui` implies `--bridge` (hybrid-MCP plan Phase 3): a Studio user almost
|
|
@@ -638,6 +661,7 @@ export async function runServe(parsed) {
|
|
|
638
661
|
void openBrowser(targetUrl);
|
|
639
662
|
}
|
|
640
663
|
let devChild = null;
|
|
664
|
+
let beaconWatchdog = null;
|
|
641
665
|
let functionsRuntime = null;
|
|
642
666
|
let resolveFunctionsExit;
|
|
643
667
|
const functionsExited = new Promise((resolve) => { resolveFunctionsExit = resolve; });
|
|
@@ -659,6 +683,7 @@ export async function runServe(parsed) {
|
|
|
659
683
|
]);
|
|
660
684
|
const stopAfterSignal = async () => {
|
|
661
685
|
(json ? process.stderr : process.stdout).write('\nShutting down...\n');
|
|
686
|
+
beaconWatchdog?.stop();
|
|
662
687
|
if (devChild && devChild.child.exitCode === null)
|
|
663
688
|
devChild.signal(await signal);
|
|
664
689
|
await functionsRuntime?.close().catch(() => undefined);
|
|
@@ -701,6 +726,7 @@ export async function runServe(parsed) {
|
|
|
701
726
|
baseEnv: process.env,
|
|
702
727
|
serveUrl: runtime.handle.url,
|
|
703
728
|
registerUrl: registerModuleUrl(),
|
|
729
|
+
beaconToken: runtime.beaconToken,
|
|
704
730
|
instance: `${functionsProjectId}-default-rtdb`,
|
|
705
731
|
location: process.env.PYRIC_FUNCTIONS_RTDB_REGION ?? 'us-central1',
|
|
706
732
|
projectId: functionsProjectId ?? 'demo-project',
|
|
@@ -758,19 +784,36 @@ export async function runServe(parsed) {
|
|
|
758
784
|
`open ${runtime.handle.url} to connect if your command performs Firebase operations.\n`);
|
|
759
785
|
}
|
|
760
786
|
info.write(`✔ run \`${plan.label}\` — firebase-admin/firebase imports are routed to the sandbox at ${runtime.handle.url}\n`);
|
|
761
|
-
|
|
762
|
-
|
|
763
|
-
|
|
764
|
-
|
|
765
|
-
|
|
766
|
-
|
|
767
|
-
|
|
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`),
|
|
768
810
|
});
|
|
769
811
|
}
|
|
770
812
|
else if (!json) {
|
|
771
813
|
process.stdout.write(formatStartupEnvExport({
|
|
772
814
|
serveUrl: runtime.handle.url,
|
|
773
815
|
registerUrl: registerModuleUrl(),
|
|
816
|
+
beaconToken: runtime.beaconToken,
|
|
774
817
|
}));
|
|
775
818
|
}
|
|
776
819
|
return await new Promise((resolveExit) => {
|
|
@@ -781,6 +824,7 @@ export async function runServe(parsed) {
|
|
|
781
824
|
return;
|
|
782
825
|
settled = true;
|
|
783
826
|
void (async () => {
|
|
827
|
+
beaconWatchdog?.stop();
|
|
784
828
|
await functionsRuntime?.close().catch(() => undefined);
|
|
785
829
|
if (devChild && devChild.child.exitCode === null) {
|
|
786
830
|
devChild.signal('SIGTERM');
|
|
@@ -821,68 +865,4 @@ export async function runServe(parsed) {
|
|
|
821
865
|
void signal.then(shutdown);
|
|
822
866
|
});
|
|
823
867
|
}
|
|
824
|
-
/**
|
|
825
|
-
* Detect a bundler build that INLINED the real firebase SDK into its served
|
|
826
|
-
* assets (`vite build` output). The served import map remaps only bare
|
|
827
|
-
* `firebase/*` specifiers, so such a build cannot be sandboxed — its calls
|
|
828
|
-
* reach real Google endpoints. Fingerprints are real-SDK-only endpoint hosts
|
|
829
|
-
* that never appear in a sandbox-clean app (whose calls all route to
|
|
830
|
-
* `/__pyric/*`). Bounded: depth ≤ 4, ≤ 200 script files, first hit per file.
|
|
831
|
-
* Returns publicDir-relative paths of offending assets.
|
|
832
|
-
*/
|
|
833
|
-
export function scanForInlinedFirebase(dir) {
|
|
834
|
-
const FINGERPRINTS = [
|
|
835
|
-
'identitytoolkit.googleapis.com',
|
|
836
|
-
'firestore.googleapis.com',
|
|
837
|
-
'securetoken.googleapis.com',
|
|
838
|
-
'firebasedatabase.app',
|
|
839
|
-
];
|
|
840
|
-
const hits = [];
|
|
841
|
-
let scanned = 0;
|
|
842
|
-
const walk = (d, rel, depth) => {
|
|
843
|
-
if (depth > 4 || scanned >= 200)
|
|
844
|
-
return;
|
|
845
|
-
let names;
|
|
846
|
-
try {
|
|
847
|
-
names = readdirSync(d);
|
|
848
|
-
}
|
|
849
|
-
catch {
|
|
850
|
-
return;
|
|
851
|
-
}
|
|
852
|
-
for (const name of names) {
|
|
853
|
-
if (scanned >= 200)
|
|
854
|
-
return;
|
|
855
|
-
const p = join(d, name);
|
|
856
|
-
const r = rel ? `${rel}/${name}` : name;
|
|
857
|
-
let st;
|
|
858
|
-
try {
|
|
859
|
-
st = statSync(p);
|
|
860
|
-
}
|
|
861
|
-
catch {
|
|
862
|
-
continue;
|
|
863
|
-
}
|
|
864
|
-
if (st.isDirectory()) {
|
|
865
|
-
// The pyric namespace itself never lands in hosting.public, but a
|
|
866
|
-
// node_modules inside a served dir would be a scan-cost trap.
|
|
867
|
-
// Dot-directories (.next, .git, .pyric) are internal caches and must be ignored.
|
|
868
|
-
if (name === 'node_modules' || name.startsWith('.'))
|
|
869
|
-
continue;
|
|
870
|
-
walk(p, r, depth + 1);
|
|
871
|
-
}
|
|
872
|
-
else if (/\.(js|mjs)$/.test(name)) {
|
|
873
|
-
scanned++;
|
|
874
|
-
try {
|
|
875
|
-
const text = readFileSync(p, 'utf8');
|
|
876
|
-
if (FINGERPRINTS.some((f) => text.includes(f)))
|
|
877
|
-
hits.push(r);
|
|
878
|
-
}
|
|
879
|
-
catch {
|
|
880
|
-
// unreadable asset: skip
|
|
881
|
-
}
|
|
882
|
-
}
|
|
883
|
-
}
|
|
884
|
-
};
|
|
885
|
-
walk(dir, '', 0);
|
|
886
|
-
return hits;
|
|
887
|
-
}
|
|
888
868
|
//# sourceMappingURL=serve.js.map
|