@pyric/cli 0.1.0-alpha.16 → 0.1.0-alpha.18
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 +42 -12
- package/dist/assurance/.generated/conformance-verdicts.d.ts +80 -72
- package/dist/assurance/.generated/conformance-verdicts.d.ts.map +1 -1
- package/dist/assurance/.generated/conformance-verdicts.js +80 -72
- package/dist/assurance/.generated/conformance-verdicts.js.map +1 -1
- package/dist/bridge/server/bridge.d.ts.map +1 -1
- package/dist/bridge/server/bridge.js +4 -2
- package/dist/bridge/server/bridge.js.map +1 -1
- package/dist/bridge/server/peer.d.ts.map +1 -1
- package/dist/bridge/server/peer.js +1 -0
- package/dist/bridge/server/peer.js.map +1 -1
- package/dist/cli/database-rules.d.ts.map +1 -1
- package/dist/cli/database-rules.js +6 -4
- package/dist/cli/database-rules.js.map +1 -1
- package/dist/cli/dev-runner.d.ts +9 -0
- package/dist/cli/dev-runner.d.ts.map +1 -1
- package/dist/cli/dev-runner.js +18 -0
- package/dist/cli/dev-runner.js.map +1 -1
- package/dist/cli/serve.d.ts.map +1 -1
- package/dist/cli/serve.js +62 -6
- package/dist/cli/serve.js.map +1 -1
- package/dist/cli/verify.js +2 -2
- package/dist/cli/verify.js.map +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.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 +1 -0
- package/dist/functions-rtdb/child.d.ts.map +1 -1
- package/dist/functions-rtdb/child.js +11 -1
- package/dist/functions-rtdb/child.js.map +1 -1
- package/dist/functions-rtdb/development-runtime.d.ts +1 -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/next/client-aliases.d.ts +11 -0
- package/dist/next/client-aliases.d.ts.map +1 -0
- package/dist/next/client-aliases.js +38 -0
- package/dist/next/client-aliases.js.map +1 -0
- package/dist/next/dev-rewrites.d.ts +9 -0
- package/dist/next/dev-rewrites.d.ts.map +1 -0
- package/dist/next/dev-rewrites.js +53 -0
- package/dist/next/dev-rewrites.js.map +1 -0
- package/dist/next/guard.d.ts +15 -0
- package/dist/next/guard.d.ts.map +1 -0
- package/dist/next/guard.js +52 -0
- package/dist/next/guard.js.map +1 -0
- package/dist/next/index.d.ts +12 -0
- package/dist/next/index.d.ts.map +1 -0
- package/dist/next/index.js +11 -0
- package/dist/next/index.js.map +1 -0
- package/dist/next/runtime-env.d.ts +7 -0
- package/dist/next/runtime-env.d.ts.map +1 -0
- package/dist/next/runtime-env.js +13 -0
- package/dist/next/runtime-env.js.map +1 -0
- package/dist/next/server-external-packages.d.ts +10 -0
- package/dist/next/server-external-packages.d.ts.map +1 -0
- package/dist/next/server-external-packages.js +34 -0
- package/dist/next/server-external-packages.js.map +1 -0
- package/dist/next/target-url.d.ts +11 -0
- package/dist/next/target-url.d.ts.map +1 -0
- package/dist/next/target-url.js +36 -0
- package/dist/next/target-url.js.map +1 -0
- package/dist/next/turbopack-config.d.ts +9 -0
- package/dist/next/turbopack-config.d.ts.map +1 -0
- package/dist/next/turbopack-config.js +39 -0
- package/dist/next/turbopack-config.js.map +1 -0
- package/dist/next/types.d.ts +40 -0
- package/dist/next/types.d.ts.map +1 -0
- package/dist/next/types.js +5 -0
- package/dist/next/types.js.map +1 -0
- package/dist/next/webpack-config.d.ts +11 -0
- package/dist/next/webpack-config.d.ts.map +1 -0
- package/dist/next/webpack-config.js +51 -0
- package/dist/next/webpack-config.js.map +1 -0
- package/dist/next/with-pyric.d.ts +22 -0
- package/dist/next/with-pyric.d.ts.map +1 -0
- package/dist/next/with-pyric.js +49 -0
- package/dist/next/with-pyric.js.map +1 -0
- package/dist/register/app-bridge.d.ts +9 -0
- package/dist/register/app-bridge.d.ts.map +1 -0
- package/dist/register/app-bridge.js +56 -0
- package/dist/register/app-bridge.js.map +1 -0
- package/dist/register/hooks.d.ts.map +1 -1
- package/dist/register/hooks.js +6 -1
- package/dist/register/hooks.js.map +1 -1
- package/dist/register/index.js +1 -1
- package/dist/register/index.js.map +1 -1
- package/dist/register/mapping.d.ts +3 -1
- package/dist/register/mapping.d.ts.map +1 -1
- package/dist/register/mapping.js +41 -5
- package/dist/register/mapping.js.map +1 -1
- package/dist/remote/index.d.ts.map +1 -1
- package/dist/remote/index.js +5 -3
- package/dist/remote/index.js.map +1 -1
- package/dist/rtdb/rules-json.d.ts +12 -0
- package/dist/rtdb/rules-json.d.ts.map +1 -1
- package/dist/rtdb/rules-json.js +98 -0
- package/dist/rtdb/rules-json.js.map +1 -1
- package/dist/serve/bundler.d.ts.map +1 -1
- package/dist/serve/bundler.js +2 -0
- package/dist/serve/bundler.js.map +1 -1
- package/dist/serve/discovery.d.ts +4 -4
- package/dist/serve/discovery.d.ts.map +1 -1
- package/dist/serve/discovery.js +59 -38
- package/dist/serve/discovery.js.map +1 -1
- package/dist/serve/entries/app-ai-passthrough.d.ts +8 -0
- package/dist/serve/entries/app-ai-passthrough.d.ts.map +1 -0
- package/dist/serve/entries/app-ai-passthrough.js +59 -0
- package/dist/serve/entries/app-ai-passthrough.js.map +1 -0
- package/dist/serve/entries/auth-helper-core.js +9 -7
- package/dist/serve/entries/auth-helper-core.js.map +1 -1
- package/dist/serve/entries/auth.d.ts +1 -0
- package/dist/serve/entries/auth.d.ts.map +1 -1
- package/dist/serve/entries/auth.js +1 -0
- package/dist/serve/entries/auth.js.map +1 -1
- package/dist/serve/entries/bridge-url.d.ts.map +1 -1
- package/dist/serve/entries/bridge-url.js +7 -2
- package/dist/serve/entries/bridge-url.js.map +1 -1
- package/dist/serve/entries/database.d.ts +1 -0
- package/dist/serve/entries/database.d.ts.map +1 -1
- package/dist/serve/entries/database.js +1 -0
- package/dist/serve/entries/database.js.map +1 -1
- package/dist/serve/entries/firestore.d.ts +1 -0
- package/dist/serve/entries/firestore.d.ts.map +1 -1
- package/dist/serve/entries/firestore.js +1 -0
- 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 +4 -2
- package/dist/serve/entries/init.js.map +1 -1
- package/dist/serve/entries/runtime.js +23 -0
- package/dist/serve/entries/runtime.js.map +1 -1
- package/dist/serve/entries/storage.d.ts +2 -0
- package/dist/serve/entries/storage.d.ts.map +1 -1
- package/dist/serve/entries/storage.js +9 -2
- package/dist/serve/entries/storage.js.map +1 -1
- package/dist/serve/html-injection.d.ts +3 -1
- package/dist/serve/html-injection.d.ts.map +1 -1
- package/dist/serve/html-injection.js +27 -1
- package/dist/serve/html-injection.js.map +1 -1
- package/dist/serve/rules.js +2 -2
- package/dist/serve/rules.js.map +1 -1
- package/dist/serve/runtime/chip-config.d.ts +1 -1
- package/dist/serve/runtime/chip-config.d.ts.map +1 -1
- package/dist/serve/runtime/chip-config.js +16 -8
- package/dist/serve/runtime/chip-config.js.map +1 -1
- package/dist/serve/runtime/chip.d.ts.map +1 -1
- package/dist/serve/runtime/chip.js +24 -3
- package/dist/serve/runtime/chip.js.map +1 -1
- package/dist/serve/runtime/status.d.ts +1 -0
- package/dist/serve/runtime/status.d.ts.map +1 -1
- package/dist/serve/runtime/status.js +71 -13
- package/dist/serve/runtime/status.js.map +1 -1
- package/dist/serve/sandbox-session.d.ts +1 -0
- package/dist/serve/sandbox-session.d.ts.map +1 -1
- package/dist/serve/sandbox-session.js +30 -2
- package/dist/serve/sandbox-session.js.map +1 -1
- package/dist/serve/site-ui/_astro/_slug_.C6QfVOxJ.css +1 -0
- package/dist/serve/site-ui/_astro/_studio_.B6b_G1ev.css +1 -0
- package/dist/serve/site-ui/_astro/app.B7pBzz5N.js +11 -0
- package/dist/serve/site-ui/_astro/app.boex5SnQ.js +1 -0
- package/dist/serve/site-ui/_astro/{chess-showcase.CnoxIle5.js → chess-showcase.DDqE-QGe.js} +1 -1
- package/dist/serve/site-ui/_astro/{example-runtime.R1d96L6-.js → example-runtime.B0byNQOl.js} +1 -1
- package/dist/serve/site-ui/_astro/index.uwPvjH_1.js +1 -0
- package/dist/serve/site-ui/_astro/reads.Dh3z0fJy.js +1 -0
- package/dist/serve/site-ui/_astro/sandbox-controls.C2IqtoSw.js +1252 -0
- package/dist/serve/site-ui/_astro/{seed.EyI3VYEu.js → seed.CCmj00su.js} +1 -1
- package/dist/serve/site-ui/auth/index.html +2 -2
- package/dist/serve/site-ui/docs/_rhythm/index.html +1 -1
- package/dist/serve/site-ui/docs/agent/set-up-your-agent/index.html +48 -13
- package/dist/serve/site-ui/docs/agent/set-up-your-agent.md +74 -11
- 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 +85 -85
- package/dist/serve/site-ui/docs/ai-compat.md +84 -84
- package/dist/serve/site-ui/docs/api-reference/index.html +3 -1
- package/dist/serve/site-ui/docs/api-reference.md +2 -0
- package/dist/serve/site-ui/docs/app-compat/index.html +28 -28
- package/dist/serve/site-ui/docs/app-compat.md +27 -27
- package/dist/serve/site-ui/docs/auth-compat/index.html +122 -122
- package/dist/serve/site-ui/docs/auth-compat.md +121 -121
- package/dist/serve/site-ui/docs/build/ai-logic/index.html +19 -2
- package/dist/serve/site-ui/docs/build/ai-logic.md +28 -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 +25 -10
- package/dist/serve/site-ui/docs/conformance-scores.md +23 -8
- package/dist/serve/site-ui/docs/create-pyric-reference-api/index.html +6 -6
- package/dist/serve/site-ui/docs/create-pyric-reference-api.md +5 -5
- package/dist/serve/site-ui/docs/database-compat/index.html +200 -448
- package/dist/serve/site-ui/docs/database-compat.md +198 -461
- package/dist/serve/site-ui/docs/examples/chess/index.html +2 -2
- package/dist/serve/site-ui/docs/examples/index.html +1 -1
- package/dist/serve/site-ui/docs/firestore-compat/index.html +186 -195
- package/dist/serve/site-ui/docs/firestore-compat.md +184 -195
- package/dist/serve/site-ui/docs/functions-rtdb-compat/index.html +15 -15
- package/dist/serve/site-ui/docs/functions-rtdb-compat.md +14 -14
- 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 +57 -0
- package/dist/serve/site-ui/docs/get-started/nextjs.md +86 -0
- package/dist/serve/site-ui/docs/get-started/start-building/index.html +38 -9
- package/dist/serve/site-ui/docs/get-started/start-building.md +62 -7
- package/dist/serve/site-ui/docs/get-started/vite/index.html +26 -0
- package/dist/serve/site-ui/docs/get-started/vite.md +45 -0
- package/dist/serve/site-ui/docs/index.json +711 -111
- package/dist/serve/site-ui/docs/messaging-compat/index.html +56 -56
- package/dist/serve/site-ui/docs/messaging-compat.md +55 -55
- 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 +39 -13
- package/dist/serve/site-ui/docs/pyric-admin-app-reference-api.md +28 -2
- 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 +38 -6
- package/dist/serve/site-ui/docs/pyric-admin-database-reference-api.md +43 -0
- package/dist/serve/site-ui/docs/pyric-admin-firestore-reference-api/index.html +9 -1
- package/dist/serve/site-ui/docs/pyric-admin-firestore-reference-api.md +8 -0
- package/dist/serve/site-ui/docs/pyric-admin-messaging-reference-api/index.html +1 -1
- package/dist/serve/site-ui/docs/pyric-admin-storage-reference-api/index.html +27 -4
- package/dist/serve/site-ui/docs/pyric-admin-storage-reference-api.md +23 -0
- 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-app-reference-api/index.html +1 -1
- package/dist/serve/site-ui/docs/pyric-auth-reference-api/index.html +1 -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 +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-conformance-browser-reference-api/index.html +1 -1
- 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 +1 -1
- 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 +123 -0
- package/dist/serve/site-ui/docs/pyric-cli-next-reference-api.md +99 -0
- package/dist/serve/site-ui/docs/pyric-cli-register-app-bridge-reference-api/index.html +127 -0
- package/dist/serve/site-ui/docs/pyric-cli-register-app-bridge-reference-api.md +174 -0
- 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 +1 -1
- package/dist/serve/site-ui/docs/pyric-cli-serve-worker-reference-api/index.html +570 -326
- package/dist/serve/site-ui/docs/pyric-cli-serve-worker-reference-api.md +198 -6
- package/dist/serve/site-ui/docs/pyric-cli-verify-reference-api/index.html +1 -1
- package/dist/serve/site-ui/docs/pyric-cli-vite-reference-api/index.html +1 -1
- package/dist/serve/site-ui/docs/pyric-database-reference-api/index.html +1 -1
- package/dist/serve/site-ui/docs/pyric-firestore-reference-api/index.html +2971 -627
- package/dist/serve/site-ui/docs/pyric-firestore-reference-api.md +2873 -517
- 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-rules-reference-api/index.html +43 -3
- package/dist/serve/site-ui/docs/pyric-rules-reference-api.md +8 -0
- package/dist/serve/site-ui/docs/pyric-sandbox-database-reference-api/index.html +26 -2
- package/dist/serve/site-ui/docs/pyric-sandbox-database-reference-api.md +24 -0
- 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 +77 -9
- package/dist/serve/site-ui/docs/pyric-sandbox-reference-api.md +28 -13
- package/dist/serve/site-ui/docs/pyric-storage-reference-api/index.html +240 -63
- package/dist/serve/site-ui/docs/pyric-storage-reference-api.md +164 -5
- package/dist/serve/site-ui/docs/pyric-ui-agents-reference-api/index.html +1 -1
- 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 +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 +1 -1
- package/dist/serve/site-ui/docs/pyric-ui-primitives-reference-api/index.html +1 -1
- 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 -10
- package/dist/serve/site-ui/docs/pyric-ui-rules-reference-api.md +0 -9
- 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 +2 -1
- package/dist/serve/site-ui/docs/pyric-ui-storage-reference-api.md +1 -0
- 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/rules-compat/index.html +87 -79
- package/dist/serve/site-ui/docs/rules-compat.md +86 -78
- 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 +119 -125
- package/dist/serve/site-ui/docs/storage-compat.md +118 -124
- 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/storage-rules-stdlib-research/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 +2 -1
- package/dist/serve/site-ui/docs/tutorial.md +2 -0
- package/dist/serve/site-ui/examples/chess/index.html +1 -1
- package/dist/serve/site-ui/examples/firestore-first-write/index.html +1 -1
- package/dist/serve/site-ui/firestore/index.html +2 -2
- package/dist/serve/site-ui/index.html +2 -2
- package/dist/serve/site-ui/llms.txt +8 -4
- package/dist/serve/site-ui/rtdb/index.html +2 -2
- package/dist/serve/site-ui/settings/index.html +2 -2
- package/dist/serve/site-ui/storage/index.html +2 -2
- package/dist/serve/site-ui/traffic/index.html +2 -2
- package/dist/serve/vite-ai-config.d.ts +4 -1
- package/dist/serve/vite-ai-config.d.ts.map +1 -1
- package/dist/serve/vite-ai-config.js +83 -19
- package/dist/serve/vite-ai-config.js.map +1 -1
- package/dist/serve/vite-functions-development.d.ts.map +1 -1
- package/dist/serve/vite-functions-development.js +1 -0
- package/dist/serve/vite-functions-development.js.map +1 -1
- package/dist/serve/vite-generation-rules-watch.d.ts.map +1 -1
- package/dist/serve/vite-generation-rules-watch.js +61 -14
- package/dist/serve/vite-generation-rules-watch.js.map +1 -1
- package/dist/serve/vite-module-swap.d.ts +4 -1
- package/dist/serve/vite-module-swap.d.ts.map +1 -1
- package/dist/serve/vite-module-swap.js +106 -21
- package/dist/serve/vite-module-swap.js.map +1 -1
- package/dist/serve/vite-plugin.d.ts.map +1 -1
- package/dist/serve/vite-plugin.js +45 -5
- package/dist/serve/vite-plugin.js.map +1 -1
- package/dist/serve/vite-sandbox-generation.js +1 -1
- package/dist/serve/vite-sandbox-generation.js.map +1 -1
- package/dist/serve/worker/client/resumable.d.ts +30 -0
- package/dist/serve/worker/client/resumable.d.ts.map +1 -0
- package/dist/serve/worker/client/resumable.js +416 -0
- package/dist/serve/worker/client/resumable.js.map +1 -0
- package/dist/serve/worker/client/rtdb-references.d.ts.map +1 -1
- package/dist/serve/worker/client/rtdb-references.js +4 -1
- package/dist/serve/worker/client/rtdb-references.js.map +1 -1
- package/dist/serve/worker/client/storage.d.ts +16 -2
- package/dist/serve/worker/client/storage.d.ts.map +1 -1
- package/dist/serve/worker/client/storage.js +57 -6
- package/dist/serve/worker/client/storage.js.map +1 -1
- package/dist/serve/worker/host/rules.d.ts.map +1 -1
- package/dist/serve/worker/host/rules.js +2 -1
- package/dist/serve/worker/host/rules.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 +1 -1
- package/dist/serve/worker/index.js.map +1 -1
- package/dist/serve/worker/serve-init.d.ts.map +1 -1
- package/dist/serve/worker/serve-init.js +31 -0
- package/dist/serve/worker/serve-init.js.map +1 -1
- package/package.json +15 -4
- package/src/assurance/.generated/conformance-verdicts.ts +80 -72
- package/src/bridge/server/bridge.ts +5 -2
- package/src/bridge/server/peer.ts +2 -1
- package/src/cli/cli.test.ts +14 -0
- package/src/cli/database-rules.ts +6 -4
- package/src/cli/dev-runner.ts +21 -0
- package/src/cli/serve.ts +63 -5
- package/src/cli/verify.ts +2 -2
- package/src/conformance/.generated/can-i-use-browser.ts +1 -1
- package/src/conformance/.generated/can-i-use.ts +1 -1
- package/src/conformance/.generated/conformance-docs.ts +1 -1
- package/src/functions-rtdb/child.ts +12 -1
- package/src/functions-rtdb/development-runtime.ts +2 -0
- package/src/next/client-aliases.ts +39 -0
- package/src/next/dev-rewrites.ts +77 -0
- package/src/next/guard.ts +61 -0
- package/src/next/index.ts +16 -0
- package/src/next/runtime-env.ts +18 -0
- package/src/next/server-external-packages.ts +43 -0
- package/src/next/target-url.ts +46 -0
- package/src/next/turbopack-config.ts +54 -0
- package/src/next/types.ts +47 -0
- package/src/next/webpack-config.ts +71 -0
- package/src/next/with-pyric.ts +58 -0
- package/src/register/app-bridge.ts +79 -0
- package/src/register/hooks.ts +6 -1
- package/src/register/index.ts +1 -1
- package/src/register/mapping.ts +50 -4
- package/src/remote/index.ts +7 -5
- package/src/rtdb/rules-json.ts +110 -0
- package/src/serve/bundler.ts +2 -0
- package/src/serve/discovery.ts +65 -44
- package/src/serve/entries/app-ai-passthrough.ts +83 -0
- package/src/serve/entries/auth-helper-core.ts +9 -7
- package/src/serve/entries/auth.ts +1 -0
- package/src/serve/entries/bridge-url.ts +9 -2
- package/src/serve/entries/database.ts +1 -0
- package/src/serve/entries/firestore.ts +1 -0
- package/src/serve/entries/init.ts +5 -2
- package/src/serve/entries/runtime.ts +25 -0
- package/src/serve/entries/storage.ts +12 -1
- package/src/serve/html-injection.ts +26 -1
- package/src/serve/rules.ts +2 -2
- package/src/serve/runtime/chip-config.ts +19 -6
- package/src/serve/runtime/chip.ts +24 -3
- package/src/serve/runtime/status.ts +76 -13
- package/src/serve/sandbox-session.ts +31 -2
- package/src/serve/vite-ai-config.ts +86 -19
- package/src/serve/vite-functions-development.ts +1 -0
- package/src/serve/vite-generation-rules-watch.ts +67 -15
- package/src/serve/vite-module-swap.ts +121 -21
- package/src/serve/vite-plugin.ts +44 -6
- package/src/serve/vite-sandbox-generation.ts +1 -1
- package/src/serve/worker/client/resumable.ts +506 -0
- package/src/serve/worker/client/rtdb-references.ts +4 -1
- package/src/serve/worker/client/storage.ts +77 -7
- package/src/serve/worker/host/rules.ts +2 -1
- package/src/serve/worker/index.ts +4 -0
- package/src/serve/worker/serve-init.ts +30 -0
- package/dist/serve/site-ui/_astro/_slug_.BoKXYrnu.css +0 -1
- package/dist/serve/site-ui/_astro/_studio_.BtYpqe1A.css +0 -1
- package/dist/serve/site-ui/_astro/app.4HeLP_FA.js +0 -109
- package/dist/serve/site-ui/_astro/app.BgSnCR5G.js +0 -1
- package/dist/serve/site-ui/_astro/index.BJiOemMX.js +0 -1
- package/dist/serve/site-ui/_astro/reads.BrKNdKAa.js +0 -1
- package/dist/serve/site-ui/_astro/sandbox-controls.BTb3EbQp.js +0 -1153
|
@@ -26,44 +26,44 @@
|
|
|
26
26
|
<div class="compat-list">
|
|
27
27
|
<details class="compat-row" data-status="ok">
|
|
28
28
|
<summary class="compat-line"><span class="compat-dot" data-status="ok" role="img" aria-label="Conforming" title="Conforming"></span><span class="compat-main"><code class="compat-api">getAI(target)</code><span class="compat-sub"><span class="compat-behavior"><code>getAI(sandbox)</code> returns an AI handle bound to the sandbox target; a model minted from it answers through the in-process answer engine</span></span></span></summary>
|
|
29
|
-
<div class="compat-evidence"><div class="compat-probe"><code>unit:instances.test.ts</code> test <code>ai#getai-sandbox-dispatch</code> (no capture; structural dispatch claim)</div></div>
|
|
29
|
+
<div class="compat-evidence"><div class="compat-probe"><a href="https://github.com/davideast/pyric/blob/main/packages/pyric/test/ai/instances.test.ts#L22" target="_blank" rel="noopener noreferrer"><code>unit:instances.test.ts</code></a> test <code>ai#getai-sandbox-dispatch</code> (no capture; structural dispatch claim)</div></div>
|
|
30
30
|
</details>
|
|
31
31
|
<details class="compat-row" data-status="ok">
|
|
32
32
|
<summary class="compat-line"><span class="compat-dot" data-status="ok" role="img" aria-label="Conforming" title="Conforming"></span><span class="compat-main"><code class="compat-api">getAI(target)</code><span class="compat-sub"><span class="compat-behavior">After package resolution selects the mirror, <code>getAI(app)</code> uses the app's sandbox and the returned handle carries the app</span></span></span></summary>
|
|
33
|
-
<div class="compat-evidence"><div class="compat-probe"><code>unit:instances.test.ts</code> test <code>ai#getai-app-dispatch</code> (package-resolution dispatch claim)</div></div>
|
|
33
|
+
<div class="compat-evidence"><div class="compat-probe"><a href="https://github.com/davideast/pyric/blob/main/packages/pyric/test/ai/instances.test.ts#L31" target="_blank" rel="noopener noreferrer"><code>unit:instances.test.ts</code></a> test <code>ai#getai-app-dispatch</code> (package-resolution dispatch claim)</div></div>
|
|
34
34
|
</details>
|
|
35
35
|
<details class="compat-row" data-status="ok">
|
|
36
36
|
<summary class="compat-line"><span class="compat-dot" data-status="ok" role="img" aria-label="Conforming" title="Conforming"></span><span class="compat-main"><code class="compat-api">getAI(target)</code><span class="compat-sub"><span class="compat-behavior">With no options the backend defaults to <code>GoogleAIBackend</code>, <code>backendType</code> is <code>GOOGLE_AI</code>, and the AI handle location is the empty string</span></span></span></summary>
|
|
37
|
-
<div class="compat-evidence"><div class="compat-probe"><code>unit:instances.test.ts</code> test <code>ai#getai-default-backend</code> (matches upstream AIOptions default)</div></div>
|
|
37
|
+
<div class="compat-evidence"><div class="compat-probe"><a href="https://github.com/davideast/pyric/blob/main/packages/pyric/test/ai/instances.test.ts#L47" target="_blank" rel="noopener noreferrer"><code>unit:instances.test.ts</code></a> test <code>ai#getai-default-backend</code> (matches upstream AIOptions default)</div></div>
|
|
38
38
|
</details>
|
|
39
39
|
<details class="compat-row" data-status="ok">
|
|
40
40
|
<summary class="compat-line"><span class="compat-dot" data-status="ok" role="img" aria-label="Conforming" title="Conforming"></span><span class="compat-main"><code class="compat-api">getAI(target)</code><span class="compat-sub"><span class="compat-behavior">Repeat <code>getAI</code> calls with the same target return a stable handle</span></span></span></summary>
|
|
41
|
-
<div class="compat-evidence"><div class="compat-probe"><code>unit:instances.test.ts</code> test <code>ai#getai-idempotent</code> (no capture; structural claim)</div></div>
|
|
41
|
+
<div class="compat-evidence"><div class="compat-probe"><a href="https://github.com/davideast/pyric/blob/main/packages/pyric/test/ai/instances.test.ts#L54" target="_blank" rel="noopener noreferrer"><code>unit:instances.test.ts</code></a> test <code>ai#getai-idempotent</code> (no capture; structural claim)</div></div>
|
|
42
42
|
</details>
|
|
43
43
|
<details class="compat-row" data-status="ok">
|
|
44
44
|
<summary class="compat-line"><span class="compat-dot" data-status="ok" role="img" aria-label="Conforming" title="Conforming"></span><span class="compat-main"><code class="compat-api">getAI(target, options)</code><span class="compat-sub"><span class="compat-behavior"><code>getAI(sandbox, { backend: new GoogleAIBackend(), engine: { kind: "scripted" } })</code> selects the scripted engine explicitly and behaves identically to the zero-config default</span></span></span></summary>
|
|
45
|
-
<div class="compat-evidence"><div class="compat-probe"><code>unit:instances.test.ts</code> test <code>ai#getai-engine-option</code> (engine seam per packages/conformance/docs/ai/cdd-deltas.md)</div></div>
|
|
45
|
+
<div class="compat-evidence"><div class="compat-probe"><a href="https://github.com/davideast/pyric/blob/main/packages/pyric/test/ai/instances.test.ts#L58" target="_blank" rel="noopener noreferrer"><code>unit:instances.test.ts</code></a> test <code>ai#getai-engine-option</code> (engine seam per packages/conformance/docs/ai/cdd-deltas.md)</div></div>
|
|
46
46
|
</details>
|
|
47
47
|
<details class="compat-row" data-status="ok">
|
|
48
48
|
<summary class="compat-line"><span class="compat-dot" data-status="ok" role="img" aria-label="Conforming" title="Conforming"></span><span class="compat-main"><code class="compat-api">VertexAIBackend</code><span class="compat-sub"><span class="compat-behavior"><code>VertexAIBackend</code> carries <code>backendType</code> <code>VERTEX_AI</code>; its location and the resulting AI handle location default to <code>us-central1</code></span></span></span></summary>
|
|
49
|
-
<div class="compat-evidence"><div class="compat-probe"><code>unit:instances.test.ts</code> test <code>ai#backend-vertex</code> (matches upstream constructor default)</div></div>
|
|
49
|
+
<div class="compat-evidence"><div class="compat-probe"><a href="https://github.com/davideast/pyric/blob/main/packages/pyric/test/ai/instances.test.ts#L72" target="_blank" rel="noopener noreferrer"><code>unit:instances.test.ts</code></a> test <code>ai#backend-vertex</code> (matches upstream constructor default)</div></div>
|
|
50
50
|
</details>
|
|
51
51
|
<details class="compat-row" data-status="ok">
|
|
52
52
|
<summary class="compat-line"><span class="compat-dot" data-status="ok" role="img" aria-label="Conforming" title="Conforming"></span><span class="compat-main"><code class="compat-api">getGenerativeModel(ai, modelParams)</code><span class="compat-sub"><span class="compat-behavior">A short model name such as <code>gemini-flash-lite-latest</code> normalizes to the <code>models/</code> resource name on <code>GenerativeModel.model</code></span></span></span></summary>
|
|
53
|
-
<div class="compat-evidence"><div class="compat-probe"><code>unit:instances.test.ts</code> test <code>ai#model-name-short</code> (upstream AIModel normalization on the GoogleAI backend)</div></div>
|
|
53
|
+
<div class="compat-evidence"><div class="compat-probe"><a href="https://github.com/davideast/pyric/blob/main/packages/pyric/test/ai/instances.test.ts#L80" target="_blank" rel="noopener noreferrer"><code>unit:instances.test.ts</code></a> test <code>ai#model-name-short</code> (upstream AIModel normalization on the GoogleAI backend)</div></div>
|
|
54
54
|
</details>
|
|
55
55
|
<details class="compat-row" data-status="diverged">
|
|
56
56
|
<summary class="compat-line"><span class="compat-dot" data-status="diverged" role="img" aria-label="Diverged (documented)" title="Diverged (documented)"></span><span class="compat-main"><code class="compat-api">getGenerativeModel(ai, modelParams)</code><span class="compat-sub"><span class="compat-behavior">A <code>models/</code>-prefixed name is accepted without double prefixing</span></span></span></summary>
|
|
57
|
-
<div class="compat-evidence"><div class="compat-probe"><code>unit:instances.test.ts</code> test <code>ai#model-name-prefixed</code> (no capture; normalization claim)</div>
|
|
57
|
+
<div class="compat-evidence"><div class="compat-probe"><a href="https://github.com/davideast/pyric/blob/main/packages/pyric/test/ai/instances.test.ts#L86" target="_blank" rel="noopener noreferrer"><code>unit:instances.test.ts</code></a> test <code>ai#model-name-prefixed</code> (no capture; normalization claim)</div>
|
|
58
58
|
<div class="compat-note">normalization</div></div>
|
|
59
59
|
</details>
|
|
60
60
|
<details class="compat-row" data-status="ok">
|
|
61
61
|
<summary class="compat-line"><span class="compat-dot" data-status="ok" role="img" aria-label="Conforming" title="Conforming"></span><span class="compat-main"><code class="compat-api">getGenerativeModel(ai, modelParams)</code><span class="compat-sub"><span class="compat-behavior"><code>getGenerativeModel</code> without <code>modelParams.model</code> throws an <code>AIError</code> with code <code>no-model</code></span></span></span></summary>
|
|
62
|
-
<div class="compat-evidence"><div class="compat-probe"><code>unit:instances.test.ts</code> test <code>ai#model-name-required</code> (upstream throw contract)</div></div>
|
|
62
|
+
<div class="compat-evidence"><div class="compat-probe"><a href="https://github.com/davideast/pyric/blob/main/packages/pyric/test/ai/instances.test.ts#L93" target="_blank" rel="noopener noreferrer"><code>unit:instances.test.ts</code></a> test <code>ai#model-name-required</code> (upstream throw contract)</div></div>
|
|
63
63
|
</details>
|
|
64
64
|
<details class="compat-row" data-status="ok">
|
|
65
65
|
<summary class="compat-line"><span class="compat-dot" data-status="ok" role="img" aria-label="Conforming" title="Conforming"></span><span class="compat-main"><code class="compat-api">getAI(sandbox)</code><span class="compat-sub"><span class="compat-behavior">The sandbox target with the scripted engine performs no network I/O for generateContent</span></span></span></summary>
|
|
66
|
-
<div class="compat-evidence"><div class="compat-probe"><code>unit:instances.test.ts</code> test <code>ai#getai-sandbox-no-network</code> (ruling 1 of the engine placement deltas: the scripted engine does no I/O anywhere)</div></div>
|
|
66
|
+
<div class="compat-evidence"><div class="compat-probe"><a href="https://github.com/davideast/pyric/blob/main/packages/pyric/test/ai/instances.test.ts#L105" target="_blank" rel="noopener noreferrer"><code>unit:instances.test.ts</code></a> test <code>ai#getai-sandbox-no-network</code> (ruling 1 of the engine placement deltas: the scripted engine does no I/O anywhere)</div></div>
|
|
67
67
|
</details>
|
|
68
68
|
</div>
|
|
69
69
|
|
|
@@ -72,55 +72,55 @@
|
|
|
72
72
|
<div class="compat-list">
|
|
73
73
|
<details class="compat-row" data-status="ok">
|
|
74
74
|
<summary class="compat-line"><span class="compat-dot" data-status="ok" role="img" aria-label="Conforming" title="Conforming"></span><span class="compat-main"><code class="compat-api">generateContent()</code><span class="compat-sub"><span class="compat-behavior">The response envelope top-level key set is exactly <code>candidates</code>, <code>modelVersion</code>, <code>responseId</code>, <code>usageMetadata</code></span></span></span></summary>
|
|
75
|
-
<div class="compat-evidence"><div class="compat-probe">Capture ai-generate-minimal-envelope replayed by packages/pyric/test/ai/generate-content.test.ts test <code>ai#generate-envelope-keys</code></div></div>
|
|
75
|
+
<div class="compat-evidence"><div class="compat-probe">Capture ai-generate-minimal-envelope replayed by packages/pyric/test/ai/generate-content.test.ts test <code>ai#generate-envelope-keys</code> (Structured evidence: <a href="https://github.com/davideast/pyric/blob/main/packages/conformance/observations/ai/ai-generate-minimal-envelope.json" target="_blank" rel="noopener noreferrer"><code>ai-generate-minimal-envelope</code></a>, <a href="https://github.com/davideast/pyric/blob/main/packages/pyric/test/ai/generate-content.test.ts#L4" target="_blank" rel="noopener noreferrer"><code>generate-content.test.ts</code></a>)</div></div>
|
|
76
76
|
</details>
|
|
77
77
|
<details class="compat-row" data-status="ok">
|
|
78
78
|
<summary class="compat-line"><span class="compat-dot" data-status="ok" role="img" aria-label="Conforming" title="Conforming"></span><span class="compat-main"><code class="compat-api">generateContent()</code><span class="compat-sub"><span class="compat-behavior">The candidate key set is <code>content</code>, <code>finishReason</code>, <code>index</code>, and <code>index</code> is present on the wire (0 for the single candidate)</span></span></span></summary>
|
|
79
|
-
<div class="compat-evidence"><div class="compat-probe">Capture ai-generate-minimal-envelope (candidateHasIndexOnWire) replayed by packages/pyric/test/ai/generate-content.test.ts test <code>ai#generate-candidate-keys</code></div></div>
|
|
79
|
+
<div class="compat-evidence"><div class="compat-probe">Capture ai-generate-minimal-envelope (candidateHasIndexOnWire) replayed by packages/pyric/test/ai/generate-content.test.ts test <code>ai#generate-candidate-keys</code> (Structured evidence: <a href="https://github.com/davideast/pyric/blob/main/packages/conformance/observations/ai/ai-generate-minimal-envelope.json" target="_blank" rel="noopener noreferrer"><code>ai-generate-minimal-envelope</code></a>, <a href="https://github.com/davideast/pyric/blob/main/packages/pyric/test/ai/generate-content.test.ts#L4" target="_blank" rel="noopener noreferrer"><code>generate-content.test.ts</code></a>)</div></div>
|
|
80
80
|
</details>
|
|
81
81
|
<details class="compat-row" data-status="ok">
|
|
82
82
|
<summary class="compat-line"><span class="compat-dot" data-status="ok" role="img" aria-label="Conforming" title="Conforming"></span><span class="compat-main"><code class="compat-api">generateContent()</code><span class="compat-sub"><span class="compat-behavior">Candidate content carries role <code>model</code> and the content key set is <code>parts</code>, <code>role</code></span></span></span></summary>
|
|
83
|
-
<div class="compat-evidence"><div class="compat-probe">Capture ai-generate-minimal-envelope replayed by packages/pyric/test/ai/generate-content.test.ts test <code>ai#generate-role-model</code></div></div>
|
|
83
|
+
<div class="compat-evidence"><div class="compat-probe">Capture ai-generate-minimal-envelope replayed by packages/pyric/test/ai/generate-content.test.ts test <code>ai#generate-role-model</code> (Structured evidence: <a href="https://github.com/davideast/pyric/blob/main/packages/conformance/observations/ai/ai-generate-minimal-envelope.json" target="_blank" rel="noopener noreferrer"><code>ai-generate-minimal-envelope</code></a>, <a href="https://github.com/davideast/pyric/blob/main/packages/pyric/test/ai/generate-content.test.ts#L4" target="_blank" rel="noopener noreferrer"><code>generate-content.test.ts</code></a>)</div></div>
|
|
84
84
|
</details>
|
|
85
85
|
<details class="compat-row" data-status="ok">
|
|
86
86
|
<summary class="compat-line"><span class="compat-dot" data-status="ok" role="img" aria-label="Conforming" title="Conforming"></span><span class="compat-main"><code class="compat-api">generateContent()</code><span class="compat-sub"><span class="compat-behavior">A normal completion finishes with <code>finishReason</code> <code>STOP</code></span></span></span></summary>
|
|
87
|
-
<div class="compat-evidence"><div class="compat-probe">Capture ai-generate-minimal-envelope replayed by packages/pyric/test/ai/generate-content.test.ts test <code>ai#generate-finish-stop</code></div></div>
|
|
87
|
+
<div class="compat-evidence"><div class="compat-probe">Capture ai-generate-minimal-envelope replayed by packages/pyric/test/ai/generate-content.test.ts test <code>ai#generate-finish-stop</code> (Structured evidence: <a href="https://github.com/davideast/pyric/blob/main/packages/conformance/observations/ai/ai-generate-minimal-envelope.json" target="_blank" rel="noopener noreferrer"><code>ai-generate-minimal-envelope</code></a>, <a href="https://github.com/davideast/pyric/blob/main/packages/pyric/test/ai/generate-content.test.ts#L4" target="_blank" rel="noopener noreferrer"><code>generate-content.test.ts</code></a>)</div></div>
|
|
88
88
|
</details>
|
|
89
89
|
<details class="compat-row" data-status="ok">
|
|
90
90
|
<summary class="compat-line"><span class="compat-dot" data-status="ok" role="img" aria-label="Conforming" title="Conforming"></span><span class="compat-main"><code class="compat-api">generateContent()</code><span class="compat-sub"><span class="compat-behavior">The usageMetadata key set on a minimal text call is <code>candidatesTokenCount</code>, <code>promptTokenCount</code>, <code>promptTokensDetails</code>, <code>serviceTier</code>, <code>totalTokenCount</code></span></span></span></summary>
|
|
91
|
-
<div class="compat-evidence"><div class="compat-probe">Capture ai-generate-minimal-envelope replayed by packages/pyric/test/ai/generate-content.test.ts test <code>ai#generate-usage-key-set</code></div></div>
|
|
91
|
+
<div class="compat-evidence"><div class="compat-probe">Capture ai-generate-minimal-envelope replayed by packages/pyric/test/ai/generate-content.test.ts test <code>ai#generate-usage-key-set</code> (Structured evidence: <a href="https://github.com/davideast/pyric/blob/main/packages/conformance/observations/ai/ai-generate-minimal-envelope.json" target="_blank" rel="noopener noreferrer"><code>ai-generate-minimal-envelope</code></a>, <a href="https://github.com/davideast/pyric/blob/main/packages/pyric/test/ai/generate-content.test.ts#L4" target="_blank" rel="noopener noreferrer"><code>generate-content.test.ts</code></a>)</div></div>
|
|
92
92
|
</details>
|
|
93
93
|
<details class="compat-row" data-status="ok">
|
|
94
94
|
<summary class="compat-line"><span class="compat-dot" data-status="ok" role="img" aria-label="Conforming" title="Conforming"></span><span class="compat-main"><code class="compat-api">generateContent()</code><span class="compat-sub"><span class="compat-behavior"><code>usageMetadata.serviceTier</code> rides the wire even though the 2.12.0 SDK typings do not declare it</span></span></span></summary>
|
|
95
|
-
<div class="compat-evidence"><div class="compat-probe">Capture ai-generate-minimal-envelope (usageServiceTierPresent) replayed by packages/pyric/test/ai/generate-content.test.ts test <code>ai#generate-usage-service-tier</code></div></div>
|
|
95
|
+
<div class="compat-evidence"><div class="compat-probe">Capture ai-generate-minimal-envelope (usageServiceTierPresent) replayed by packages/pyric/test/ai/generate-content.test.ts test <code>ai#generate-usage-service-tier</code> (Structured evidence: <a href="https://github.com/davideast/pyric/blob/main/packages/conformance/observations/ai/ai-generate-minimal-envelope.json" target="_blank" rel="noopener noreferrer"><code>ai-generate-minimal-envelope</code></a>, <a href="https://github.com/davideast/pyric/blob/main/packages/pyric/test/ai/generate-content.test.ts#L4" target="_blank" rel="noopener noreferrer"><code>generate-content.test.ts</code></a>)</div></div>
|
|
96
96
|
</details>
|
|
97
97
|
<details class="compat-row" data-status="ok">
|
|
98
98
|
<summary class="compat-line"><span class="compat-dot" data-status="ok" role="img" aria-label="Conforming" title="Conforming"></span><span class="compat-main"><code class="compat-api">generateContent()</code><span class="compat-sub"><span class="compat-behavior"><code>modelVersion</code> and <code>responseId</code> are present nonempty strings; the sandbox mints them deterministically</span></span></span></summary>
|
|
99
|
-
<div class="compat-evidence"><div class="compat-probe">Capture ai-generate-minimal-envelope replayed by packages/pyric/test/ai/generate-content.test.ts test <code>ai#generate-modelversion-responseid</code></div></div>
|
|
99
|
+
<div class="compat-evidence"><div class="compat-probe">Capture ai-generate-minimal-envelope replayed by packages/pyric/test/ai/generate-content.test.ts test <code>ai#generate-modelversion-responseid</code> (Structured evidence: <a href="https://github.com/davideast/pyric/blob/main/packages/conformance/observations/ai/ai-generate-minimal-envelope.json" target="_blank" rel="noopener noreferrer"><code>ai-generate-minimal-envelope</code></a>, <a href="https://github.com/davideast/pyric/blob/main/packages/pyric/test/ai/generate-content.test.ts#L4" target="_blank" rel="noopener noreferrer"><code>generate-content.test.ts</code></a>)</div></div>
|
|
100
100
|
</details>
|
|
101
101
|
<details class="compat-row" data-status="ok">
|
|
102
102
|
<summary class="compat-line"><span class="compat-dot" data-status="ok" role="img" aria-label="Conforming" title="Conforming"></span><span class="compat-main"><code class="compat-api">generateContent(request)</code><span class="compat-sub"><span class="compat-behavior">A plain string request is wrapped as a single user turn before it reaches the engine</span></span></span></summary>
|
|
103
|
-
<div class="compat-evidence"><div class="compat-probe"><code>unit:generate-content.test.ts</code> test <code>ai#generate-string-request</code> (no capture; upstream request formatting claim)</div></div>
|
|
103
|
+
<div class="compat-evidence"><div class="compat-probe"><a href="https://github.com/davideast/pyric/blob/main/packages/pyric/test/ai/generate-content.test.ts#L82" target="_blank" rel="noopener noreferrer"><code>unit:generate-content.test.ts</code></a> test <code>ai#generate-string-request</code> (no capture; upstream request formatting claim)</div></div>
|
|
104
104
|
</details>
|
|
105
105
|
<details class="compat-row" data-status="ok">
|
|
106
106
|
<summary class="compat-line"><span class="compat-dot" data-status="ok" role="img" aria-label="Conforming" title="Conforming"></span><span class="compat-main"><code class="compat-api">generateContent(request)</code><span class="compat-sub"><span class="compat-behavior">A top-level <code>systemInstruction</code> is accepted and the response envelope shape is unaffected</span></span></span></summary>
|
|
107
|
-
<div class="compat-evidence"><div class="compat-probe">Capture ai-system-instruction-accepted replayed by packages/pyric/test/ai/generate-content.test.ts test <code>ai#generate-system-instruction</code></div></div>
|
|
107
|
+
<div class="compat-evidence"><div class="compat-probe">Capture ai-system-instruction-accepted replayed by packages/pyric/test/ai/generate-content.test.ts test <code>ai#generate-system-instruction</code> (Structured evidence: <a href="https://github.com/davideast/pyric/blob/main/packages/conformance/observations/ai/ai-system-instruction-accepted.json" target="_blank" rel="noopener noreferrer"><code>ai-system-instruction-accepted</code></a>, <a href="https://github.com/davideast/pyric/blob/main/packages/pyric/test/ai/generate-content.test.ts#L100" target="_blank" rel="noopener noreferrer"><code>generate-content.test.ts</code></a>)</div></div>
|
|
108
108
|
</details>
|
|
109
109
|
<details class="compat-row" data-status="ok">
|
|
110
110
|
<summary class="compat-line"><span class="compat-dot" data-status="ok" role="img" aria-label="Conforming" title="Conforming"></span><span class="compat-main"><code class="compat-api">generateContent(request)</code><span class="compat-sub"><span class="compat-behavior"><code>responseMimeType</code> <code>application/json</code> plus a <code>responseSchema</code> yields a text part that parses as JSON with the schema key set</span></span></span></summary>
|
|
111
|
-
<div class="compat-evidence"><div class="compat-probe">Capture ai-structured-output-shape replayed by packages/pyric/test/ai/generate-content.test.ts test <code>ai#generate-structured-output</code></div></div>
|
|
111
|
+
<div class="compat-evidence"><div class="compat-probe">Capture ai-structured-output-shape replayed by packages/pyric/test/ai/generate-content.test.ts test <code>ai#generate-structured-output</code> (Structured evidence: <a href="https://github.com/davideast/pyric/blob/main/packages/conformance/observations/ai/ai-structured-output-shape.json" target="_blank" rel="noopener noreferrer"><code>ai-structured-output-shape</code></a>, <a href="https://github.com/davideast/pyric/blob/main/packages/pyric/test/ai/generate-content.test.ts#L110" target="_blank" rel="noopener noreferrer"><code>generate-content.test.ts</code></a>)</div></div>
|
|
112
112
|
</details>
|
|
113
113
|
<details class="compat-row" data-status="ok">
|
|
114
114
|
<summary class="compat-line"><span class="compat-dot" data-status="ok" role="img" aria-label="Conforming" title="Conforming"></span><span class="compat-main"><code class="compat-api">generateContent(request)</code><span class="compat-sub"><span class="compat-behavior">With <code>thinkingConfig</code> on the probe model, text parts carry <code>thoughtSignature</code> and no part is flagged <code>thought: true</code></span></span></span></summary>
|
|
115
|
-
<div class="compat-evidence"><div class="compat-probe">Capture ai-thinking-thought-parts (partKeySets, anyThoughtPart false) replayed by packages/pyric/test/ai/generate-content.test.ts test <code>ai#generate-thinking-signature</code></div></div>
|
|
115
|
+
<div class="compat-evidence"><div class="compat-probe">Capture ai-thinking-thought-parts (partKeySets, anyThoughtPart false) replayed by packages/pyric/test/ai/generate-content.test.ts test <code>ai#generate-thinking-signature</code> (Structured evidence: <a href="https://github.com/davideast/pyric/blob/main/packages/conformance/observations/ai/ai-thinking-thought-parts.json" target="_blank" rel="noopener noreferrer"><code>ai-thinking-thought-parts</code></a>, <a href="https://github.com/davideast/pyric/blob/main/packages/pyric/test/ai/generate-content.test.ts#L125" target="_blank" rel="noopener noreferrer"><code>generate-content.test.ts</code></a>)</div></div>
|
|
116
116
|
</details>
|
|
117
117
|
<details class="compat-row" data-status="ok">
|
|
118
118
|
<summary class="compat-line"><span class="compat-dot" data-status="ok" role="img" aria-label="Conforming" title="Conforming"></span><span class="compat-main"><code class="compat-api">generateContent(request, singleRequestOptions)</code><span class="compat-sub"><span class="compat-behavior">A pre-aborted <code>SingleRequestOptions.signal</code> rejects the call</span></span></span></summary>
|
|
119
|
-
<div class="compat-evidence"><div class="compat-probe"><code>unit:generate-content.test.ts</code> test <code>ai#generate-abort-signal</code> (no capture; upstream SingleRequestOptions contract)</div></div>
|
|
119
|
+
<div class="compat-evidence"><div class="compat-probe"><a href="https://github.com/davideast/pyric/blob/main/packages/pyric/test/ai/generate-content.test.ts#L138" target="_blank" rel="noopener noreferrer"><code>unit:generate-content.test.ts</code></a> test <code>ai#generate-abort-signal</code> (no capture; upstream SingleRequestOptions contract)</div></div>
|
|
120
120
|
</details>
|
|
121
121
|
<details class="compat-row" data-status="ok">
|
|
122
122
|
<summary class="compat-line"><span class="compat-dot" data-status="ok" role="img" aria-label="Conforming" title="Conforming"></span><span class="compat-main"><code class="compat-api">generateContent()</code><span class="compat-sub"><span class="compat-behavior">Token counts are minted without a tokenizer, and the minimal envelope omits <code>safetyRatings</code>, matching the captured candidate key set</span></span></span></summary>
|
|
123
|
-
<div class="compat-evidence"><div class="compat-probe">Capture ai-generate-minimal-envelope replayed by packages/pyric/test/ai/generate-content.test.ts test <code>ai#generate-decoration-synthesized</code></div></div>
|
|
123
|
+
<div class="compat-evidence"><div class="compat-probe">Capture ai-generate-minimal-envelope replayed by packages/pyric/test/ai/generate-content.test.ts test <code>ai#generate-decoration-synthesized</code> (Structured evidence: <a href="https://github.com/davideast/pyric/blob/main/packages/conformance/observations/ai/ai-generate-minimal-envelope.json" target="_blank" rel="noopener noreferrer"><code>ai-generate-minimal-envelope</code></a>, <a href="https://github.com/davideast/pyric/blob/main/packages/pyric/test/ai/generate-content.test.ts#L4" target="_blank" rel="noopener noreferrer"><code>generate-content.test.ts</code></a>)</div></div>
|
|
124
124
|
</details>
|
|
125
125
|
</div>
|
|
126
126
|
|
|
@@ -129,35 +129,35 @@
|
|
|
129
129
|
<div class="compat-list">
|
|
130
130
|
<details class="compat-row" data-status="ok">
|
|
131
131
|
<summary class="compat-line"><span class="compat-dot" data-status="ok" role="img" aria-label="Conforming" title="Conforming"></span><span class="compat-main"><code class="compat-api">generateContentStream()</code><span class="compat-sub"><span class="compat-behavior"><code>result.stream</code> async-iterates response chunks via <code>for await</code>; each chunk is a complete GenerateContentResponse</span></span></span></summary>
|
|
132
|
-
<div class="compat-evidence"><div class="compat-probe">Capture ai-generate-stream-framing replayed by packages/pyric/test/ai/streaming.test.ts test <code>ai#stream-async-iterable</code></div></div>
|
|
132
|
+
<div class="compat-evidence"><div class="compat-probe">Capture ai-generate-stream-framing replayed by packages/pyric/test/ai/streaming.test.ts test <code>ai#stream-async-iterable</code> (Structured evidence: <a href="https://github.com/davideast/pyric/blob/main/packages/conformance/observations/ai/ai-generate-stream-framing.json" target="_blank" rel="noopener noreferrer"><code>ai-generate-stream-framing</code></a>, <a href="https://github.com/davideast/pyric/blob/main/packages/pyric/test/ai/streaming.test.ts#L4" target="_blank" rel="noopener noreferrer"><code>streaming.test.ts</code></a>)</div></div>
|
|
133
133
|
</details>
|
|
134
134
|
<details class="compat-row" data-status="ok">
|
|
135
135
|
<summary class="compat-line"><span class="compat-dot" data-status="ok" role="img" aria-label="Conforming" title="Conforming"></span><span class="compat-main"><code class="compat-api">generateContentStream() wire framing</code><span class="compat-sub"><span class="compat-behavior">Every SSE event is <code>data: </code> prefixed and its payload parses as a complete JSON document</span></span></span></summary>
|
|
136
|
-
<div class="compat-evidence"><div class="compat-probe">Capture ai-generate-stream-framing (allEventsDataPrefixed) replayed byte-level by packages/pyric/test/ai/streaming.test.ts test <code>ai#stream-data-prefixed</code></div></div>
|
|
136
|
+
<div class="compat-evidence"><div class="compat-probe">Capture ai-generate-stream-framing (allEventsDataPrefixed) replayed byte-level by packages/pyric/test/ai/streaming.test.ts test <code>ai#stream-data-prefixed</code> (Structured evidence: <a href="https://github.com/davideast/pyric/blob/main/packages/conformance/observations/ai/ai-generate-stream-framing.json" target="_blank" rel="noopener noreferrer"><code>ai-generate-stream-framing</code></a>, <a href="https://github.com/davideast/pyric/blob/main/packages/pyric/test/ai/streaming.test.ts#L4" target="_blank" rel="noopener noreferrer"><code>streaming.test.ts</code></a>)</div></div>
|
|
137
137
|
</details>
|
|
138
138
|
<details class="compat-row" data-status="ok">
|
|
139
139
|
<summary class="compat-line"><span class="compat-dot" data-status="ok" role="img" aria-label="Conforming" title="Conforming"></span><span class="compat-main"><code class="compat-api">generateContentStream() wire framing</code><span class="compat-sub"><span class="compat-behavior">SSE events are separated by CRLF CRLF</span></span></span></summary>
|
|
140
|
-
<div class="compat-evidence"><div class="compat-probe">Capture ai-generate-stream-framing (separatorIsCrlfCrlf) replayed byte-level by packages/pyric/test/ai/streaming.test.ts test <code>ai#stream-separator-crlf</code></div></div>
|
|
140
|
+
<div class="compat-evidence"><div class="compat-probe">Capture ai-generate-stream-framing (separatorIsCrlfCrlf) replayed byte-level by packages/pyric/test/ai/streaming.test.ts test <code>ai#stream-separator-crlf</code> (Structured evidence: <a href="https://github.com/davideast/pyric/blob/main/packages/conformance/observations/ai/ai-generate-stream-framing.json" target="_blank" rel="noopener noreferrer"><code>ai-generate-stream-framing</code></a>, <a href="https://github.com/davideast/pyric/blob/main/packages/pyric/test/ai/streaming.test.ts#L4" target="_blank" rel="noopener noreferrer"><code>streaming.test.ts</code></a>)</div></div>
|
|
141
141
|
</details>
|
|
142
142
|
<details class="compat-row" data-status="ok">
|
|
143
143
|
<summary class="compat-line"><span class="compat-dot" data-status="ok" role="img" aria-label="Conforming" title="Conforming"></span><span class="compat-main"><code class="compat-api">generateContentStream()</code><span class="compat-sub"><span class="compat-behavior"><code>finishReason</code> appears only on the last chunk of a stream</span></span></span></summary>
|
|
144
|
-
<div class="compat-evidence"><div class="compat-probe">Capture ai-generate-stream-framing (finishReasonOnlyOnLastChunk) replayed by packages/pyric/test/ai/streaming.test.ts test <code>ai#stream-finish-last-chunk</code></div></div>
|
|
144
|
+
<div class="compat-evidence"><div class="compat-probe">Capture ai-generate-stream-framing (finishReasonOnlyOnLastChunk) replayed by packages/pyric/test/ai/streaming.test.ts test <code>ai#stream-finish-last-chunk</code> (Structured evidence: <a href="https://github.com/davideast/pyric/blob/main/packages/conformance/observations/ai/ai-generate-stream-framing.json" target="_blank" rel="noopener noreferrer"><code>ai-generate-stream-framing</code></a>, <a href="https://github.com/davideast/pyric/blob/main/packages/pyric/test/ai/streaming.test.ts#L4" target="_blank" rel="noopener noreferrer"><code>streaming.test.ts</code></a>)</div></div>
|
|
145
145
|
</details>
|
|
146
146
|
<details class="compat-row" data-status="ok">
|
|
147
147
|
<summary class="compat-line"><span class="compat-dot" data-status="ok" role="img" aria-label="Conforming" title="Conforming"></span><span class="compat-main"><code class="compat-api">generateContentStream()</code><span class="compat-sub"><span class="compat-behavior"><code>usageMetadata</code> rides every chunk, not only the last one</span></span></span></summary>
|
|
148
|
-
<div class="compat-evidence"><div class="compat-probe">Capture ai-generate-stream-framing (usageMetadataChunkIndexes covers all chunks) replayed by packages/pyric/test/ai/streaming.test.ts test <code>ai#stream-usage-every-chunk</code></div></div>
|
|
148
|
+
<div class="compat-evidence"><div class="compat-probe">Capture ai-generate-stream-framing (usageMetadataChunkIndexes covers all chunks) replayed by packages/pyric/test/ai/streaming.test.ts test <code>ai#stream-usage-every-chunk</code> (Structured evidence: <a href="https://github.com/davideast/pyric/blob/main/packages/conformance/observations/ai/ai-generate-stream-framing.json" target="_blank" rel="noopener noreferrer"><code>ai-generate-stream-framing</code></a>, <a href="https://github.com/davideast/pyric/blob/main/packages/pyric/test/ai/streaming.test.ts#L4" target="_blank" rel="noopener noreferrer"><code>streaming.test.ts</code></a>)</div></div>
|
|
149
149
|
</details>
|
|
150
150
|
<details class="compat-row" data-status="ok">
|
|
151
151
|
<summary class="compat-line"><span class="compat-dot" data-status="ok" role="img" aria-label="Conforming" title="Conforming"></span><span class="compat-main"><code class="compat-api">generateContentStream()</code><span class="compat-sub"><span class="compat-behavior">Every chunk carries <code>candidates</code> or <code>usageMetadata</code></span></span></span></summary>
|
|
152
|
-
<div class="compat-evidence"><div class="compat-probe">Capture ai-generate-stream-framing (everyEventHasCandidatesOrUsage) replayed by packages/pyric/test/ai/streaming.test.ts test <code>ai#stream-chunk-envelope</code></div></div>
|
|
152
|
+
<div class="compat-evidence"><div class="compat-probe">Capture ai-generate-stream-framing (everyEventHasCandidatesOrUsage) replayed by packages/pyric/test/ai/streaming.test.ts test <code>ai#stream-chunk-envelope</code> (Structured evidence: <a href="https://github.com/davideast/pyric/blob/main/packages/conformance/observations/ai/ai-generate-stream-framing.json" target="_blank" rel="noopener noreferrer"><code>ai-generate-stream-framing</code></a>, <a href="https://github.com/davideast/pyric/blob/main/packages/pyric/test/ai/streaming.test.ts#L4" target="_blank" rel="noopener noreferrer"><code>streaming.test.ts</code></a>)</div></div>
|
|
153
153
|
</details>
|
|
154
154
|
<details class="compat-row" data-status="ok">
|
|
155
155
|
<summary class="compat-line"><span class="compat-dot" data-status="ok" role="img" aria-label="Conforming" title="Conforming"></span><span class="compat-main"><code class="compat-api">generateContentStream()</code><span class="compat-sub"><span class="compat-behavior"><code>result.response</code> resolves to an aggregated response whose text is the concatenation of the streamed text parts</span></span></span></summary>
|
|
156
|
-
<div class="compat-evidence"><div class="compat-probe"><code>unit:streaming.test.ts</code> test <code>ai#stream-response-aggregate</code> (aggregation semantics; text values come from an explicit script)</div></div>
|
|
156
|
+
<div class="compat-evidence"><div class="compat-probe"><a href="https://github.com/davideast/pyric/blob/main/packages/pyric/test/ai/streaming.test.ts#L107" target="_blank" rel="noopener noreferrer"><code>unit:streaming.test.ts</code></a> test <code>ai#stream-response-aggregate</code> (aggregation semantics; text values come from an explicit script)</div></div>
|
|
157
157
|
</details>
|
|
158
158
|
<details class="compat-row" data-status="diverged">
|
|
159
159
|
<summary class="compat-line"><span class="compat-dot" data-status="diverged" role="img" aria-label="Diverged (documented)" title="Diverged (documented)"></span><span class="compat-main"><code class="compat-api">generateContentStream()</code><span class="compat-sub"><span class="compat-behavior">The aggregated response carries the final chunk <code>finishReason</code> and <code>usageMetadata</code></span></span></span></summary>
|
|
160
|
-
<div class="compat-evidence"><div class="compat-probe"><code>unit:streaming.test.ts</code> test <code>ai#stream-aggregate-final-meta</code> (aggregation semantics derived from the framing capture)</div>
|
|
160
|
+
<div class="compat-evidence"><div class="compat-probe"><a href="https://github.com/davideast/pyric/blob/main/packages/pyric/test/ai/streaming.test.ts#L117" target="_blank" rel="noopener noreferrer"><code>unit:streaming.test.ts</code></a> test <code>ai#stream-aggregate-final-meta</code> (aggregation semantics derived from the framing capture)</div>
|
|
161
161
|
<div class="compat-note">metadata carry</div></div>
|
|
162
162
|
</details>
|
|
163
163
|
</div>
|
|
@@ -167,34 +167,34 @@
|
|
|
167
167
|
<div class="compat-list">
|
|
168
168
|
<details class="compat-row" data-status="ok">
|
|
169
169
|
<summary class="compat-line"><span class="compat-dot" data-status="ok" role="img" aria-label="Conforming" title="Conforming"></span><span class="compat-main"><code class="compat-api">GenerativeModel.startChat()</code><span class="compat-sub"><span class="compat-behavior"><code>startChat</code> returns a <code>ChatSession</code> seeded with <code>StartChatParams.history</code></span></span></span></summary>
|
|
170
|
-
<div class="compat-evidence"><div class="compat-probe"><code>unit:upstream-ai-probes.test.ts</code> (I1 validateChatHistory accept/reject via startChat) + <code>unit:chat-session.test.ts</code> test <code>ai#chat-startchat</code></div></div>
|
|
170
|
+
<div class="compat-evidence"><div class="compat-probe"><a href="https://github.com/davideast/pyric/blob/main/packages/pyric/test/ai/upstream-ai-probes.test.ts#L6" target="_blank" rel="noopener noreferrer"><code>unit:upstream-ai-probes.test.ts</code></a> (I1 validateChatHistory accept/reject via startChat) + <a href="https://github.com/davideast/pyric/blob/main/packages/pyric/test/ai/chat-session.test.ts#L32" target="_blank" rel="noopener noreferrer"><code>unit:chat-session.test.ts</code></a> test <code>ai#chat-startchat</code></div></div>
|
|
171
171
|
</details>
|
|
172
172
|
<details class="compat-row" data-status="diverged">
|
|
173
173
|
<summary class="compat-line"><span class="compat-dot" data-status="diverged" role="img" aria-label="Diverged (documented)" title="Diverged (documented)"></span><span class="compat-main"><code class="compat-api">ChatSession.sendMessage() / getHistory()</code><span class="compat-sub"><span class="compat-behavior"><code>sendMessage</code> appends the user turn and the model turn; <code>getHistory()</code> returns the ordered <code>Content[]</code> with alternating roles</span></span></span></summary>
|
|
174
|
-
<div class="compat-evidence"><div class="compat-probe"><code>unit:chat-session.test.ts</code> test <code>ai#chat-history-threads</code> (no capture; history threading claim)</div>
|
|
174
|
+
<div class="compat-evidence"><div class="compat-probe"><a href="https://github.com/davideast/pyric/blob/main/packages/pyric/test/ai/chat-session.test.ts#L45" target="_blank" rel="noopener noreferrer"><code>unit:chat-session.test.ts</code></a> test <code>ai#chat-history-threads</code> (no capture; history threading claim)</div>
|
|
175
175
|
<div class="compat-note">clone</div></div>
|
|
176
176
|
</details>
|
|
177
177
|
<details class="compat-row" data-status="diverged">
|
|
178
178
|
<summary class="compat-line"><span class="compat-dot" data-status="diverged" role="img" aria-label="Diverged (documented)" title="Diverged (documented)"></span><span class="compat-main"><code class="compat-api">ChatSession.getHistory()</code><span class="compat-sub"><span class="compat-behavior">Blocked prompts and blocked candidates are excluded from <code>getHistory()</code></span></span></span></summary>
|
|
179
|
-
<div class="compat-evidence"><div class="compat-probe"><code>unit:chat-session.test.ts</code> test <code>ai#chat-history-excludes-blocked</code> (upstream JSDoc contract; exercised with a scripted blocked envelope)</div>
|
|
179
|
+
<div class="compat-evidence"><div class="compat-probe"><a href="https://github.com/davideast/pyric/blob/main/packages/pyric/test/ai/chat-session.test.ts#L61" target="_blank" rel="noopener noreferrer"><code>unit:chat-session.test.ts</code></a> test <code>ai#chat-history-excludes-blocked</code> (upstream JSDoc contract; exercised with a scripted blocked envelope)</div>
|
|
180
180
|
<div class="compat-note">blocked history</div></div>
|
|
181
181
|
</details>
|
|
182
182
|
<details class="compat-row" data-status="ok">
|
|
183
183
|
<summary class="compat-line"><span class="compat-dot" data-status="ok" role="img" aria-label="Conforming" title="Conforming"></span><span class="compat-main"><code class="compat-api">ChatSession.sendMessage()</code><span class="compat-sub"><span class="compat-behavior">A <code>sendMessage</code> result carries the same envelope facts as <code>generateContent</code>: the four top-level keys and role <code>model</code></span></span></span></summary>
|
|
184
|
-
<div class="compat-evidence"><div class="compat-probe">Capture ai-generate-minimal-envelope replayed by packages/pyric/test/ai/chat-session.test.ts test <code>ai#chat-sendmessage-envelope</code></div></div>
|
|
184
|
+
<div class="compat-evidence"><div class="compat-probe">Capture ai-generate-minimal-envelope replayed by packages/pyric/test/ai/chat-session.test.ts test <code>ai#chat-sendmessage-envelope</code> (Structured evidence: <a href="https://github.com/davideast/pyric/blob/main/packages/conformance/observations/ai/ai-generate-minimal-envelope.json" target="_blank" rel="noopener noreferrer"><code>ai-generate-minimal-envelope</code></a>, <a href="https://github.com/davideast/pyric/blob/main/packages/pyric/test/ai/chat-session.test.ts#L11" target="_blank" rel="noopener noreferrer"><code>chat-session.test.ts</code></a>)</div></div>
|
|
185
185
|
</details>
|
|
186
186
|
<details class="compat-row" data-status="ok">
|
|
187
187
|
<summary class="compat-line"><span class="compat-dot" data-status="ok" role="img" aria-label="Conforming" title="Conforming"></span><span class="compat-main"><code class="compat-api">ChatSession.sendMessageStream()</code><span class="compat-sub"><span class="compat-behavior"><code>sendMessageStream</code> returns a stream plus a response promise; history updates after aggregation completes</span></span></span></summary>
|
|
188
|
-
<div class="compat-evidence"><div class="compat-probe"><code>unit:chat-session.test.ts</code> test <code>ai#chat-sendmessagestream</code> (no capture; streaming turn claim)</div></div>
|
|
188
|
+
<div class="compat-evidence"><div class="compat-probe"><a href="https://github.com/davideast/pyric/blob/main/packages/pyric/test/ai/chat-session.test.ts#L80" target="_blank" rel="noopener noreferrer"><code>unit:chat-session.test.ts</code></a> test <code>ai#chat-sendmessagestream</code> (no capture; streaming turn claim)</div></div>
|
|
189
189
|
</details>
|
|
190
190
|
<details class="compat-row" data-status="diverged">
|
|
191
191
|
<summary class="compat-line"><span class="compat-dot" data-status="diverged" role="img" aria-label="Diverged (documented)" title="Diverged (documented)"></span><span class="compat-main"><code class="compat-api">ChatSession.sendMessageStream()</code><span class="compat-sub"><span class="compat-behavior">Exactly one user turn is recorded per <code>sendMessageStream</code> call; the mirror implements the 2.13.0 fixed semantics, not the installed 2.12.0 duplicate-user-turn bug</span></span></span></summary>
|
|
192
|
-
<div class="compat-evidence"><div class="compat-probe"><code>unit:chat-session.test.ts</code> test <code>ai#chat-stream-single-user-turn</code> (no capture; divergence pinned by ruling, see notes)</div>
|
|
192
|
+
<div class="compat-evidence"><div class="compat-probe"><a href="https://github.com/davideast/pyric/blob/main/packages/pyric/test/ai/chat-session.test.ts#L93" target="_blank" rel="noopener noreferrer"><code>unit:chat-session.test.ts</code></a> test <code>ai#chat-stream-single-user-turn</code> (no capture; divergence pinned by ruling, see notes)</div>
|
|
193
193
|
<div class="compat-note">2.13.0 semantics</div></div>
|
|
194
194
|
</details>
|
|
195
195
|
<details class="compat-row" data-status="ok">
|
|
196
196
|
<summary class="compat-line"><span class="compat-dot" data-status="ok" role="img" aria-label="Conforming" title="Conforming"></span><span class="compat-main"><code class="compat-api">POSSIBLE_ROLES</code><span class="compat-sub"><span class="compat-behavior"><code>POSSIBLE_ROLES</code> is exactly <code>["user", "model", "function", "system"]</code></span></span></span></summary>
|
|
197
|
-
<div class="compat-evidence"><div class="compat-probe"><code>unit:chat-session.test.ts</code> test <code>ai#chat-role-vocabulary</code> (upstream constant; distinct from the production wire role vocabulary in ai-error-bad-role)</div></div>
|
|
197
|
+
<div class="compat-evidence"><div class="compat-probe"><a href="https://github.com/davideast/pyric/blob/main/packages/pyric/test/ai/chat-session.test.ts#L108" target="_blank" rel="noopener noreferrer"><code>unit:chat-session.test.ts</code></a> test <code>ai#chat-role-vocabulary</code> (upstream constant; distinct from the production wire role vocabulary in ai-error-bad-role)</div></div>
|
|
198
198
|
</details>
|
|
199
199
|
</div>
|
|
200
200
|
|
|
@@ -203,27 +203,27 @@
|
|
|
203
203
|
<div class="compat-list">
|
|
204
204
|
<details class="compat-row" data-status="ok">
|
|
205
205
|
<summary class="compat-line"><span class="compat-dot" data-status="ok" role="img" aria-label="Conforming" title="Conforming"></span><span class="compat-main"><code class="compat-api">functionCall parts</code><span class="compat-sub"><span class="compat-behavior">A functionCall part carries the key set <code>args</code>, <code>id</code>, <code>name</code>, and <code>args</code> arrives as a parsed JSON object, not a string</span></span></span></summary>
|
|
206
|
-
<div class="compat-evidence"><div class="compat-probe">Capture ai-function-call-shape (functionCallKeySet, argsIsObjectNotString) replayed by packages/pyric/test/ai/function-calling.test.ts test <code>ai#fncall-part-shape</code></div></div>
|
|
206
|
+
<div class="compat-evidence"><div class="compat-probe">Capture ai-function-call-shape (functionCallKeySet, argsIsObjectNotString) replayed by packages/pyric/test/ai/function-calling.test.ts test <code>ai#fncall-part-shape</code> (Structured evidence: <a href="https://github.com/davideast/pyric/blob/main/packages/conformance/observations/ai/ai-function-call-shape.json" target="_blank" rel="noopener noreferrer"><code>ai-function-call-shape</code></a>, <a href="https://github.com/davideast/pyric/blob/main/packages/pyric/test/ai/function-calling.test.ts#L3" target="_blank" rel="noopener noreferrer"><code>function-calling.test.ts</code></a>)</div></div>
|
|
207
207
|
</details>
|
|
208
208
|
<details class="compat-row" data-status="ok">
|
|
209
209
|
<summary class="compat-line"><span class="compat-dot" data-status="ok" role="img" aria-label="Conforming" title="Conforming"></span><span class="compat-main"><code class="compat-api">toolConfig.functionCallingConfig</code><span class="compat-sub"><span class="compat-behavior">Mode <code>ANY</code> forces a functionCall part in the response and the candidate finishes <code>STOP</code></span></span></span></summary>
|
|
210
|
-
<div class="compat-evidence"><div class="compat-probe">Capture ai-function-call-shape (captured under mode ANY, finishReason STOP) replayed by packages/pyric/test/ai/function-calling.test.ts test <code>ai#fncall-mode-any</code></div></div>
|
|
210
|
+
<div class="compat-evidence"><div class="compat-probe">Capture ai-function-call-shape (captured under mode ANY, finishReason STOP) replayed by packages/pyric/test/ai/function-calling.test.ts test <code>ai#fncall-mode-any</code> (Structured evidence: <a href="https://github.com/davideast/pyric/blob/main/packages/conformance/observations/ai/ai-function-call-shape.json" target="_blank" rel="noopener noreferrer"><code>ai-function-call-shape</code></a>, <a href="https://github.com/davideast/pyric/blob/main/packages/pyric/test/ai/function-calling.test.ts#L3" target="_blank" rel="noopener noreferrer"><code>function-calling.test.ts</code></a>)</div></div>
|
|
211
211
|
</details>
|
|
212
212
|
<details class="compat-row" data-status="ok">
|
|
213
213
|
<summary class="compat-line"><span class="compat-dot" data-status="ok" role="img" aria-label="Conforming" title="Conforming"></span><span class="compat-main"><code class="compat-api">functionCall parts</code><span class="compat-sub"><span class="compat-behavior"><code>functionCall.id</code> is present on the GoogleAI wire; the mirror emits an id on synthesized calls</span></span></span></summary>
|
|
214
|
-
<div class="compat-evidence"><div class="compat-probe">Capture ai-function-call-shape (id in functionCallKeySet) replayed by packages/pyric/test/ai/function-calling.test.ts test <code>ai#fncall-id-present</code></div></div>
|
|
214
|
+
<div class="compat-evidence"><div class="compat-probe">Capture ai-function-call-shape (id in functionCallKeySet) replayed by packages/pyric/test/ai/function-calling.test.ts test <code>ai#fncall-id-present</code> (Structured evidence: <a href="https://github.com/davideast/pyric/blob/main/packages/conformance/observations/ai/ai-function-call-shape.json" target="_blank" rel="noopener noreferrer"><code>ai-function-call-shape</code></a>, <a href="https://github.com/davideast/pyric/blob/main/packages/pyric/test/ai/function-calling.test.ts#L3" target="_blank" rel="noopener noreferrer"><code>function-calling.test.ts</code></a>)</div></div>
|
|
215
215
|
</details>
|
|
216
216
|
<details class="compat-row" data-status="ok">
|
|
217
217
|
<summary class="compat-line"><span class="compat-dot" data-status="ok" role="img" aria-label="Conforming" title="Conforming"></span><span class="compat-main"><code class="compat-api">functionResponse round trip</code><span class="compat-sub"><span class="compat-behavior">A round trip that threads the model functionCall turn back verbatim, thoughtSignature preserved, is accepted: the answer has a text part and no further functionCall part</span></span></span></summary>
|
|
218
|
-
<div class="compat-evidence"><div class="compat-probe">Capture ai-function-response-round replayed by packages/pyric/test/ai/function-calling.test.ts test <code>ai#fncall-round-trip</code></div></div>
|
|
218
|
+
<div class="compat-evidence"><div class="compat-probe">Capture ai-function-response-round replayed by packages/pyric/test/ai/function-calling.test.ts test <code>ai#fncall-round-trip</code> (Structured evidence: <a href="https://github.com/davideast/pyric/blob/main/packages/conformance/observations/ai/ai-function-response-round.json" target="_blank" rel="noopener noreferrer"><code>ai-function-response-round</code></a>, <a href="https://github.com/davideast/pyric/blob/main/packages/pyric/test/ai/function-calling.test.ts#L4" target="_blank" rel="noopener noreferrer"><code>function-calling.test.ts</code></a>)</div></div>
|
|
219
219
|
</details>
|
|
220
220
|
<details class="compat-row" data-status="ok">
|
|
221
221
|
<summary class="compat-line"><span class="compat-dot" data-status="ok" role="img" aria-label="Conforming" title="Conforming"></span><span class="compat-main"><code class="compat-api">functionResponse round trip</code><span class="compat-sub"><span class="compat-behavior">A replayed model functionCall turn lacking <code>thoughtSignature</code> is rejected 400 INVALID_ARGUMENT with the thought-signature message</span></span></span></summary>
|
|
222
|
-
<div class="compat-evidence"><div class="compat-probe">Capture ai-error-fncall-missing-thought-signature replayed by packages/pyric/test/ai/function-calling.test.ts test <code>ai#fncall-thought-signature-required</code></div></div>
|
|
222
|
+
<div class="compat-evidence"><div class="compat-probe">Capture ai-error-fncall-missing-thought-signature replayed by packages/pyric/test/ai/function-calling.test.ts test <code>ai#fncall-thought-signature-required</code> (Structured evidence: <a href="https://github.com/davideast/pyric/blob/main/packages/conformance/observations/ai/ai-error-fncall-missing-thought-signature.json" target="_blank" rel="noopener noreferrer"><code>ai-error-fncall-missing-thought-signature</code></a>, <a href="https://github.com/davideast/pyric/blob/main/packages/pyric/test/ai/function-calling.test.ts#L4" target="_blank" rel="noopener noreferrer"><code>function-calling.test.ts</code></a>)</div></div>
|
|
223
223
|
</details>
|
|
224
224
|
<details class="compat-row" data-status="ok">
|
|
225
225
|
<summary class="compat-line"><span class="compat-dot" data-status="ok" role="img" aria-label="Conforming" title="Conforming"></span><span class="compat-main"><code class="compat-api">scripted engine synthesis</code><span class="compat-sub"><span class="compat-behavior">The engine mints a <code>thoughtSignature</code> on every functionCall part it synthesizes, so scripted tool round trips replay cleanly</span></span></span></summary>
|
|
226
|
-
<div class="compat-evidence"><div class="compat-probe"><code>unit:function-calling.test.ts</code> test <code>ai#fncall-signature-minted</code> (capture ai-error-fncall-missing-thought-signature cited as the motivating rejection)</div></div>
|
|
226
|
+
<div class="compat-evidence"><div class="compat-probe"><a href="https://github.com/davideast/pyric/blob/main/packages/pyric/test/ai/function-calling.test.ts#L4" target="_blank" rel="noopener noreferrer"><code>unit:function-calling.test.ts</code></a> test <code>ai#fncall-signature-minted</code> (capture ai-error-fncall-missing-thought-signature cited as the motivating rejection) (Structured evidence: <a href="https://github.com/davideast/pyric/blob/main/packages/conformance/observations/ai/ai-error-fncall-missing-thought-signature.json" target="_blank" rel="noopener noreferrer"><code>ai-error-fncall-missing-thought-signature</code></a>)</div></div>
|
|
227
227
|
</details>
|
|
228
228
|
</div>
|
|
229
229
|
|
|
@@ -232,11 +232,11 @@
|
|
|
232
232
|
<div class="compat-list">
|
|
233
233
|
<details class="compat-row" data-status="ok">
|
|
234
234
|
<summary class="compat-line"><span class="compat-dot" data-status="ok" role="img" aria-label="Conforming" title="Conforming"></span><span class="compat-main"><code class="compat-api">countTokens()</code><span class="compat-sub"><span class="compat-behavior">The countTokens envelope key set is exactly <code>promptTokensDetails</code>, <code>totalTokens</code></span></span></span></summary>
|
|
235
|
-
<div class="compat-evidence"><div class="compat-probe">Capture ai-counttokens-envelope replayed by packages/pyric/test/ai/errors-counttokens.test.ts test <code>ai#counttokens-envelope</code></div></div>
|
|
235
|
+
<div class="compat-evidence"><div class="compat-probe">Capture ai-counttokens-envelope replayed by packages/pyric/test/ai/errors-counttokens.test.ts test <code>ai#counttokens-envelope</code> (Structured evidence: <a href="https://github.com/davideast/pyric/blob/main/packages/conformance/observations/ai/ai-counttokens-envelope.json" target="_blank" rel="noopener noreferrer"><code>ai-counttokens-envelope</code></a>, <a href="https://github.com/davideast/pyric/blob/main/packages/pyric/test/ai/errors-counttokens.test.ts#L39" target="_blank" rel="noopener noreferrer"><code>errors-counttokens.test.ts</code></a>)</div></div>
|
|
236
236
|
</details>
|
|
237
237
|
<details class="compat-row" data-status="ok">
|
|
238
238
|
<summary class="compat-line"><span class="compat-dot" data-status="ok" role="img" aria-label="Conforming" title="Conforming"></span><span class="compat-main"><code class="compat-api">countTokens()</code><span class="compat-sub"><span class="compat-behavior">An identical payload returns an identical <code>totalTokens</code> across calls</span></span></span></summary>
|
|
239
|
-
<div class="compat-evidence"><div class="compat-probe">Capture ai-counttokens-envelope (deterministicAcrossTwoCalls) replayed by packages/pyric/test/ai/errors-counttokens.test.ts test <code>ai#counttokens-deterministic</code></div></div>
|
|
239
|
+
<div class="compat-evidence"><div class="compat-probe">Capture ai-counttokens-envelope (deterministicAcrossTwoCalls) replayed by packages/pyric/test/ai/errors-counttokens.test.ts test <code>ai#counttokens-deterministic</code> (Structured evidence: <a href="https://github.com/davideast/pyric/blob/main/packages/conformance/observations/ai/ai-counttokens-envelope.json" target="_blank" rel="noopener noreferrer"><code>ai-counttokens-envelope</code></a>, <a href="https://github.com/davideast/pyric/blob/main/packages/pyric/test/ai/errors-counttokens.test.ts#L40" target="_blank" rel="noopener noreferrer"><code>errors-counttokens.test.ts</code></a>)</div></div>
|
|
240
240
|
</details>
|
|
241
241
|
</div>
|
|
242
242
|
|
|
@@ -245,31 +245,31 @@
|
|
|
245
245
|
<div class="compat-list">
|
|
246
246
|
<details class="compat-row" data-status="ok">
|
|
247
247
|
<summary class="compat-line"><span class="compat-dot" data-status="ok" role="img" aria-label="Conforming" title="Conforming"></span><span class="compat-main"><code class="compat-api">error envelope</code><span class="compat-sub"><span class="compat-behavior">A model name production has never served fails 404 NOT_FOUND with the error key set <code>code</code>, <code>message</code>, <code>status</code> and no details</span></span></span></summary>
|
|
248
|
-
<div class="compat-evidence"><div class="compat-probe">Capture ai-error-unknown-model replayed by packages/pyric/test/ai/errors-counttokens.test.ts test <code>ai#error-unknown-model</code></div></div>
|
|
248
|
+
<div class="compat-evidence"><div class="compat-probe">Capture ai-error-unknown-model replayed by packages/pyric/test/ai/errors-counttokens.test.ts test <code>ai#error-unknown-model</code> (Structured evidence: <a href="https://github.com/davideast/pyric/blob/main/packages/conformance/observations/ai/ai-error-unknown-model.json" target="_blank" rel="noopener noreferrer"><code>ai-error-unknown-model</code></a>, <a href="https://github.com/davideast/pyric/blob/main/packages/pyric/test/ai/errors-counttokens.test.ts#L59" target="_blank" rel="noopener noreferrer"><code>errors-counttokens.test.ts</code></a>)</div></div>
|
|
249
249
|
</details>
|
|
250
250
|
<details class="compat-row" data-status="ok">
|
|
251
251
|
<summary class="compat-line"><span class="compat-dot" data-status="ok" role="img" aria-label="Conforming" title="Conforming"></span><span class="compat-main"><code class="compat-api">error envelope</code><span class="compat-sub"><span class="compat-behavior">A retired model family (Gemini 1.5) fails 404 NOT_FOUND with an ErrorInfo detail and a retirement message distinct from unknown-model</span></span></span></summary>
|
|
252
|
-
<div class="compat-evidence"><div class="compat-probe">Capture ai-error-retired-model replayed by packages/pyric/test/ai/errors-counttokens.test.ts test <code>ai#error-retired-model</code></div></div>
|
|
252
|
+
<div class="compat-evidence"><div class="compat-probe">Capture ai-error-retired-model replayed by packages/pyric/test/ai/errors-counttokens.test.ts test <code>ai#error-retired-model</code> (Structured evidence: <a href="https://github.com/davideast/pyric/blob/main/packages/conformance/observations/ai/ai-error-retired-model.json" target="_blank" rel="noopener noreferrer"><code>ai-error-retired-model</code></a>, <a href="https://github.com/davideast/pyric/blob/main/packages/pyric/test/ai/errors-counttokens.test.ts#L70" target="_blank" rel="noopener noreferrer"><code>errors-counttokens.test.ts</code></a>)</div></div>
|
|
253
253
|
</details>
|
|
254
254
|
<details class="compat-row" data-status="ok">
|
|
255
255
|
<summary class="compat-line"><span class="compat-dot" data-status="ok" role="img" aria-label="Conforming" title="Conforming"></span><span class="compat-main"><code class="compat-api">error envelope</code><span class="compat-sub"><span class="compat-behavior">An invalid API key fails 400 INVALID_ARGUMENT, not 401, with ErrorInfo plus LocalizedMessage details and the message <code>API key not valid. Please pass a valid API key.</code></span></span></span></summary>
|
|
256
|
-
<div class="compat-evidence"><div class="compat-probe">Capture ai-error-bad-api-key replayed by packages/pyric/test/ai/errors-counttokens.test.ts test <code>ai#error-bad-api-key</code></div></div>
|
|
256
|
+
<div class="compat-evidence"><div class="compat-probe">Capture ai-error-bad-api-key replayed by packages/pyric/test/ai/errors-counttokens.test.ts test <code>ai#error-bad-api-key</code> (Structured evidence: <a href="https://github.com/davideast/pyric/blob/main/packages/conformance/observations/ai/ai-error-bad-api-key.json" target="_blank" rel="noopener noreferrer"><code>ai-error-bad-api-key</code></a>, <a href="https://github.com/davideast/pyric/blob/main/packages/pyric/test/ai/errors-counttokens.test.ts#L82" target="_blank" rel="noopener noreferrer"><code>errors-counttokens.test.ts</code></a>)</div></div>
|
|
257
257
|
</details>
|
|
258
258
|
<details class="compat-row" data-status="ok">
|
|
259
259
|
<summary class="compat-line"><span class="compat-dot" data-status="ok" role="img" aria-label="Conforming" title="Conforming"></span><span class="compat-main"><code class="compat-api">error envelope</code><span class="compat-sub"><span class="compat-behavior">An empty <code>contents</code> array fails 400 INVALID_ARGUMENT with the message <code>contents is not specified</code></span></span></span></summary>
|
|
260
|
-
<div class="compat-evidence"><div class="compat-probe">Capture ai-error-empty-contents replayed by packages/pyric/test/ai/errors-counttokens.test.ts test <code>ai#error-empty-contents</code></div></div>
|
|
260
|
+
<div class="compat-evidence"><div class="compat-probe">Capture ai-error-empty-contents replayed by packages/pyric/test/ai/errors-counttokens.test.ts test <code>ai#error-empty-contents</code> (Structured evidence: <a href="https://github.com/davideast/pyric/blob/main/packages/conformance/observations/ai/ai-error-empty-contents.json" target="_blank" rel="noopener noreferrer"><code>ai-error-empty-contents</code></a>, <a href="https://github.com/davideast/pyric/blob/main/packages/pyric/test/ai/errors-counttokens.test.ts#L116" target="_blank" rel="noopener noreferrer"><code>errors-counttokens.test.ts</code></a>)</div></div>
|
|
261
261
|
</details>
|
|
262
262
|
<details class="compat-row" data-status="ok">
|
|
263
263
|
<summary class="compat-line"><span class="compat-dot" data-status="ok" role="img" aria-label="Conforming" title="Conforming"></span><span class="compat-main"><code class="compat-api">error envelope</code><span class="compat-sub"><span class="compat-behavior">An invalid content role fails 400 INVALID_ARGUMENT and the message lists the production role vocabulary: SYSTEM, SYSTEM_1, USER, ASSISTANT, DEVELOPER, CONTEXT, USER_CONTEXT, MODEL, USER</span></span></span></summary>
|
|
264
|
-
<div class="compat-evidence"><div class="compat-probe">Capture ai-error-bad-role replayed by packages/pyric/test/ai/errors-counttokens.test.ts test <code>ai#error-bad-role</code></div></div>
|
|
264
|
+
<div class="compat-evidence"><div class="compat-probe">Capture ai-error-bad-role replayed by packages/pyric/test/ai/errors-counttokens.test.ts test <code>ai#error-bad-role</code> (Structured evidence: <a href="https://github.com/davideast/pyric/blob/main/packages/conformance/observations/ai/ai-error-bad-role.json" target="_blank" rel="noopener noreferrer"><code>ai-error-bad-role</code></a>, <a href="https://github.com/davideast/pyric/blob/main/packages/pyric/test/ai/errors-counttokens.test.ts#L125" target="_blank" rel="noopener noreferrer"><code>errors-counttokens.test.ts</code></a>)</div></div>
|
|
265
265
|
</details>
|
|
266
266
|
<details class="compat-row" data-status="ok">
|
|
267
267
|
<summary class="compat-line"><span class="compat-dot" data-status="ok" role="img" aria-label="Conforming" title="Conforming"></span><span class="compat-main"><code class="compat-api">AIError</code><span class="compat-sub"><span class="compat-behavior">HTTP failures surface as <code>AIError</code> with an <code>AIErrorCode</code> code and <code>customErrorData</code> carrying <code>status</code>, <code>statusText</code>, and <code>errorDetails</code></span></span></span></summary>
|
|
268
|
-
<div class="compat-evidence"><div class="compat-probe"><code>unit:errors-counttokens.test.ts</code> test <code>ai#error-aierror-shape</code> (capture ai-error-bad-api-key cited as the sample envelope)</div></div>
|
|
268
|
+
<div class="compat-evidence"><div class="compat-probe"><a href="https://github.com/davideast/pyric/blob/main/packages/pyric/test/ai/errors-counttokens.test.ts#L83" target="_blank" rel="noopener noreferrer"><code>unit:errors-counttokens.test.ts</code></a> test <code>ai#error-aierror-shape</code> (capture ai-error-bad-api-key cited as the sample envelope) (Structured evidence: <a href="https://github.com/davideast/pyric/blob/main/packages/conformance/observations/ai/ai-error-bad-api-key.json" target="_blank" rel="noopener noreferrer"><code>ai-error-bad-api-key</code></a>)</div></div>
|
|
269
269
|
</details>
|
|
270
270
|
<details class="compat-row" data-status="ok">
|
|
271
271
|
<summary class="compat-line"><span class="compat-dot" data-status="ok" role="img" aria-label="Conforming" title="Conforming"></span><span class="compat-main"><code class="compat-api">AIErrorCode</code><span class="compat-sub"><span class="compat-behavior"><code>AIErrorCode</code> exposes the 14 documented codes, from <code>error</code> through <code>unsupported</code></span></span></span></summary>
|
|
272
|
-
<div class="compat-evidence"><div class="compat-probe"><code>unit:errors-counttokens.test.ts</code> test <code>ai#error-code-vocabulary</code> (upstream constant vocabulary)</div></div>
|
|
272
|
+
<div class="compat-evidence"><div class="compat-probe"><a href="https://github.com/davideast/pyric/blob/main/packages/pyric/test/ai/errors-counttokens.test.ts#L154" target="_blank" rel="noopener noreferrer"><code>unit:errors-counttokens.test.ts</code></a> test <code>ai#error-code-vocabulary</code> (upstream constant vocabulary)</div></div>
|
|
273
273
|
</details>
|
|
274
274
|
</div>
|
|
275
275
|
|
|
@@ -278,27 +278,27 @@
|
|
|
278
278
|
<div class="compat-list">
|
|
279
279
|
<details class="compat-row" data-status="ok">
|
|
280
280
|
<summary class="compat-line"><span class="compat-dot" data-status="ok" role="img" aria-label="Conforming" title="Conforming"></span><span class="compat-main"><code class="compat-api">response.text()</code><span class="compat-sub"><span class="compat-behavior"><code>text()</code> concatenates the text parts of the first candidate</span></span></span></summary>
|
|
281
|
-
<div class="compat-evidence"><div class="compat-probe"><code>unit:upstream-ai-probes.test.ts</code> (I3 text() across mixed parts) + <code>unit:helpers-schema.test.ts</code> test <code>ai#helper-text</code></div></div>
|
|
281
|
+
<div class="compat-evidence"><div class="compat-probe"><a href="https://github.com/davideast/pyric/blob/main/packages/pyric/test/ai/upstream-ai-probes.test.ts#L11" target="_blank" rel="noopener noreferrer"><code>unit:upstream-ai-probes.test.ts</code></a> (I3 text() across mixed parts) + <a href="https://github.com/davideast/pyric/blob/main/packages/pyric/test/ai/helpers-schema.test.ts#L33" target="_blank" rel="noopener noreferrer"><code>unit:helpers-schema.test.ts</code></a> test <code>ai#helper-text</code></div></div>
|
|
282
282
|
</details>
|
|
283
283
|
<details class="compat-row" data-status="ok">
|
|
284
284
|
<summary class="compat-line"><span class="compat-dot" data-status="ok" role="img" aria-label="Conforming" title="Conforming"></span><span class="compat-main"><code class="compat-api">response.text()</code><span class="compat-sub"><span class="compat-behavior"><code>text()</code> throws on bad finish reasons such as <code>SAFETY</code> and on a blocked prompt</span></span></span></summary>
|
|
285
|
-
<div class="compat-evidence"><div class="compat-probe"><code>unit:helpers-schema.test.ts</code> test <code>ai#helper-text-throws</code> (exercised with a scripted SAFETY envelope)</div></div>
|
|
285
|
+
<div class="compat-evidence"><div class="compat-probe"><a href="https://github.com/davideast/pyric/blob/main/packages/pyric/test/ai/helpers-schema.test.ts#L51" target="_blank" rel="noopener noreferrer"><code>unit:helpers-schema.test.ts</code></a> test <code>ai#helper-text-throws</code> (exercised with a scripted SAFETY envelope)</div></div>
|
|
286
286
|
</details>
|
|
287
287
|
<details class="compat-row" data-status="ok">
|
|
288
288
|
<summary class="compat-line"><span class="compat-dot" data-status="ok" role="img" aria-label="Conforming" title="Conforming"></span><span class="compat-main"><code class="compat-api">response.functionCalls()</code><span class="compat-sub"><span class="compat-behavior"><code>functionCalls()</code> returns the <code>FunctionCall</code> array from the functionCall parts, args as parsed objects</span></span></span></summary>
|
|
289
|
-
<div class="compat-evidence"><div class="compat-probe"><code>unit:upstream-ai-probes.test.ts</code> (I3 text+functionCall mix) + Capture ai-function-call-shape replayed by <code>unit:helpers-schema.test.ts</code> test <code>ai#helper-functioncalls</code></div></div>
|
|
289
|
+
<div class="compat-evidence"><div class="compat-probe"><a href="https://github.com/davideast/pyric/blob/main/packages/pyric/test/ai/upstream-ai-probes.test.ts#L113" target="_blank" rel="noopener noreferrer"><code>unit:upstream-ai-probes.test.ts</code></a> (I3 text+functionCall mix) + Capture ai-function-call-shape replayed by <a href="https://github.com/davideast/pyric/blob/main/packages/pyric/test/ai/helpers-schema.test.ts#L70" target="_blank" rel="noopener noreferrer"><code>unit:helpers-schema.test.ts</code></a> test <code>ai#helper-functioncalls</code> (Structured evidence: <a href="https://github.com/davideast/pyric/blob/main/packages/conformance/observations/ai/ai-function-call-shape.json" target="_blank" rel="noopener noreferrer"><code>ai-function-call-shape</code></a>)</div></div>
|
|
290
290
|
</details>
|
|
291
291
|
<details class="compat-row" data-status="ok">
|
|
292
292
|
<summary class="compat-line"><span class="compat-dot" data-status="ok" role="img" aria-label="Conforming" title="Conforming"></span><span class="compat-main"><code class="compat-api">response.thoughtSummary()</code><span class="compat-sub"><span class="compat-behavior"><code>thoughtSummary()</code> returns undefined when no part is flagged <code>thought: true</code>, the captured lite-model case</span></span></span></summary>
|
|
293
|
-
<div class="compat-evidence"><div class="compat-probe"><code>unit:upstream-ai-probes.test.ts</code> (I3 thoughtSummary from thought parts) + Capture ai-thinking-thought-parts replayed by <code>unit:helpers-schema.test.ts</code> test <code>ai#helper-thoughtsummary</code></div></div>
|
|
293
|
+
<div class="compat-evidence"><div class="compat-probe"><a href="https://github.com/davideast/pyric/blob/main/packages/pyric/test/ai/upstream-ai-probes.test.ts#L11" target="_blank" rel="noopener noreferrer"><code>unit:upstream-ai-probes.test.ts</code></a> (I3 thoughtSummary from thought parts) + Capture ai-thinking-thought-parts replayed by <a href="https://github.com/davideast/pyric/blob/main/packages/pyric/test/ai/helpers-schema.test.ts#L85" target="_blank" rel="noopener noreferrer"><code>unit:helpers-schema.test.ts</code></a> test <code>ai#helper-thoughtsummary</code> (Structured evidence: <a href="https://github.com/davideast/pyric/blob/main/packages/conformance/observations/ai/ai-thinking-thought-parts.json" target="_blank" rel="noopener noreferrer"><code>ai-thinking-thought-parts</code></a>)</div></div>
|
|
294
294
|
</details>
|
|
295
295
|
<details class="compat-row" data-status="ok">
|
|
296
296
|
<summary class="compat-line"><span class="compat-dot" data-status="ok" role="img" aria-label="Conforming" title="Conforming"></span><span class="compat-main"><code class="compat-api">response.inlineDataParts()</code><span class="compat-sub"><span class="compat-behavior"><code>inlineDataParts()</code> returns the <code>InlineDataPart</code> array when inlineData parts exist and undefined when none do</span></span></span></summary>
|
|
297
|
-
<div class="compat-evidence"><div class="compat-probe"><code>unit:helpers-schema.test.ts</code> test <code>ai#helper-inlinedataparts</code> (exercised with a scripted raw envelope)</div></div>
|
|
297
|
+
<div class="compat-evidence"><div class="compat-probe"><a href="https://github.com/davideast/pyric/blob/main/packages/pyric/test/ai/helpers-schema.test.ts#L93" target="_blank" rel="noopener noreferrer"><code>unit:helpers-schema.test.ts</code></a> test <code>ai#helper-inlinedataparts</code> (exercised with a scripted raw envelope)</div></div>
|
|
298
298
|
</details>
|
|
299
299
|
<details class="compat-row" data-status="ok">
|
|
300
300
|
<summary class="compat-line"><span class="compat-dot" data-status="ok" role="img" aria-label="Conforming" title="Conforming"></span><span class="compat-main"><code class="compat-api">response helpers</code><span class="compat-sub"><span class="compat-behavior">Helpers tolerate omitted decoration: an envelope without <code>usageMetadata</code>, <code>finishReason</code>, or <code>safetyRatings</code> still serves <code>text()</code> without throwing</span></span></span></summary>
|
|
301
|
-
<div class="compat-evidence"><div class="compat-probe"><code>unit:helpers-schema.test.ts</code> test <code>ai#helper-tolerates-missing-decor</code> (exercised with a scripted bare envelope)</div></div>
|
|
301
|
+
<div class="compat-evidence"><div class="compat-probe"><a href="https://github.com/davideast/pyric/blob/main/packages/pyric/test/ai/helpers-schema.test.ts#L124" target="_blank" rel="noopener noreferrer"><code>unit:helpers-schema.test.ts</code></a> test <code>ai#helper-tolerates-missing-decor</code> (exercised with a scripted bare envelope)</div></div>
|
|
302
302
|
</details>
|
|
303
303
|
</div>
|
|
304
304
|
|
|
@@ -307,24 +307,24 @@
|
|
|
307
307
|
<div class="compat-list">
|
|
308
308
|
<details class="compat-row" data-status="ok">
|
|
309
309
|
<summary class="compat-line"><span class="compat-dot" data-status="ok" role="img" aria-label="Conforming" title="Conforming"></span><span class="compat-main"><code class="compat-api">Schema.object()</code><span class="compat-sub"><span class="compat-behavior"><code>Schema.object</code> serializes to type <code>object</code> with <code>properties</code>, and <code>required</code> is derived by excluding <code>optionalProperties</code></span></span></span></summary>
|
|
310
|
-
<div class="compat-evidence"><div class="compat-probe"><code>unit:upstream-ai-probes.test.ts</code> (I2 empty optionalProperties + propertyOrdering) + <code>unit:helpers-schema.test.ts</code> test <code>ai#schema-object-tojson</code></div></div>
|
|
310
|
+
<div class="compat-evidence"><div class="compat-probe"><a href="https://github.com/davideast/pyric/blob/main/packages/pyric/test/ai/upstream-ai-probes.test.ts#L8" target="_blank" rel="noopener noreferrer"><code>unit:upstream-ai-probes.test.ts</code></a> (I2 empty optionalProperties + propertyOrdering) + <a href="https://github.com/davideast/pyric/blob/main/packages/pyric/test/ai/helpers-schema.test.ts#L139" target="_blank" rel="noopener noreferrer"><code>unit:helpers-schema.test.ts</code></a> test <code>ai#schema-object-tojson</code></div></div>
|
|
311
311
|
</details>
|
|
312
312
|
<details class="compat-row" data-status="diverged">
|
|
313
313
|
<summary class="compat-line"><span class="compat-dot" data-status="diverged" role="img" aria-label="Diverged (documented)" title="Diverged (documented)"></span><span class="compat-main"><code class="compat-api">Schema.enumString()</code><span class="compat-sub"><span class="compat-behavior"><code>Schema.enumString</code> serializes the enum values with type <code>string</code> and format <code>enum</code></span></span></span></summary>
|
|
314
|
-
<div class="compat-evidence"><div class="compat-probe"><code>unit:helpers-schema.test.ts</code> test <code>ai#schema-string-enum</code> (upstream toJSON request shape; GoogleAI accepts only enum and date-time formats)</div>
|
|
314
|
+
<div class="compat-evidence"><div class="compat-probe"><a href="https://github.com/davideast/pyric/blob/main/packages/pyric/test/ai/helpers-schema.test.ts#L153" target="_blank" rel="noopener noreferrer"><code>unit:helpers-schema.test.ts</code></a> test <code>ai#schema-string-enum</code> (upstream toJSON request shape; GoogleAI accepts only enum and date-time formats)</div>
|
|
315
315
|
<div class="compat-note">format</div></div>
|
|
316
316
|
</details>
|
|
317
317
|
<details class="compat-row" data-status="ok">
|
|
318
318
|
<summary class="compat-line"><span class="compat-dot" data-status="ok" role="img" aria-label="Conforming" title="Conforming"></span><span class="compat-main"><code class="compat-api">Schema.string()/integer()/number()/boolean()/array()</code><span class="compat-sub"><span class="compat-behavior">Each primitive builder serializes its <code>SchemaType</code>, and <code>array</code> carries <code>items</code></span></span></span></summary>
|
|
319
|
-
<div class="compat-evidence"><div class="compat-probe"><code>unit:helpers-schema.test.ts</code> test <code>ai#schema-primitives</code> (upstream toJSON request shape)</div></div>
|
|
319
|
+
<div class="compat-evidence"><div class="compat-probe"><a href="https://github.com/davideast/pyric/blob/main/packages/pyric/test/ai/helpers-schema.test.ts#L160" target="_blank" rel="noopener noreferrer"><code>unit:helpers-schema.test.ts</code></a> test <code>ai#schema-primitives</code> (upstream toJSON request shape)</div></div>
|
|
320
320
|
</details>
|
|
321
321
|
<details class="compat-row" data-status="ok">
|
|
322
322
|
<summary class="compat-line"><span class="compat-dot" data-status="ok" role="img" aria-label="Conforming" title="Conforming"></span><span class="compat-main"><code class="compat-api">Schema.anyOf()</code><span class="compat-sub"><span class="compat-behavior"><code>Schema.anyOf</code> returns an <code>AnyOfSchema</code> whose JSON carries an <code>anyOf</code> array of sub-schemas and no top-level type</span></span></span></summary>
|
|
323
|
-
<div class="compat-evidence"><div class="compat-probe"><code>unit:upstream-ai-probes.test.ts</code> (I2 empty anyOf → invalid-schema) + <code>unit:helpers-schema.test.ts</code> test <code>ai#schema-anyof</code></div></div>
|
|
323
|
+
<div class="compat-evidence"><div class="compat-probe"><a href="https://github.com/davideast/pyric/blob/main/packages/pyric/test/ai/upstream-ai-probes.test.ts#L8" target="_blank" rel="noopener noreferrer"><code>unit:upstream-ai-probes.test.ts</code></a> (I2 empty anyOf → invalid-schema) + <a href="https://github.com/davideast/pyric/blob/main/packages/pyric/test/ai/helpers-schema.test.ts#L170" target="_blank" rel="noopener noreferrer"><code>unit:helpers-schema.test.ts</code></a> test <code>ai#schema-anyof</code></div></div>
|
|
324
324
|
</details>
|
|
325
325
|
<details class="compat-row" data-status="ok">
|
|
326
326
|
<summary class="compat-line"><span class="compat-dot" data-status="ok" role="img" aria-label="Conforming" title="Conforming"></span><span class="compat-main"><code class="compat-api">generationConfig.responseSchema</code><span class="compat-sub"><span class="compat-behavior">A built <code>Schema</code> serializes into <code>generationConfig.responseSchema</code> on the request and drives JSON output</span></span></span></summary>
|
|
327
|
-
<div class="compat-evidence"><div class="compat-probe">Capture ai-structured-output-shape replayed by packages/pyric/test/ai/helpers-schema.test.ts test <code>ai#schema-rides-request</code></div></div>
|
|
327
|
+
<div class="compat-evidence"><div class="compat-probe">Capture ai-structured-output-shape replayed by packages/pyric/test/ai/helpers-schema.test.ts test <code>ai#schema-rides-request</code> (Structured evidence: <a href="https://github.com/davideast/pyric/blob/main/packages/conformance/observations/ai/ai-structured-output-shape.json" target="_blank" rel="noopener noreferrer"><code>ai-structured-output-shape</code></a>, <a href="https://github.com/davideast/pyric/blob/main/packages/pyric/test/ai/helpers-schema.test.ts#L179" target="_blank" rel="noopener noreferrer"><code>helpers-schema.test.ts</code></a>)</div></div>
|
|
328
328
|
</details>
|
|
329
329
|
</div>
|
|
330
330
|
|
|
@@ -333,39 +333,39 @@
|
|
|
333
333
|
<div class="compat-list">
|
|
334
334
|
<details class="compat-row" data-status="ok">
|
|
335
335
|
<summary class="compat-line"><span class="compat-dot" data-status="ok" role="img" aria-label="Conforming" title="Conforming"></span><span class="compat-main"><code class="compat-api">scripted engine</code><span class="compat-sub"><span class="compat-behavior">With no script the engine returns a deterministic synthesized response derived from the request, wire-true in shape: the captured envelope key sets hold</span></span></span></summary>
|
|
336
|
-
<div class="compat-evidence"><div class="compat-probe"><code>unit:engines.test.ts</code> test <code>ai#scripted-zero-config</code> (capture ai-generate-minimal-envelope cited as the shape source)</div></div>
|
|
336
|
+
<div class="compat-evidence"><div class="compat-probe"><a href="https://github.com/davideast/pyric/blob/main/packages/pyric/test/ai/engines.test.ts#L10" target="_blank" rel="noopener noreferrer"><code>unit:engines.test.ts</code></a> test <code>ai#scripted-zero-config</code> (capture ai-generate-minimal-envelope cited as the shape source) (Structured evidence: <a href="https://github.com/davideast/pyric/blob/main/packages/conformance/observations/ai/ai-generate-minimal-envelope.json" target="_blank" rel="noopener noreferrer"><code>ai-generate-minimal-envelope</code></a>)</div></div>
|
|
337
337
|
</details>
|
|
338
338
|
<details class="compat-row" data-status="ok">
|
|
339
339
|
<summary class="compat-line"><span class="compat-dot" data-status="ok" role="img" aria-label="Conforming" title="Conforming"></span><span class="compat-main"><code class="compat-api">scripted engine</code><span class="compat-sub"><span class="compat-behavior">The same unscripted request twice yields an identical envelope, candidates and usage included</span></span></span></summary>
|
|
340
|
-
<div class="compat-evidence"><div class="compat-probe"><code>unit:engines.test.ts</code> test <code>ai#scripted-deterministic</code> (determinism claim from the scripted authoring deltas)</div></div>
|
|
340
|
+
<div class="compat-evidence"><div class="compat-probe"><a href="https://github.com/davideast/pyric/blob/main/packages/pyric/test/ai/engines.test.ts#L47" target="_blank" rel="noopener noreferrer"><code>unit:engines.test.ts</code></a> test <code>ai#scripted-deterministic</code> (determinism claim from the scripted authoring deltas)</div></div>
|
|
341
341
|
</details>
|
|
342
342
|
<details class="compat-row" data-status="ok">
|
|
343
343
|
<summary class="compat-line"><span class="compat-dot" data-status="ok" role="img" aria-label="Conforming" title="Conforming"></span><span class="compat-main"><code class="compat-api">script(ai, entries)</code><span class="compat-sub"><span class="compat-behavior">Script entries without matchers are consumed in FIFO queue order</span></span></span></summary>
|
|
344
|
-
<div class="compat-evidence"><div class="compat-probe"><code>unit:engines.test.ts</code> test <code>ai#scripted-queue-order</code> (ruling 2 of the scripted authoring deltas)</div></div>
|
|
344
|
+
<div class="compat-evidence"><div class="compat-probe"><a href="https://github.com/davideast/pyric/blob/main/packages/pyric/test/ai/engines.test.ts#L57" target="_blank" rel="noopener noreferrer"><code>unit:engines.test.ts</code></a> test <code>ai#scripted-queue-order</code> (ruling 2 of the scripted authoring deltas)</div></div>
|
|
345
345
|
</details>
|
|
346
346
|
<details class="compat-row" data-status="ok">
|
|
347
347
|
<summary class="compat-line"><span class="compat-dot" data-status="ok" role="img" aria-label="Conforming" title="Conforming"></span><span class="compat-main"><code class="compat-api">script(ai, entries)</code><span class="compat-sub"><span class="compat-behavior">Entries match by substring, regex, or predicate on the request; a matching entry wins over the plain queue</span></span></span></summary>
|
|
348
|
-
<div class="compat-evidence"><div class="compat-probe"><code>unit:engines.test.ts</code> test <code>ai#scripted-matchers</code> (ruling 2 of the scripted authoring deltas)</div></div>
|
|
348
|
+
<div class="compat-evidence"><div class="compat-probe"><a href="https://github.com/davideast/pyric/blob/main/packages/pyric/test/ai/engines.test.ts#L66" target="_blank" rel="noopener noreferrer"><code>unit:engines.test.ts</code></a> test <code>ai#scripted-matchers</code> (ruling 2 of the scripted authoring deltas)</div></div>
|
|
349
349
|
</details>
|
|
350
350
|
<details class="compat-row" data-status="ok">
|
|
351
351
|
<summary class="compat-line"><span class="compat-dot" data-status="ok" role="img" aria-label="Conforming" title="Conforming"></span><span class="compat-main"><code class="compat-api">script(ai, entries)</code><span class="compat-sub"><span class="compat-behavior">A raw Gemini envelope entry is returned verbatim, so an observation <code>behavior.raw</code> pastes in directly and captures are the corpus</span></span></span></summary>
|
|
352
|
-
<div class="compat-evidence"><div class="compat-probe"><code>unit:engines.test.ts</code> test <code>ai#scripted-raw-envelope</code> (ruling 3 of the scripted authoring deltas)</div></div>
|
|
352
|
+
<div class="compat-evidence"><div class="compat-probe"><a href="https://github.com/davideast/pyric/blob/main/packages/pyric/test/ai/engines.test.ts#L79" target="_blank" rel="noopener noreferrer"><code>unit:engines.test.ts</code></a> test <code>ai#scripted-raw-envelope</code> (ruling 3 of the scripted authoring deltas)</div></div>
|
|
353
353
|
</details>
|
|
354
354
|
<details class="compat-row" data-status="ok">
|
|
355
355
|
<summary class="compat-line"><span class="compat-dot" data-status="ok" role="img" aria-label="Conforming" title="Conforming"></span><span class="compat-main"><code class="compat-api">script(ai, entries)</code><span class="compat-sub"><span class="compat-behavior">A <code>text</code> shorthand expands to a wire-true envelope: finishReason STOP, usageMetadata with serviceTier, modelVersion, responseId</span></span></span></summary>
|
|
356
|
-
<div class="compat-evidence"><div class="compat-probe"><code>unit:engines.test.ts</code> test <code>ai#scripted-shorthand-text</code> (capture ai-generate-minimal-envelope cited as the expansion target)</div></div>
|
|
356
|
+
<div class="compat-evidence"><div class="compat-probe"><a href="https://github.com/davideast/pyric/blob/main/packages/pyric/test/ai/engines.test.ts#L10" target="_blank" rel="noopener noreferrer"><code>unit:engines.test.ts</code></a> test <code>ai#scripted-shorthand-text</code> (capture ai-generate-minimal-envelope cited as the expansion target) (Structured evidence: <a href="https://github.com/davideast/pyric/blob/main/packages/conformance/observations/ai/ai-generate-minimal-envelope.json" target="_blank" rel="noopener noreferrer"><code>ai-generate-minimal-envelope</code></a>)</div></div>
|
|
357
357
|
</details>
|
|
358
358
|
<details class="compat-row" data-status="ok">
|
|
359
359
|
<summary class="compat-line"><span class="compat-dot" data-status="ok" role="img" aria-label="Conforming" title="Conforming"></span><span class="compat-main"><code class="compat-api">script(ai, entries)</code><span class="compat-sub"><span class="compat-behavior">A <code>functionCall</code> shorthand expands to a model turn whose functionCall part carries a minted <code>thoughtSignature</code></span></span></span></summary>
|
|
360
|
-
<div class="compat-evidence"><div class="compat-probe"><code>unit:engines.test.ts</code> test <code>ai#scripted-shorthand-functioncall</code> (capture ai-error-fncall-missing-thought-signature cited as the motivating rejection)</div></div>
|
|
360
|
+
<div class="compat-evidence"><div class="compat-probe"><a href="https://github.com/davideast/pyric/blob/main/packages/pyric/test/ai/engines.test.ts#L116" target="_blank" rel="noopener noreferrer"><code>unit:engines.test.ts</code></a> test <code>ai#scripted-shorthand-functioncall</code> (capture ai-error-fncall-missing-thought-signature cited as the motivating rejection) (Structured evidence: <a href="https://github.com/davideast/pyric/blob/main/packages/conformance/observations/ai/ai-error-fncall-missing-thought-signature.json" target="_blank" rel="noopener noreferrer"><code>ai-error-fncall-missing-thought-signature</code></a>)</div></div>
|
|
361
361
|
</details>
|
|
362
362
|
<details class="compat-row" data-status="ok">
|
|
363
363
|
<summary class="compat-line"><span class="compat-dot" data-status="ok" role="img" aria-label="Conforming" title="Conforming"></span><span class="compat-main"><code class="compat-api">script(ai, entries)</code><span class="compat-sub"><span class="compat-behavior">A chunk-array shorthand declares chunk boundaries and the engine applies the captured framing, so authors never hand-write SSE</span></span></span></summary>
|
|
364
|
-
<div class="compat-evidence"><div class="compat-probe"><code>unit:engines.test.ts</code> test <code>ai#scripted-stream-chunks</code> (capture ai-generate-stream-framing cited as the framing source)</div></div>
|
|
364
|
+
<div class="compat-evidence"><div class="compat-probe"><a href="https://github.com/davideast/pyric/blob/main/packages/pyric/test/ai/engines.test.ts#L11" target="_blank" rel="noopener noreferrer"><code>unit:engines.test.ts</code></a> test <code>ai#scripted-stream-chunks</code> (capture ai-generate-stream-framing cited as the framing source) (Structured evidence: <a href="https://github.com/davideast/pyric/blob/main/packages/conformance/observations/ai/ai-generate-stream-framing.json" target="_blank" rel="noopener noreferrer"><code>ai-generate-stream-framing</code></a>)</div></div>
|
|
365
365
|
</details>
|
|
366
366
|
<details class="compat-row" data-status="ok">
|
|
367
367
|
<summary class="compat-line"><span class="compat-dot" data-status="ok" role="img" aria-label="Conforming" title="Conforming"></span><span class="compat-main"><code class="compat-api">script(ai, entries)</code><span class="compat-sub"><span class="compat-behavior">Scripted text is the one place generated text values may be asserted: <code>response.text()</code> returns the scripted string exactly</span></span></span></summary>
|
|
368
|
-
<div class="compat-evidence"><div class="compat-probe"><code>unit:engines.test.ts</code> test <code>ai#scripted-text-assertable</code> (evidence tier ruling 1: generated text is never compared anywhere else)</div></div>
|
|
368
|
+
<div class="compat-evidence"><div class="compat-probe"><a href="https://github.com/davideast/pyric/blob/main/packages/pyric/test/ai/engines.test.ts#L142" target="_blank" rel="noopener noreferrer"><code>unit:engines.test.ts</code></a> test <code>ai#scripted-text-assertable</code> (evidence tier ruling 1: generated text is never compared anywhere else)</div></div>
|
|
369
369
|
</details>
|
|
370
370
|
</div>
|
|
371
371
|
|
|
@@ -374,23 +374,23 @@
|
|
|
374
374
|
<div class="compat-list">
|
|
375
375
|
<details class="compat-row" data-status="ok">
|
|
376
376
|
<summary class="compat-line"><span class="compat-dot" data-status="ok" role="img" aria-label="Conforming" title="Conforming"></span><span class="compat-main"><code class="compat-api">openai engine</code><span class="compat-sub"><span class="compat-behavior">Gemini <code>contents</code> and <code>systemInstruction</code> translate to OpenAI chat messages, and the OpenAI response translates back to a Gemini envelope with role <code>model</code></span></span></span></summary>
|
|
377
|
-
<div class="compat-evidence"><div class="compat-probe"><code>unit:engines.test.ts</code> test <code>ai#openai-request-translation</code> (translation exercised against a local OpenAI-compatible mock)</div></div>
|
|
377
|
+
<div class="compat-evidence"><div class="compat-probe"><a href="https://github.com/davideast/pyric/blob/main/packages/pyric/test/ai/engines.test.ts#L185" target="_blank" rel="noopener noreferrer"><code>unit:engines.test.ts</code></a> test <code>ai#openai-request-translation</code> (translation exercised against a local OpenAI-compatible mock)</div></div>
|
|
378
378
|
</details>
|
|
379
379
|
<details class="compat-row" data-status="ok">
|
|
380
380
|
<summary class="compat-line"><span class="compat-dot" data-status="ok" role="img" aria-label="Conforming" title="Conforming"></span><span class="compat-main"><code class="compat-api">openai engine</code><span class="compat-sub"><span class="compat-behavior">OpenAI <code>tool_call</code> ids are matched FIFO against Gemini functionResponse parts when replaying tool history</span></span></span></summary>
|
|
381
|
-
<div class="compat-evidence"><div class="compat-probe"><code>unit:engines.test.ts</code> test <code>ai#openai-fifo-tool-ids</code> (lossy translation edge from ticket #96)</div></div>
|
|
381
|
+
<div class="compat-evidence"><div class="compat-probe"><a href="https://github.com/davideast/pyric/blob/main/packages/pyric/test/ai/engines.test.ts#L198" target="_blank" rel="noopener noreferrer"><code>unit:engines.test.ts</code></a> test <code>ai#openai-fifo-tool-ids</code> (lossy translation edge from ticket #96)</div></div>
|
|
382
382
|
</details>
|
|
383
383
|
<details class="compat-row" data-status="ok">
|
|
384
384
|
<summary class="compat-line"><span class="compat-dot" data-status="ok" role="img" aria-label="Conforming" title="Conforming"></span><span class="compat-main"><code class="compat-api">openai engine</code><span class="compat-sub"><span class="compat-behavior">Streamed OpenAI tool_call deltas are buffered; the Gemini stream emits whole functionCall parts with parsed args, never partial fragments</span></span></span></summary>
|
|
385
|
-
<div class="compat-evidence"><div class="compat-probe"><code>unit:engines.test.ts</code> test <code>ai#openai-buffered-fncalls</code> (lossy translation edge from ticket #96)</div></div>
|
|
385
|
+
<div class="compat-evidence"><div class="compat-probe"><a href="https://github.com/davideast/pyric/blob/main/packages/pyric/test/ai/engines.test.ts#L230" target="_blank" rel="noopener noreferrer"><code>unit:engines.test.ts</code></a> test <code>ai#openai-buffered-fncalls</code> (lossy translation edge from ticket #96)</div></div>
|
|
386
386
|
</details>
|
|
387
387
|
<details class="compat-row" data-status="ok">
|
|
388
388
|
<summary class="compat-line"><span class="compat-dot" data-status="ok" role="img" aria-label="Conforming" title="Conforming"></span><span class="compat-main"><code class="compat-api">openai engine</code><span class="compat-sub"><span class="compat-behavior">The OpenAI <code>[DONE]</code> sentinel is never forwarded as a Gemini chunk; every emitted chunk is a parseable Gemini envelope</span></span></span></summary>
|
|
389
|
-
<div class="compat-evidence"><div class="compat-probe"><code>unit:engines.test.ts</code> test <code>ai#openai-done-not-forwarded</code> (lossy translation edge from ticket #96)</div></div>
|
|
389
|
+
<div class="compat-evidence"><div class="compat-probe"><a href="https://github.com/davideast/pyric/blob/main/packages/pyric/test/ai/engines.test.ts#L254" target="_blank" rel="noopener noreferrer"><code>unit:engines.test.ts</code></a> test <code>ai#openai-done-not-forwarded</code> (lossy translation edge from ticket #96)</div></div>
|
|
390
390
|
</details>
|
|
391
391
|
<details class="compat-row" data-status="ok">
|
|
392
392
|
<summary class="compat-line"><span class="compat-dot" data-status="ok" role="img" aria-label="Conforming" title="Conforming"></span><span class="compat-main"><code class="compat-api">openai engine</code><span class="compat-sub"><span class="compat-behavior">Parts flagged <code>thought: true</code> in history are skipped when replaying to an OpenAI upstream</span></span></span></summary>
|
|
393
|
-
<div class="compat-evidence"><div class="compat-probe"><code>unit:engines.test.ts</code> test <code>ai#openai-thought-parts-skipped</code> (lossy translation edge from ticket #96)</div></div>
|
|
393
|
+
<div class="compat-evidence"><div class="compat-probe"><a href="https://github.com/davideast/pyric/blob/main/packages/pyric/test/ai/engines.test.ts#L271" target="_blank" rel="noopener noreferrer"><code>unit:engines.test.ts</code></a> test <code>ai#openai-thought-parts-skipped</code> (lossy translation edge from ticket #96)</div></div>
|
|
394
394
|
</details>
|
|
395
395
|
</div>
|
|
396
396
|
|
|
@@ -402,17 +402,17 @@ Known differences between Pyric and production Firebase. Each remains tracked as
|
|
|
402
402
|
|
|
403
403
|
<div class="compat-list">
|
|
404
404
|
<details class="compat-row" data-status="diverged"><summary class="compat-line"><span class="compat-dot" data-status="diverged" role="img" aria-label="Diverged (documented)" title="Diverged (documented)"></span><span class="compat-main"><code class="compat-api">getGenerativeModel(ai, modelParams)</code><span class="compat-sub"><span class="compat-behavior">A <code>models/</code>-prefixed name is accepted without double prefixing</span></span></span></summary>
|
|
405
|
-
<div class="compat-evidence"><div class="compat-note"><code>unit:instances.test.ts</code> test <code>ai#model-name-prefixed</code> (no capture; normalization claim)</div></div></details>
|
|
405
|
+
<div class="compat-evidence"><div class="compat-note"><a href="https://github.com/davideast/pyric/blob/main/packages/pyric/test/ai/instances.test.ts#L86" target="_blank" rel="noopener noreferrer"><code>unit:instances.test.ts</code></a> test <code>ai#model-name-prefixed</code> (no capture; normalization claim)</div></div></details>
|
|
406
406
|
<details class="compat-row" data-status="diverged"><summary class="compat-line"><span class="compat-dot" data-status="diverged" role="img" aria-label="Diverged (documented)" title="Diverged (documented)"></span><span class="compat-main"><code class="compat-api">generateContentStream()</code><span class="compat-sub"><span class="compat-behavior">The aggregated response carries the final chunk <code>finishReason</code> and <code>usageMetadata</code></span></span></span></summary>
|
|
407
|
-
<div class="compat-evidence"><div class="compat-note"><code>unit:streaming.test.ts</code> test <code>ai#stream-aggregate-final-meta</code> (aggregation semantics derived from the framing capture)</div></div></details>
|
|
407
|
+
<div class="compat-evidence"><div class="compat-note"><a href="https://github.com/davideast/pyric/blob/main/packages/pyric/test/ai/streaming.test.ts#L117" target="_blank" rel="noopener noreferrer"><code>unit:streaming.test.ts</code></a> test <code>ai#stream-aggregate-final-meta</code> (aggregation semantics derived from the framing capture)</div></div></details>
|
|
408
408
|
<details class="compat-row" data-status="diverged"><summary class="compat-line"><span class="compat-dot" data-status="diverged" role="img" aria-label="Diverged (documented)" title="Diverged (documented)"></span><span class="compat-main"><code class="compat-api">ChatSession.sendMessage() / getHistory()</code><span class="compat-sub"><span class="compat-behavior"><code>sendMessage</code> appends the user turn and the model turn; <code>getHistory()</code> returns the ordered <code>Content[]</code> with alternating roles</span></span></span></summary>
|
|
409
|
-
<div class="compat-evidence"><div class="compat-note"><code>unit:chat-session.test.ts</code> test <code>ai#chat-history-threads</code> (no capture; history threading claim)</div></div></details>
|
|
409
|
+
<div class="compat-evidence"><div class="compat-note"><a href="https://github.com/davideast/pyric/blob/main/packages/pyric/test/ai/chat-session.test.ts#L45" target="_blank" rel="noopener noreferrer"><code>unit:chat-session.test.ts</code></a> test <code>ai#chat-history-threads</code> (no capture; history threading claim)</div></div></details>
|
|
410
410
|
<details class="compat-row" data-status="diverged"><summary class="compat-line"><span class="compat-dot" data-status="diverged" role="img" aria-label="Diverged (documented)" title="Diverged (documented)"></span><span class="compat-main"><code class="compat-api">ChatSession.getHistory()</code><span class="compat-sub"><span class="compat-behavior">Blocked prompts and blocked candidates are excluded from <code>getHistory()</code></span></span></span></summary>
|
|
411
|
-
<div class="compat-evidence"><div class="compat-note"><code>unit:chat-session.test.ts</code> test <code>ai#chat-history-excludes-blocked</code> (upstream JSDoc contract; exercised with a scripted blocked envelope)</div></div></details>
|
|
411
|
+
<div class="compat-evidence"><div class="compat-note"><a href="https://github.com/davideast/pyric/blob/main/packages/pyric/test/ai/chat-session.test.ts#L61" target="_blank" rel="noopener noreferrer"><code>unit:chat-session.test.ts</code></a> test <code>ai#chat-history-excludes-blocked</code> (upstream JSDoc contract; exercised with a scripted blocked envelope)</div></div></details>
|
|
412
412
|
<details class="compat-row" data-status="diverged"><summary class="compat-line"><span class="compat-dot" data-status="diverged" role="img" aria-label="Diverged (documented)" title="Diverged (documented)"></span><span class="compat-main"><code class="compat-api">ChatSession.sendMessageStream()</code><span class="compat-sub"><span class="compat-behavior">Exactly one user turn is recorded per <code>sendMessageStream</code> call; the mirror implements the 2.13.0 fixed semantics, not the installed 2.12.0 duplicate-user-turn bug</span></span></span></summary>
|
|
413
|
-
<div class="compat-evidence"><div class="compat-note"><code>unit:chat-session.test.ts</code> test <code>ai#chat-stream-single-user-turn</code> (no capture; divergence pinned by ruling, see notes)</div></div></details>
|
|
413
|
+
<div class="compat-evidence"><div class="compat-note"><a href="https://github.com/davideast/pyric/blob/main/packages/pyric/test/ai/chat-session.test.ts#L93" target="_blank" rel="noopener noreferrer"><code>unit:chat-session.test.ts</code></a> test <code>ai#chat-stream-single-user-turn</code> (no capture; divergence pinned by ruling, see notes)</div></div></details>
|
|
414
414
|
<details class="compat-row" data-status="diverged"><summary class="compat-line"><span class="compat-dot" data-status="diverged" role="img" aria-label="Diverged (documented)" title="Diverged (documented)"></span><span class="compat-main"><code class="compat-api">Schema.enumString()</code><span class="compat-sub"><span class="compat-behavior"><code>Schema.enumString</code> serializes the enum values with type <code>string</code> and format <code>enum</code></span></span></span></summary>
|
|
415
|
-
<div class="compat-evidence"><div class="compat-note"><code>unit:helpers-schema.test.ts</code> test <code>ai#schema-string-enum</code> (upstream toJSON request shape; GoogleAI accepts only enum and date-time formats)</div></div></details>
|
|
415
|
+
<div class="compat-evidence"><div class="compat-note"><a href="https://github.com/davideast/pyric/blob/main/packages/pyric/test/ai/helpers-schema.test.ts#L153" target="_blank" rel="noopener noreferrer"><code>unit:helpers-schema.test.ts</code></a> test <code>ai#schema-string-enum</code> (upstream toJSON request shape; GoogleAI accepts only enum and date-time formats)</div></div></details>
|
|
416
416
|
</div>
|
|
417
417
|
|
|
418
418
|
## Reviewed public-runtime gaps
|