@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
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"runtime-env.js","sourceRoot":"","sources":["../../src/next/runtime-env.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,oBAAoB,EAAE,MAAM,iCAAiC,CAAC;AAEvE,MAAM,UAAU,iBAAiB,CAAC,MAAwB,EAAE,OAA0B;IACpF,IAAI,OAAO,KAAK,SAAS,IAAI,OAAO,CAAC,WAAW,KAAK,SAAS,EAAE,CAAC;QAC/D,OAAO,MAAM,CAAC;IAChB,CAAC;IACD,MAAM,aAAa,GAAqB,MAAM,CAAC,MAAM,CAAC,EAAE,EAAE,MAAM,CAAC,CAAC;IAClE,MAAM,WAAW,GAAG,aAAa,CAAC,GAAG,KAAK,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,EAAE,aAAa,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IAChG,MAAM,SAAS,GAAG,oBAAoB,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC;IAC5D,WAAW,CAAC,kBAAkB,GAAG,SAAS,CAAC;IAC3C,aAAa,CAAC,GAAG,GAAG,WAAW,CAAC;IAChC,OAAO,aAAa,CAAC;AACvB,CAAC"}
|
|
1
|
+
{"version":3,"file":"runtime-env.js","sourceRoot":"","sources":["../../src/next/runtime-env.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,oBAAoB,EAAE,MAAM,iCAAiC,CAAC;AAEvE,MAAM,UAAU,iBAAiB,CAAC,MAAwB,EAAE,OAA0B;IACpF,IAAI,OAAO,KAAK,SAAS,IAAI,OAAO,CAAC,WAAW,KAAK,SAAS,EAAE,CAAC;QAC/D,OAAO,MAAM,CAAC;IAChB,CAAC;IACD,MAAM,aAAa,GAAqB,MAAM,CAAC,MAAM,CAAC,EAAE,EAAE,MAAM,CAAC,CAAC;IAClE,MAAM,WAAW,GAAG,aAAa,CAAC,GAAG,KAAK,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,EAAE,aAAa,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IAChG,MAAM,SAAS,GAAG,oBAAoB,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC;IAC5D,8EAA8E;IAC9E,4EAA4E;IAC5E,8EAA8E;IAC9E,6EAA6E;IAC7E,WAAW,CAAC,8BAA8B,GAAG,SAAS,CAAC;IACvD,WAAW,CAAC,kBAAkB,GAAG,SAAS,CAAC;IAC3C,aAAa,CAAC,GAAG,GAAG,WAAW,CAAC;IAChC,OAAO,aAAa,CAAC;AACvB,CAAC"}
|
|
@@ -5,7 +5,7 @@ import type { NextConfig, PyricNextOptions } from './types.js';
|
|
|
5
5
|
/**
|
|
6
6
|
* Higher-order configuration wrapper for Next.js (`next.config.js` or `next.config.mjs`).
|
|
7
7
|
*
|
|
8
|
-
* During development mode (`pyric
|
|
8
|
+
* During development mode (`pyric sandbox` or non-production NODE_ENV):
|
|
9
9
|
* - Applies Webpack and Turbopack alias mappings to swap `firebase/*` imports
|
|
10
10
|
* for Pyric local sandbox mirrors on client components.
|
|
11
11
|
* - Adds `firebase` and `firebase-admin` to `serverExternalPackages` to prevent
|
package/dist/next/with-pyric.js
CHANGED
|
@@ -18,7 +18,7 @@ function applyPyricEnhancements(config, options) {
|
|
|
18
18
|
/**
|
|
19
19
|
* Higher-order configuration wrapper for Next.js (`next.config.js` or `next.config.mjs`).
|
|
20
20
|
*
|
|
21
|
-
* During development mode (`pyric
|
|
21
|
+
* During development mode (`pyric sandbox` or non-production NODE_ENV):
|
|
22
22
|
* - Applies Webpack and Turbopack alias mappings to swap `firebase/*` imports
|
|
23
23
|
* for Pyric local sandbox mirrors on client components.
|
|
24
24
|
* - Adds `firebase` and `firebase-admin` to `serverExternalPackages` to prevent
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
import type { GuardMode } from './net-guard.js';
|
|
2
|
+
/** The dev server route that receives beacons (`serve/beacon-route.ts`). */
|
|
3
|
+
export declare const BEACON_PATH = "/__pyric/beacon";
|
|
4
|
+
/** Header carrying the per-launch secret from `PYRIC_BEACON_TOKEN`. The route
|
|
5
|
+
* rejects a beacon that does not present it. */
|
|
6
|
+
export declare const BEACON_TOKEN_HEADER = "x-pyric-beacon-token";
|
|
7
|
+
/** What one activated child asserts about itself. Wire shape of the POST body
|
|
8
|
+
* and the fields of the stderr line, kept identical on purpose. */
|
|
9
|
+
export interface BeaconReport {
|
|
10
|
+
/** The child's own pid, the only durable handle a parent has on it. */
|
|
11
|
+
readonly pid: number;
|
|
12
|
+
/** Net-guard mode actually in force in this process. */
|
|
13
|
+
readonly guard: GuardMode;
|
|
14
|
+
/** Whether module resolution hooks were installed. `false` means imports
|
|
15
|
+
* are NOT being rewritten, which is the whole thing worth knowing. */
|
|
16
|
+
readonly hooks: boolean;
|
|
17
|
+
/** The activator verbatim, so the parent can attribute the beacon. */
|
|
18
|
+
readonly sandbox: string;
|
|
19
|
+
}
|
|
20
|
+
export interface BeaconHooks {
|
|
21
|
+
readonly write?: (line: string) => void;
|
|
22
|
+
/** Delivery seam for the machine channel. Defaults to
|
|
23
|
+
* {@link sendBeaconRequest}. */
|
|
24
|
+
readonly send?: (endpoint: string, body: string, token: string) => void;
|
|
25
|
+
/** Environment read for the beacon secret and the stderr gate. Defaults to
|
|
26
|
+
* `process.env`. */
|
|
27
|
+
readonly env?: Record<string, string | undefined>;
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* POST one beacon body, fire and forget, over an unref'd socket. See the
|
|
31
|
+
* module header for why this is `node:http` and not `fetch`.
|
|
32
|
+
*
|
|
33
|
+
* `token` is the per-launch secret from `PYRIC_BEACON_TOKEN`; the route
|
|
34
|
+
* rejects a beacon without it.
|
|
35
|
+
*/
|
|
36
|
+
export declare function sendBeaconRequest(endpoint: string, body: string, token: string): void;
|
|
37
|
+
/**
|
|
38
|
+
* The beacon endpoint implied by an activator value, or `null` when none is.
|
|
39
|
+
* Accepts `remote:<url>` (what `buildChildEnv` writes) and a bare URL; any
|
|
40
|
+
* non-http(s) scheme, and anything unparseable, is `null`: an unfetchable
|
|
41
|
+
* guess is worse than an honest absence.
|
|
42
|
+
*/
|
|
43
|
+
export declare function beaconEndpoint(sandbox: string | undefined): string | null;
|
|
44
|
+
/**
|
|
45
|
+
* One stderr line, structured the way net-guard's verdict lines are: fixed
|
|
46
|
+
* leading fields first so it is greppable (`beacon ACTIVE pid= guard= hooks=
|
|
47
|
+
* bridge=`), then the explanation.
|
|
48
|
+
*/
|
|
49
|
+
export declare function formatBeaconLine(report: BeaconReport, endpoint: string | null): string;
|
|
50
|
+
/**
|
|
51
|
+
* Whether the stderr channel prints.
|
|
52
|
+
*
|
|
53
|
+
* Quiet by default: a healthy first run should not carry a line per launched
|
|
54
|
+
* process, and the POST already tells the dev server what happened. The line
|
|
55
|
+
* prints when the developer asked for detail (`PYRIC_GUARD` set explicitly,
|
|
56
|
+
* `PYRIC_DEBUG`, or `PYRIC_VERBOSE`), and always when the report itself is bad
|
|
57
|
+
* news, since a child whose hooks did not install may have no other way to say
|
|
58
|
+
* so.
|
|
59
|
+
*/
|
|
60
|
+
export declare function beaconLineIsPrinted(report: BeaconReport, env: Record<string, string | undefined>): boolean;
|
|
61
|
+
/**
|
|
62
|
+
* Emit the beacon. Never throws, never returns a promise: the caller is the
|
|
63
|
+
* `--import` hot path of every pyric-launched process.
|
|
64
|
+
*
|
|
65
|
+
* The POST always goes out. The stderr line is conditional, see
|
|
66
|
+
* {@link beaconLineIsPrinted}.
|
|
67
|
+
*/
|
|
68
|
+
export declare function emitBeacon(report: BeaconReport, hooks?: BeaconHooks): void;
|
|
69
|
+
//# sourceMappingURL=beacon.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"beacon.d.ts","sourceRoot":"","sources":["../../src/register/beacon.ts"],"names":[],"mappings":"AAuDA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAEhD,4EAA4E;AAC5E,eAAO,MAAM,WAAW,oBAAoB,CAAC;AAE7C;iDACiD;AACjD,eAAO,MAAM,mBAAmB,yBAAyB,CAAC;AAI1D;oEACoE;AACpE,MAAM,WAAW,YAAY;IAC3B,uEAAuE;IACvE,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,wDAAwD;IACxD,QAAQ,CAAC,KAAK,EAAE,SAAS,CAAC;IAC1B;2EACuE;IACvE,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAC;IACxB,sEAAsE;IACtE,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;CAC1B;AAED,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IACxC;qCACiC;IACjC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IACxE;yBACqB;IACrB,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,CAAC;CACnD;AAWD;;;;;;GAMG;AACH,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI,CA0CrF;AAED;;;;;GAKG;AACH,wBAAgB,cAAc,CAAC,OAAO,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,GAAG,IAAI,CAczE;AAED;;;;GAIG;AACH,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,GAAG,IAAI,GAAG,MAAM,CAYtF;AAED;;;;;;;;;GASG;AACH,wBAAgB,mBAAmB,CACjC,MAAM,EAAE,YAAY,EACpB,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,GACtC,OAAO,CAKT;AAED;;;;;;GAMG;AACH,wBAAgB,UAAU,CAAC,MAAM,EAAE,YAAY,EAAE,KAAK,GAAE,WAAgB,GAAG,IAAI,CAa9E"}
|
|
@@ -0,0 +1,199 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The handshake beacon: register's proof that interception is live in this
|
|
3
|
+
* process.
|
|
4
|
+
*
|
|
5
|
+
* `pyric sandbox` sets `PYRIC_SANDBOX` and appends `--import
|
|
6
|
+
* @pyric/cli/register` to the child's `NODE_OPTIONS`, and then assumes the
|
|
7
|
+
* rest. Every link in that chain is silently breakable by the user's own
|
|
8
|
+
* command: a `bun`/`deno` runner that never evaluates Node loader hooks, a
|
|
9
|
+
* script that overwrites `NODE_OPTIONS` wholesale, a `NODE_ENV=production`
|
|
10
|
+
* that trips the activation refusal, an intermediate process that strips the
|
|
11
|
+
* env. In every one of those cases the child comes up looking perfectly
|
|
12
|
+
* healthy while its `firebase-admin` and `firebase` imports resolve to the
|
|
13
|
+
* real SDKs and reach live Firebase.
|
|
14
|
+
*
|
|
15
|
+
* The beacon closes that gap the only honest way: the child says so itself,
|
|
16
|
+
* after the hooks and the net-guard are actually installed.
|
|
17
|
+
*
|
|
18
|
+
* Two channels, on purpose
|
|
19
|
+
* ------------------------
|
|
20
|
+
* 1. A fire-and-forget `POST <bridge>/__pyric/beacon`, whenever a bridge URL
|
|
21
|
+
* is knowable from the child's own env. That is the machine channel: it
|
|
22
|
+
* reaches the dev server across an arbitrary depth of intermediate
|
|
23
|
+
* processes (npm, then next, then its worker), where stderr scraping stops
|
|
24
|
+
* being attributable. It carries the per-launch secret from
|
|
25
|
+
* `PYRIC_BEACON_TOKEN`, which is what the route authorizes on.
|
|
26
|
+
* 2. One structured stderr line, printed when the developer asked for detail
|
|
27
|
+
* or when the report is bad news (see {@link beaconLineIsPrinted}). It is
|
|
28
|
+
* the fallback for a process with no reachable server, no port, no network.
|
|
29
|
+
*
|
|
30
|
+
* Where the bridge URL comes from
|
|
31
|
+
* -------------------------------
|
|
32
|
+
* `cli/sandbox-runner.ts:buildChildEnv` sets
|
|
33
|
+
* `PYRIC_SANDBOX=remote:<serveUrl>`, so the activator is the address. Nothing
|
|
34
|
+
* else needs to be plumbed, and the beacon works for any descendant that
|
|
35
|
+
* inherited the env, not just the direct child. When the activator carries no
|
|
36
|
+
* URL (`PYRIC_SANDBOX=local`, or a hand-set value), there is no endpoint and
|
|
37
|
+
* the line says `bridge=none` rather than guessing.
|
|
38
|
+
*
|
|
39
|
+
* The POST must never be able to hurt the child
|
|
40
|
+
* ---------------------------------------------
|
|
41
|
+
* It is diagnostics. A refused connection, a 500, an unreachable host: every
|
|
42
|
+
* one of those is swallowed. `emitBeacon` is `void`, never awaited.
|
|
43
|
+
*
|
|
44
|
+
* It is sent over a raw `node:http` request, an unref'd socket under a hard
|
|
45
|
+
* one-second bound (see {@link BEACON_TIMEOUT_MS}), rather than `fetch`, whose
|
|
46
|
+
* pending promise has neither knob. A short `node seed.js` child must not sit
|
|
47
|
+
* around after finishing its work just to deliver a diagnostic. A child that
|
|
48
|
+
* exits before the beacon lands simply loses the machine channel, which is
|
|
49
|
+
* exactly why the watchdog on the other end is warn-only.
|
|
50
|
+
*
|
|
51
|
+
* The POST targets loopback, which is not in the shared Google endpoint
|
|
52
|
+
* catalog, so it passes the net-guard installed moments earlier without a
|
|
53
|
+
* verdict.
|
|
54
|
+
*/
|
|
55
|
+
import { createRequire } from 'node:module';
|
|
56
|
+
/** The dev server route that receives beacons (`serve/beacon-route.ts`). */
|
|
57
|
+
export const BEACON_PATH = '/__pyric/beacon';
|
|
58
|
+
/** Header carrying the per-launch secret from `PYRIC_BEACON_TOKEN`. The route
|
|
59
|
+
* rejects a beacon that does not present it. */
|
|
60
|
+
export const BEACON_TOKEN_HEADER = 'x-pyric-beacon-token';
|
|
61
|
+
const LOG_PREFIX = '@pyric/cli/register: beacon';
|
|
62
|
+
/**
|
|
63
|
+
* The hard bound on how long a beacon may delay a child's exit.
|
|
64
|
+
*
|
|
65
|
+
* One second, because this is loopback: the bridge is the dev server that
|
|
66
|
+
* launched us. If it has not accepted a connection in a second it is not
|
|
67
|
+
* going to, and no diagnostic is worth more of the child's life than that.
|
|
68
|
+
*/
|
|
69
|
+
const BEACON_TIMEOUT_MS = 1_000;
|
|
70
|
+
/**
|
|
71
|
+
* POST one beacon body, fire and forget, over an unref'd socket. See the
|
|
72
|
+
* module header for why this is `node:http` and not `fetch`.
|
|
73
|
+
*
|
|
74
|
+
* `token` is the per-launch secret from `PYRIC_BEACON_TOKEN`; the route
|
|
75
|
+
* rejects a beacon without it.
|
|
76
|
+
*/
|
|
77
|
+
export function sendBeaconRequest(endpoint, body, token) {
|
|
78
|
+
const require = createRequire(import.meta.url);
|
|
79
|
+
const secure = endpoint.startsWith('https:');
|
|
80
|
+
const http = require(secure ? 'node:https' : 'node:http');
|
|
81
|
+
const req = http.request(endpoint, {
|
|
82
|
+
method: 'POST',
|
|
83
|
+
headers: {
|
|
84
|
+
'content-type': 'application/json',
|
|
85
|
+
'content-length': Buffer.byteLength(body),
|
|
86
|
+
[BEACON_TOKEN_HEADER]: token,
|
|
87
|
+
},
|
|
88
|
+
});
|
|
89
|
+
// The bound on how long this can delay the child's exit is the unref'd timer
|
|
90
|
+
// below, not the socket and not a request timeout. A pending connect holds
|
|
91
|
+
// the event loop open regardless of `socket.unref()`, and `req.setTimeout()`
|
|
92
|
+
// does not arm until the `connect` event, so against a blackholed loopback
|
|
93
|
+
// address a 300 ms request timeout was measured firing at 5006 ms, when the
|
|
94
|
+
// kernel reset the connection. The timer destroys the request instead: it
|
|
95
|
+
// cannot hold the loop by itself, and it always gets to run.
|
|
96
|
+
const abort = setTimeout(() => req.destroy(), BEACON_TIMEOUT_MS);
|
|
97
|
+
abort.unref?.();
|
|
98
|
+
const settle = () => clearTimeout(abort);
|
|
99
|
+
req.on('socket', (socket) => {
|
|
100
|
+
socket.unref?.();
|
|
101
|
+
});
|
|
102
|
+
// A refused/reset connection is an expected outcome, not an error the child
|
|
103
|
+
// should ever hear about.
|
|
104
|
+
req.on('error', settle);
|
|
105
|
+
req.on('close', settle);
|
|
106
|
+
req.on('response', (res) => {
|
|
107
|
+
res.resume?.();
|
|
108
|
+
settle();
|
|
109
|
+
});
|
|
110
|
+
req.end(body);
|
|
111
|
+
}
|
|
112
|
+
/**
|
|
113
|
+
* The beacon endpoint implied by an activator value, or `null` when none is.
|
|
114
|
+
* Accepts `remote:<url>` (what `buildChildEnv` writes) and a bare URL; any
|
|
115
|
+
* non-http(s) scheme, and anything unparseable, is `null`: an unfetchable
|
|
116
|
+
* guess is worse than an honest absence.
|
|
117
|
+
*/
|
|
118
|
+
export function beaconEndpoint(sandbox) {
|
|
119
|
+
if (sandbox === undefined)
|
|
120
|
+
return null;
|
|
121
|
+
const raw = sandbox.trim();
|
|
122
|
+
if (raw.length === 0)
|
|
123
|
+
return null;
|
|
124
|
+
const value = raw.startsWith('remote:') ? raw.slice('remote:'.length).trim() : raw;
|
|
125
|
+
if (value.length === 0)
|
|
126
|
+
return null;
|
|
127
|
+
let url;
|
|
128
|
+
try {
|
|
129
|
+
url = new URL(value);
|
|
130
|
+
}
|
|
131
|
+
catch {
|
|
132
|
+
return null;
|
|
133
|
+
}
|
|
134
|
+
if (url.protocol !== 'http:' && url.protocol !== 'https:')
|
|
135
|
+
return null;
|
|
136
|
+
return `${url.origin}${BEACON_PATH}`;
|
|
137
|
+
}
|
|
138
|
+
/**
|
|
139
|
+
* One stderr line, structured the way net-guard's verdict lines are: fixed
|
|
140
|
+
* leading fields first so it is greppable (`beacon ACTIVE pid= guard= hooks=
|
|
141
|
+
* bridge=`), then the explanation.
|
|
142
|
+
*/
|
|
143
|
+
export function formatBeaconLine(report, endpoint) {
|
|
144
|
+
const head = `${LOG_PREFIX} ACTIVE pid=${report.pid} guard=${report.guard} ` +
|
|
145
|
+
`hooks=${report.hooks ? 1 : 0} bridge=${endpoint ?? 'none'}`;
|
|
146
|
+
let hooksNote;
|
|
147
|
+
if (report.hooks) {
|
|
148
|
+
hooksNote = 'firebase-admin/firebase imports in this process are rewritten to the pyric sandbox';
|
|
149
|
+
}
|
|
150
|
+
else {
|
|
151
|
+
hooksNote =
|
|
152
|
+
'module hooks did NOT install, so firebase-admin/firebase imports in this process are NOT rewritten';
|
|
153
|
+
}
|
|
154
|
+
return `${head}: ${hooksNote}, net-guard mode ${report.guard}.\n`;
|
|
155
|
+
}
|
|
156
|
+
/**
|
|
157
|
+
* Whether the stderr channel prints.
|
|
158
|
+
*
|
|
159
|
+
* Quiet by default: a healthy first run should not carry a line per launched
|
|
160
|
+
* process, and the POST already tells the dev server what happened. The line
|
|
161
|
+
* prints when the developer asked for detail (`PYRIC_GUARD` set explicitly,
|
|
162
|
+
* `PYRIC_DEBUG`, or `PYRIC_VERBOSE`), and always when the report itself is bad
|
|
163
|
+
* news, since a child whose hooks did not install may have no other way to say
|
|
164
|
+
* so.
|
|
165
|
+
*/
|
|
166
|
+
export function beaconLineIsPrinted(report, env) {
|
|
167
|
+
if (!report.hooks)
|
|
168
|
+
return true;
|
|
169
|
+
if ((env.PYRIC_GUARD ?? '').trim().length > 0)
|
|
170
|
+
return true;
|
|
171
|
+
if (env.PYRIC_DEBUG)
|
|
172
|
+
return true;
|
|
173
|
+
return Boolean(env.PYRIC_VERBOSE);
|
|
174
|
+
}
|
|
175
|
+
/**
|
|
176
|
+
* Emit the beacon. Never throws, never returns a promise: the caller is the
|
|
177
|
+
* `--import` hot path of every pyric-launched process.
|
|
178
|
+
*
|
|
179
|
+
* The POST always goes out. The stderr line is conditional, see
|
|
180
|
+
* {@link beaconLineIsPrinted}.
|
|
181
|
+
*/
|
|
182
|
+
export function emitBeacon(report, hooks = {}) {
|
|
183
|
+
const env = hooks.env ?? process.env;
|
|
184
|
+
const write = hooks.write ?? ((line) => void process.stderr.write(line));
|
|
185
|
+
const endpoint = beaconEndpoint(report.sandbox);
|
|
186
|
+
if (beaconLineIsPrinted(report, env))
|
|
187
|
+
write(formatBeaconLine(report, endpoint));
|
|
188
|
+
if (endpoint === null)
|
|
189
|
+
return;
|
|
190
|
+
const token = env.PYRIC_BEACON_TOKEN ?? '';
|
|
191
|
+
try {
|
|
192
|
+
(hooks.send ?? sendBeaconRequest)(endpoint, JSON.stringify(report), token);
|
|
193
|
+
}
|
|
194
|
+
catch {
|
|
195
|
+
// A runtime with no usable http module, or an endpoint that slipped the
|
|
196
|
+
// URL parse, loses the machine channel only.
|
|
197
|
+
}
|
|
198
|
+
}
|
|
199
|
+
//# sourceMappingURL=beacon.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"beacon.js","sourceRoot":"","sources":["../../src/register/beacon.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/register/index.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/register/index.ts"],"names":[],"mappings":"AAkMA;;yEAEyE;AACzE,eAAO,IAAI,MAAM,SAAQ,CAAC"}
|
package/dist/register/index.js
CHANGED
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* `@pyric/cli/register` — the Node substitution seam (adoption layer 2).
|
|
3
3
|
*
|
|
4
|
-
* Loaded via `node --import @pyric/cli/register` (which `pyric
|
|
5
|
-
* through NODE_OPTIONS), it makes the user's UNCHANGED `firebase-admin`
|
|
6
|
-
* `firebase` imports resolve to `pyric-admin`
|
|
4
|
+
* Loaded via `node --import @pyric/cli/register` (which `pyric sandbox`
|
|
5
|
+
* injects through NODE_OPTIONS), it makes the user's UNCHANGED `firebase-admin`
|
|
6
|
+
* and `firebase` imports resolve to `pyric-admin` and `pyric`, every subpath 1:1,
|
|
7
7
|
* and installs the sandbox-factory global that `pyric-admin`'s ambient
|
|
8
8
|
* `initializeApp()` consumes.
|
|
9
9
|
*
|
|
@@ -17,6 +17,17 @@
|
|
|
17
17
|
* `require()` and `import`. On older 22.x it falls back to
|
|
18
18
|
* `module.register()` (ESM-only) with a warning that CJS require() is not
|
|
19
19
|
* rewritten.
|
|
20
|
+
*
|
|
21
|
+
* On activation it also installs the NETWORK GUARD (`./net-guard.js`), which
|
|
22
|
+
* reports egress from this process to live Google/Firebase endpoints, or
|
|
23
|
+
* refuses it under `PYRIC_GUARD=block`. See that module for the policy and the
|
|
24
|
+
* `PYRIC_GUARD` and `PYRIC_GUARD_ALLOW` knobs.
|
|
25
|
+
*
|
|
26
|
+
* Finally it emits the HANDSHAKE BEACON (`./beacon.js`): a fire-and-forget
|
|
27
|
+
* `POST /__pyric/beacon` when the activator carries a bridge URL, plus a
|
|
28
|
+
* stderr line when the developer asked for detail. That is how `pyric sandbox`
|
|
29
|
+
* learns that interception actually reached this child rather than assuming
|
|
30
|
+
* it did.
|
|
20
31
|
*/
|
|
21
32
|
import Module from 'node:module';
|
|
22
33
|
import { readFileSync } from 'node:fs';
|
|
@@ -24,6 +35,8 @@ import { dirname, join } from 'node:path';
|
|
|
24
35
|
import { pathToFileURL } from 'node:url';
|
|
25
36
|
import { mapFirebaseSpecifier } from './mapping.js';
|
|
26
37
|
import { resolveEsmOnlySubpath } from './esm-exports.js';
|
|
38
|
+
import { installNetGuard, parseGuardMode } from './net-guard.js';
|
|
39
|
+
import { emitBeacon } from './beacon.js';
|
|
27
40
|
import { remoteSandbox } from '../remote/index.js';
|
|
28
41
|
/** The shared seam with pyric-admin's ambient init: a synchronous factory
|
|
29
42
|
* returning the lazy branded handle. `Symbol.for` so both packages agree
|
|
@@ -68,7 +81,28 @@ function resolveEsmOnlyForRequire(mapped) {
|
|
|
68
81
|
}
|
|
69
82
|
}
|
|
70
83
|
function activate() {
|
|
84
|
+
// FIRST, before any hook or global: the network guard.
|
|
85
|
+
//
|
|
86
|
+
// Order matters in one direction only. Everything after this line makes the
|
|
87
|
+
// process load MORE code (the resolution hooks pull in the pyric mirrors,
|
|
88
|
+
// the factory global pulls in the remote sandbox) and any of it could open
|
|
89
|
+
// a socket. Installing the guard first leaves no window in which
|
|
90
|
+
// sandbox-substituted code runs unguarded. The reverse ordering buys
|
|
91
|
+
// nothing: the guard mutates globals only (`undici.globalDispatcher.1`,
|
|
92
|
+
// `net`/`tls` connect) and depends on nothing the hooks establish.
|
|
93
|
+
//
|
|
94
|
+
// It stays BELOW the NODE_ENV=production refusal, deliberately. A refused
|
|
95
|
+
// process is a real production run that we declined to touch, and warning
|
|
96
|
+
// about its perfectly legitimate Google traffic, let alone blocking it,
|
|
97
|
+
// would be actively harmful. `PYRIC_SANDBOX` plus no refusal is the only
|
|
98
|
+
// state in which "traffic to live Google is a bug" is a true statement.
|
|
99
|
+
const guard = installNetGuard();
|
|
100
|
+
// Whether module resolution is actually being intercepted. Both branches
|
|
101
|
+
// below install SOMETHING, but a runtime with neither API installs nothing,
|
|
102
|
+
// which is precisely the state the beacon exists to make visible.
|
|
103
|
+
let hooksInstalled = false;
|
|
71
104
|
if (typeof moduleApi.registerHooks === 'function') {
|
|
105
|
+
hooksInstalled = true;
|
|
72
106
|
moduleApi.registerHooks({
|
|
73
107
|
resolve(specifier, context, nextResolve) {
|
|
74
108
|
const mapped = mapFirebaseSpecifier(specifier, context.parentURL);
|
|
@@ -94,16 +128,41 @@ function activate() {
|
|
|
94
128
|
});
|
|
95
129
|
}
|
|
96
130
|
else {
|
|
97
|
-
process.stderr.write('@pyric/cli/register: this Node version lacks module.registerHooks (needs >= 22.15)
|
|
98
|
-
'
|
|
131
|
+
process.stderr.write('@pyric/cli/register: this Node version lacks module.registerHooks (needs >= 22.15). ' +
|
|
132
|
+
'Falling back to module.register: ESM imports of firebase-admin/firebase are rewritten, ' +
|
|
99
133
|
"but CJS require('firebase-admin') is NOT intercepted. Upgrade Node to >= 22.15 for full coverage.\n");
|
|
134
|
+
hooksInstalled = typeof moduleApi.register === 'function';
|
|
100
135
|
moduleApi.register?.(new URL('./hooks.js', import.meta.url));
|
|
101
136
|
}
|
|
102
137
|
// The factory global — exact contract shared with pyric-admin's ambient
|
|
103
138
|
// init: synchronous, returns the lazy branded handle.
|
|
104
139
|
globalThis[SANDBOX_FACTORY] = (opts) => remoteSandbox(opts);
|
|
105
|
-
process.stderr.write(`@pyric/cli/register: active
|
|
140
|
+
process.stderr.write(`@pyric/cli/register: active. firebase-admin/firebase imports now resolve to the ` +
|
|
106
141
|
`pyric sandbox (PYRIC_SANDBOX=${process.env.PYRIC_SANDBOX}).\n`);
|
|
142
|
+
// LAST: the handshake beacon, after the guard, the hooks and the factory
|
|
143
|
+
// global are all in place. Its whole claim is "interception is live in this
|
|
144
|
+
// process", so it must not be able to run before that is true. See
|
|
145
|
+
// `./beacon.js` for the two channels and why the POST is fire-and-forget.
|
|
146
|
+
emitBeacon({
|
|
147
|
+
pid: process.pid,
|
|
148
|
+
guard: installedGuardMode(guard),
|
|
149
|
+
hooks: hooksInstalled,
|
|
150
|
+
sandbox: process.env.PYRIC_SANDBOX ?? '',
|
|
151
|
+
});
|
|
152
|
+
}
|
|
153
|
+
/**
|
|
154
|
+
* The net-guard mode actually in force, for the beacon to report.
|
|
155
|
+
*
|
|
156
|
+
* Policy: the installed guard is the authority when there is one. There is no
|
|
157
|
+
* guard object in exactly one case, `PYRIC_GUARD=off` (the `PYRIC_SANDBOX`
|
|
158
|
+
* gate `installNetGuard` shares with this module has already passed by the
|
|
159
|
+
* time it runs), and re-parsing the env is how that case names itself rather
|
|
160
|
+
* than guessing a default.
|
|
161
|
+
*/
|
|
162
|
+
function installedGuardMode(guard) {
|
|
163
|
+
if (guard !== null)
|
|
164
|
+
return guard.mode;
|
|
165
|
+
return parseGuardMode(process.env.PYRIC_GUARD);
|
|
107
166
|
}
|
|
108
167
|
/** Whether this process's firebase-admin/firebase imports are being rewritten
|
|
109
168
|
* to the pyric sandbox — true only when `PYRIC_SANDBOX` was set (and not
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/register/index.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/register/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
/** Marks a rejection as the guard's, so callers can tell it from a DNS/TLS
|
|
2
|
+
* failure. A blocked `fetch` only exposes it as `error.cause.code`. */
|
|
3
|
+
export declare const GUARD_BLOCKED_CODE = "PYRIC_GUARD_BLOCKED";
|
|
4
|
+
export type GuardMode = 'warn' | 'block' | 'off';
|
|
5
|
+
/** What the guard decided about one outbound connection. */
|
|
6
|
+
export interface EgressVerdict {
|
|
7
|
+
/** `warn` reported-and-permitted, `block` refused, `allow` allowlisted. */
|
|
8
|
+
readonly verdict: 'warn' | 'block' | 'allow';
|
|
9
|
+
/** Whether the connection may proceed. */
|
|
10
|
+
readonly permitted: boolean;
|
|
11
|
+
/**
|
|
12
|
+
* The hostname actually being contacted, which is what the developer needs
|
|
13
|
+
* in order to find the call. Not the catalog suffix: `cloudfunctions.net`
|
|
14
|
+
* does not tell you which region or project a callable went to.
|
|
15
|
+
*/
|
|
16
|
+
readonly host: string;
|
|
17
|
+
/** The catalog suffix that matched (`host` when the match was exact). */
|
|
18
|
+
readonly endpoint: string;
|
|
19
|
+
/** Human service label, verbatim from the shared catalog. */
|
|
20
|
+
readonly service: string;
|
|
21
|
+
/** Present only for catalog entries that can never be a false positive. */
|
|
22
|
+
readonly alwaysBlock?: true;
|
|
23
|
+
}
|
|
24
|
+
/** `PYRIC_GUARD` → mode. Unset, empty or unrecognised all mean the safe
|
|
25
|
+
* default: report, do not break the developer's app. */
|
|
26
|
+
export declare function parseGuardMode(raw: string | undefined): GuardMode;
|
|
27
|
+
/** `PYRIC_GUARD_ALLOW` → hostnames. Accepts bare hosts and full URLs, because
|
|
28
|
+
* the values it carries are configured as URLs (AI engine baseUrls). */
|
|
29
|
+
export declare function parseAllowHosts(raw: string | undefined): string[];
|
|
30
|
+
/**
|
|
31
|
+
* The whole verdict, pure: catalog lookup, then `alwaysBlock`, then the
|
|
32
|
+
* allowlist, then the mode. `null` means nothing to say: either not a
|
|
33
|
+
* production endpoint, or the guard is off.
|
|
34
|
+
*/
|
|
35
|
+
export declare function evaluateEgress(hostname: string, policy: {
|
|
36
|
+
mode: GuardMode;
|
|
37
|
+
allow: readonly string[];
|
|
38
|
+
}): EgressVerdict | null;
|
|
39
|
+
/** One stderr line per verdict: structured (fixed leading fields, so it is
|
|
40
|
+
* greppable) and attributable (service + transport + initiating command).
|
|
41
|
+
* The request PATH is deliberately never logged: it carries ids and tokens. */
|
|
42
|
+
export declare function formatGuardLine(verdict: EgressVerdict, transport: 'fetch' | 'socket', context: string | undefined): string;
|
|
43
|
+
export interface ReporterOptions {
|
|
44
|
+
readonly mode: GuardMode;
|
|
45
|
+
readonly allow: readonly string[];
|
|
46
|
+
readonly write?: (line: string) => void;
|
|
47
|
+
/** Initiating command, for attribution. Usually `basename(argv[1])`. */
|
|
48
|
+
readonly context?: string;
|
|
49
|
+
/**
|
|
50
|
+
* The shared "already reported" ledger. `installNetGuard` hands the SAME set
|
|
51
|
+
* to the dispatcher wrapper and the socket backstop, because undici connects
|
|
52
|
+
* through `net.connect`: a warn-mode fetch trips both seams and would
|
|
53
|
+
* otherwise print the same host twice. It also survives a re-assert, so
|
|
54
|
+
* being re-wrapped does not restart the noise.
|
|
55
|
+
*/
|
|
56
|
+
readonly reported?: Set<string>;
|
|
57
|
+
}
|
|
58
|
+
interface Dispatcher {
|
|
59
|
+
dispatch(opts: unknown, handler: unknown): unknown;
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* Wrap a dispatcher so `dispatch` is guarded and every other member still
|
|
63
|
+
* belongs to the real instance.
|
|
64
|
+
*
|
|
65
|
+
* A `Proxy` rather than a subclass or a copy: undici's Agent keeps state in
|
|
66
|
+
* private fields and internal symbols, and every forwarded call must run with
|
|
67
|
+
* `this` bound to the REAL instance (hence `Reflect.get(target, prop, target)`
|
|
68
|
+
* and the bind) or those fields are not there. `instanceof` keeps working.
|
|
69
|
+
*/
|
|
70
|
+
export declare function wrapDispatcher<T extends Dispatcher>(real: T, options: ReporterOptions): T;
|
|
71
|
+
type ConnectFn = (...args: unknown[]) => unknown;
|
|
72
|
+
/** A `createConnection`-bearing object: an `http.Agent`/`https.Agent`
|
|
73
|
+
* prototype in production, a stand-in under test. */
|
|
74
|
+
type AgentPrototype = {
|
|
75
|
+
createConnection?: unknown;
|
|
76
|
+
};
|
|
77
|
+
export interface NetGuardHooks {
|
|
78
|
+
/** Object carrying the undici dispatcher symbol. Defaults to `globalThis`. */
|
|
79
|
+
scope?: Record<symbol, unknown>;
|
|
80
|
+
env?: Record<string, string | undefined>;
|
|
81
|
+
argv?: readonly string[];
|
|
82
|
+
write?: (line: string) => void;
|
|
83
|
+
net?: {
|
|
84
|
+
connect: ConnectFn;
|
|
85
|
+
createConnection: ConnectFn;
|
|
86
|
+
};
|
|
87
|
+
tls?: {
|
|
88
|
+
connect: ConnectFn;
|
|
89
|
+
};
|
|
90
|
+
/** Prototypes whose `createConnection` is patched. Defaults to the
|
|
91
|
+
* `http.Agent` and `https.Agent` prototypes. */
|
|
92
|
+
agentPrototypes?: readonly AgentPrototype[];
|
|
93
|
+
}
|
|
94
|
+
export interface NetGuard {
|
|
95
|
+
readonly mode: GuardMode;
|
|
96
|
+
readonly allow: readonly string[];
|
|
97
|
+
/** Re-wrap the global dispatcher if something replaced it (a future Next
|
|
98
|
+
* calling `setGlobalDispatcher` would otherwise silently unhook us). */
|
|
99
|
+
reassert(): void;
|
|
100
|
+
/** Stop the periodic re-assert. Used by the CLI's own tests. */
|
|
101
|
+
stop(): void;
|
|
102
|
+
}
|
|
103
|
+
/**
|
|
104
|
+
* Install the guard. Gated on `PYRIC_SANDBOX` exactly like the rest of the
|
|
105
|
+
* register module: without the activator this is a no-op, so the module stays
|
|
106
|
+
* safe to import anywhere. Returns `null` when nothing was installed.
|
|
107
|
+
*/
|
|
108
|
+
export declare function installNetGuard(hooks?: NetGuardHooks): NetGuard | null;
|
|
109
|
+
export {};
|
|
110
|
+
//# sourceMappingURL=net-guard.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"net-guard.d.ts","sourceRoot":"","sources":["../../src/register/net-guard.ts"],"names":[],"mappings":"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"}
|