@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,40 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Node-side factory for each tool family. This is the only bridge module
|
|
3
|
+
* that imports `pyric/rules/internal/node` or the conformance tools; the
|
|
4
|
+
* browser side has its own map in `client/tool-family-factories.ts`.
|
|
5
|
+
*
|
|
6
|
+
* The keys are the family record filenames. `satisfies` against the keys
|
|
7
|
+
* derived from the generated aggregate makes a missing or surplus entry a
|
|
8
|
+
* compile error.
|
|
9
|
+
*/
|
|
10
|
+
import type { ToolHandler } from '@inbrowser/agent';
|
|
11
|
+
import {
|
|
12
|
+
createFirestoreSimulatorTools,
|
|
13
|
+
createFirestoreRulesTools,
|
|
14
|
+
} from 'pyric/rules/internal/node';
|
|
15
|
+
import { createFirestoreDataTools, createFirestoreInspectTools } from 'pyric/firestore';
|
|
16
|
+
import { createRtdbInspectionTools } from '../../rtdb/inspection.js';
|
|
17
|
+
import { createConformanceTools } from '../../conformance/tools.js';
|
|
18
|
+
import type { ForwardedFamilyKey, InProcessFamilyKey } from '../tool-families.js';
|
|
19
|
+
|
|
20
|
+
/** A resolver that must never run: forwarded families are executed by the browser peer, not here. */
|
|
21
|
+
export type StubResolver = () => never;
|
|
22
|
+
|
|
23
|
+
/** Forwarded families, called with a stub so only metadata is read. */
|
|
24
|
+
export const FORWARDED_METADATA_FACTORIES = {
|
|
25
|
+
'firestore-simulator': (stub) => createFirestoreSimulatorTools({ resolveSandbox: stub as never }),
|
|
26
|
+
'firestore-data': (stub) => createFirestoreDataTools({ resolveDb: stub as never }),
|
|
27
|
+
'firestore-inspect': (stub) => createFirestoreInspectTools({ resolveSandbox: stub as never }),
|
|
28
|
+
'rtdb-inspection': (stub) => createRtdbInspectionTools({ resolveSandbox: stub as never }),
|
|
29
|
+
} satisfies Record<ForwardedFamilyKey, (stub: StubResolver) => ToolHandler[]>;
|
|
30
|
+
|
|
31
|
+
/**
|
|
32
|
+
* In-process families, returned as live handlers the MCP server registers
|
|
33
|
+
* directly. `scope` reaches the rules factory, which appends a hosted
|
|
34
|
+
* verification tool only when one is supplied; the default surface supplies
|
|
35
|
+
* none.
|
|
36
|
+
*/
|
|
37
|
+
export const IN_PROCESS_HANDLER_FACTORIES = {
|
|
38
|
+
'firestore-rules': (scope) => createFirestoreRulesTools({ scope } as never),
|
|
39
|
+
conformance: () => createConformanceTools(),
|
|
40
|
+
} satisfies Record<InProcessFamilyKey, (scope?: unknown) => ToolHandler[]>;
|
|
@@ -1,26 +1,27 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
3
|
-
* existing `pyric/rules` factories without running any
|
|
4
|
-
* tool logic. Used by the bridge to register MCP tools whose actual
|
|
5
|
-
* dispatch happens against the connected browser peer.
|
|
2
|
+
* Node-side composition of the tool families the bridge serves over MCP.
|
|
6
3
|
*
|
|
7
|
-
*
|
|
8
|
-
*
|
|
9
|
-
*
|
|
10
|
-
*
|
|
11
|
-
* the
|
|
12
|
-
*
|
|
13
|
-
*
|
|
4
|
+
* Forwarded families are executed by the browser sandbox peer, so this
|
|
5
|
+
* process never holds a `LocalEnvironment`. It still needs each tool's
|
|
6
|
+
* metadata (name, description, parameters) to populate the MCP tool list, so
|
|
7
|
+
* it calls the family factories with a stub resolver and reads only the
|
|
8
|
+
* metadata; the bridge replaces `execute` with forward-to-peer dispatch
|
|
9
|
+
* before any call reaches a handler.
|
|
10
|
+
*
|
|
11
|
+
* In-process families run here without a browser peer and are returned as
|
|
12
|
+
* live handlers.
|
|
13
|
+
*
|
|
14
|
+
* Family order comes from the records under `../tool-family-records/`; the
|
|
15
|
+
* factories come from `./tool-family-factories.ts`.
|
|
14
16
|
*/
|
|
15
17
|
|
|
16
18
|
import type { ToolHandler } from '@inbrowser/agent';
|
|
19
|
+
import { toolFamilies } from '../tool-families.js';
|
|
17
20
|
import {
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
import { createRtdbInspectionTools } from '../../rtdb/inspection.js';
|
|
23
|
-
import { createConformanceTools } from '../../conformance/tools.js';
|
|
21
|
+
FORWARDED_METADATA_FACTORIES,
|
|
22
|
+
IN_PROCESS_HANDLER_FACTORIES,
|
|
23
|
+
type StubResolver,
|
|
24
|
+
} from './tool-family-factories.js';
|
|
24
25
|
|
|
25
26
|
export interface ToolMetadata {
|
|
26
27
|
name: string;
|
|
@@ -37,63 +38,30 @@ function toMetadata(handler: ToolHandler): ToolMetadata {
|
|
|
37
38
|
}
|
|
38
39
|
|
|
39
40
|
/**
|
|
40
|
-
* Tool metadata for
|
|
41
|
-
*
|
|
42
|
-
*
|
|
43
|
-
* test) is NOT included here — those execute in Node and are
|
|
44
|
-
* registered separately, since they don't need the browser sandbox.
|
|
41
|
+
* Tool metadata for every forwarded family, in family order. The stub
|
|
42
|
+
* resolver never runs: the bridge replaces `execute()` with its own
|
|
43
|
+
* forward-to-peer dispatch.
|
|
45
44
|
*/
|
|
46
45
|
export function getSandboxToolMetadata(): ToolMetadata[] {
|
|
47
|
-
|
|
48
|
-
// its own forward-to-peer dispatch.
|
|
49
|
-
const stubResolver = async () => {
|
|
46
|
+
const stub: StubResolver = () => {
|
|
50
47
|
throw new Error(
|
|
51
48
|
'BUG: sandbox-tool factory executor invoked on the bridge side — should have been replaced',
|
|
52
49
|
);
|
|
53
50
|
};
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
...createFirestoreSimulatorTools({
|
|
58
|
-
resolveSandbox: stubResolver as never,
|
|
59
|
-
}),
|
|
60
|
-
// Data plane — addDoc / setDoc / getDoc / updateDoc / deleteDoc /
|
|
61
|
-
// collection / query / where — the modular Firestore CRUD surface
|
|
62
|
-
// routed through the browser sandbox so agents can drive a real app
|
|
63
|
-
// session rather than only the simulator.
|
|
64
|
-
...createFirestoreDataTools({
|
|
65
|
-
resolveDb: stubResolver as never,
|
|
66
|
-
}),
|
|
67
|
-
// `sandbox_inspect` — single-call diagnostic that answers
|
|
68
|
-
// "what state is the sandbox in?" Born out of CLAUDE_DEBUG_SESSION.md
|
|
69
|
-
// (a real agent needing 51 tool calls + 72k tokens to figure out
|
|
70
|
-
// that rules weren't loaded). Routes to the browser sandbox like
|
|
71
|
-
// the other forwarded tools.
|
|
72
|
-
...createFirestoreInspectTools({
|
|
73
|
-
resolveSandbox: stubResolver as never,
|
|
74
|
-
}),
|
|
75
|
-
...createRtdbInspectionTools({
|
|
76
|
-
resolveSandbox: stubResolver as never,
|
|
77
|
-
}),
|
|
78
|
-
];
|
|
79
|
-
return handlers.map(toMetadata);
|
|
51
|
+
return toolFamilies('forwarded')
|
|
52
|
+
.flatMap((family) => FORWARDED_METADATA_FACTORIES[family.key](stub))
|
|
53
|
+
.map(toMetadata);
|
|
80
54
|
}
|
|
81
55
|
|
|
82
56
|
/**
|
|
83
|
-
*
|
|
84
|
-
* (no browser needed). Returned as live ToolHandlers — the bridge
|
|
57
|
+
* Live handlers for every in-process family, in family order. The bridge
|
|
85
58
|
* registers each handler's `execute` directly.
|
|
86
59
|
*
|
|
87
60
|
* `scope` is forwarded so the hosted Rules Test API verification tool can
|
|
88
61
|
* authenticate without changing the bridge's sandbox-only execution model.
|
|
89
62
|
*/
|
|
90
63
|
export function getInProcessToolHandlers(scope?: unknown): ToolHandler[] {
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
// No browser is needed.
|
|
95
|
-
return [
|
|
96
|
-
...createFirestoreRulesTools({ scope } as never),
|
|
97
|
-
...createConformanceTools(),
|
|
98
|
-
];
|
|
64
|
+
return toolFamilies('in-process').flatMap((family) =>
|
|
65
|
+
IN_PROCESS_HANDLER_FACTORIES[family.key](scope),
|
|
66
|
+
);
|
|
99
67
|
}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
// Generated by scripts/generate-tool-family-registry.ts. Do not edit.
|
|
2
|
+
import type { ToolFamily } from './tool-families.js';
|
|
3
|
+
import conformance from './tool-family-records/conformance.js';
|
|
4
|
+
import firestoreData from './tool-family-records/firestore-data.js';
|
|
5
|
+
import firestoreInspect from './tool-family-records/firestore-inspect.js';
|
|
6
|
+
import firestoreRules from './tool-family-records/firestore-rules.js';
|
|
7
|
+
import firestoreSimulator from './tool-family-records/firestore-simulator.js';
|
|
8
|
+
import rtdbInspection from './tool-family-records/rtdb-inspection.js';
|
|
9
|
+
|
|
10
|
+
export const TOOL_FAMILIES = [
|
|
11
|
+
{ key: "conformance", ...conformance },
|
|
12
|
+
{ key: "firestore-data", ...firestoreData },
|
|
13
|
+
{ key: "firestore-inspect", ...firestoreInspect },
|
|
14
|
+
{ key: "firestore-rules", ...firestoreRules },
|
|
15
|
+
{ key: "firestore-simulator", ...firestoreSimulator },
|
|
16
|
+
{ key: "rtdb-inspection", ...rtdbInspection },
|
|
17
|
+
] as const satisfies readonly ToolFamily[];
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tool family contract shared by both sides of the bridge.
|
|
3
|
+
*
|
|
4
|
+
* A family is authored as one record under `tool-family-records/`: its
|
|
5
|
+
* transport, its position in the default `tools/list` order, and the exact
|
|
6
|
+
* tool names its factory yields. `scripts/generate-tool-family-registry.ts`
|
|
7
|
+
* aggregates the records into `tool-families.generated.ts`. This module reads
|
|
8
|
+
* only that aggregate, so the browser bundle and the MCP process share one
|
|
9
|
+
* manifest without either importing the other's factories.
|
|
10
|
+
*
|
|
11
|
+
* Factories live in `server/tool-family-factories.ts` (Node) and
|
|
12
|
+
* `client/tool-family-factories.ts` (browser). Each map is typed against the
|
|
13
|
+
* family keys derived here, so a record without a factory, or a factory
|
|
14
|
+
* without a record, fails to compile.
|
|
15
|
+
*/
|
|
16
|
+
import { TOOL_FAMILIES } from './tool-families.generated.js';
|
|
17
|
+
|
|
18
|
+
export type ToolTransport = 'forwarded' | 'in-process';
|
|
19
|
+
|
|
20
|
+
/** Authored in one record file per family. The key is the filename without `.ts`; the generator adds it. */
|
|
21
|
+
export interface ToolFamilyRecord {
|
|
22
|
+
/** `forwarded`: executed by the browser sandbox peer. `in-process`: executed in the MCP process. */
|
|
23
|
+
readonly transport: ToolTransport;
|
|
24
|
+
/** Stable position in the default `tools/list` order. Unique across all records; authored with gaps of 10. */
|
|
25
|
+
readonly order: number;
|
|
26
|
+
/** Exact names the family factory yields for the default surface, in factory order. */
|
|
27
|
+
readonly tools: readonly string[];
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
export interface ToolFamily extends ToolFamilyRecord {
|
|
31
|
+
readonly key: string;
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
type RegisteredFamily = (typeof TOOL_FAMILIES)[number];
|
|
35
|
+
export type ForwardedFamilyKey = Extract<RegisteredFamily, { transport: 'forwarded' }>['key'];
|
|
36
|
+
export type InProcessFamilyKey = Extract<RegisteredFamily, { transport: 'in-process' }>['key'];
|
|
37
|
+
|
|
38
|
+
function assertUnique(label: string, values: readonly (string | number)[]): void {
|
|
39
|
+
const seen = new Set<string | number>();
|
|
40
|
+
for (const value of values) {
|
|
41
|
+
if (seen.has(value)) throw new Error(`duplicate tool family ${label} '${value}'`);
|
|
42
|
+
seen.add(value);
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
function validateFamilies(families: readonly RegisteredFamily[]): readonly RegisteredFamily[] {
|
|
47
|
+
assertUnique('key', families.map((family) => family.key));
|
|
48
|
+
assertUnique('order', families.map((family) => family.order));
|
|
49
|
+
assertUnique('tool name', families.flatMap((family) => family.tools));
|
|
50
|
+
return [...families].sort((a, b) => a.order - b.order);
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
const FAMILIES_BY_ORDER = validateFamilies(TOOL_FAMILIES);
|
|
54
|
+
|
|
55
|
+
/** Families of one transport, sorted by `order`. Validates once at load: duplicate key, order, or tool name throws. */
|
|
56
|
+
export function toolFamilies<T extends ToolTransport>(
|
|
57
|
+
transport: T,
|
|
58
|
+
): readonly Extract<RegisteredFamily, { transport: T }>[] {
|
|
59
|
+
return FAMILIES_BY_ORDER.filter(
|
|
60
|
+
(family): family is Extract<RegisteredFamily, { transport: T }> =>
|
|
61
|
+
family.transport === transport,
|
|
62
|
+
);
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
/**
|
|
66
|
+
* Fail closed when a factory yields a different name set from the records.
|
|
67
|
+
* Both sides call this with the same message so drift reads the same
|
|
68
|
+
* wherever it surfaces.
|
|
69
|
+
*/
|
|
70
|
+
export function assertExactToolNames(
|
|
71
|
+
label: string,
|
|
72
|
+
actual: readonly string[],
|
|
73
|
+
expected: readonly string[],
|
|
74
|
+
): void {
|
|
75
|
+
const actualSorted = [...actual].sort();
|
|
76
|
+
const expectedSorted = [...expected].sort();
|
|
77
|
+
if (
|
|
78
|
+
actualSorted.length !== expectedSorted.length ||
|
|
79
|
+
actualSorted.some((name, index) => name !== expectedSorted[index])
|
|
80
|
+
) {
|
|
81
|
+
throw new Error(
|
|
82
|
+
`${label} drifted from the default MCP contract\n` +
|
|
83
|
+
`expected: ${expected.join(', ')}\n` +
|
|
84
|
+
`actual: ${actual.join(', ')}`,
|
|
85
|
+
);
|
|
86
|
+
}
|
|
87
|
+
}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import type { ToolFamilyRecord } from '../tool-families.js';
|
|
2
|
+
export default {
|
|
3
|
+
transport: 'forwarded',
|
|
4
|
+
order: 20,
|
|
5
|
+
tools: [
|
|
6
|
+
'firestore_get_document',
|
|
7
|
+
'firestore_list_documents',
|
|
8
|
+
'firestore_create_document',
|
|
9
|
+
'firestore_add_document',
|
|
10
|
+
'firestore_update_document',
|
|
11
|
+
'firestore_delete_document',
|
|
12
|
+
'firestore_batch_write',
|
|
13
|
+
'firestore_query_where',
|
|
14
|
+
],
|
|
15
|
+
} as const satisfies ToolFamilyRecord;
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import type { ToolFamilyRecord } from '../tool-families.js';
|
|
2
|
+
export default {
|
|
3
|
+
transport: 'in-process',
|
|
4
|
+
order: 50,
|
|
5
|
+
tools: [
|
|
6
|
+
'firestore_simulate_rules',
|
|
7
|
+
'firestore_rules_stdlib_list',
|
|
8
|
+
'firestore_rules_stdlib_get',
|
|
9
|
+
'firestore_lint_rules',
|
|
10
|
+
'firestore_resolve_modules',
|
|
11
|
+
'rules_stdlib_list',
|
|
12
|
+
'rules_stdlib_get',
|
|
13
|
+
'rules_resolve_modules',
|
|
14
|
+
],
|
|
15
|
+
} as const satisfies ToolFamilyRecord;
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import type { ToolFamilyRecord } from '../tool-families.js';
|
|
2
|
+
export default {
|
|
3
|
+
transport: 'forwarded',
|
|
4
|
+
order: 10,
|
|
5
|
+
tools: [
|
|
6
|
+
'firestore_simulator_create',
|
|
7
|
+
'firestore_simulator_execute',
|
|
8
|
+
'firestore_simulator_read',
|
|
9
|
+
'firestore_simulator_batch',
|
|
10
|
+
'firestore_create_with_auto_id',
|
|
11
|
+
'firestore_simulator_undo',
|
|
12
|
+
'firestore_simulator_redo',
|
|
13
|
+
'firestore_simulator_events',
|
|
14
|
+
'firestore_simulator_transaction',
|
|
15
|
+
],
|
|
16
|
+
} as const satisfies ToolFamilyRecord;
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Externalization presets and helpers for Node backend bundlers.
|
|
3
|
+
*
|
|
4
|
+
* Prevents backend bundlers (Rolldown, esbuild, tsup, Rollup, Vite, Webpack)
|
|
5
|
+
* from inlining Firebase and Firebase Admin SDKs into bundled server outputs,
|
|
6
|
+
* preserving runtime interception by `@pyric/cli/register` under `pyric sandbox`.
|
|
7
|
+
*/
|
|
8
|
+
|
|
9
|
+
/**
|
|
10
|
+
* RegExp patterns matching Firebase packages for bundlers that accept RegExp
|
|
11
|
+
* in their external configuration (Rolldown, Rollup, Vite, Webpack).
|
|
12
|
+
*/
|
|
13
|
+
export const pyricRollupExternals: readonly RegExp[] = Object.freeze([
|
|
14
|
+
/^firebase-admin(\/.*)?$/,
|
|
15
|
+
/^firebase(\/.*)?$/,
|
|
16
|
+
/^@firebase(\/.*)?$/,
|
|
17
|
+
]);
|
|
18
|
+
|
|
19
|
+
/**
|
|
20
|
+
* Wildcard string patterns matching Firebase packages for bundlers that require
|
|
21
|
+
* string arrays with glob wildcards (esbuild, tsup).
|
|
22
|
+
*/
|
|
23
|
+
export const pyricEsbuildExternals: readonly string[] = Object.freeze([
|
|
24
|
+
'firebase-admin',
|
|
25
|
+
'firebase-admin/*',
|
|
26
|
+
'firebase',
|
|
27
|
+
'firebase/*',
|
|
28
|
+
'@firebase/*',
|
|
29
|
+
]);
|
|
30
|
+
|
|
31
|
+
/**
|
|
32
|
+
* Universal predicate returning true if a module specifier belongs to Firebase
|
|
33
|
+
* or Firebase Admin SDK surfaces intercepted by Pyric.
|
|
34
|
+
*
|
|
35
|
+
* Compatible with bundlers that accept a function in their external setting
|
|
36
|
+
* (Rolldown, Rollup, Vite, Webpack).
|
|
37
|
+
*/
|
|
38
|
+
export function isPyricExternal(id: string): boolean {
|
|
39
|
+
if (typeof id !== 'string' || id.length === 0) {
|
|
40
|
+
return false;
|
|
41
|
+
}
|
|
42
|
+
return pyricRollupExternals.some((regex) => regex.test(id));
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
/**
|
|
46
|
+
* Convenience presets mapping bundler names to their supported external pattern format.
|
|
47
|
+
*/
|
|
48
|
+
export const pyricExternals = Object.freeze({
|
|
49
|
+
rolldown: pyricRollupExternals,
|
|
50
|
+
rollup: pyricRollupExternals,
|
|
51
|
+
vite: pyricRollupExternals,
|
|
52
|
+
webpack: pyricRollupExternals,
|
|
53
|
+
esbuild: pyricEsbuildExternals,
|
|
54
|
+
tsup: pyricEsbuildExternals,
|
|
55
|
+
});
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `@pyric/cli/bundler` — externalization presets and helpers for Node backend
|
|
3
|
+
* bundlers (Rolldown, esbuild, tsup, Rollup, Vite) to preserve `@pyric/cli/register`
|
|
4
|
+
* runtime sandbox interception.
|
|
5
|
+
*
|
|
6
|
+
* // rolldown.config.ts / rollup.config.js
|
|
7
|
+
* import { pyricExternals } from '@pyric/cli/bundler';
|
|
8
|
+
* export default { external: pyricExternals.rolldown };
|
|
9
|
+
*
|
|
10
|
+
* // vite.config.ts (SSR / Node backend builds)
|
|
11
|
+
* export default { build: { rollupOptions: { external: pyricExternals.vite } } };
|
|
12
|
+
*
|
|
13
|
+
* // tsup.config.ts / esbuild.config.mjs
|
|
14
|
+
* export default { external: pyricExternals.esbuild };
|
|
15
|
+
*/
|
|
16
|
+
export {
|
|
17
|
+
pyricRollupExternals,
|
|
18
|
+
pyricEsbuildExternals,
|
|
19
|
+
isPyricExternal,
|
|
20
|
+
pyricExternals,
|
|
21
|
+
} from './externals.js';
|
package/src/cli/cli.test.ts
CHANGED
|
@@ -461,47 +461,3 @@ describe('runInit', () => {
|
|
|
461
461
|
expect(io.getOut()).toContain('skipped package.json'); // unchanged merge
|
|
462
462
|
});
|
|
463
463
|
});
|
|
464
|
-
|
|
465
|
-
describe('scanForInlinedFirebase', () => {
|
|
466
|
-
it('flags a bundled chunk that inlines real-SDK endpoint hosts', async () => {
|
|
467
|
-
const { scanForInlinedFirebase } = await import('./serve.js');
|
|
468
|
-
const { mkdtempSync, mkdirSync, writeFileSync } = await import('node:fs');
|
|
469
|
-
const { tmpdir } = await import('node:os');
|
|
470
|
-
const { join } = await import('node:path');
|
|
471
|
-
const dir = mkdtempSync(join(tmpdir(), 'pyric-inline-scan-'));
|
|
472
|
-
mkdirSync(join(dir, 'assets'));
|
|
473
|
-
writeFileSync(
|
|
474
|
-
join(dir, 'assets', 'index-abc.js'),
|
|
475
|
-
'fetch("https://identitytoolkit.googleapis.com/v1/projects?key="+k)',
|
|
476
|
-
);
|
|
477
|
-
const hits = scanForInlinedFirebase(dir);
|
|
478
|
-
expect(hits).toEqual(['assets/index-abc.js']);
|
|
479
|
-
});
|
|
480
|
-
|
|
481
|
-
it('stays clean for an unbundled app importing firebase by bare specifier', async () => {
|
|
482
|
-
const { scanForInlinedFirebase } = await import('./serve.js');
|
|
483
|
-
const { mkdtempSync, writeFileSync } = await import('node:fs');
|
|
484
|
-
const { tmpdir } = await import('node:os');
|
|
485
|
-
const { join } = await import('node:path');
|
|
486
|
-
const dir = mkdtempSync(join(tmpdir(), 'pyric-inline-clean-'));
|
|
487
|
-
writeFileSync(
|
|
488
|
-
join(dir, 'main.js'),
|
|
489
|
-
"import { getAuth } from 'firebase/auth'; import { getFirestore } from 'firebase/firestore';",
|
|
490
|
-
);
|
|
491
|
-
expect(scanForInlinedFirebase(dir)).toEqual([]);
|
|
492
|
-
});
|
|
493
|
-
|
|
494
|
-
it('ignores hidden frameworks and build cache directories like .next and .git', async () => {
|
|
495
|
-
const { scanForInlinedFirebase } = await import('./serve.js');
|
|
496
|
-
const { mkdtempSync, mkdirSync, writeFileSync } = await import('node:fs');
|
|
497
|
-
const { tmpdir } = await import('node:os');
|
|
498
|
-
const { join } = await import('node:path');
|
|
499
|
-
const dir = mkdtempSync(join(tmpdir(), 'pyric-inline-ignore-'));
|
|
500
|
-
mkdirSync(join(dir, '.next'));
|
|
501
|
-
writeFileSync(
|
|
502
|
-
join(dir, '.next', 'bundle.js'),
|
|
503
|
-
'fetch("https://identitytoolkit.googleapis.com/v1/projects?key="+k)',
|
|
504
|
-
);
|
|
505
|
-
expect(scanForInlinedFirebase(dir)).toEqual([]);
|
|
506
|
-
});
|
|
507
|
-
});
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Detect a served frontend build that inlined the real Firebase SDK.
|
|
3
|
+
*
|
|
4
|
+
* The served import map remaps only bare `firebase/*` specifiers, so a plain
|
|
5
|
+
* `vite build` that compiled the SDK into an app chunk cannot be sandboxed:
|
|
6
|
+
* its calls reach real Google endpoints while the injected banner claims
|
|
7
|
+
* otherwise. `cli/serve.ts` refuses such a dist rather than serving it.
|
|
8
|
+
*
|
|
9
|
+
* Only the SDK fingerprint hosts are matched, never the full endpoint catalog.
|
|
10
|
+
* This check throws, and a dist can legitimately carry a bare callable URL, a
|
|
11
|
+
* public asset URL, or a `databaseURL` literal without any Firebase SDK in it.
|
|
12
|
+
*
|
|
13
|
+
* Backend bundles are deliberately out of scope. `withPyric` externalizes
|
|
14
|
+
* firebase and firebase-admin, the backend-bundler docs tell users to mark them
|
|
15
|
+
* external, and the net guard reports real egress at runtime with attribution,
|
|
16
|
+
* which a grep over build output cannot do.
|
|
17
|
+
*/
|
|
18
|
+
import { readdirSync, readFileSync, statSync } from 'node:fs';
|
|
19
|
+
import { join } from 'node:path';
|
|
20
|
+
import { SDK_FINGERPRINT_HOSTS } from '../google-endpoints.js';
|
|
21
|
+
|
|
22
|
+
/** Depth limit for the walk. */
|
|
23
|
+
const MAX_DEPTH = 4;
|
|
24
|
+
|
|
25
|
+
/** Total script files read. */
|
|
26
|
+
const MAX_FILES = 200;
|
|
27
|
+
|
|
28
|
+
/** Script extensions worth reading in served frontend output. */
|
|
29
|
+
const SCRIPT_FILE = /\.(js|mjs)$/;
|
|
30
|
+
|
|
31
|
+
/**
|
|
32
|
+
* Scan `dir` for inlined SDK fingerprints and return the offending paths,
|
|
33
|
+
* relative to `dir`. Bounded: depth 4, 200 script files, first hit per file.
|
|
34
|
+
*/
|
|
35
|
+
export function scanForInlinedFirebase(dir: string): string[] {
|
|
36
|
+
const hits: string[] = [];
|
|
37
|
+
let scanned = 0;
|
|
38
|
+
const walk = (current: string, rel: string, depth: number): void => {
|
|
39
|
+
if (depth > MAX_DEPTH || scanned >= MAX_FILES) return;
|
|
40
|
+
let names: string[];
|
|
41
|
+
try {
|
|
42
|
+
names = readdirSync(current);
|
|
43
|
+
} catch {
|
|
44
|
+
return;
|
|
45
|
+
}
|
|
46
|
+
for (const name of names) {
|
|
47
|
+
if (scanned >= MAX_FILES) return;
|
|
48
|
+
const path = join(current, name);
|
|
49
|
+
const relPath = rel ? `${rel}/${name}` : name;
|
|
50
|
+
let stat;
|
|
51
|
+
try {
|
|
52
|
+
stat = statSync(path);
|
|
53
|
+
} catch {
|
|
54
|
+
continue;
|
|
55
|
+
}
|
|
56
|
+
if (stat.isDirectory()) {
|
|
57
|
+
// The pyric namespace itself never lands in hosting.public, but a
|
|
58
|
+
// node_modules inside a served dir would be a scan-cost trap.
|
|
59
|
+
// Dot-directories (.next, .git, .pyric) are internal caches.
|
|
60
|
+
if (name === 'node_modules' || name.startsWith('.')) continue;
|
|
61
|
+
walk(path, relPath, depth + 1);
|
|
62
|
+
continue;
|
|
63
|
+
}
|
|
64
|
+
if (!SCRIPT_FILE.test(name)) continue;
|
|
65
|
+
scanned++;
|
|
66
|
+
let text: string;
|
|
67
|
+
try {
|
|
68
|
+
text = readFileSync(path, 'utf8');
|
|
69
|
+
} catch {
|
|
70
|
+
continue; // unreadable asset
|
|
71
|
+
}
|
|
72
|
+
if (SDK_FINGERPRINT_HOSTS.some((host) => text.includes(host))) hits.push(relPath);
|
|
73
|
+
}
|
|
74
|
+
};
|
|
75
|
+
walk(dir, '', 0);
|
|
76
|
+
return hits;
|
|
77
|
+
}
|