@pyric/cli 0.1.0-alpha.20 → 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/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.BOr2kwae.js +115 -0
- package/dist/serve/site-ui/_astro/app.DhAcImFD.js +1 -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.03a08f9t.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 +1 -1
- package/dist/serve/site-ui/docs/build/cloud-firestore/index.html +1 -1
- 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 +6 -2
- package/dist/serve/site-ui/docs/conformance-scores.md +5 -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/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/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 +2967 -1482
- package/dist/serve/site-ui/docs/messaging-compat/index.html +1 -1
- package/dist/serve/site-ui/docs/observe/resolve-runtime-status/index.html +1 -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/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 +2 -1
- 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 +1 -1
- package/dist/serve/site-ui/docs/pyric-cli-conformance-reference-api/index.html +2 -1
- 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 +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 +24 -2
- 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 +9 -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 +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 +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
|
@@ -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 {};
|
|
@@ -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';
|
|
@@ -391,6 +392,15 @@ if (!useWorker && activityTokenFromPayload) {
|
|
|
391
392
|
);
|
|
392
393
|
}
|
|
393
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
|
+
|
|
394
404
|
// ── provenance (flow doc section 3a): make the shim's presence unmistakable.
|
|
395
405
|
// Source says `firebase/*`; what runs is the pyric sandbox — say so loudly
|
|
396
406
|
// once, and explain any stack frame that points into /__pyric/sdk/. ────────
|
package/src/serve/namespace.ts
CHANGED
|
@@ -6,6 +6,8 @@
|
|
|
6
6
|
* the injected init script + shared chunks)
|
|
7
7
|
* /__pyric/init.json the page init payload (rules, bridge URL) —
|
|
8
8
|
* fetched by the runtime chunk at module init
|
|
9
|
+
* /__pyric/beacon the handshake beacon a pyric-launched child
|
|
10
|
+
* POSTs once its interception is installed
|
|
9
11
|
*
|
|
10
12
|
* Bridge routes (`/__pyric/mcp`, `/__pyric/sandbox`) mount here in P2.
|
|
11
13
|
*/
|
|
@@ -21,7 +23,11 @@ import { createStudioRoutes, type StudioRouteOptions } from './studio/index.js';
|
|
|
21
23
|
import { pipeFileToResponse, getHeader, isAllowedHost, isAllowedOrigin, type ServeLogger } from './server.js';
|
|
22
24
|
import type { InitPayload } from './init-payload.js';
|
|
23
25
|
import { handleActivity } from './activity-route.js';
|
|
26
|
+
import { handleAiProxy, AI_PROXY_ROUTE } from './ai-proxy.js';
|
|
27
|
+
import { aiTerminalBlockFor, type AiDiagnosticPayload } from './ai-terminal-blocks.js';
|
|
24
28
|
import { createSiteTreeHandler } from './site-tree.js';
|
|
29
|
+
import { BEACON_PATH, type BeaconReport } from '../register/beacon.js';
|
|
30
|
+
import { handleBeacon } from './beacon-route.js';
|
|
25
31
|
export type { InitPayload } from './init-payload.js';
|
|
26
32
|
|
|
27
33
|
/**
|
|
@@ -119,138 +125,22 @@ export interface NamespaceOptions {
|
|
|
119
125
|
* (local Ollama). Always mounted — the route only touches the network
|
|
120
126
|
* when a request arrives. */
|
|
121
127
|
aiProxyUpstream?: string;
|
|
122
|
-
/**
|
|
123
|
-
*
|
|
124
|
-
*
|
|
128
|
+
/** Receives one handshake beacon per pyric-launched child (`POST
|
|
129
|
+
* /__pyric/beacon`, sent by `@pyric/cli/register` once its hooks and
|
|
130
|
+
* net-guard are installed). Absent means the route still 204s; the child
|
|
131
|
+
* must never be able to fail on its own proof-of-life. */
|
|
132
|
+
beacon?: (report: BeaconReport) => void;
|
|
133
|
+
/** The per-launch secret a beacon must present in `x-pyric-beacon-token`,
|
|
134
|
+
* which the launcher puts in the child's `PYRIC_BEACON_TOKEN`. Absent means
|
|
135
|
+
* one is generated that nobody holds, so the route accepts nothing. */
|
|
136
|
+
beaconToken?: string;
|
|
137
|
+
/** Where hot-reload/diagnostic lines print (rules reload, denial relay,
|
|
138
|
+
* AI broker diagnostics, ai-proxy upstream failures). Absent ⇒ diagnostics
|
|
139
|
+
* are dropped (a caller that wires no logger opts out silently rather than
|
|
140
|
+
* falling back to raw `console`). */
|
|
125
141
|
logger?: ServeLogger;
|
|
126
142
|
}
|
|
127
143
|
|
|
128
|
-
// ─── AI proxy (`/__pyric/ai-proxy` — pyric/ai, cdd-deltas #98.2) ───────────
|
|
129
|
-
|
|
130
|
-
/** Default upstream: local Ollama's OpenAI-compatible endpoint. */
|
|
131
|
-
export const AI_PROXY_DEFAULT_UPSTREAM = 'http://localhost:11434/v1';
|
|
132
|
-
|
|
133
|
-
/**
|
|
134
|
-
* Request headers that must NOT be forwarded upstream: origin-sensitive
|
|
135
|
-
* browser context (`origin`/`referer`/`cookie` — the upstream is a different
|
|
136
|
-
* origin and must never see the page's), hop-by-hop headers, and the two the
|
|
137
|
-
* proxy re-derives (`host`, `content-length`). `accept-encoding` is dropped
|
|
138
|
-
* so fetch negotiates its own compression and the streamed body needs no
|
|
139
|
-
* length fixups.
|
|
140
|
-
*/
|
|
141
|
-
const AI_PROXY_STRIPPED_HEADERS = new Set([
|
|
142
|
-
'host',
|
|
143
|
-
'origin',
|
|
144
|
-
'referer',
|
|
145
|
-
'cookie',
|
|
146
|
-
'connection',
|
|
147
|
-
'content-length',
|
|
148
|
-
'accept-encoding',
|
|
149
|
-
'keep-alive',
|
|
150
|
-
'proxy-authorization',
|
|
151
|
-
'te',
|
|
152
|
-
'trailer',
|
|
153
|
-
'transfer-encoding',
|
|
154
|
-
'upgrade',
|
|
155
|
-
]);
|
|
156
|
-
|
|
157
|
-
/**
|
|
158
|
-
* Handle `POST /__pyric/ai-proxy/<suffix>` — a same-origin passthrough to the
|
|
159
|
-
* configured OpenAI-compatible upstream, so the browser openai engine
|
|
160
|
-
* (running in the served page or the SharedWorker host) reaches a localhost
|
|
161
|
-
* upstream like Ollama with ZERO CORS setup (no `OLLAMA_ORIGINS`, ever).
|
|
162
|
-
*
|
|
163
|
-
* Behavior:
|
|
164
|
-
* - POST only (the OpenAI chat-completions surface is POST); 405 otherwise.
|
|
165
|
-
* - the path suffix + query ride through verbatim
|
|
166
|
-
* (`/__pyric/ai-proxy/chat/completions` → `<upstream>/chat/completions`).
|
|
167
|
-
* - the request body is forwarded verbatim; headers minus the
|
|
168
|
-
* origin-sensitive/hop-by-hop set above (`authorization` DOES forward —
|
|
169
|
-
* upstreams may require a key).
|
|
170
|
-
* - the response body is STREAMED through chunk-by-chunk — SSE passthrough
|
|
171
|
-
* must never buffer, or `stream: true` completions would arrive all at
|
|
172
|
-
* once at the end.
|
|
173
|
-
* - an unreachable upstream answers 502 with a plain-text explanation.
|
|
174
|
-
*/
|
|
175
|
-
async function handleAiProxy(
|
|
176
|
-
configuredUpstream: string | undefined,
|
|
177
|
-
req: IncomingMessage,
|
|
178
|
-
res: ServerResponse,
|
|
179
|
-
url: URL,
|
|
180
|
-
): Promise<void> {
|
|
181
|
-
if (req.method !== 'POST') {
|
|
182
|
-
res.writeHead(405, { allow: 'POST' }).end('method not allowed');
|
|
183
|
-
return;
|
|
184
|
-
}
|
|
185
|
-
const upstreamBase = (
|
|
186
|
-
configuredUpstream ??
|
|
187
|
-
process.env.PYRIC_AI_PROXY_UPSTREAM ??
|
|
188
|
-
AI_PROXY_DEFAULT_UPSTREAM
|
|
189
|
-
).replace(/\/$/, '');
|
|
190
|
-
const suffix = url.pathname.slice('/__pyric/ai-proxy'.length);
|
|
191
|
-
const target = `${upstreamBase}${suffix}${url.search}`;
|
|
192
|
-
|
|
193
|
-
// Buffer the REQUEST body (small JSON payloads); the RESPONSE streams.
|
|
194
|
-
const raw = await new Promise<Buffer>((resolve, reject) => {
|
|
195
|
-
const chunks: Buffer[] = [];
|
|
196
|
-
req.on('data', (c: Buffer) => chunks.push(c));
|
|
197
|
-
req.on('end', () => resolve(Buffer.concat(chunks)));
|
|
198
|
-
req.on('error', reject);
|
|
199
|
-
});
|
|
200
|
-
// Copy into a plain-ArrayBuffer view — fetch's BodyInit typing rejects
|
|
201
|
-
// Buffer's ArrayBufferLike backing.
|
|
202
|
-
const body = new Uint8Array(raw.byteLength);
|
|
203
|
-
body.set(raw);
|
|
204
|
-
|
|
205
|
-
const headers: Record<string, string> = {};
|
|
206
|
-
for (const [key, value] of Object.entries(req.headers)) {
|
|
207
|
-
if (value === undefined) continue;
|
|
208
|
-
if (AI_PROXY_STRIPPED_HEADERS.has(key.toLowerCase())) continue;
|
|
209
|
-
headers[key] = Array.isArray(value) ? value.join(', ') : value;
|
|
210
|
-
}
|
|
211
|
-
|
|
212
|
-
let upstream: Response;
|
|
213
|
-
try {
|
|
214
|
-
upstream = await fetch(target, { method: 'POST', headers, body });
|
|
215
|
-
} catch (e) {
|
|
216
|
-
res.writeHead(502, { 'content-type': 'text/plain' });
|
|
217
|
-
res.end(
|
|
218
|
-
`pyric dev ai-proxy: upstream ${target} unreachable: ` +
|
|
219
|
-
`${e instanceof Error ? e.message : String(e)}\n` +
|
|
220
|
-
'Set PYRIC_AI_PROXY_UPSTREAM to an OpenAI-compatible base URL ' +
|
|
221
|
-
`(default ${AI_PROXY_DEFAULT_UPSTREAM}).`,
|
|
222
|
-
);
|
|
223
|
-
return;
|
|
224
|
-
}
|
|
225
|
-
|
|
226
|
-
const responseHeaders: Record<string, string> = { 'cache-control': 'no-store' };
|
|
227
|
-
const contentType = upstream.headers.get('content-type');
|
|
228
|
-
if (contentType) responseHeaders['content-type'] = contentType;
|
|
229
|
-
res.writeHead(upstream.status, responseHeaders);
|
|
230
|
-
if (!upstream.body) {
|
|
231
|
-
res.end();
|
|
232
|
-
return;
|
|
233
|
-
}
|
|
234
|
-
(res as ServerResponse & { flushHeaders?: () => void }).flushHeaders?.();
|
|
235
|
-
|
|
236
|
-
// Chunk-by-chunk passthrough. A dropped client cancels the upstream read
|
|
237
|
-
// so an abandoned SSE stream doesn't keep the upstream generating.
|
|
238
|
-
const reader = upstream.body.getReader();
|
|
239
|
-
res.on('close', () => {
|
|
240
|
-
void reader.cancel().catch(() => {});
|
|
241
|
-
});
|
|
242
|
-
try {
|
|
243
|
-
for (;;) {
|
|
244
|
-
const { done, value } = await reader.read();
|
|
245
|
-
if (done) break;
|
|
246
|
-
res.write(value);
|
|
247
|
-
}
|
|
248
|
-
} catch {
|
|
249
|
-
// Upstream or client dropped mid-stream — nothing to salvage.
|
|
250
|
-
}
|
|
251
|
-
res.end();
|
|
252
|
-
}
|
|
253
|
-
|
|
254
144
|
/** The page's persistence backend speaks this route:
|
|
255
145
|
* GET /__pyric/state → whole envelope (404 when absent)
|
|
256
146
|
* GET /__pyric/state?section=firestore → that section (404 when null)
|
|
@@ -390,6 +280,18 @@ async function handleCapture(
|
|
|
390
280
|
// An agent driving `pyric dev` headlessly has no browser console to watch;
|
|
391
281
|
// this is that visibility, printed to the terminal instead.
|
|
392
282
|
//
|
|
283
|
+
// The route carries the AI broker's diagnostics on the same channel, relayed
|
|
284
|
+
// by `serve/ai-diagnostics-relay.ts` off the sandbox event stream:
|
|
285
|
+
// `request_rejected` (a malformed request) and `response_blocked` (a safety
|
|
286
|
+
// or recitation filter withheld the answer). Same category ("the sandbox
|
|
287
|
+
// refused your operation"), same terminal treatment, same throttle, so they
|
|
288
|
+
// ride here rather than opening parallel diagnostics channels.
|
|
289
|
+
// `model_substituted` (an engine answered as a model the code never named)
|
|
290
|
+
// rides along too: not a refusal, but the same "the sandbox quietly did
|
|
291
|
+
// something else" category. The payload's `kind` discriminates the four, and
|
|
292
|
+
// `ai-terminal-blocks.ts` holds one record per AI kind so this route
|
|
293
|
+
// dispatches through a table instead of a cascade.
|
|
294
|
+
//
|
|
393
295
|
// A denied listener re-fires on every auth/rules change, so printing is
|
|
394
296
|
// throttled per (path, message) pair — at most one line per window, and
|
|
395
297
|
// silent (no output at all) on suppression rather than a "suppressed N more"
|
|
@@ -449,9 +351,21 @@ export function formatDenialBlock(payload: DenialRelayPayload): string {
|
|
|
449
351
|
return lines.join('\n');
|
|
450
352
|
}
|
|
451
353
|
|
|
452
|
-
/**
|
|
453
|
-
*
|
|
454
|
-
*
|
|
354
|
+
/**
|
|
355
|
+
* The throttle key separator: a NUL byte, written as an escape so the file
|
|
356
|
+
* stays greppable. It cannot occur in a Firestore path, a model id, or a
|
|
357
|
+
* rejection reason, so no (target, reason) pair can be spelled two ways.
|
|
358
|
+
*/
|
|
359
|
+
const THROTTLE_KEY_SEPARATOR = '\x00';
|
|
360
|
+
|
|
361
|
+
/** Handle `POST /__pyric/denials`: a rules denial, or (discriminated by
|
|
362
|
+
* `kind`) an AI broker rejection, blocked response, or model substitution
|
|
363
|
+
* relayed off the sandbox event stream. All four share the throttle map: an
|
|
364
|
+
* agent retry loop re-sends the SAME malformed (or filter-tripping) AI
|
|
365
|
+
* request exactly the way a denied listener re-fires, so one line per
|
|
366
|
+
* (target, reason) per window is the right volume for every one of them.
|
|
367
|
+
* Always 204s (best-effort diagnostics: a malformed body or a caller with no
|
|
368
|
+
* logger wired must never fail the page that reported the refusal). */
|
|
455
369
|
async function handleDenials(
|
|
456
370
|
throttle: DenialThrottle,
|
|
457
371
|
logger: ServeLogger | undefined,
|
|
@@ -463,15 +377,26 @@ async function handleDenials(
|
|
|
463
377
|
return;
|
|
464
378
|
}
|
|
465
379
|
try {
|
|
466
|
-
const payload = (await collectBody(req)) as DenialRelayPayload;
|
|
467
|
-
const
|
|
468
|
-
|
|
469
|
-
|
|
380
|
+
const payload = (await collectBody(req)) as DenialRelayPayload & AiDiagnosticPayload;
|
|
381
|
+
const aiBlock = aiTerminalBlockFor(payload.kind);
|
|
382
|
+
let target: string;
|
|
383
|
+
let reason: string;
|
|
384
|
+
let render: () => string;
|
|
385
|
+
if (aiBlock === null) {
|
|
386
|
+
target = payload.denialContext?.request?.path ?? '';
|
|
387
|
+
reason = typeof payload.message === 'string' ? payload.message : 'permission denied';
|
|
388
|
+
render = () => formatDenialBlock(payload);
|
|
389
|
+
} else {
|
|
390
|
+
target = aiBlock.throttleTarget(payload);
|
|
391
|
+
reason = aiBlock.throttleReason(payload);
|
|
392
|
+
render = () => aiBlock.format(payload);
|
|
393
|
+
}
|
|
394
|
+
const key = `${target}${THROTTLE_KEY_SEPARATOR}${reason}`;
|
|
470
395
|
if (logger && throttle.shouldPrint(key, Date.now())) {
|
|
471
|
-
logger.note(
|
|
396
|
+
logger.note(render());
|
|
472
397
|
}
|
|
473
398
|
} catch {
|
|
474
|
-
/* malformed body
|
|
399
|
+
/* malformed body: drop it; this is a diagnostics side channel */
|
|
475
400
|
}
|
|
476
401
|
res.writeHead(204).end();
|
|
477
402
|
}
|
|
@@ -480,6 +405,9 @@ export function createPyricNamespace(opts: NamespaceOptions) {
|
|
|
480
405
|
const stateWriterLock = createWriterLock();
|
|
481
406
|
const studioWriterLock = opts.studio?.writerLock ?? createWriterLock();
|
|
482
407
|
const sessionToken = opts.sessionToken ?? randomBytes(24).toString('base64url');
|
|
408
|
+
// Fail closed: with no launcher-supplied secret the generated one is held by
|
|
409
|
+
// nobody, so `/__pyric/beacon` accepts nothing rather than everything.
|
|
410
|
+
const beaconToken = opts.beaconToken ?? randomBytes(24).toString('base64url');
|
|
483
411
|
let studioRoutes: ((req: IncomingMessage, res: ServerResponse, url: URL) => Promise<boolean>) | null = null;
|
|
484
412
|
if (opts.studio) {
|
|
485
413
|
const studioOptions: StudioRouteOptions = {
|
|
@@ -534,8 +462,13 @@ export function createPyricNamespace(opts: NamespaceOptions) {
|
|
|
534
462
|
opts.events.handle(req, res);
|
|
535
463
|
return true;
|
|
536
464
|
}
|
|
537
|
-
if (url.pathname ===
|
|
538
|
-
return handleAiProxy(opts.aiProxyUpstream, req, res, url).then(
|
|
465
|
+
if (url.pathname === AI_PROXY_ROUTE || url.pathname.startsWith(`${AI_PROXY_ROUTE}/`)) {
|
|
466
|
+
return handleAiProxy(opts.aiProxyUpstream, denialThrottle, req, res, url, opts.logger).then(
|
|
467
|
+
() => true,
|
|
468
|
+
);
|
|
469
|
+
}
|
|
470
|
+
if (url.pathname === BEACON_PATH) {
|
|
471
|
+
return handleBeacon({ token: beaconToken, onBeacon: opts.beacon }, req, res).then(() => true);
|
|
539
472
|
}
|
|
540
473
|
if (url.pathname === '/__pyric/denials') {
|
|
541
474
|
return handleDenials(denialThrottle, opts.logger, req, res).then(() => true);
|
|
@@ -17,8 +17,22 @@ interface RuntimeChipDocument {
|
|
|
17
17
|
querySelector(selector: string): { getAttribute(name: string): string | null } | null;
|
|
18
18
|
}
|
|
19
19
|
|
|
20
|
+
/** Read the browser-inlined chip value, preferring the `NEXT_PUBLIC_`-prefixed
|
|
21
|
+
* name (the only one Next.js is guaranteed to expose to client bundles) and
|
|
22
|
+
* falling back to the unprefixed name for other bundlers/back-compat. */
|
|
23
|
+
function bundlerRuntimeChipValue(): string | undefined {
|
|
24
|
+
if (typeof process === 'undefined' || typeof process.env === 'undefined') return undefined;
|
|
25
|
+
if (typeof process.env.NEXT_PUBLIC_PYRIC_RUNTIME_CHIP === 'string') {
|
|
26
|
+
return process.env.NEXT_PUBLIC_PYRIC_RUNTIME_CHIP;
|
|
27
|
+
}
|
|
28
|
+
if (typeof process.env.PYRIC_RUNTIME_CHIP === 'string') {
|
|
29
|
+
return process.env.PYRIC_RUNTIME_CHIP;
|
|
30
|
+
}
|
|
31
|
+
return undefined;
|
|
32
|
+
}
|
|
33
|
+
|
|
20
34
|
function hasBundlerRuntimeChipConfig(): boolean {
|
|
21
|
-
return
|
|
35
|
+
return bundlerRuntimeChipValue() !== undefined;
|
|
22
36
|
}
|
|
23
37
|
|
|
24
38
|
/** Read plugin-authored values from DOM metadata or bundler environment variables, defaulting to collapsed UI when omitted. */
|
|
@@ -31,7 +45,7 @@ export function readPyricRuntimeChipConfig(
|
|
|
31
45
|
|
|
32
46
|
const shouldFallbackToEnv = !hasMetaTag && hasBundlerRuntimeChipConfig();
|
|
33
47
|
if (shouldFallbackToEnv) {
|
|
34
|
-
value =
|
|
48
|
+
value = bundlerRuntimeChipValue() as string;
|
|
35
49
|
}
|
|
36
50
|
if (value === 'off') {
|
|
37
51
|
return null;
|