@pyric/cli 0.1.0-alpha.19 → 0.1.0-alpha.21
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +64 -89
- package/dist/assurance/.generated/conformance-verdicts.d.ts +68 -1
- package/dist/assurance/.generated/conformance-verdicts.d.ts.map +1 -1
- package/dist/assurance/.generated/conformance-verdicts.js +68 -1
- package/dist/assurance/.generated/conformance-verdicts.js.map +1 -1
- package/dist/bridge/client/dispatch.d.ts +25 -19
- package/dist/bridge/client/dispatch.d.ts.map +1 -1
- package/dist/bridge/client/dispatch.js +41 -48
- package/dist/bridge/client/dispatch.js.map +1 -1
- package/dist/bridge/client/tool-family-factories.d.ts +26 -0
- package/dist/bridge/client/tool-family-factories.d.ts.map +1 -0
- package/dist/bridge/client/tool-family-factories.js +10 -0
- package/dist/bridge/client/tool-family-factories.js.map +1 -0
- package/dist/bridge/server/mcp-contract.d.ts +7 -6
- package/dist/bridge/server/mcp-contract.d.ts.map +1 -1
- package/dist/bridge/server/mcp-contract.js +9 -48
- package/dist/bridge/server/mcp-contract.js.map +1 -1
- package/dist/bridge/server/peer.d.ts +11 -1
- package/dist/bridge/server/peer.d.ts.map +1 -1
- package/dist/bridge/server/peer.js +22 -1
- package/dist/bridge/server/peer.js.map +1 -1
- package/dist/bridge/server/tool-family-factories.d.ts +30 -0
- package/dist/bridge/server/tool-family-factories.d.ts.map +1 -0
- package/dist/bridge/server/tool-family-factories.js +22 -0
- package/dist/bridge/server/tool-family-factories.js.map +1 -0
- package/dist/bridge/server/tool-metadata.d.ts +17 -18
- package/dist/bridge/server/tool-metadata.d.ts.map +1 -1
- package/dist/bridge/server/tool-metadata.js +24 -59
- package/dist/bridge/server/tool-metadata.js.map +1 -1
- package/dist/bridge/tool-families.d.ts +48 -0
- package/dist/bridge/tool-families.d.ts.map +1 -0
- package/dist/bridge/tool-families.generated.d.ts +32 -0
- package/dist/bridge/tool-families.generated.d.ts.map +1 -0
- package/dist/bridge/tool-families.generated.js +15 -0
- package/dist/bridge/tool-families.generated.js.map +1 -0
- package/dist/bridge/tool-families.js +51 -0
- package/dist/bridge/tool-families.js.map +1 -0
- package/dist/bridge/tool-family-records/conformance.d.ts +7 -0
- package/dist/bridge/tool-family-records/conformance.d.ts.map +1 -0
- package/dist/bridge/tool-family-records/conformance.js +6 -0
- package/dist/bridge/tool-family-records/conformance.js.map +1 -0
- package/dist/bridge/tool-family-records/firestore-data.d.ts +7 -0
- package/dist/bridge/tool-family-records/firestore-data.d.ts.map +1 -0
- package/dist/bridge/tool-family-records/firestore-data.js +15 -0
- package/dist/bridge/tool-family-records/firestore-data.js.map +1 -0
- package/dist/bridge/tool-family-records/firestore-inspect.d.ts +7 -0
- package/dist/bridge/tool-family-records/firestore-inspect.d.ts.map +1 -0
- package/dist/bridge/tool-family-records/firestore-inspect.js +6 -0
- package/dist/bridge/tool-family-records/firestore-inspect.js.map +1 -0
- package/dist/bridge/tool-family-records/firestore-rules.d.ts +7 -0
- package/dist/bridge/tool-family-records/firestore-rules.d.ts.map +1 -0
- package/dist/bridge/tool-family-records/firestore-rules.js +15 -0
- package/dist/bridge/tool-family-records/firestore-rules.js.map +1 -0
- package/dist/bridge/tool-family-records/firestore-simulator.d.ts +7 -0
- package/dist/bridge/tool-family-records/firestore-simulator.d.ts.map +1 -0
- package/dist/bridge/tool-family-records/firestore-simulator.js +16 -0
- package/dist/bridge/tool-family-records/firestore-simulator.js.map +1 -0
- package/dist/bridge/tool-family-records/rtdb-inspection.d.ts +7 -0
- package/dist/bridge/tool-family-records/rtdb-inspection.d.ts.map +1 -0
- package/dist/bridge/tool-family-records/rtdb-inspection.js +6 -0
- package/dist/bridge/tool-family-records/rtdb-inspection.js.map +1 -0
- package/dist/bundler/externals.d.ts +37 -0
- package/dist/bundler/externals.d.ts.map +1 -0
- package/dist/bundler/externals.js +52 -0
- package/dist/bundler/externals.js.map +1 -0
- package/dist/bundler/index.d.ts +17 -0
- package/dist/bundler/index.d.ts.map +1 -0
- package/dist/bundler/index.js +17 -0
- package/dist/bundler/index.js.map +1 -0
- package/dist/cli/index.d.ts +2 -2
- package/dist/cli/index.d.ts.map +1 -1
- package/dist/cli/index.js +48 -42
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/inlined-sdk-scanner.d.ts +6 -0
- package/dist/cli/inlined-sdk-scanner.d.ts.map +1 -0
- package/dist/cli/inlined-sdk-scanner.js +82 -0
- package/dist/cli/inlined-sdk-scanner.js.map +1 -0
- package/dist/cli/mcp-proxy.js +3 -3
- package/dist/cli/mcp-proxy.js.map +1 -1
- package/dist/cli/parse-args.d.ts +1 -1
- package/dist/cli/parse-args.d.ts.map +1 -1
- package/dist/cli/parse-args.js +51 -15
- package/dist/cli/parse-args.js.map +1 -1
- package/dist/cli/pyric-config.d.ts +24 -0
- package/dist/cli/pyric-config.d.ts.map +1 -0
- package/dist/cli/pyric-config.js +28 -0
- package/dist/cli/pyric-config.js.map +1 -0
- package/dist/cli/sandbox-interlock.d.ts +97 -0
- package/dist/cli/sandbox-interlock.d.ts.map +1 -0
- package/dist/cli/sandbox-interlock.js +112 -0
- package/dist/cli/sandbox-interlock.js.map +1 -0
- package/dist/cli/{dev-runner.d.ts → sandbox-runner.d.ts} +53 -48
- package/dist/cli/sandbox-runner.d.ts.map +1 -0
- package/dist/cli/{dev-runner.js → sandbox-runner.js} +105 -67
- package/dist/cli/sandbox-runner.js.map +1 -0
- package/dist/cli/serve.d.ts +12 -14
- package/dist/cli/serve.d.ts.map +1 -1
- package/dist/cli/serve.js +155 -116
- package/dist/cli/serve.js.map +1 -1
- package/dist/cli/snapshot.js +5 -5
- package/dist/cli/snapshot.js.map +1 -1
- package/dist/cli/unsupported-runtime.d.ts +27 -0
- package/dist/cli/unsupported-runtime.d.ts.map +1 -0
- package/dist/cli/unsupported-runtime.js +63 -0
- package/dist/cli/unsupported-runtime.js.map +1 -0
- package/dist/cli/verify.js +1 -1
- package/dist/cli/verify.js.map +1 -1
- package/dist/conformance/.generated/can-i-use-browser.d.ts +1 -1
- package/dist/conformance/.generated/can-i-use-browser.d.ts.map +1 -1
- package/dist/conformance/.generated/can-i-use-browser.js +1 -1
- package/dist/conformance/.generated/can-i-use-browser.js.map +1 -1
- package/dist/conformance/.generated/can-i-use.d.ts +1 -1
- package/dist/conformance/.generated/can-i-use.d.ts.map +1 -1
- package/dist/conformance/.generated/can-i-use.js +1 -1
- package/dist/conformance/.generated/can-i-use.js.map +1 -1
- package/dist/conformance/.generated/conformance-docs.d.ts.map +1 -1
- package/dist/conformance/.generated/conformance-docs.js +1 -1
- package/dist/conformance/.generated/conformance-docs.js.map +1 -1
- package/dist/functions-rtdb/child.d.ts +37 -0
- package/dist/functions-rtdb/child.d.ts.map +1 -1
- package/dist/functions-rtdb/child.js +90 -21
- package/dist/functions-rtdb/child.js.map +1 -1
- package/dist/functions-rtdb/development-runtime.d.ts +3 -0
- package/dist/functions-rtdb/development-runtime.d.ts.map +1 -1
- package/dist/functions-rtdb/development-runtime.js +2 -1
- package/dist/functions-rtdb/development-runtime.js.map +1 -1
- package/dist/functions-rtdb/project.js +8 -8
- package/dist/functions-rtdb/project.js.map +1 -1
- package/dist/google-endpoints.d.ts +67 -0
- package/dist/google-endpoints.d.ts.map +1 -0
- package/dist/google-endpoints.js +119 -0
- package/dist/google-endpoints.js.map +1 -0
- package/dist/next/guard.js +1 -1
- package/dist/next/guard.js.map +1 -1
- package/dist/next/runtime-env.d.ts.map +1 -1
- package/dist/next/runtime-env.js +5 -0
- package/dist/next/runtime-env.js.map +1 -1
- package/dist/next/with-pyric.d.ts +1 -1
- package/dist/next/with-pyric.js +1 -1
- package/dist/register/beacon.d.ts +69 -0
- package/dist/register/beacon.d.ts.map +1 -0
- package/dist/register/beacon.js +199 -0
- package/dist/register/beacon.js.map +1 -0
- package/dist/register/index.d.ts.map +1 -1
- package/dist/register/index.js +65 -6
- package/dist/register/index.js.map +1 -1
- package/dist/register/net-guard.d.ts +110 -0
- package/dist/register/net-guard.d.ts.map +1 -0
- package/dist/register/net-guard.js +462 -0
- package/dist/register/net-guard.js.map +1 -0
- package/dist/remote/index.d.ts +1 -1
- package/dist/remote/index.js +9 -9
- package/dist/remote/index.js.map +1 -1
- package/dist/serve/ai-diagnostics-relay.d.ts +63 -0
- package/dist/serve/ai-diagnostics-relay.d.ts.map +1 -0
- package/dist/serve/ai-diagnostics-relay.js +125 -0
- package/dist/serve/ai-diagnostics-relay.js.map +1 -0
- package/dist/serve/ai-proxy.d.ts +92 -0
- package/dist/serve/ai-proxy.d.ts.map +1 -0
- package/dist/serve/ai-proxy.js +269 -0
- package/dist/serve/ai-proxy.js.map +1 -0
- package/dist/serve/ai-status.d.ts +44 -0
- package/dist/serve/ai-status.d.ts.map +1 -0
- package/dist/serve/ai-status.js +77 -0
- package/dist/serve/ai-status.js.map +1 -0
- package/dist/serve/ai-terminal-blocks.d.ts +97 -0
- package/dist/serve/ai-terminal-blocks.d.ts.map +1 -0
- package/dist/serve/ai-terminal-blocks.js +128 -0
- package/dist/serve/ai-terminal-blocks.js.map +1 -0
- package/dist/serve/ai-terminal-text.d.ts +36 -0
- package/dist/serve/ai-terminal-text.d.ts.map +1 -0
- package/dist/serve/ai-terminal-text.js +48 -0
- package/dist/serve/ai-terminal-text.js.map +1 -0
- package/dist/serve/beacon-route.d.ts +53 -0
- package/dist/serve/beacon-route.d.ts.map +1 -0
- package/dist/serve/beacon-route.js +101 -0
- package/dist/serve/beacon-route.js.map +1 -0
- package/dist/serve/bundler.js +10 -10
- package/dist/serve/bundler.js.map +1 -1
- package/dist/serve/entries/active-auth-registry.d.ts +16 -0
- package/dist/serve/entries/active-auth-registry.d.ts.map +1 -0
- package/dist/serve/entries/active-auth-registry.js +48 -0
- package/dist/serve/entries/active-auth-registry.js.map +1 -0
- package/dist/serve/entries/active-auth.d.ts +18 -0
- package/dist/serve/entries/active-auth.d.ts.map +1 -0
- package/dist/serve/entries/active-auth.js +84 -0
- package/dist/serve/entries/active-auth.js.map +1 -0
- package/dist/serve/entries/ai.d.ts.map +1 -1
- package/dist/serve/entries/ai.js +27 -1
- package/dist/serve/entries/ai.js.map +1 -1
- package/dist/serve/entries/auth-helper-core.d.ts +1 -0
- package/dist/serve/entries/auth-helper-core.d.ts.map +1 -1
- package/dist/serve/entries/auth-helper-core.js +4 -0
- package/dist/serve/entries/auth-helper-core.js.map +1 -1
- package/dist/serve/entries/auth-helper-dom.d.ts.map +1 -1
- package/dist/serve/entries/auth-helper-dom.js +29 -3
- package/dist/serve/entries/auth-helper-dom.js.map +1 -1
- package/dist/serve/entries/auth-helper-runtime.js +1 -1
- package/dist/serve/entries/auth-helper-runtime.js.map +1 -1
- package/dist/serve/entries/auth.d.ts.map +1 -1
- package/dist/serve/entries/auth.js +8 -0
- package/dist/serve/entries/auth.js.map +1 -1
- package/dist/serve/entries/bridge-url.d.ts +1 -1
- package/dist/serve/entries/bridge-url.js +1 -1
- package/dist/serve/entries/firestore.js +3 -3
- package/dist/serve/entries/firestore.js.map +1 -1
- package/dist/serve/entries/init.d.ts.map +1 -1
- package/dist/serve/entries/init.js +70 -4
- package/dist/serve/entries/init.js.map +1 -1
- package/dist/serve/entries/keepalive.js +1 -1
- package/dist/serve/entries/keepalive.js.map +1 -1
- package/dist/serve/entries/runtime.d.ts.map +1 -1
- package/dist/serve/entries/runtime.js +30 -14
- package/dist/serve/entries/runtime.js.map +1 -1
- package/dist/serve/entries/storage.js +1 -1
- package/dist/serve/entries/storage.js.map +1 -1
- package/dist/serve/entries/worker-runtime.js +1 -1
- package/dist/serve/entries/worker-runtime.js.map +1 -1
- package/dist/serve/init-payload.d.ts +4 -0
- package/dist/serve/init-payload.d.ts.map +1 -1
- package/dist/serve/namespace.d.ts +20 -5
- package/dist/serve/namespace.d.ts.map +1 -1
- package/dist/serve/namespace.js +93 -129
- package/dist/serve/namespace.js.map +1 -1
- package/dist/serve/rules.d.ts.map +1 -1
- package/dist/serve/rules.js +44 -21
- package/dist/serve/rules.js.map +1 -1
- package/dist/serve/runtime/chip-config.d.ts.map +1 -1
- package/dist/serve/runtime/chip-config.js +16 -2
- package/dist/serve/runtime/chip-config.js.map +1 -1
- package/dist/serve/runtime/chip-dialog.d.ts +18 -0
- package/dist/serve/runtime/chip-dialog.d.ts.map +1 -0
- package/dist/serve/runtime/chip-dialog.js +315 -0
- package/dist/serve/runtime/chip-dialog.js.map +1 -0
- package/dist/serve/runtime/chip-install.d.ts +2 -0
- package/dist/serve/runtime/chip-install.d.ts.map +1 -1
- package/dist/serve/runtime/chip-install.js +9 -4
- package/dist/serve/runtime/chip-install.js.map +1 -1
- package/dist/serve/runtime/chip-user-search.d.ts +16 -0
- package/dist/serve/runtime/chip-user-search.d.ts.map +1 -0
- package/dist/serve/runtime/chip-user-search.js +354 -0
- package/dist/serve/runtime/chip-user-search.js.map +1 -0
- package/dist/serve/runtime/chip.d.ts +10 -0
- package/dist/serve/runtime/chip.d.ts.map +1 -1
- package/dist/serve/runtime/chip.js +149 -15
- package/dist/serve/runtime/chip.js.map +1 -1
- package/dist/serve/runtime/identity.d.ts +17 -0
- package/dist/serve/runtime/identity.d.ts.map +1 -0
- package/dist/serve/runtime/identity.js +10 -0
- package/dist/serve/runtime/identity.js.map +1 -0
- package/dist/serve/runtime/manifest.d.ts +1 -1
- package/dist/serve/runtime/manifest.d.ts.map +1 -1
- package/dist/serve/runtime/manifest.js +1 -1
- package/dist/serve/runtime/manifest.js.map +1 -1
- package/dist/serve/runtime/status.d.ts.map +1 -1
- package/dist/serve/runtime/status.js +23 -0
- package/dist/serve/runtime/status.js.map +1 -1
- package/dist/serve/sandbox-session.d.ts +8 -0
- package/dist/serve/sandbox-session.d.ts.map +1 -1
- package/dist/serve/sandbox-session.js +12 -4
- package/dist/serve/sandbox-session.js.map +1 -1
- package/dist/serve/server.d.ts +7 -0
- package/dist/serve/server.d.ts.map +1 -1
- package/dist/serve/server.js +15 -1
- package/dist/serve/server.js.map +1 -1
- package/dist/serve/site-ui/404.html +1 -1
- package/dist/serve/site-ui/_astro/{RulesCodeEditor.Bl-XMkhD.js → RulesCodeEditor.DsTAsKIa.js} +1 -1
- package/dist/serve/site-ui/_astro/_slug_.Da5VLhW1.css +1 -0
- package/dist/serve/site-ui/_astro/_studio_.BnfYCKoI.css +1 -0
- package/dist/serve/site-ui/_astro/app.BOr2kwae.js +115 -0
- package/dist/serve/site-ui/_astro/app.DhAcImFD.js +1 -0
- package/dist/serve/site-ui/_astro/app.pMSnN6Qw.css +1 -0
- package/dist/serve/site-ui/_astro/{chess-showcase.Dh5D8kqe.js → chess-showcase.Bn_pP6UJ.js} +2 -2
- package/dist/serve/site-ui/_astro/{example-runtime.CuyAjjiG.js → example-runtime.CXopTGv7.js} +1 -1
- package/dist/serve/site-ui/_astro/index.Tb-31efc.css +1 -0
- package/dist/serve/site-ui/_astro/index.UkCBr-_0.css +1 -0
- package/dist/serve/site-ui/_astro/sandbox-controls.rOuZTOUG.js +510 -0
- package/dist/serve/site-ui/_astro/{seed.CSUkloMi.js → seed.03a08f9t.js} +2 -2
- package/dist/serve/site-ui/_astro/writes.BsPBG3dp.js +653 -0
- package/dist/serve/site-ui/auth/index.html +5 -3
- package/dist/serve/site-ui/david-east.jpg +0 -0
- package/dist/serve/site-ui/docs/_rhythm/index.html +6 -3
- package/dist/serve/site-ui/docs/_rhythm.md +1 -1
- package/dist/serve/site-ui/docs/agent/set-up-your-agent/index.html +18 -15
- package/dist/serve/site-ui/docs/agent/set-up-your-agent.md +16 -16
- package/dist/serve/site-ui/docs/agent/watch-and-review/index.html +6 -5
- package/dist/serve/site-ui/docs/agent/watch-and-review.md +1 -5
- package/dist/serve/site-ui/docs/agent/work-with-an-agent/index.html +8 -5
- package/dist/serve/site-ui/docs/agent/work-with-an-agent.md +4 -4
- package/dist/serve/site-ui/docs/ai-compat/index.html +5 -2
- package/dist/serve/site-ui/docs/api-reference/index.html +13 -2
- package/dist/serve/site-ui/docs/api-reference.md +8 -0
- package/dist/serve/site-ui/docs/app-compat/index.html +5 -2
- package/dist/serve/site-ui/docs/auth-compat/index.html +7 -4
- package/dist/serve/site-ui/docs/auth-compat.md +2 -2
- package/dist/serve/site-ui/docs/build/ai-logic/index.html +10 -2
- package/dist/serve/site-ui/docs/build/ai-logic.md +6 -0
- package/dist/serve/site-ui/docs/build/authentication/index.html +7 -4
- package/dist/serve/site-ui/docs/build/authentication.md +2 -2
- package/dist/serve/site-ui/docs/build/cloud-firestore/index.html +5 -2
- package/dist/serve/site-ui/docs/build/cloud-messaging/index.html +5 -2
- package/dist/serve/site-ui/docs/build/cloud-storage/index.html +6 -3
- package/dist/serve/site-ui/docs/build/cloud-storage.md +1 -1
- package/dist/serve/site-ui/docs/build/realtime-database/index.html +9 -6
- package/dist/serve/site-ui/docs/build/realtime-database.md +4 -4
- package/dist/serve/site-ui/docs/conformance-scores/index.html +10 -3
- package/dist/serve/site-ui/docs/conformance-scores.md +5 -1
- package/dist/serve/site-ui/docs/create-pyric-reference-api/index.html +6 -3
- package/dist/serve/site-ui/docs/create-pyric-reference-api.md +1 -1
- package/dist/serve/site-ui/docs/database-compat/index.html +48 -45
- package/dist/serve/site-ui/docs/database-compat.md +43 -43
- package/dist/serve/site-ui/docs/examples/chess/index.html +5 -2
- package/dist/serve/site-ui/docs/examples/index.html +5 -2
- package/dist/serve/site-ui/docs/firestore-compat/index.html +8 -5
- package/dist/serve/site-ui/docs/firestore-compat.md +3 -3
- package/dist/serve/site-ui/docs/firestore-flutter-compat/index.html +319 -0
- package/dist/serve/site-ui/docs/firestore-flutter-compat.md +344 -0
- package/dist/serve/site-ui/docs/functions-rtdb-compat/index.html +5 -2
- package/dist/serve/site-ui/docs/get-started/backend-bundlers/index.html +105 -0
- package/dist/serve/site-ui/docs/get-started/backend-bundlers.md +165 -0
- package/dist/serve/site-ui/docs/get-started/how-the-swap-works/index.html +9 -6
- package/dist/serve/site-ui/docs/get-started/how-the-swap-works.md +5 -5
- package/dist/serve/site-ui/docs/get-started/nextjs/index.html +9 -6
- package/dist/serve/site-ui/docs/get-started/nextjs.md +4 -4
- package/dist/serve/site-ui/docs/get-started/start-building/index.html +14 -9
- package/dist/serve/site-ui/docs/get-started/start-building.md +16 -10
- package/dist/serve/site-ui/docs/get-started/vite/index.html +6 -3
- package/dist/serve/site-ui/docs/get-started/vite.md +1 -1
- package/dist/serve/site-ui/docs/index.json +3128 -1613
- package/dist/serve/site-ui/docs/messaging-compat/index.html +5 -2
- package/dist/serve/site-ui/docs/observe/resolve-runtime-status/index.html +5 -2
- package/dist/serve/site-ui/docs/observe/see-whats-happening/index.html +6 -4
- package/dist/serve/site-ui/docs/observe/see-whats-happening.md +2 -4
- package/dist/serve/site-ui/docs/observe/shape-your-data/index.html +9 -6
- package/dist/serve/site-ui/docs/observe/shape-your-data.md +4 -4
- package/dist/serve/site-ui/docs/overview/index.html +16 -10
- package/dist/serve/site-ui/docs/overview.md +19 -11
- package/dist/serve/site-ui/docs/pyric-admin-app-reference-api/index.html +5 -2
- package/dist/serve/site-ui/docs/pyric-admin-auth-reference-api/index.html +5 -2
- package/dist/serve/site-ui/docs/pyric-admin-database-reference-api/index.html +5 -2
- package/dist/serve/site-ui/docs/pyric-admin-firestore-reference-api/index.html +8 -5
- package/dist/serve/site-ui/docs/pyric-admin-firestore-reference-api.md +3 -3
- package/dist/serve/site-ui/docs/pyric-admin-messaging-reference-api/index.html +5 -2
- package/dist/serve/site-ui/docs/pyric-admin-reference-api/index.html +501 -0
- package/dist/serve/site-ui/docs/pyric-admin-reference-api.md +587 -0
- package/dist/serve/site-ui/docs/pyric-admin-storage-reference-api/index.html +5 -2
- package/dist/serve/site-ui/docs/pyric-ai-reference-api/index.html +5 -2
- package/dist/serve/site-ui/docs/pyric-ai-scripting-reference-api/index.html +5 -2
- package/dist/serve/site-ui/docs/pyric-analytics-reference-api/index.html +124 -0
- package/dist/serve/site-ui/docs/pyric-analytics-reference-api.md +287 -0
- package/dist/serve/site-ui/docs/pyric-app-check-reference-api/index.html +87 -0
- package/dist/serve/site-ui/docs/pyric-app-check-reference-api.md +199 -0
- package/dist/serve/site-ui/docs/pyric-app-reference-api/index.html +5 -2
- package/dist/serve/site-ui/docs/pyric-auth-reference-api/index.html +10 -3
- package/dist/serve/site-ui/docs/pyric-auth-reference-api.md +2 -1
- package/dist/serve/site-ui/docs/pyric-cli-assurance-browser-reference-api/index.html +5 -2
- package/dist/serve/site-ui/docs/pyric-cli-assurance-reference-api/index.html +5 -2
- package/dist/serve/site-ui/docs/pyric-cli-bridge-client-reference-api/index.html +6 -3
- package/dist/serve/site-ui/docs/pyric-cli-bridge-client-reference-api.md +1 -1
- package/dist/serve/site-ui/docs/pyric-cli-bridge-reference-api/index.html +5 -2
- package/dist/serve/site-ui/docs/pyric-cli-bundler-reference-api/index.html +56 -0
- package/dist/serve/site-ui/docs/pyric-cli-bundler-reference-api.md +72 -0
- package/dist/serve/site-ui/docs/pyric-cli-conformance-browser-reference-api/index.html +6 -2
- package/dist/serve/site-ui/docs/pyric-cli-conformance-browser-reference-api.md +1 -0
- package/dist/serve/site-ui/docs/pyric-cli-conformance-docs-reference-api/index.html +5 -2
- package/dist/serve/site-ui/docs/pyric-cli-conformance-reference-api/index.html +6 -2
- package/dist/serve/site-ui/docs/pyric-cli-conformance-reference-api.md +1 -0
- package/dist/serve/site-ui/docs/pyric-cli-credentials-node-reference-api/index.html +5 -2
- package/dist/serve/site-ui/docs/pyric-cli-discover-reference-api/index.html +5 -2
- package/dist/serve/site-ui/docs/pyric-cli-next-reference-api/index.html +6 -3
- package/dist/serve/site-ui/docs/pyric-cli-next-reference-api.md +1 -1
- package/dist/serve/site-ui/docs/pyric-cli-register-app-bridge-reference-api/index.html +5 -2
- package/dist/serve/site-ui/docs/pyric-cli-register-reference-api/index.html +5 -2
- package/dist/serve/site-ui/docs/pyric-cli-remote-reference-api/index.html +39 -11
- package/dist/serve/site-ui/docs/pyric-cli-remote-reference-api.md +17 -9
- package/dist/serve/site-ui/docs/pyric-cli-serve-worker-reference-api/index.html +137 -94
- package/dist/serve/site-ui/docs/pyric-cli-serve-worker-reference-api.md +61 -1
- package/dist/serve/site-ui/docs/pyric-cli-verify-reference-api/index.html +6 -3
- package/dist/serve/site-ui/docs/pyric-cli-verify-reference-api.md +1 -1
- package/dist/serve/site-ui/docs/pyric-cli-vite-reference-api/index.html +6 -3
- package/dist/serve/site-ui/docs/pyric-cli-vite-reference-api.md +2 -2
- package/dist/serve/site-ui/docs/pyric-database-reference-api/index.html +167 -96
- package/dist/serve/site-ui/docs/pyric-database-reference-api.md +108 -2
- package/dist/serve/site-ui/docs/pyric-firestore-lite-reference-api/index.html +559 -0
- package/dist/serve/site-ui/docs/pyric-firestore-lite-reference-api.md +1240 -0
- package/dist/serve/site-ui/docs/pyric-firestore-reference-api/index.html +44 -12
- package/dist/serve/site-ui/docs/pyric-firestore-reference-api.md +18 -8
- package/dist/serve/site-ui/docs/pyric-functions-reference-api/index.html +67 -0
- package/dist/serve/site-ui/docs/pyric-functions-reference-api.md +149 -0
- package/dist/serve/site-ui/docs/pyric-messaging-reference-api/index.html +10 -4
- package/dist/serve/site-ui/docs/pyric-messaging-reference-api.md +5 -2
- package/dist/serve/site-ui/docs/pyric-messaging-sw-reference-api/index.html +10 -4
- package/dist/serve/site-ui/docs/pyric-messaging-sw-reference-api.md +5 -2
- package/dist/serve/site-ui/docs/pyric-performance-reference-api/index.html +35 -0
- package/dist/serve/site-ui/docs/pyric-performance-reference-api.md +69 -0
- package/dist/serve/site-ui/docs/pyric-remote-config-reference-api/index.html +132 -0
- package/dist/serve/site-ui/docs/pyric-remote-config-reference-api.md +307 -0
- package/dist/serve/site-ui/docs/pyric-rules-reference-api/index.html +5 -2
- package/dist/serve/site-ui/docs/pyric-sandbox-database-reference-api/index.html +56 -18
- package/dist/serve/site-ui/docs/pyric-sandbox-database-reference-api.md +48 -9
- package/dist/serve/site-ui/docs/pyric-sandbox-firestore-reference-api/index.html +6 -3
- package/dist/serve/site-ui/docs/pyric-sandbox-firestore-reference-api.md +2 -2
- package/dist/serve/site-ui/docs/pyric-sandbox-reference-api/index.html +243 -50
- package/dist/serve/site-ui/docs/pyric-sandbox-reference-api.md +148 -31
- package/dist/serve/site-ui/docs/pyric-storage-reference-api/index.html +26 -5
- package/dist/serve/site-ui/docs/pyric-storage-reference-api.md +24 -2
- package/dist/serve/site-ui/docs/pyric-ui-agents-reference-api/index.html +30 -97
- package/dist/serve/site-ui/docs/pyric-ui-agents-reference-api.md +20 -51
- package/dist/serve/site-ui/docs/pyric-ui-auth-hooks-reference-api/index.html +5 -2
- package/dist/serve/site-ui/docs/pyric-ui-auth-reference-api/index.html +6 -3
- package/dist/serve/site-ui/docs/pyric-ui-auth-reference-api.md +1 -1
- package/dist/serve/site-ui/docs/pyric-ui-events-hooks-reference-api/index.html +5 -2
- package/dist/serve/site-ui/docs/pyric-ui-events-reference-api/index.html +5 -2
- package/dist/serve/site-ui/docs/pyric-ui-firestore-hooks-reference-api/index.html +5 -2
- package/dist/serve/site-ui/docs/pyric-ui-firestore-reference-api/index.html +6 -3
- package/dist/serve/site-ui/docs/pyric-ui-firestore-reference-api.md +1 -1
- package/dist/serve/site-ui/docs/pyric-ui-primitives-reference-api/index.html +128 -27
- package/dist/serve/site-ui/docs/pyric-ui-primitives-reference-api.md +58 -5
- package/dist/serve/site-ui/docs/pyric-ui-rtdb-reference-api/index.html +5 -2
- package/dist/serve/site-ui/docs/pyric-ui-rules-hooks-reference-api/index.html +5 -2
- package/dist/serve/site-ui/docs/pyric-ui-rules-reference-api/index.html +5 -2
- package/dist/serve/site-ui/docs/pyric-ui-storage-hooks-reference-api/index.html +5 -2
- package/dist/serve/site-ui/docs/pyric-ui-storage-reference-api/index.html +8 -6
- package/dist/serve/site-ui/docs/pyric-ui-storage-reference-api.md +3 -4
- package/dist/serve/site-ui/docs/pyric-ui-traffic-hooks-reference-api/index.html +5 -2
- package/dist/serve/site-ui/docs/pyric-ui-traffic-reference-api/index.html +5 -2
- package/dist/serve/site-ui/docs/reference/cli/index.html +156 -0
- package/dist/serve/site-ui/docs/reference/cli.md +120 -0
- package/dist/serve/site-ui/docs/rules-compat/index.html +14 -3
- package/dist/serve/site-ui/docs/rules-compat.md +9 -1
- package/dist/serve/site-ui/docs/secure/audit-your-rules/index.html +5 -2
- package/dist/serve/site-ui/docs/secure/firestore-rules-limits/index.html +5 -2
- package/dist/serve/site-ui/docs/secure/read-a-denial/index.html +6 -3
- package/dist/serve/site-ui/docs/secure/read-a-denial.md +1 -1
- package/dist/serve/site-ui/docs/secure/rtdb-rules-in-typescript/index.html +5 -2
- package/dist/serve/site-ui/docs/secure/rules-standard-library/index.html +5 -2
- package/dist/serve/site-ui/docs/secure/secure-it-with-rules/index.html +5 -2
- package/dist/serve/site-ui/docs/secure/simulate-and-lint/index.html +5 -2
- package/dist/serve/site-ui/docs/secure/write-a-rules-test-suite/index.html +5 -2
- package/dist/serve/site-ui/docs/ship/ship-to-production/index.html +7 -4
- package/dist/serve/site-ui/docs/ship/ship-to-production.md +2 -2
- package/dist/serve/site-ui/docs/ship/test-in-node/index.html +9 -6
- package/dist/serve/site-ui/docs/ship/test-in-node.md +4 -4
- package/dist/serve/site-ui/docs/storage-compat/index.html +17 -14
- package/dist/serve/site-ui/docs/storage-compat.md +12 -12
- package/dist/serve/site-ui/docs/trust/how-we-know-it-matches-firebase/index.html +5 -2
- package/dist/serve/site-ui/docs/trust/rules-standard-library/index.html +5 -2
- package/dist/serve/site-ui/docs/trust/versioning-and-compatibility/index.html +5 -2
- package/dist/serve/site-ui/docs/tutorial/index.html +10 -7
- package/dist/serve/site-ui/docs/tutorial.md +4 -4
- package/dist/serve/site-ui/examples/chess/index.html +4 -2
- package/dist/serve/site-ui/firestore/index.html +5 -3
- package/dist/serve/site-ui/hero-charcoal.jpg +0 -0
- package/dist/serve/site-ui/index.html +9 -7
- package/dist/serve/site-ui/llms.txt +13 -3
- package/dist/serve/site-ui/pyric-campfire-full.png +0 -0
- package/dist/serve/site-ui/pyric-campfire.png +0 -0
- package/dist/serve/site-ui/rtdb/index.html +5 -3
- package/dist/serve/site-ui/settings/index.html +5 -3
- package/dist/serve/site-ui/storage/index.html +5 -3
- package/dist/serve/site-ui/studio/index.html +13 -0
- package/dist/serve/site-ui/studio-routes.json +1 -1
- package/dist/serve/site-ui/traffic/index.html +5 -3
- package/dist/serve/studio/disk-workspace.d.ts.map +1 -1
- package/dist/serve/studio/disk-workspace.js +64 -2
- package/dist/serve/studio/disk-workspace.js.map +1 -1
- package/dist/serve/studio/routes.d.ts +9 -0
- package/dist/serve/studio/routes.d.ts.map +1 -1
- package/dist/serve/studio/routes.js +47 -7
- package/dist/serve/studio/routes.js.map +1 -1
- package/dist/serve/vite-ai-config.d.ts.map +1 -1
- package/dist/serve/vite-ai-config.js +38 -8
- package/dist/serve/vite-ai-config.js.map +1 -1
- package/dist/serve/vite-module-swap.d.ts.map +1 -1
- package/dist/serve/vite-module-swap.js +0 -28
- package/dist/serve/vite-module-swap.js.map +1 -1
- package/dist/serve/vite-plugin.d.ts +7 -7
- package/dist/serve/vite-plugin.js +1 -1
- package/dist/serve/vite-plugin.js.map +1 -1
- package/dist/serve/vite-sandbox-generation.d.ts +1 -1
- package/dist/serve/vite-sandbox-generation.d.ts.map +1 -1
- package/dist/serve/vite-sandbox-generation.js +13 -1
- package/dist/serve/vite-sandbox-generation.js.map +1 -1
- package/dist/serve/worker/client/auth.js +1 -2
- package/dist/serve/worker/client/auth.js.map +1 -1
- package/dist/serve/worker/client/core.d.ts +21 -1
- package/dist/serve/worker/client/core.d.ts.map +1 -1
- package/dist/serve/worker/client/core.js +79 -3
- package/dist/serve/worker/client/core.js.map +1 -1
- package/dist/serve/worker/client/disconnect.js +1 -1
- package/dist/serve/worker/client/disconnect.js.map +1 -1
- package/dist/serve/worker/client/presence.d.ts.map +1 -1
- package/dist/serve/worker/client/presence.js +18 -5
- package/dist/serve/worker/client/presence.js.map +1 -1
- package/dist/serve/worker/client.d.ts +1 -1
- package/dist/serve/worker/client.d.ts.map +1 -1
- package/dist/serve/worker/client.js +1 -1
- package/dist/serve/worker/client.js.map +1 -1
- package/dist/serve/worker/context-resolver.d.ts +30 -0
- package/dist/serve/worker/context-resolver.d.ts.map +1 -0
- package/dist/serve/worker/context-resolver.js +44 -0
- package/dist/serve/worker/context-resolver.js.map +1 -0
- package/dist/serve/worker/entry.js +23 -19
- package/dist/serve/worker/entry.js.map +1 -1
- package/dist/serve/worker/host/core.d.ts +1 -0
- package/dist/serve/worker/host/core.d.ts.map +1 -1
- package/dist/serve/worker/host/core.js +12 -6
- package/dist/serve/worker/host/core.js.map +1 -1
- package/dist/serve/worker/host/storage.js +2 -2
- package/dist/serve/worker/host-ai.d.ts.map +1 -1
- package/dist/serve/worker/host-ai.js +15 -0
- package/dist/serve/worker/host-ai.js.map +1 -1
- package/dist/serve/worker/host-auth.js +1 -2
- package/dist/serve/worker/host-auth.js.map +1 -1
- package/dist/serve/worker/index.d.ts +1 -1
- package/dist/serve/worker/index.d.ts.map +1 -1
- package/dist/serve/worker/index.js +2 -2
- package/dist/serve/worker/index.js.map +1 -1
- package/dist/serve/worker/port-lifecycle.d.ts +18 -0
- package/dist/serve/worker/port-lifecycle.d.ts.map +1 -0
- package/dist/serve/worker/port-lifecycle.js +28 -0
- package/dist/serve/worker/port-lifecycle.js.map +1 -0
- package/dist/serve/worker/protocol.d.ts +4 -0
- package/dist/serve/worker/protocol.d.ts.map +1 -1
- package/dist/serve/worker/protocol.js.map +1 -1
- package/dist/serve/worker/serve-init.d.ts.map +1 -1
- package/dist/serve/worker/serve-init.js +15 -3
- package/dist/serve/worker/serve-init.js.map +1 -1
- package/dist/verify/fixture.d.ts +1 -1
- package/package.json +17 -6
- package/src/assurance/.generated/conformance-verdicts.ts +68 -1
- package/src/bridge/client/dispatch.ts +52 -56
- package/src/bridge/client/tool-family-factories.ts +34 -0
- package/src/bridge/server/mcp-contract.ts +15 -59
- package/src/bridge/server/peer.ts +24 -1
- package/src/bridge/server/tool-family-factories.ts +40 -0
- package/src/bridge/server/tool-metadata.ts +29 -61
- package/src/bridge/tool-families.generated.ts +17 -0
- package/src/bridge/tool-families.ts +87 -0
- package/src/bridge/tool-family-records/conformance.ts +6 -0
- package/src/bridge/tool-family-records/firestore-data.ts +15 -0
- package/src/bridge/tool-family-records/firestore-inspect.ts +6 -0
- package/src/bridge/tool-family-records/firestore-rules.ts +15 -0
- package/src/bridge/tool-family-records/firestore-simulator.ts +16 -0
- package/src/bridge/tool-family-records/rtdb-inspection.ts +6 -0
- package/src/bundler/externals.ts +55 -0
- package/src/bundler/index.ts +21 -0
- package/src/cli/cli.test.ts +2 -46
- package/src/cli/index.ts +48 -42
- package/src/cli/inlined-sdk-scanner.ts +77 -0
- package/src/cli/mcp-proxy.ts +4 -4
- package/src/cli/parse-args.ts +61 -15
- package/src/cli/pyric-config.ts +45 -0
- package/src/cli/sandbox-interlock.ts +167 -0
- package/src/cli/{dev-runner.ts → sandbox-runner.ts} +142 -86
- package/src/cli/serve.ts +182 -115
- package/src/cli/snapshot.ts +5 -5
- package/src/cli/unsupported-runtime.ts +68 -0
- package/src/cli/verify.ts +1 -1
- package/src/conformance/.generated/can-i-use-browser.ts +2 -2
- package/src/conformance/.generated/can-i-use.ts +2 -2
- package/src/conformance/.generated/conformance-docs.ts +1 -1
- package/src/functions-rtdb/child.ts +115 -21
- package/src/functions-rtdb/development-runtime.ts +5 -1
- package/src/functions-rtdb/project.ts +8 -8
- package/src/google-endpoints.ts +155 -0
- package/src/next/guard.ts +1 -1
- package/src/next/runtime-env.ts +5 -0
- package/src/next/with-pyric.ts +1 -1
- package/src/register/beacon.ts +232 -0
- package/src/register/index.ts +68 -6
- package/src/register/net-guard.ts +567 -0
- package/src/remote/index.ts +9 -9
- package/src/serve/ai-diagnostics-relay.ts +243 -0
- package/src/serve/ai-proxy.ts +327 -0
- package/src/serve/ai-status.ts +109 -0
- package/src/serve/ai-terminal-blocks.ts +210 -0
- package/src/serve/ai-terminal-text.ts +52 -0
- package/src/serve/beacon-route.ts +141 -0
- package/src/serve/bundler.ts +10 -10
- package/src/serve/entries/active-auth-registry.ts +56 -0
- package/src/serve/entries/active-auth.ts +100 -0
- package/src/serve/entries/ai.ts +27 -1
- package/src/serve/entries/auth-helper-core.ts +5 -0
- package/src/serve/entries/auth-helper-dom.ts +27 -3
- package/src/serve/entries/auth-helper-runtime.ts +1 -1
- package/src/serve/entries/auth.ts +8 -0
- package/src/serve/entries/bridge-url.ts +1 -1
- package/src/serve/entries/firestore.ts +3 -3
- package/src/serve/entries/init.ts +78 -3
- package/src/serve/entries/keepalive.ts +1 -1
- package/src/serve/entries/runtime.ts +29 -14
- package/src/serve/entries/storage.ts +1 -1
- package/src/serve/entries/worker-runtime.ts +1 -1
- package/src/serve/init-payload.ts +4 -0
- package/src/serve/namespace.ts +117 -145
- package/src/serve/rules.ts +47 -22
- package/src/serve/runtime/chip-config.ts +16 -2
- package/src/serve/runtime/chip-dialog.ts +366 -0
- package/src/serve/runtime/chip-install.ts +10 -4
- package/src/serve/runtime/chip-user-search.ts +391 -0
- package/src/serve/runtime/chip.ts +177 -15
- package/src/serve/runtime/identity.ts +26 -0
- package/src/serve/runtime/manifest.ts +1 -1
- package/src/serve/runtime/status.ts +24 -0
- package/src/serve/sandbox-session.ts +19 -4
- package/src/serve/server.ts +18 -1
- package/src/serve/studio/disk-workspace.ts +76 -2
- package/src/serve/studio/routes.ts +63 -7
- package/src/serve/vite-ai-config.ts +37 -7
- package/src/serve/vite-module-swap.ts +0 -28
- package/src/serve/vite-plugin.ts +8 -8
- package/src/serve/vite-sandbox-generation.ts +16 -1
- package/src/serve/worker/client/auth.ts +1 -1
- package/src/serve/worker/client/core.ts +80 -3
- package/src/serve/worker/client/disconnect.ts +1 -1
- package/src/serve/worker/client/presence.ts +25 -5
- package/src/serve/worker/client.ts +1 -1
- package/src/serve/worker/context-resolver.ts +60 -0
- package/src/serve/worker/entry.ts +22 -18
- package/src/serve/worker/host/core.ts +9 -7
- package/src/serve/worker/host/storage.ts +2 -2
- package/src/serve/worker/host-ai.ts +15 -0
- package/src/serve/worker/host-auth.ts +1 -1
- package/src/serve/worker/index.ts +4 -1
- package/src/serve/worker/port-lifecycle.ts +45 -0
- package/src/serve/worker/protocol.ts +2 -1
- package/src/serve/worker/serve-init.ts +14 -3
- package/src/verify/fixture.ts +1 -1
- package/README.md.orig +0 -145
- package/dist/cli/dev-runner.d.ts.map +0 -1
- package/dist/cli/dev-runner.js.map +0 -1
- package/dist/serve/site-ui/_astro/_slug_.CXh9yTP1.css +0 -1
- package/dist/serve/site-ui/_astro/_slug_.CupVK4TM.css +0 -1
- package/dist/serve/site-ui/_astro/_studio_.CfxiQWkk.css +0 -1
- package/dist/serve/site-ui/_astro/app.BsFsMjn0.css +0 -1
- package/dist/serve/site-ui/_astro/app.Ce3MTLQm.js +0 -1
- package/dist/serve/site-ui/_astro/app.taqzyjD0.js +0 -11
- package/dist/serve/site-ui/_astro/sandbox-controls.BP4M5f1M.js +0 -1169
- package/dist/serve/site-ui/_astro/writes.C57paAj2.js +0 -99
- package/dist/serve/site-ui/docs/trust/storage-rules-stdlib-research/index.html +0 -582
- package/dist/serve/site-ui/docs/trust/storage-rules-stdlib-research.md +0 -448
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
import * as ipAuth from 'pyric/auth';
|
|
2
|
+
import * as wcRaw from '../worker/client.js';
|
|
3
|
+
import { acceptProviderCredential, restorePortSession } from '../worker/client.js';
|
|
4
|
+
import {
|
|
5
|
+
projectRuntimeIdentity,
|
|
6
|
+
type RuntimeIdentity,
|
|
7
|
+
} from '../runtime/identity.js';
|
|
8
|
+
import { createActiveAuthRegistry } from './active-auth-registry.js';
|
|
9
|
+
import { useWorker } from './worker-runtime.js';
|
|
10
|
+
|
|
11
|
+
const wc = wcRaw as unknown as typeof ipAuth;
|
|
12
|
+
const selectedAuth = useWorker ? wc : ipAuth;
|
|
13
|
+
type ActiveAuth = { currentUser: RuntimeIdentity | null };
|
|
14
|
+
const observeActiveAuth = selectedAuth.onAuthStateChanged as unknown as (
|
|
15
|
+
auth: ActiveAuth,
|
|
16
|
+
listener: (user: RuntimeIdentity | null) => void,
|
|
17
|
+
) => () => void;
|
|
18
|
+
const activeAuthRegistry = createActiveAuthRegistry<ActiveAuth>(observeActiveAuth);
|
|
19
|
+
|
|
20
|
+
export function registerActiveAuth(auth: ActiveAuth): () => void {
|
|
21
|
+
return activeAuthRegistry.register(auth);
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
export function subscribeToActiveAuth(
|
|
25
|
+
listener: (user: RuntimeIdentity | null) => void,
|
|
26
|
+
): () => void {
|
|
27
|
+
return activeAuthRegistry.subscribe(listener);
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
export function getActiveAuthUser(): RuntimeIdentity | null {
|
|
31
|
+
for (const auth of activeAuthRegistry.auths()) {
|
|
32
|
+
if (auth.currentUser) {
|
|
33
|
+
return projectRuntimeIdentity(auth.currentUser);
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
return null;
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
export async function switchAllAuthUsers(uid: string): Promise<void> {
|
|
40
|
+
const promises: Promise<unknown>[] = [];
|
|
41
|
+
for (const auth of activeAuthRegistry.auths()) {
|
|
42
|
+
if (useWorker) {
|
|
43
|
+
promises.push(restorePortSession(auth as never, uid));
|
|
44
|
+
} else {
|
|
45
|
+
try {
|
|
46
|
+
ipAuth.sandbox.restoreSession(auth as never, uid);
|
|
47
|
+
} catch {
|
|
48
|
+
// A stale handle or unavailable identity must not block other handles.
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
await Promise.all(promises);
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
export async function signOutAllAuths(): Promise<void> {
|
|
56
|
+
const promises: Promise<unknown>[] = [];
|
|
57
|
+
for (const auth of activeAuthRegistry.auths()) {
|
|
58
|
+
if (useWorker) {
|
|
59
|
+
promises.push(wc.signOut(auth as never));
|
|
60
|
+
} else {
|
|
61
|
+
promises.push(ipAuth.signOut(auth as never));
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
await Promise.all(promises);
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
export async function commitCredentialToAllAuths(identity: {
|
|
68
|
+
uid: string;
|
|
69
|
+
email?: string | null;
|
|
70
|
+
displayName?: string | null;
|
|
71
|
+
customClaims?: Record<string, unknown>;
|
|
72
|
+
providerId?: string;
|
|
73
|
+
}): Promise<void> {
|
|
74
|
+
const promises: Promise<unknown>[] = [];
|
|
75
|
+
for (const auth of activeAuthRegistry.auths()) {
|
|
76
|
+
if (useWorker) {
|
|
77
|
+
promises.push(acceptProviderCredential(auth as never, {
|
|
78
|
+
uid: identity.uid,
|
|
79
|
+
email: identity.email ?? null,
|
|
80
|
+
displayName: identity.displayName ?? null,
|
|
81
|
+
customClaims: identity.customClaims ?? {},
|
|
82
|
+
providerId: identity.providerId ?? 'password',
|
|
83
|
+
}));
|
|
84
|
+
} else {
|
|
85
|
+
try {
|
|
86
|
+
ipAuth.sandbox.seedUsers(auth as never, [{
|
|
87
|
+
uid: identity.uid,
|
|
88
|
+
email: identity.email ?? '',
|
|
89
|
+
password: 'synthetic-password',
|
|
90
|
+
displayName: identity.displayName ?? undefined,
|
|
91
|
+
customClaims: identity.customClaims ?? {},
|
|
92
|
+
providerId: identity.providerId ?? 'password',
|
|
93
|
+
}]);
|
|
94
|
+
} catch {
|
|
95
|
+
// A stale handle or duplicate seed must not block other handles.
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
await Promise.all(promises);
|
|
100
|
+
}
|
package/src/serve/entries/ai.ts
CHANGED
|
@@ -105,6 +105,16 @@ function toEngineWire(engine: EngineOption | undefined): AiEngineConfigWire | un
|
|
|
105
105
|
...(openai.modelMap !== undefined ? { modelMap: openai.modelMap } : {}),
|
|
106
106
|
};
|
|
107
107
|
}
|
|
108
|
+
if (config.kind === 'gemini') {
|
|
109
|
+
const gemini = config as Extract<EngineOption, { kind: 'gemini' }>;
|
|
110
|
+
const hasBaseUrl = gemini.baseUrl !== undefined;
|
|
111
|
+
const hasApiKey = gemini.apiKey !== undefined;
|
|
112
|
+
return {
|
|
113
|
+
kind: 'gemini',
|
|
114
|
+
...(hasBaseUrl ? { baseUrl: gemini.baseUrl } : {}),
|
|
115
|
+
...(hasApiKey ? { apiKey: gemini.apiKey } : {}),
|
|
116
|
+
};
|
|
117
|
+
}
|
|
108
118
|
const scripted = config as Extract<EngineOption, { kind: 'scripted' }>;
|
|
109
119
|
return {
|
|
110
120
|
kind: 'scripted',
|
|
@@ -139,6 +149,21 @@ function wireToEngineOption(wire: AiEngineConfigWire): EngineOption {
|
|
|
139
149
|
...(wire.modelMap !== undefined ? { modelMap: wire.modelMap } : {}),
|
|
140
150
|
} as EngineOption;
|
|
141
151
|
}
|
|
152
|
+
const isGeminiWire = wire.kind === 'gemini';
|
|
153
|
+
if (isGeminiWire) {
|
|
154
|
+
const result: Record<string, unknown> = {
|
|
155
|
+
kind: 'gemini',
|
|
156
|
+
};
|
|
157
|
+
const hasBaseUrl = wire.baseUrl !== undefined;
|
|
158
|
+
if (hasBaseUrl) {
|
|
159
|
+
result.baseUrl = wire.baseUrl;
|
|
160
|
+
}
|
|
161
|
+
const hasApiKey = wire.apiKey !== undefined;
|
|
162
|
+
if (hasApiKey) {
|
|
163
|
+
result.apiKey = wire.apiKey;
|
|
164
|
+
}
|
|
165
|
+
return result as unknown as EngineOption;
|
|
166
|
+
}
|
|
142
167
|
return {
|
|
143
168
|
kind: 'scripted',
|
|
144
169
|
...(wire.script !== undefined
|
|
@@ -274,10 +299,11 @@ export const getAI = (
|
|
|
274
299
|
"Use a structured { kind: 'scripted' } or { kind: 'openai' } engine config.",
|
|
275
300
|
);
|
|
276
301
|
}
|
|
302
|
+
const wire = toEngineWire(engine) ?? pluginEngineWire();
|
|
277
303
|
return createTransportAI(
|
|
278
304
|
resolved,
|
|
279
305
|
options,
|
|
280
|
-
portEngine(workerClientForApp(resolved),
|
|
306
|
+
portEngine(workerClientForApp(resolved), wire),
|
|
281
307
|
assertAlive,
|
|
282
308
|
);
|
|
283
309
|
}
|
|
@@ -86,6 +86,11 @@ export class ServeAuthHelper {
|
|
|
86
86
|
return { openPopup: open, openRedirect: open };
|
|
87
87
|
}
|
|
88
88
|
|
|
89
|
+
promptCreateUser(providerId = 'password'): Promise<UserCredential> {
|
|
90
|
+
const open = this.resolver().openPopup;
|
|
91
|
+
return open({ providerId, authType: 'signIn' });
|
|
92
|
+
}
|
|
93
|
+
|
|
89
94
|
subscribe(fn: () => void): () => void {
|
|
90
95
|
this.listeners.add(fn);
|
|
91
96
|
return () => this.listeners.delete(fn);
|
|
@@ -19,8 +19,24 @@ const PROVIDER_LABEL: Record<string, string> = {
|
|
|
19
19
|
};
|
|
20
20
|
|
|
21
21
|
const STYLE = `
|
|
22
|
-
dialog[data-pyric-auth] {
|
|
23
|
-
|
|
22
|
+
dialog[data-pyric-auth] {
|
|
23
|
+
position: fixed;
|
|
24
|
+
top: 50%;
|
|
25
|
+
left: 50%;
|
|
26
|
+
transform: translate(-50%, -50%);
|
|
27
|
+
margin: 0;
|
|
28
|
+
width: min(420px, 92vw);
|
|
29
|
+
max-height: 90vh;
|
|
30
|
+
overflow-y: auto;
|
|
31
|
+
border: 1px solid #2a2a35;
|
|
32
|
+
border-radius: 12px;
|
|
33
|
+
background: #16161d;
|
|
34
|
+
color: #e8e8ee;
|
|
35
|
+
font: 14px/1.45 system-ui, sans-serif;
|
|
36
|
+
padding: 20px;
|
|
37
|
+
box-shadow: 0 20px 60px rgba(0, 0, 0, 0.6);
|
|
38
|
+
z-index: 2147483647;
|
|
39
|
+
}
|
|
24
40
|
dialog[data-pyric-auth]::backdrop { background: rgb(0 0 0 / 0.6); }
|
|
25
41
|
dialog[data-pyric-auth] h2 { margin: 0 0 4px; font-size: 16px; }
|
|
26
42
|
dialog[data-pyric-auth] p { margin: 0 0 14px; font-size: 12px; color: #9a9aa8; }
|
|
@@ -61,13 +77,18 @@ export function mountAuthHelperDialog(helper: ServeAuthHelper): void {
|
|
|
61
77
|
return;
|
|
62
78
|
}
|
|
63
79
|
const provider = PROVIDER_LABEL[snap.request.providerId] ?? snap.request.providerId;
|
|
80
|
+
const existingForm = dialog.querySelector('form');
|
|
81
|
+
const savedEmail = existingForm?.querySelector<HTMLInputElement>('input[type="email"]')?.value;
|
|
82
|
+
const savedName = existingForm?.querySelector<HTMLInputElement>('input[type="text"]')?.value;
|
|
83
|
+
const savedClaims = existingForm?.querySelector<HTMLTextAreaElement>('textarea')?.value;
|
|
84
|
+
|
|
64
85
|
dialog.replaceChildren();
|
|
65
86
|
|
|
66
87
|
const h2 = document.createElement('h2');
|
|
67
88
|
h2.textContent = `Sign in with ${provider}`;
|
|
68
89
|
const p = document.createElement('p');
|
|
69
90
|
p.textContent =
|
|
70
|
-
'pyric
|
|
91
|
+
'pyric sandbox sign-in helper. Pick a test account or add one. Custom claims let rules using request.auth.token.* run against this identity.';
|
|
71
92
|
dialog.append(h2, p);
|
|
72
93
|
|
|
73
94
|
if (snap.identities.length > 0) {
|
|
@@ -90,12 +111,15 @@ export function mountAuthHelperDialog(helper: ServeAuthHelper): void {
|
|
|
90
111
|
email.type = 'email';
|
|
91
112
|
email.placeholder = 'email@example.com';
|
|
92
113
|
email.required = true;
|
|
114
|
+
if (savedEmail) email.value = savedEmail;
|
|
93
115
|
const name = document.createElement('input');
|
|
94
116
|
name.type = 'text';
|
|
95
117
|
name.placeholder = 'Display name (optional)';
|
|
118
|
+
if (savedName) name.value = savedName;
|
|
96
119
|
const claims = document.createElement('textarea');
|
|
97
120
|
claims.rows = 3;
|
|
98
121
|
claims.placeholder = 'Custom claims JSON (optional)\ne.g. { "admin": true }';
|
|
122
|
+
if (savedClaims) claims.value = savedClaims;
|
|
99
123
|
const err = document.createElement('div');
|
|
100
124
|
err.className = 'err';
|
|
101
125
|
const row = document.createElement('div');
|
|
@@ -13,7 +13,7 @@ export function resolveServeAuthFlow(
|
|
|
13
13
|
): Promise<UserCredential> {
|
|
14
14
|
if (!resolver) {
|
|
15
15
|
return Promise.reject(
|
|
16
|
-
new Error('pyric
|
|
16
|
+
new Error('pyric sandbox provider helper is not initialized; load /__pyric/sdk/init.js first'),
|
|
17
17
|
);
|
|
18
18
|
}
|
|
19
19
|
return kind === 'popup' ? resolver.openPopup(request) : resolver.openRedirect(request);
|
|
@@ -24,7 +24,9 @@ import { customClaimsFromTokenClaims } from './auth-helper-core.js';
|
|
|
24
24
|
import { resolveServeAuthFlow } from './auth-helper-runtime.js';
|
|
25
25
|
import type { SessionMode } from './session-store.js';
|
|
26
26
|
import { getApp, type FirebaseApp } from 'pyric/app';
|
|
27
|
+
import { registerAppCleanup } from 'pyric/app/internal';
|
|
27
28
|
import { workerClientForApp } from './app-client.js';
|
|
29
|
+
import { registerActiveAuth } from './active-auth.js';
|
|
28
30
|
|
|
29
31
|
// Worker-client auth, cast to the canonical pyric/auth surface for the picked
|
|
30
32
|
// bindings (same names + shapes). Provider-bridge specifics are explicit below.
|
|
@@ -101,6 +103,8 @@ export const getAuth = ((app?: FirebaseApp) => {
|
|
|
101
103
|
if (!useWorker) {
|
|
102
104
|
const handle = pyricGetAuth(resolved);
|
|
103
105
|
wireAppPersistence(resolved, handle);
|
|
106
|
+
const releaseActiveAuth = registerActiveAuth(handle);
|
|
107
|
+
registerAppCleanup(resolved, releaseActiveAuth);
|
|
104
108
|
return handle;
|
|
105
109
|
}
|
|
106
110
|
const existing = workerAuthByApp.get(resolved);
|
|
@@ -111,6 +115,10 @@ export const getAuth = ((app?: FirebaseApp) => {
|
|
|
111
115
|
}) as unknown as ReturnType<typeof pyricGetAuth>;
|
|
112
116
|
workerAuthByApp.set(resolved, handle);
|
|
113
117
|
wireAppPersistence(resolved, handle);
|
|
118
|
+
const releaseActiveAuth = registerActiveAuth(handle);
|
|
119
|
+
// Match Firebase's cached-service lifecycle: getAuth(deletedApp) still
|
|
120
|
+
// returns its existing handle, but that handle no longer joins chip fan-out.
|
|
121
|
+
registerAppCleanup(resolved, releaseActiveAuth);
|
|
114
122
|
return handle;
|
|
115
123
|
}) as typeof pyricGetAuth;
|
|
116
124
|
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Re-anchor a bridge WebSocket URL to the page's own origin.
|
|
3
3
|
*
|
|
4
|
-
* `pyric
|
|
4
|
+
* `pyric sandbox` / the vite plugin bake their OWN host into the bridge URL it
|
|
5
5
|
* sends the page (e.g. `ws://localhost:5173/__pyric/sandbox`). But the page may
|
|
6
6
|
* have been loaded over a different host (Tailscale, a LAN IP) or scheme
|
|
7
7
|
* (`https` via `tailscale serve`, which then requires `wss`). Connecting to the
|
|
@@ -103,8 +103,8 @@ function acceptedNoOp(name: string): void {
|
|
|
103
103
|
if (cacheNoticeShown) return;
|
|
104
104
|
cacheNoticeShown = true;
|
|
105
105
|
console.info(
|
|
106
|
-
`[pyric
|
|
107
|
-
'
|
|
106
|
+
`[pyric sandbox] ${name}(): client cache and persistence settings are accepted but unused. ` +
|
|
107
|
+
'The Pyric sandbox is the source of truth. Durable state is the worker store or `pyric sandbox --persist`.',
|
|
108
108
|
);
|
|
109
109
|
}
|
|
110
110
|
|
|
@@ -184,7 +184,7 @@ export async function enableNetwork(_db?: unknown): Promise<void> {
|
|
|
184
184
|
export async function terminate(db?: unknown): Promise<void> {
|
|
185
185
|
if (useWorker) {
|
|
186
186
|
console.info(
|
|
187
|
-
'[pyric
|
|
187
|
+
'[pyric sandbox] terminate(): the SharedWorker-hosted sandbox is shared across every tab; ' +
|
|
188
188
|
'it is not torn down by a single tab calling terminate().',
|
|
189
189
|
);
|
|
190
190
|
return;
|
|
@@ -5,21 +5,36 @@
|
|
|
5
5
|
* only; in fallback mode it mints credentials via `createSignInCredential`
|
|
6
6
|
* so OAuth users carry real provider metadata.
|
|
7
7
|
*/
|
|
8
|
-
import {
|
|
8
|
+
import {
|
|
9
|
+
getAuth,
|
|
10
|
+
sandbox as authSandbox,
|
|
11
|
+
} from 'pyric/auth';
|
|
9
12
|
import {
|
|
10
13
|
getAuth as getWorkerAuth,
|
|
11
14
|
listUsers,
|
|
15
|
+
setLens,
|
|
12
16
|
} from '../worker/client.js';
|
|
17
|
+
import {
|
|
18
|
+
switchAllAuthUsers,
|
|
19
|
+
signOutAllAuths,
|
|
20
|
+
commitCredentialToAllAuths,
|
|
21
|
+
getActiveAuthUser,
|
|
22
|
+
subscribeToActiveAuth,
|
|
23
|
+
registerActiveAuth,
|
|
24
|
+
} from './active-auth.js';
|
|
13
25
|
import { sandbox } from './runtime.js';
|
|
14
26
|
import { useWorker, workerDb } from './worker-runtime.js';
|
|
15
|
-
import { ServeAuthHelper } from './auth-helper-core.js';
|
|
27
|
+
import { ServeAuthHelper, customClaimsFromTokenClaims } from './auth-helper-core.js';
|
|
16
28
|
import { installServeAuthResolver } from './auth-helper-runtime.js';
|
|
17
29
|
import { mountAuthHelperDialog } from './auth-helper-dom.js';
|
|
18
30
|
import { installPyricRuntimeChip } from '../runtime/chip-install.js';
|
|
19
31
|
import { getPyricRuntimeStatus } from '../runtime/status.js';
|
|
32
|
+
import { projectRuntimeIdentity } from '../runtime/identity.js';
|
|
20
33
|
|
|
21
34
|
const localAuth = useWorker ? null : getAuth(sandbox);
|
|
22
35
|
const workerAuth = useWorker && workerDb ? getWorkerAuth(workerDb) : null;
|
|
36
|
+
if (workerAuth) registerActiveAuth(workerAuth);
|
|
37
|
+
if (localAuth) registerActiveAuth(localAuth);
|
|
23
38
|
const helper = workerAuth
|
|
24
39
|
? new ServeAuthHelper({
|
|
25
40
|
list: async () => (await listUsers(workerAuth)).map((user) => ({
|
|
@@ -56,7 +71,67 @@ if (localAuth) authSandbox.setAuthFlowResolver(localAuth, resolver);
|
|
|
56
71
|
|
|
57
72
|
if (typeof document !== 'undefined' && typeof window !== 'undefined') {
|
|
58
73
|
mountAuthHelperDialog(helper);
|
|
59
|
-
installPyricRuntimeChip({
|
|
74
|
+
installPyricRuntimeChip({
|
|
75
|
+
runtime: getPyricRuntimeStatus(),
|
|
76
|
+
document,
|
|
77
|
+
identity: {
|
|
78
|
+
listUsers: async () => {
|
|
79
|
+
if (workerAuth) {
|
|
80
|
+
return listUsers(workerAuth);
|
|
81
|
+
}
|
|
82
|
+
if (localAuth) {
|
|
83
|
+
return authSandbox.listUsers(localAuth);
|
|
84
|
+
}
|
|
85
|
+
return [];
|
|
86
|
+
},
|
|
87
|
+
switchUser: async (uid: string) => {
|
|
88
|
+
await switchAllAuthUsers(uid);
|
|
89
|
+
setLens(undefined);
|
|
90
|
+
},
|
|
91
|
+
signOut: async () => {
|
|
92
|
+
await signOutAllAuths();
|
|
93
|
+
setLens(undefined);
|
|
94
|
+
},
|
|
95
|
+
openCreateUser: async () => {
|
|
96
|
+
try {
|
|
97
|
+
const cred = await helper.promptCreateUser('password');
|
|
98
|
+
const tokenResult = await cred.user.getIdTokenResult();
|
|
99
|
+
const customClaims = customClaimsFromTokenClaims(
|
|
100
|
+
(tokenResult.claims ?? {}) as Record<string, unknown>,
|
|
101
|
+
);
|
|
102
|
+
const identity = {
|
|
103
|
+
uid: cred.user.uid,
|
|
104
|
+
email: cred.user.email,
|
|
105
|
+
displayName: cred.user.displayName,
|
|
106
|
+
customClaims,
|
|
107
|
+
providerId: 'password',
|
|
108
|
+
};
|
|
109
|
+
await commitCredentialToAllAuths(identity);
|
|
110
|
+
await switchAllAuthUsers(identity.uid);
|
|
111
|
+
setLens(undefined);
|
|
112
|
+
} catch (err) {
|
|
113
|
+
console.error('[pyric] openCreateUser error:', err);
|
|
114
|
+
}
|
|
115
|
+
},
|
|
116
|
+
getCurrentUser: () => {
|
|
117
|
+
const active = getActiveAuthUser();
|
|
118
|
+
if (active) return active;
|
|
119
|
+
if (workerAuth?.currentUser) {
|
|
120
|
+
return projectRuntimeIdentity(workerAuth.currentUser);
|
|
121
|
+
}
|
|
122
|
+
if (localAuth?.currentUser) {
|
|
123
|
+
return projectRuntimeIdentity(localAuth.currentUser);
|
|
124
|
+
}
|
|
125
|
+
return null;
|
|
126
|
+
},
|
|
127
|
+
subscribeAuth: (listener) => {
|
|
128
|
+
const unsubActive = subscribeToActiveAuth((user) => {
|
|
129
|
+
listener(projectRuntimeIdentity(user));
|
|
130
|
+
});
|
|
131
|
+
return unsubActive;
|
|
132
|
+
},
|
|
133
|
+
},
|
|
134
|
+
});
|
|
60
135
|
}
|
|
61
136
|
|
|
62
137
|
export {};
|
|
@@ -27,7 +27,7 @@ export function keepaliveSafe(
|
|
|
27
27
|
if (!warnedLargeState) {
|
|
28
28
|
warnedLargeState = true;
|
|
29
29
|
warn(
|
|
30
|
-
`[pyric
|
|
30
|
+
`[pyric sandbox] persisted state is ${Math.round(bytes / 1024)}KB. It is too large for an ` +
|
|
31
31
|
'unload-time flush; the final unsaved change may be lost if you CLOSE the tab before ' +
|
|
32
32
|
'the next auto-flush. Reloads and normal saves are unaffected.',
|
|
33
33
|
);
|
|
@@ -34,6 +34,7 @@ import { toPageOriginWsUrl } from './bridge-url.js';
|
|
|
34
34
|
import { buildVerifyFixture } from '../../verify/fixture.js';
|
|
35
35
|
import type { InitPayload } from '../init-payload.js';
|
|
36
36
|
import { setupFirebaseActivityGuard } from '../activity-guard.js';
|
|
37
|
+
import { setupAiDiagnosticsRelay } from '../ai-diagnostics-relay.js';
|
|
37
38
|
import { getPyricRuntimeStatus } from '../runtime/status.js';
|
|
38
39
|
export { sandbox } from './app-backend.js';
|
|
39
40
|
import { sandbox } from './app-backend.js';
|
|
@@ -140,10 +141,15 @@ if (!useWorker) try {
|
|
|
140
141
|
diagnostics.rulesDeployed = true;
|
|
141
142
|
diagnostics.rulesHash = payload.rulesHash;
|
|
142
143
|
}
|
|
144
|
+
const db = getDatabase(sandbox);
|
|
143
145
|
if (payload.databaseRules) {
|
|
144
|
-
rtdbSandbox.setRules(
|
|
146
|
+
rtdbSandbox.setRules(db, payload.databaseRules);
|
|
145
147
|
diagnostics.databaseRulesDeployed = true;
|
|
146
148
|
diagnostics.databaseRulesHash = payload.databaseRulesHash ?? null;
|
|
149
|
+
} else if (payload.permissive) {
|
|
150
|
+
rtdbSandbox.setDefaultPolicy(db, 'allow');
|
|
151
|
+
} else {
|
|
152
|
+
rtdbSandbox.setDefaultPolicy(db, 'deny');
|
|
147
153
|
}
|
|
148
154
|
// Open the ONE per-sandbox storage service eagerly: the FIRST open wins the
|
|
149
155
|
// rules AND the project-scoped IDB name (`pyric-storage:<projectKey>`,
|
|
@@ -212,7 +218,7 @@ if (!useWorker) try {
|
|
|
212
218
|
readOnly = true;
|
|
213
219
|
diagnostics.persistReadOnly = true;
|
|
214
220
|
console.warn(
|
|
215
|
-
'[pyric
|
|
221
|
+
'[pyric sandbox] another tab is the persist writer. This tab is read-only ' +
|
|
216
222
|
'(your changes here will NOT be saved). Close the other tab and reload to take over.',
|
|
217
223
|
);
|
|
218
224
|
};
|
|
@@ -288,7 +294,7 @@ if (!useWorker) try {
|
|
|
288
294
|
if (res.status === 423) lostWriterLock();
|
|
289
295
|
else if (res.ok) diagnostics.lastFlushAt = Date.now();
|
|
290
296
|
},
|
|
291
|
-
(e) => console.warn('[pyric
|
|
297
|
+
(e) => console.warn('[pyric sandbox] auth state flush failed:', e),
|
|
292
298
|
);
|
|
293
299
|
}, 500);
|
|
294
300
|
});
|
|
@@ -353,7 +359,7 @@ if (!useWorker) try {
|
|
|
353
359
|
if (existing) {
|
|
354
360
|
diagnostics.seedSkipped = true;
|
|
355
361
|
console.info(
|
|
356
|
-
'[pyric
|
|
362
|
+
'[pyric sandbox] --seed skipped because the sandbox already has restored data. The fixture would ' +
|
|
357
363
|
'have overwritten it. Use `--persist --fresh` to discard existing state and re-seed.',
|
|
358
364
|
);
|
|
359
365
|
} else {
|
|
@@ -367,7 +373,7 @@ if (!useWorker) try {
|
|
|
367
373
|
diagnostics.initError = e instanceof Error ? e.message : String(e);
|
|
368
374
|
runtimeStatus.reportError(e, 'runtime');
|
|
369
375
|
console.error(
|
|
370
|
-
'[pyric
|
|
376
|
+
'[pyric sandbox] init failed. The sandbox is running without your project rules:',
|
|
371
377
|
diagnostics.initError,
|
|
372
378
|
);
|
|
373
379
|
}
|
|
@@ -386,11 +392,20 @@ if (!useWorker && activityTokenFromPayload) {
|
|
|
386
392
|
);
|
|
387
393
|
}
|
|
388
394
|
|
|
395
|
+
// Same plane split for the AI broker's diagnostics: an in-page sandbox runs
|
|
396
|
+
// its own broker, so its `request_rejected`, `response_blocked`, and
|
|
397
|
+
// `model_substituted` events need the same relay to reach the dev terminal.
|
|
398
|
+
// Unlike the activity guard this needs no capability token (the denial relay
|
|
399
|
+
// it rides carries none).
|
|
400
|
+
if (!useWorker) {
|
|
401
|
+
setupAiDiagnosticsRelay({ subscribe: (listener) => sandbox.onEvent(listener) }, fetch);
|
|
402
|
+
}
|
|
403
|
+
|
|
389
404
|
// ── provenance (flow doc section 3a): make the shim's presence unmistakable.
|
|
390
405
|
// Source says `firebase/*`; what runs is the pyric sandbox — say so loudly
|
|
391
406
|
// once, and explain any stack frame that points into /__pyric/sdk/. ────────
|
|
392
407
|
console.info(
|
|
393
|
-
`[pyric
|
|
408
|
+
`[pyric sandbox] firebase/* on this page is served by the Pyric sandbox` +
|
|
394
409
|
(useWorker
|
|
395
410
|
? ' in a SharedWorker (one backend for all tabs; rules/seed/persist owned by the worker)'
|
|
396
411
|
: diagnostics.rulesHash || diagnostics.databaseRulesHash || diagnostics.storageRulesHash
|
|
@@ -405,7 +420,7 @@ function explainSandboxFrame(stackOrUrl: string | undefined): boolean {
|
|
|
405
420
|
if (!provenanceHintShown) {
|
|
406
421
|
provenanceHintShown = true;
|
|
407
422
|
console.info(
|
|
408
|
-
'[pyric
|
|
423
|
+
'[pyric sandbox] the error above originates in the Pyric sandbox shim serving firebase/*, ' +
|
|
409
424
|
'not the real Firebase SDK — behavior can differ where COMPAT coverage is incomplete.',
|
|
410
425
|
);
|
|
411
426
|
}
|
|
@@ -452,7 +467,7 @@ async function connectBridgePeer(rawUrl: string): Promise<void> {
|
|
|
452
467
|
connectBridge(sandbox, { url });
|
|
453
468
|
}
|
|
454
469
|
diagnostics.bridgeConnected = true;
|
|
455
|
-
console.info('[pyric
|
|
470
|
+
console.info('[pyric sandbox] sandbox registered with the MCP bridge at', url);
|
|
456
471
|
}
|
|
457
472
|
if (bridgeUrlFromPayload) {
|
|
458
473
|
// In-page path: bridgeUrlFromPayload came from the (already-blocking) init
|
|
@@ -461,7 +476,7 @@ if (bridgeUrlFromPayload) {
|
|
|
461
476
|
await connectBridgePeer(bridgeUrlFromPayload);
|
|
462
477
|
} catch (e) {
|
|
463
478
|
runtimeStatus.reportError(e, 'runtime');
|
|
464
|
-
console.error('[pyric
|
|
479
|
+
console.error('[pyric sandbox] bridge connect failed:', e instanceof Error ? e.message : String(e));
|
|
465
480
|
}
|
|
466
481
|
} else if (useWorker) {
|
|
467
482
|
// Worker path: the worker owns serve-init, so the page skipped the init.json
|
|
@@ -476,7 +491,7 @@ if (bridgeUrlFromPayload) {
|
|
|
476
491
|
if (url) await connectBridgePeer(url);
|
|
477
492
|
} catch (e) {
|
|
478
493
|
runtimeStatus.reportError(e, 'runtime');
|
|
479
|
-
console.error('[pyric
|
|
494
|
+
console.error('[pyric sandbox] bridge connect failed:', e instanceof Error ? e.message : String(e));
|
|
480
495
|
}
|
|
481
496
|
})();
|
|
482
497
|
}
|
|
@@ -547,10 +562,10 @@ if (!useWorker && typeof EventSource !== 'undefined') {
|
|
|
547
562
|
if (lint.parseError) throw new Error(JSON.stringify(lint.parseError));
|
|
548
563
|
diagnostics.rulesDeployed = true;
|
|
549
564
|
diagnostics.rulesHash = rulesHash;
|
|
550
|
-
console.info(`[pyric
|
|
565
|
+
console.info(`[pyric sandbox] firestore.rules hot-reloaded (hash ${rulesHash})`);
|
|
551
566
|
} catch (err) {
|
|
552
567
|
runtimeStatus.reportError(err, 'runtime');
|
|
553
|
-
console.error('[pyric
|
|
568
|
+
console.error('[pyric sandbox] rules hot-reload failed:', err instanceof Error ? err.message : String(err));
|
|
554
569
|
}
|
|
555
570
|
});
|
|
556
571
|
events.addEventListener('rtdb-rules-update', (e) => {
|
|
@@ -567,7 +582,7 @@ if (!useWorker && typeof EventSource !== 'undefined') {
|
|
|
567
582
|
newHash = rulesHash;
|
|
568
583
|
}
|
|
569
584
|
diagnostics.databaseRulesHash = newHash;
|
|
570
|
-
console.info(`[pyric
|
|
585
|
+
console.info(`[pyric sandbox] database.rules.json hot-reloaded (hash ${rulesHash})`);
|
|
571
586
|
} catch (err) {
|
|
572
587
|
runtimeStatus.reportError(err, 'runtime');
|
|
573
588
|
const isErrorInstance = err instanceof Error;
|
|
@@ -575,7 +590,7 @@ if (!useWorker && typeof EventSource !== 'undefined') {
|
|
|
575
590
|
if (isErrorInstance) {
|
|
576
591
|
errorMessage = (err as Error).message;
|
|
577
592
|
}
|
|
578
|
-
console.error('[pyric
|
|
593
|
+
console.error('[pyric sandbox] database rules hot-reload failed:', errorMessage);
|
|
579
594
|
}
|
|
580
595
|
});
|
|
581
596
|
}
|
|
@@ -66,7 +66,7 @@ export function connectStorageEmulator(
|
|
|
66
66
|
_options?: unknown,
|
|
67
67
|
): void {
|
|
68
68
|
console.info(
|
|
69
|
-
'[pyric
|
|
69
|
+
'[pyric sandbox] Pyric replaces the Firebase emulator; connectStorageEmulator is a no-op.',
|
|
70
70
|
);
|
|
71
71
|
if (!useWorker) ip.connectStorageEmulator(storage as FirebaseStorage, _host, _port, _options as never);
|
|
72
72
|
}
|
|
@@ -125,7 +125,7 @@ if (useWorker && typeof document !== 'undefined') {
|
|
|
125
125
|
? ' This is the only connected page — reload it to pick up the new worker.'
|
|
126
126
|
: '';
|
|
127
127
|
console.warn(
|
|
128
|
-
`[pyric
|
|
128
|
+
`[pyric sandbox] the SharedWorker is running older code (build ${runningVersion}) than what is now `
|
|
129
129
|
+ `served (build ${servedVersion}). A SharedWorker can't hot-update — CLOSE ALL TABS of this origin `
|
|
130
130
|
+ 'and reopen to load the new worker. (All tabs share one worker, so a partial reload leaves '
|
|
131
131
|
+ `the old code running for everyone.)${othersHint}`,
|
|
@@ -4,11 +4,15 @@ import type { AiEngineConfigWire } from './worker/protocol.js';
|
|
|
4
4
|
export interface InitPayload {
|
|
5
5
|
/** Per-server capability for the warning-only activity report endpoint. */
|
|
6
6
|
activityToken?: string;
|
|
7
|
+
/** Per-boot session capability token required on workspace and project endpoints. */
|
|
8
|
+
sessionToken?: string;
|
|
7
9
|
rules: string | null;
|
|
8
10
|
rulesHash: string | null;
|
|
9
11
|
databaseRules?: { rules: Record<string, unknown> } | null;
|
|
10
12
|
databaseRulesHash?: string | null;
|
|
11
13
|
databaseUrl?: string | null;
|
|
14
|
+
/** Explicit opt-in to permissive default access when rules are unconfigured. */
|
|
15
|
+
permissive?: boolean;
|
|
12
16
|
/** Storage rules are installed once, before the first Storage operation. */
|
|
13
17
|
storageRules: string | null;
|
|
14
18
|
storageRulesHash: string | null;
|