@pyric/cli 0.1.0-alpha.19 → 0.1.0-alpha.21

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (642) hide show
  1. package/README.md +64 -89
  2. package/dist/assurance/.generated/conformance-verdicts.d.ts +68 -1
  3. package/dist/assurance/.generated/conformance-verdicts.d.ts.map +1 -1
  4. package/dist/assurance/.generated/conformance-verdicts.js +68 -1
  5. package/dist/assurance/.generated/conformance-verdicts.js.map +1 -1
  6. package/dist/bridge/client/dispatch.d.ts +25 -19
  7. package/dist/bridge/client/dispatch.d.ts.map +1 -1
  8. package/dist/bridge/client/dispatch.js +41 -48
  9. package/dist/bridge/client/dispatch.js.map +1 -1
  10. package/dist/bridge/client/tool-family-factories.d.ts +26 -0
  11. package/dist/bridge/client/tool-family-factories.d.ts.map +1 -0
  12. package/dist/bridge/client/tool-family-factories.js +10 -0
  13. package/dist/bridge/client/tool-family-factories.js.map +1 -0
  14. package/dist/bridge/server/mcp-contract.d.ts +7 -6
  15. package/dist/bridge/server/mcp-contract.d.ts.map +1 -1
  16. package/dist/bridge/server/mcp-contract.js +9 -48
  17. package/dist/bridge/server/mcp-contract.js.map +1 -1
  18. package/dist/bridge/server/peer.d.ts +11 -1
  19. package/dist/bridge/server/peer.d.ts.map +1 -1
  20. package/dist/bridge/server/peer.js +22 -1
  21. package/dist/bridge/server/peer.js.map +1 -1
  22. package/dist/bridge/server/tool-family-factories.d.ts +30 -0
  23. package/dist/bridge/server/tool-family-factories.d.ts.map +1 -0
  24. package/dist/bridge/server/tool-family-factories.js +22 -0
  25. package/dist/bridge/server/tool-family-factories.js.map +1 -0
  26. package/dist/bridge/server/tool-metadata.d.ts +17 -18
  27. package/dist/bridge/server/tool-metadata.d.ts.map +1 -1
  28. package/dist/bridge/server/tool-metadata.js +24 -59
  29. package/dist/bridge/server/tool-metadata.js.map +1 -1
  30. package/dist/bridge/tool-families.d.ts +48 -0
  31. package/dist/bridge/tool-families.d.ts.map +1 -0
  32. package/dist/bridge/tool-families.generated.d.ts +32 -0
  33. package/dist/bridge/tool-families.generated.d.ts.map +1 -0
  34. package/dist/bridge/tool-families.generated.js +15 -0
  35. package/dist/bridge/tool-families.generated.js.map +1 -0
  36. package/dist/bridge/tool-families.js +51 -0
  37. package/dist/bridge/tool-families.js.map +1 -0
  38. package/dist/bridge/tool-family-records/conformance.d.ts +7 -0
  39. package/dist/bridge/tool-family-records/conformance.d.ts.map +1 -0
  40. package/dist/bridge/tool-family-records/conformance.js +6 -0
  41. package/dist/bridge/tool-family-records/conformance.js.map +1 -0
  42. package/dist/bridge/tool-family-records/firestore-data.d.ts +7 -0
  43. package/dist/bridge/tool-family-records/firestore-data.d.ts.map +1 -0
  44. package/dist/bridge/tool-family-records/firestore-data.js +15 -0
  45. package/dist/bridge/tool-family-records/firestore-data.js.map +1 -0
  46. package/dist/bridge/tool-family-records/firestore-inspect.d.ts +7 -0
  47. package/dist/bridge/tool-family-records/firestore-inspect.d.ts.map +1 -0
  48. package/dist/bridge/tool-family-records/firestore-inspect.js +6 -0
  49. package/dist/bridge/tool-family-records/firestore-inspect.js.map +1 -0
  50. package/dist/bridge/tool-family-records/firestore-rules.d.ts +7 -0
  51. package/dist/bridge/tool-family-records/firestore-rules.d.ts.map +1 -0
  52. package/dist/bridge/tool-family-records/firestore-rules.js +15 -0
  53. package/dist/bridge/tool-family-records/firestore-rules.js.map +1 -0
  54. package/dist/bridge/tool-family-records/firestore-simulator.d.ts +7 -0
  55. package/dist/bridge/tool-family-records/firestore-simulator.d.ts.map +1 -0
  56. package/dist/bridge/tool-family-records/firestore-simulator.js +16 -0
  57. package/dist/bridge/tool-family-records/firestore-simulator.js.map +1 -0
  58. package/dist/bridge/tool-family-records/rtdb-inspection.d.ts +7 -0
  59. package/dist/bridge/tool-family-records/rtdb-inspection.d.ts.map +1 -0
  60. package/dist/bridge/tool-family-records/rtdb-inspection.js +6 -0
  61. package/dist/bridge/tool-family-records/rtdb-inspection.js.map +1 -0
  62. package/dist/bundler/externals.d.ts +37 -0
  63. package/dist/bundler/externals.d.ts.map +1 -0
  64. package/dist/bundler/externals.js +52 -0
  65. package/dist/bundler/externals.js.map +1 -0
  66. package/dist/bundler/index.d.ts +17 -0
  67. package/dist/bundler/index.d.ts.map +1 -0
  68. package/dist/bundler/index.js +17 -0
  69. package/dist/bundler/index.js.map +1 -0
  70. package/dist/cli/index.d.ts +2 -2
  71. package/dist/cli/index.d.ts.map +1 -1
  72. package/dist/cli/index.js +48 -42
  73. package/dist/cli/index.js.map +1 -1
  74. package/dist/cli/inlined-sdk-scanner.d.ts +6 -0
  75. package/dist/cli/inlined-sdk-scanner.d.ts.map +1 -0
  76. package/dist/cli/inlined-sdk-scanner.js +82 -0
  77. package/dist/cli/inlined-sdk-scanner.js.map +1 -0
  78. package/dist/cli/mcp-proxy.js +3 -3
  79. package/dist/cli/mcp-proxy.js.map +1 -1
  80. package/dist/cli/parse-args.d.ts +1 -1
  81. package/dist/cli/parse-args.d.ts.map +1 -1
  82. package/dist/cli/parse-args.js +51 -15
  83. package/dist/cli/parse-args.js.map +1 -1
  84. package/dist/cli/pyric-config.d.ts +24 -0
  85. package/dist/cli/pyric-config.d.ts.map +1 -0
  86. package/dist/cli/pyric-config.js +28 -0
  87. package/dist/cli/pyric-config.js.map +1 -0
  88. package/dist/cli/sandbox-interlock.d.ts +97 -0
  89. package/dist/cli/sandbox-interlock.d.ts.map +1 -0
  90. package/dist/cli/sandbox-interlock.js +112 -0
  91. package/dist/cli/sandbox-interlock.js.map +1 -0
  92. package/dist/cli/{dev-runner.d.ts → sandbox-runner.d.ts} +53 -48
  93. package/dist/cli/sandbox-runner.d.ts.map +1 -0
  94. package/dist/cli/{dev-runner.js → sandbox-runner.js} +105 -67
  95. package/dist/cli/sandbox-runner.js.map +1 -0
  96. package/dist/cli/serve.d.ts +12 -14
  97. package/dist/cli/serve.d.ts.map +1 -1
  98. package/dist/cli/serve.js +155 -116
  99. package/dist/cli/serve.js.map +1 -1
  100. package/dist/cli/snapshot.js +5 -5
  101. package/dist/cli/snapshot.js.map +1 -1
  102. package/dist/cli/unsupported-runtime.d.ts +27 -0
  103. package/dist/cli/unsupported-runtime.d.ts.map +1 -0
  104. package/dist/cli/unsupported-runtime.js +63 -0
  105. package/dist/cli/unsupported-runtime.js.map +1 -0
  106. package/dist/cli/verify.js +1 -1
  107. package/dist/cli/verify.js.map +1 -1
  108. package/dist/conformance/.generated/can-i-use-browser.d.ts +1 -1
  109. package/dist/conformance/.generated/can-i-use-browser.d.ts.map +1 -1
  110. package/dist/conformance/.generated/can-i-use-browser.js +1 -1
  111. package/dist/conformance/.generated/can-i-use-browser.js.map +1 -1
  112. package/dist/conformance/.generated/can-i-use.d.ts +1 -1
  113. package/dist/conformance/.generated/can-i-use.d.ts.map +1 -1
  114. package/dist/conformance/.generated/can-i-use.js +1 -1
  115. package/dist/conformance/.generated/can-i-use.js.map +1 -1
  116. package/dist/conformance/.generated/conformance-docs.d.ts.map +1 -1
  117. package/dist/conformance/.generated/conformance-docs.js +1 -1
  118. package/dist/conformance/.generated/conformance-docs.js.map +1 -1
  119. package/dist/functions-rtdb/child.d.ts +37 -0
  120. package/dist/functions-rtdb/child.d.ts.map +1 -1
  121. package/dist/functions-rtdb/child.js +90 -21
  122. package/dist/functions-rtdb/child.js.map +1 -1
  123. package/dist/functions-rtdb/development-runtime.d.ts +3 -0
  124. package/dist/functions-rtdb/development-runtime.d.ts.map +1 -1
  125. package/dist/functions-rtdb/development-runtime.js +2 -1
  126. package/dist/functions-rtdb/development-runtime.js.map +1 -1
  127. package/dist/functions-rtdb/project.js +8 -8
  128. package/dist/functions-rtdb/project.js.map +1 -1
  129. package/dist/google-endpoints.d.ts +67 -0
  130. package/dist/google-endpoints.d.ts.map +1 -0
  131. package/dist/google-endpoints.js +119 -0
  132. package/dist/google-endpoints.js.map +1 -0
  133. package/dist/next/guard.js +1 -1
  134. package/dist/next/guard.js.map +1 -1
  135. package/dist/next/runtime-env.d.ts.map +1 -1
  136. package/dist/next/runtime-env.js +5 -0
  137. package/dist/next/runtime-env.js.map +1 -1
  138. package/dist/next/with-pyric.d.ts +1 -1
  139. package/dist/next/with-pyric.js +1 -1
  140. package/dist/register/beacon.d.ts +69 -0
  141. package/dist/register/beacon.d.ts.map +1 -0
  142. package/dist/register/beacon.js +199 -0
  143. package/dist/register/beacon.js.map +1 -0
  144. package/dist/register/index.d.ts.map +1 -1
  145. package/dist/register/index.js +65 -6
  146. package/dist/register/index.js.map +1 -1
  147. package/dist/register/net-guard.d.ts +110 -0
  148. package/dist/register/net-guard.d.ts.map +1 -0
  149. package/dist/register/net-guard.js +462 -0
  150. package/dist/register/net-guard.js.map +1 -0
  151. package/dist/remote/index.d.ts +1 -1
  152. package/dist/remote/index.js +9 -9
  153. package/dist/remote/index.js.map +1 -1
  154. package/dist/serve/ai-diagnostics-relay.d.ts +63 -0
  155. package/dist/serve/ai-diagnostics-relay.d.ts.map +1 -0
  156. package/dist/serve/ai-diagnostics-relay.js +125 -0
  157. package/dist/serve/ai-diagnostics-relay.js.map +1 -0
  158. package/dist/serve/ai-proxy.d.ts +92 -0
  159. package/dist/serve/ai-proxy.d.ts.map +1 -0
  160. package/dist/serve/ai-proxy.js +269 -0
  161. package/dist/serve/ai-proxy.js.map +1 -0
  162. package/dist/serve/ai-status.d.ts +44 -0
  163. package/dist/serve/ai-status.d.ts.map +1 -0
  164. package/dist/serve/ai-status.js +77 -0
  165. package/dist/serve/ai-status.js.map +1 -0
  166. package/dist/serve/ai-terminal-blocks.d.ts +97 -0
  167. package/dist/serve/ai-terminal-blocks.d.ts.map +1 -0
  168. package/dist/serve/ai-terminal-blocks.js +128 -0
  169. package/dist/serve/ai-terminal-blocks.js.map +1 -0
  170. package/dist/serve/ai-terminal-text.d.ts +36 -0
  171. package/dist/serve/ai-terminal-text.d.ts.map +1 -0
  172. package/dist/serve/ai-terminal-text.js +48 -0
  173. package/dist/serve/ai-terminal-text.js.map +1 -0
  174. package/dist/serve/beacon-route.d.ts +53 -0
  175. package/dist/serve/beacon-route.d.ts.map +1 -0
  176. package/dist/serve/beacon-route.js +101 -0
  177. package/dist/serve/beacon-route.js.map +1 -0
  178. package/dist/serve/bundler.js +10 -10
  179. package/dist/serve/bundler.js.map +1 -1
  180. package/dist/serve/entries/active-auth-registry.d.ts +16 -0
  181. package/dist/serve/entries/active-auth-registry.d.ts.map +1 -0
  182. package/dist/serve/entries/active-auth-registry.js +48 -0
  183. package/dist/serve/entries/active-auth-registry.js.map +1 -0
  184. package/dist/serve/entries/active-auth.d.ts +18 -0
  185. package/dist/serve/entries/active-auth.d.ts.map +1 -0
  186. package/dist/serve/entries/active-auth.js +84 -0
  187. package/dist/serve/entries/active-auth.js.map +1 -0
  188. package/dist/serve/entries/ai.d.ts.map +1 -1
  189. package/dist/serve/entries/ai.js +27 -1
  190. package/dist/serve/entries/ai.js.map +1 -1
  191. package/dist/serve/entries/auth-helper-core.d.ts +1 -0
  192. package/dist/serve/entries/auth-helper-core.d.ts.map +1 -1
  193. package/dist/serve/entries/auth-helper-core.js +4 -0
  194. package/dist/serve/entries/auth-helper-core.js.map +1 -1
  195. package/dist/serve/entries/auth-helper-dom.d.ts.map +1 -1
  196. package/dist/serve/entries/auth-helper-dom.js +29 -3
  197. package/dist/serve/entries/auth-helper-dom.js.map +1 -1
  198. package/dist/serve/entries/auth-helper-runtime.js +1 -1
  199. package/dist/serve/entries/auth-helper-runtime.js.map +1 -1
  200. package/dist/serve/entries/auth.d.ts.map +1 -1
  201. package/dist/serve/entries/auth.js +8 -0
  202. package/dist/serve/entries/auth.js.map +1 -1
  203. package/dist/serve/entries/bridge-url.d.ts +1 -1
  204. package/dist/serve/entries/bridge-url.js +1 -1
  205. package/dist/serve/entries/firestore.js +3 -3
  206. package/dist/serve/entries/firestore.js.map +1 -1
  207. package/dist/serve/entries/init.d.ts.map +1 -1
  208. package/dist/serve/entries/init.js +70 -4
  209. package/dist/serve/entries/init.js.map +1 -1
  210. package/dist/serve/entries/keepalive.js +1 -1
  211. package/dist/serve/entries/keepalive.js.map +1 -1
  212. package/dist/serve/entries/runtime.d.ts.map +1 -1
  213. package/dist/serve/entries/runtime.js +30 -14
  214. package/dist/serve/entries/runtime.js.map +1 -1
  215. package/dist/serve/entries/storage.js +1 -1
  216. package/dist/serve/entries/storage.js.map +1 -1
  217. package/dist/serve/entries/worker-runtime.js +1 -1
  218. package/dist/serve/entries/worker-runtime.js.map +1 -1
  219. package/dist/serve/init-payload.d.ts +4 -0
  220. package/dist/serve/init-payload.d.ts.map +1 -1
  221. package/dist/serve/namespace.d.ts +20 -5
  222. package/dist/serve/namespace.d.ts.map +1 -1
  223. package/dist/serve/namespace.js +93 -129
  224. package/dist/serve/namespace.js.map +1 -1
  225. package/dist/serve/rules.d.ts.map +1 -1
  226. package/dist/serve/rules.js +44 -21
  227. package/dist/serve/rules.js.map +1 -1
  228. package/dist/serve/runtime/chip-config.d.ts.map +1 -1
  229. package/dist/serve/runtime/chip-config.js +16 -2
  230. package/dist/serve/runtime/chip-config.js.map +1 -1
  231. package/dist/serve/runtime/chip-dialog.d.ts +18 -0
  232. package/dist/serve/runtime/chip-dialog.d.ts.map +1 -0
  233. package/dist/serve/runtime/chip-dialog.js +315 -0
  234. package/dist/serve/runtime/chip-dialog.js.map +1 -0
  235. package/dist/serve/runtime/chip-install.d.ts +2 -0
  236. package/dist/serve/runtime/chip-install.d.ts.map +1 -1
  237. package/dist/serve/runtime/chip-install.js +9 -4
  238. package/dist/serve/runtime/chip-install.js.map +1 -1
  239. package/dist/serve/runtime/chip-user-search.d.ts +16 -0
  240. package/dist/serve/runtime/chip-user-search.d.ts.map +1 -0
  241. package/dist/serve/runtime/chip-user-search.js +354 -0
  242. package/dist/serve/runtime/chip-user-search.js.map +1 -0
  243. package/dist/serve/runtime/chip.d.ts +10 -0
  244. package/dist/serve/runtime/chip.d.ts.map +1 -1
  245. package/dist/serve/runtime/chip.js +149 -15
  246. package/dist/serve/runtime/chip.js.map +1 -1
  247. package/dist/serve/runtime/identity.d.ts +17 -0
  248. package/dist/serve/runtime/identity.d.ts.map +1 -0
  249. package/dist/serve/runtime/identity.js +10 -0
  250. package/dist/serve/runtime/identity.js.map +1 -0
  251. package/dist/serve/runtime/manifest.d.ts +1 -1
  252. package/dist/serve/runtime/manifest.d.ts.map +1 -1
  253. package/dist/serve/runtime/manifest.js +1 -1
  254. package/dist/serve/runtime/manifest.js.map +1 -1
  255. package/dist/serve/runtime/status.d.ts.map +1 -1
  256. package/dist/serve/runtime/status.js +23 -0
  257. package/dist/serve/runtime/status.js.map +1 -1
  258. package/dist/serve/sandbox-session.d.ts +8 -0
  259. package/dist/serve/sandbox-session.d.ts.map +1 -1
  260. package/dist/serve/sandbox-session.js +12 -4
  261. package/dist/serve/sandbox-session.js.map +1 -1
  262. package/dist/serve/server.d.ts +7 -0
  263. package/dist/serve/server.d.ts.map +1 -1
  264. package/dist/serve/server.js +15 -1
  265. package/dist/serve/server.js.map +1 -1
  266. package/dist/serve/site-ui/404.html +1 -1
  267. package/dist/serve/site-ui/_astro/{RulesCodeEditor.Bl-XMkhD.js → RulesCodeEditor.DsTAsKIa.js} +1 -1
  268. package/dist/serve/site-ui/_astro/_slug_.Da5VLhW1.css +1 -0
  269. package/dist/serve/site-ui/_astro/_studio_.BnfYCKoI.css +1 -0
  270. package/dist/serve/site-ui/_astro/app.BOr2kwae.js +115 -0
  271. package/dist/serve/site-ui/_astro/app.DhAcImFD.js +1 -0
  272. package/dist/serve/site-ui/_astro/app.pMSnN6Qw.css +1 -0
  273. package/dist/serve/site-ui/_astro/{chess-showcase.Dh5D8kqe.js → chess-showcase.Bn_pP6UJ.js} +2 -2
  274. package/dist/serve/site-ui/_astro/{example-runtime.CuyAjjiG.js → example-runtime.CXopTGv7.js} +1 -1
  275. package/dist/serve/site-ui/_astro/index.Tb-31efc.css +1 -0
  276. package/dist/serve/site-ui/_astro/index.UkCBr-_0.css +1 -0
  277. package/dist/serve/site-ui/_astro/sandbox-controls.rOuZTOUG.js +510 -0
  278. package/dist/serve/site-ui/_astro/{seed.CSUkloMi.js → seed.03a08f9t.js} +2 -2
  279. package/dist/serve/site-ui/_astro/writes.BsPBG3dp.js +653 -0
  280. package/dist/serve/site-ui/auth/index.html +5 -3
  281. package/dist/serve/site-ui/david-east.jpg +0 -0
  282. package/dist/serve/site-ui/docs/_rhythm/index.html +6 -3
  283. package/dist/serve/site-ui/docs/_rhythm.md +1 -1
  284. package/dist/serve/site-ui/docs/agent/set-up-your-agent/index.html +18 -15
  285. package/dist/serve/site-ui/docs/agent/set-up-your-agent.md +16 -16
  286. package/dist/serve/site-ui/docs/agent/watch-and-review/index.html +6 -5
  287. package/dist/serve/site-ui/docs/agent/watch-and-review.md +1 -5
  288. package/dist/serve/site-ui/docs/agent/work-with-an-agent/index.html +8 -5
  289. package/dist/serve/site-ui/docs/agent/work-with-an-agent.md +4 -4
  290. package/dist/serve/site-ui/docs/ai-compat/index.html +5 -2
  291. package/dist/serve/site-ui/docs/api-reference/index.html +13 -2
  292. package/dist/serve/site-ui/docs/api-reference.md +8 -0
  293. package/dist/serve/site-ui/docs/app-compat/index.html +5 -2
  294. package/dist/serve/site-ui/docs/auth-compat/index.html +7 -4
  295. package/dist/serve/site-ui/docs/auth-compat.md +2 -2
  296. package/dist/serve/site-ui/docs/build/ai-logic/index.html +10 -2
  297. package/dist/serve/site-ui/docs/build/ai-logic.md +6 -0
  298. package/dist/serve/site-ui/docs/build/authentication/index.html +7 -4
  299. package/dist/serve/site-ui/docs/build/authentication.md +2 -2
  300. package/dist/serve/site-ui/docs/build/cloud-firestore/index.html +5 -2
  301. package/dist/serve/site-ui/docs/build/cloud-messaging/index.html +5 -2
  302. package/dist/serve/site-ui/docs/build/cloud-storage/index.html +6 -3
  303. package/dist/serve/site-ui/docs/build/cloud-storage.md +1 -1
  304. package/dist/serve/site-ui/docs/build/realtime-database/index.html +9 -6
  305. package/dist/serve/site-ui/docs/build/realtime-database.md +4 -4
  306. package/dist/serve/site-ui/docs/conformance-scores/index.html +10 -3
  307. package/dist/serve/site-ui/docs/conformance-scores.md +5 -1
  308. package/dist/serve/site-ui/docs/create-pyric-reference-api/index.html +6 -3
  309. package/dist/serve/site-ui/docs/create-pyric-reference-api.md +1 -1
  310. package/dist/serve/site-ui/docs/database-compat/index.html +48 -45
  311. package/dist/serve/site-ui/docs/database-compat.md +43 -43
  312. package/dist/serve/site-ui/docs/examples/chess/index.html +5 -2
  313. package/dist/serve/site-ui/docs/examples/index.html +5 -2
  314. package/dist/serve/site-ui/docs/firestore-compat/index.html +8 -5
  315. package/dist/serve/site-ui/docs/firestore-compat.md +3 -3
  316. package/dist/serve/site-ui/docs/firestore-flutter-compat/index.html +319 -0
  317. package/dist/serve/site-ui/docs/firestore-flutter-compat.md +344 -0
  318. package/dist/serve/site-ui/docs/functions-rtdb-compat/index.html +5 -2
  319. package/dist/serve/site-ui/docs/get-started/backend-bundlers/index.html +105 -0
  320. package/dist/serve/site-ui/docs/get-started/backend-bundlers.md +165 -0
  321. package/dist/serve/site-ui/docs/get-started/how-the-swap-works/index.html +9 -6
  322. package/dist/serve/site-ui/docs/get-started/how-the-swap-works.md +5 -5
  323. package/dist/serve/site-ui/docs/get-started/nextjs/index.html +9 -6
  324. package/dist/serve/site-ui/docs/get-started/nextjs.md +4 -4
  325. package/dist/serve/site-ui/docs/get-started/start-building/index.html +14 -9
  326. package/dist/serve/site-ui/docs/get-started/start-building.md +16 -10
  327. package/dist/serve/site-ui/docs/get-started/vite/index.html +6 -3
  328. package/dist/serve/site-ui/docs/get-started/vite.md +1 -1
  329. package/dist/serve/site-ui/docs/index.json +3128 -1613
  330. package/dist/serve/site-ui/docs/messaging-compat/index.html +5 -2
  331. package/dist/serve/site-ui/docs/observe/resolve-runtime-status/index.html +5 -2
  332. package/dist/serve/site-ui/docs/observe/see-whats-happening/index.html +6 -4
  333. package/dist/serve/site-ui/docs/observe/see-whats-happening.md +2 -4
  334. package/dist/serve/site-ui/docs/observe/shape-your-data/index.html +9 -6
  335. package/dist/serve/site-ui/docs/observe/shape-your-data.md +4 -4
  336. package/dist/serve/site-ui/docs/overview/index.html +16 -10
  337. package/dist/serve/site-ui/docs/overview.md +19 -11
  338. package/dist/serve/site-ui/docs/pyric-admin-app-reference-api/index.html +5 -2
  339. package/dist/serve/site-ui/docs/pyric-admin-auth-reference-api/index.html +5 -2
  340. package/dist/serve/site-ui/docs/pyric-admin-database-reference-api/index.html +5 -2
  341. package/dist/serve/site-ui/docs/pyric-admin-firestore-reference-api/index.html +8 -5
  342. package/dist/serve/site-ui/docs/pyric-admin-firestore-reference-api.md +3 -3
  343. package/dist/serve/site-ui/docs/pyric-admin-messaging-reference-api/index.html +5 -2
  344. package/dist/serve/site-ui/docs/pyric-admin-reference-api/index.html +501 -0
  345. package/dist/serve/site-ui/docs/pyric-admin-reference-api.md +587 -0
  346. package/dist/serve/site-ui/docs/pyric-admin-storage-reference-api/index.html +5 -2
  347. package/dist/serve/site-ui/docs/pyric-ai-reference-api/index.html +5 -2
  348. package/dist/serve/site-ui/docs/pyric-ai-scripting-reference-api/index.html +5 -2
  349. package/dist/serve/site-ui/docs/pyric-analytics-reference-api/index.html +124 -0
  350. package/dist/serve/site-ui/docs/pyric-analytics-reference-api.md +287 -0
  351. package/dist/serve/site-ui/docs/pyric-app-check-reference-api/index.html +87 -0
  352. package/dist/serve/site-ui/docs/pyric-app-check-reference-api.md +199 -0
  353. package/dist/serve/site-ui/docs/pyric-app-reference-api/index.html +5 -2
  354. package/dist/serve/site-ui/docs/pyric-auth-reference-api/index.html +10 -3
  355. package/dist/serve/site-ui/docs/pyric-auth-reference-api.md +2 -1
  356. package/dist/serve/site-ui/docs/pyric-cli-assurance-browser-reference-api/index.html +5 -2
  357. package/dist/serve/site-ui/docs/pyric-cli-assurance-reference-api/index.html +5 -2
  358. package/dist/serve/site-ui/docs/pyric-cli-bridge-client-reference-api/index.html +6 -3
  359. package/dist/serve/site-ui/docs/pyric-cli-bridge-client-reference-api.md +1 -1
  360. package/dist/serve/site-ui/docs/pyric-cli-bridge-reference-api/index.html +5 -2
  361. package/dist/serve/site-ui/docs/pyric-cli-bundler-reference-api/index.html +56 -0
  362. package/dist/serve/site-ui/docs/pyric-cli-bundler-reference-api.md +72 -0
  363. package/dist/serve/site-ui/docs/pyric-cli-conformance-browser-reference-api/index.html +6 -2
  364. package/dist/serve/site-ui/docs/pyric-cli-conformance-browser-reference-api.md +1 -0
  365. package/dist/serve/site-ui/docs/pyric-cli-conformance-docs-reference-api/index.html +5 -2
  366. package/dist/serve/site-ui/docs/pyric-cli-conformance-reference-api/index.html +6 -2
  367. package/dist/serve/site-ui/docs/pyric-cli-conformance-reference-api.md +1 -0
  368. package/dist/serve/site-ui/docs/pyric-cli-credentials-node-reference-api/index.html +5 -2
  369. package/dist/serve/site-ui/docs/pyric-cli-discover-reference-api/index.html +5 -2
  370. package/dist/serve/site-ui/docs/pyric-cli-next-reference-api/index.html +6 -3
  371. package/dist/serve/site-ui/docs/pyric-cli-next-reference-api.md +1 -1
  372. package/dist/serve/site-ui/docs/pyric-cli-register-app-bridge-reference-api/index.html +5 -2
  373. package/dist/serve/site-ui/docs/pyric-cli-register-reference-api/index.html +5 -2
  374. package/dist/serve/site-ui/docs/pyric-cli-remote-reference-api/index.html +39 -11
  375. package/dist/serve/site-ui/docs/pyric-cli-remote-reference-api.md +17 -9
  376. package/dist/serve/site-ui/docs/pyric-cli-serve-worker-reference-api/index.html +137 -94
  377. package/dist/serve/site-ui/docs/pyric-cli-serve-worker-reference-api.md +61 -1
  378. package/dist/serve/site-ui/docs/pyric-cli-verify-reference-api/index.html +6 -3
  379. package/dist/serve/site-ui/docs/pyric-cli-verify-reference-api.md +1 -1
  380. package/dist/serve/site-ui/docs/pyric-cli-vite-reference-api/index.html +6 -3
  381. package/dist/serve/site-ui/docs/pyric-cli-vite-reference-api.md +2 -2
  382. package/dist/serve/site-ui/docs/pyric-database-reference-api/index.html +167 -96
  383. package/dist/serve/site-ui/docs/pyric-database-reference-api.md +108 -2
  384. package/dist/serve/site-ui/docs/pyric-firestore-lite-reference-api/index.html +559 -0
  385. package/dist/serve/site-ui/docs/pyric-firestore-lite-reference-api.md +1240 -0
  386. package/dist/serve/site-ui/docs/pyric-firestore-reference-api/index.html +44 -12
  387. package/dist/serve/site-ui/docs/pyric-firestore-reference-api.md +18 -8
  388. package/dist/serve/site-ui/docs/pyric-functions-reference-api/index.html +67 -0
  389. package/dist/serve/site-ui/docs/pyric-functions-reference-api.md +149 -0
  390. package/dist/serve/site-ui/docs/pyric-messaging-reference-api/index.html +10 -4
  391. package/dist/serve/site-ui/docs/pyric-messaging-reference-api.md +5 -2
  392. package/dist/serve/site-ui/docs/pyric-messaging-sw-reference-api/index.html +10 -4
  393. package/dist/serve/site-ui/docs/pyric-messaging-sw-reference-api.md +5 -2
  394. package/dist/serve/site-ui/docs/pyric-performance-reference-api/index.html +35 -0
  395. package/dist/serve/site-ui/docs/pyric-performance-reference-api.md +69 -0
  396. package/dist/serve/site-ui/docs/pyric-remote-config-reference-api/index.html +132 -0
  397. package/dist/serve/site-ui/docs/pyric-remote-config-reference-api.md +307 -0
  398. package/dist/serve/site-ui/docs/pyric-rules-reference-api/index.html +5 -2
  399. package/dist/serve/site-ui/docs/pyric-sandbox-database-reference-api/index.html +56 -18
  400. package/dist/serve/site-ui/docs/pyric-sandbox-database-reference-api.md +48 -9
  401. package/dist/serve/site-ui/docs/pyric-sandbox-firestore-reference-api/index.html +6 -3
  402. package/dist/serve/site-ui/docs/pyric-sandbox-firestore-reference-api.md +2 -2
  403. package/dist/serve/site-ui/docs/pyric-sandbox-reference-api/index.html +243 -50
  404. package/dist/serve/site-ui/docs/pyric-sandbox-reference-api.md +148 -31
  405. package/dist/serve/site-ui/docs/pyric-storage-reference-api/index.html +26 -5
  406. package/dist/serve/site-ui/docs/pyric-storage-reference-api.md +24 -2
  407. package/dist/serve/site-ui/docs/pyric-ui-agents-reference-api/index.html +30 -97
  408. package/dist/serve/site-ui/docs/pyric-ui-agents-reference-api.md +20 -51
  409. package/dist/serve/site-ui/docs/pyric-ui-auth-hooks-reference-api/index.html +5 -2
  410. package/dist/serve/site-ui/docs/pyric-ui-auth-reference-api/index.html +6 -3
  411. package/dist/serve/site-ui/docs/pyric-ui-auth-reference-api.md +1 -1
  412. package/dist/serve/site-ui/docs/pyric-ui-events-hooks-reference-api/index.html +5 -2
  413. package/dist/serve/site-ui/docs/pyric-ui-events-reference-api/index.html +5 -2
  414. package/dist/serve/site-ui/docs/pyric-ui-firestore-hooks-reference-api/index.html +5 -2
  415. package/dist/serve/site-ui/docs/pyric-ui-firestore-reference-api/index.html +6 -3
  416. package/dist/serve/site-ui/docs/pyric-ui-firestore-reference-api.md +1 -1
  417. package/dist/serve/site-ui/docs/pyric-ui-primitives-reference-api/index.html +128 -27
  418. package/dist/serve/site-ui/docs/pyric-ui-primitives-reference-api.md +58 -5
  419. package/dist/serve/site-ui/docs/pyric-ui-rtdb-reference-api/index.html +5 -2
  420. package/dist/serve/site-ui/docs/pyric-ui-rules-hooks-reference-api/index.html +5 -2
  421. package/dist/serve/site-ui/docs/pyric-ui-rules-reference-api/index.html +5 -2
  422. package/dist/serve/site-ui/docs/pyric-ui-storage-hooks-reference-api/index.html +5 -2
  423. package/dist/serve/site-ui/docs/pyric-ui-storage-reference-api/index.html +8 -6
  424. package/dist/serve/site-ui/docs/pyric-ui-storage-reference-api.md +3 -4
  425. package/dist/serve/site-ui/docs/pyric-ui-traffic-hooks-reference-api/index.html +5 -2
  426. package/dist/serve/site-ui/docs/pyric-ui-traffic-reference-api/index.html +5 -2
  427. package/dist/serve/site-ui/docs/reference/cli/index.html +156 -0
  428. package/dist/serve/site-ui/docs/reference/cli.md +120 -0
  429. package/dist/serve/site-ui/docs/rules-compat/index.html +14 -3
  430. package/dist/serve/site-ui/docs/rules-compat.md +9 -1
  431. package/dist/serve/site-ui/docs/secure/audit-your-rules/index.html +5 -2
  432. package/dist/serve/site-ui/docs/secure/firestore-rules-limits/index.html +5 -2
  433. package/dist/serve/site-ui/docs/secure/read-a-denial/index.html +6 -3
  434. package/dist/serve/site-ui/docs/secure/read-a-denial.md +1 -1
  435. package/dist/serve/site-ui/docs/secure/rtdb-rules-in-typescript/index.html +5 -2
  436. package/dist/serve/site-ui/docs/secure/rules-standard-library/index.html +5 -2
  437. package/dist/serve/site-ui/docs/secure/secure-it-with-rules/index.html +5 -2
  438. package/dist/serve/site-ui/docs/secure/simulate-and-lint/index.html +5 -2
  439. package/dist/serve/site-ui/docs/secure/write-a-rules-test-suite/index.html +5 -2
  440. package/dist/serve/site-ui/docs/ship/ship-to-production/index.html +7 -4
  441. package/dist/serve/site-ui/docs/ship/ship-to-production.md +2 -2
  442. package/dist/serve/site-ui/docs/ship/test-in-node/index.html +9 -6
  443. package/dist/serve/site-ui/docs/ship/test-in-node.md +4 -4
  444. package/dist/serve/site-ui/docs/storage-compat/index.html +17 -14
  445. package/dist/serve/site-ui/docs/storage-compat.md +12 -12
  446. package/dist/serve/site-ui/docs/trust/how-we-know-it-matches-firebase/index.html +5 -2
  447. package/dist/serve/site-ui/docs/trust/rules-standard-library/index.html +5 -2
  448. package/dist/serve/site-ui/docs/trust/versioning-and-compatibility/index.html +5 -2
  449. package/dist/serve/site-ui/docs/tutorial/index.html +10 -7
  450. package/dist/serve/site-ui/docs/tutorial.md +4 -4
  451. package/dist/serve/site-ui/examples/chess/index.html +4 -2
  452. package/dist/serve/site-ui/firestore/index.html +5 -3
  453. package/dist/serve/site-ui/hero-charcoal.jpg +0 -0
  454. package/dist/serve/site-ui/index.html +9 -7
  455. package/dist/serve/site-ui/llms.txt +13 -3
  456. package/dist/serve/site-ui/pyric-campfire-full.png +0 -0
  457. package/dist/serve/site-ui/pyric-campfire.png +0 -0
  458. package/dist/serve/site-ui/rtdb/index.html +5 -3
  459. package/dist/serve/site-ui/settings/index.html +5 -3
  460. package/dist/serve/site-ui/storage/index.html +5 -3
  461. package/dist/serve/site-ui/studio/index.html +13 -0
  462. package/dist/serve/site-ui/studio-routes.json +1 -1
  463. package/dist/serve/site-ui/traffic/index.html +5 -3
  464. package/dist/serve/studio/disk-workspace.d.ts.map +1 -1
  465. package/dist/serve/studio/disk-workspace.js +64 -2
  466. package/dist/serve/studio/disk-workspace.js.map +1 -1
  467. package/dist/serve/studio/routes.d.ts +9 -0
  468. package/dist/serve/studio/routes.d.ts.map +1 -1
  469. package/dist/serve/studio/routes.js +47 -7
  470. package/dist/serve/studio/routes.js.map +1 -1
  471. package/dist/serve/vite-ai-config.d.ts.map +1 -1
  472. package/dist/serve/vite-ai-config.js +38 -8
  473. package/dist/serve/vite-ai-config.js.map +1 -1
  474. package/dist/serve/vite-module-swap.d.ts.map +1 -1
  475. package/dist/serve/vite-module-swap.js +0 -28
  476. package/dist/serve/vite-module-swap.js.map +1 -1
  477. package/dist/serve/vite-plugin.d.ts +7 -7
  478. package/dist/serve/vite-plugin.js +1 -1
  479. package/dist/serve/vite-plugin.js.map +1 -1
  480. package/dist/serve/vite-sandbox-generation.d.ts +1 -1
  481. package/dist/serve/vite-sandbox-generation.d.ts.map +1 -1
  482. package/dist/serve/vite-sandbox-generation.js +13 -1
  483. package/dist/serve/vite-sandbox-generation.js.map +1 -1
  484. package/dist/serve/worker/client/auth.js +1 -2
  485. package/dist/serve/worker/client/auth.js.map +1 -1
  486. package/dist/serve/worker/client/core.d.ts +21 -1
  487. package/dist/serve/worker/client/core.d.ts.map +1 -1
  488. package/dist/serve/worker/client/core.js +79 -3
  489. package/dist/serve/worker/client/core.js.map +1 -1
  490. package/dist/serve/worker/client/disconnect.js +1 -1
  491. package/dist/serve/worker/client/disconnect.js.map +1 -1
  492. package/dist/serve/worker/client/presence.d.ts.map +1 -1
  493. package/dist/serve/worker/client/presence.js +18 -5
  494. package/dist/serve/worker/client/presence.js.map +1 -1
  495. package/dist/serve/worker/client.d.ts +1 -1
  496. package/dist/serve/worker/client.d.ts.map +1 -1
  497. package/dist/serve/worker/client.js +1 -1
  498. package/dist/serve/worker/client.js.map +1 -1
  499. package/dist/serve/worker/context-resolver.d.ts +30 -0
  500. package/dist/serve/worker/context-resolver.d.ts.map +1 -0
  501. package/dist/serve/worker/context-resolver.js +44 -0
  502. package/dist/serve/worker/context-resolver.js.map +1 -0
  503. package/dist/serve/worker/entry.js +23 -19
  504. package/dist/serve/worker/entry.js.map +1 -1
  505. package/dist/serve/worker/host/core.d.ts +1 -0
  506. package/dist/serve/worker/host/core.d.ts.map +1 -1
  507. package/dist/serve/worker/host/core.js +12 -6
  508. package/dist/serve/worker/host/core.js.map +1 -1
  509. package/dist/serve/worker/host/storage.js +2 -2
  510. package/dist/serve/worker/host-ai.d.ts.map +1 -1
  511. package/dist/serve/worker/host-ai.js +15 -0
  512. package/dist/serve/worker/host-ai.js.map +1 -1
  513. package/dist/serve/worker/host-auth.js +1 -2
  514. package/dist/serve/worker/host-auth.js.map +1 -1
  515. package/dist/serve/worker/index.d.ts +1 -1
  516. package/dist/serve/worker/index.d.ts.map +1 -1
  517. package/dist/serve/worker/index.js +2 -2
  518. package/dist/serve/worker/index.js.map +1 -1
  519. package/dist/serve/worker/port-lifecycle.d.ts +18 -0
  520. package/dist/serve/worker/port-lifecycle.d.ts.map +1 -0
  521. package/dist/serve/worker/port-lifecycle.js +28 -0
  522. package/dist/serve/worker/port-lifecycle.js.map +1 -0
  523. package/dist/serve/worker/protocol.d.ts +4 -0
  524. package/dist/serve/worker/protocol.d.ts.map +1 -1
  525. package/dist/serve/worker/protocol.js.map +1 -1
  526. package/dist/serve/worker/serve-init.d.ts.map +1 -1
  527. package/dist/serve/worker/serve-init.js +15 -3
  528. package/dist/serve/worker/serve-init.js.map +1 -1
  529. package/dist/verify/fixture.d.ts +1 -1
  530. package/package.json +17 -6
  531. package/src/assurance/.generated/conformance-verdicts.ts +68 -1
  532. package/src/bridge/client/dispatch.ts +52 -56
  533. package/src/bridge/client/tool-family-factories.ts +34 -0
  534. package/src/bridge/server/mcp-contract.ts +15 -59
  535. package/src/bridge/server/peer.ts +24 -1
  536. package/src/bridge/server/tool-family-factories.ts +40 -0
  537. package/src/bridge/server/tool-metadata.ts +29 -61
  538. package/src/bridge/tool-families.generated.ts +17 -0
  539. package/src/bridge/tool-families.ts +87 -0
  540. package/src/bridge/tool-family-records/conformance.ts +6 -0
  541. package/src/bridge/tool-family-records/firestore-data.ts +15 -0
  542. package/src/bridge/tool-family-records/firestore-inspect.ts +6 -0
  543. package/src/bridge/tool-family-records/firestore-rules.ts +15 -0
  544. package/src/bridge/tool-family-records/firestore-simulator.ts +16 -0
  545. package/src/bridge/tool-family-records/rtdb-inspection.ts +6 -0
  546. package/src/bundler/externals.ts +55 -0
  547. package/src/bundler/index.ts +21 -0
  548. package/src/cli/cli.test.ts +2 -46
  549. package/src/cli/index.ts +48 -42
  550. package/src/cli/inlined-sdk-scanner.ts +77 -0
  551. package/src/cli/mcp-proxy.ts +4 -4
  552. package/src/cli/parse-args.ts +61 -15
  553. package/src/cli/pyric-config.ts +45 -0
  554. package/src/cli/sandbox-interlock.ts +167 -0
  555. package/src/cli/{dev-runner.ts → sandbox-runner.ts} +142 -86
  556. package/src/cli/serve.ts +182 -115
  557. package/src/cli/snapshot.ts +5 -5
  558. package/src/cli/unsupported-runtime.ts +68 -0
  559. package/src/cli/verify.ts +1 -1
  560. package/src/conformance/.generated/can-i-use-browser.ts +2 -2
  561. package/src/conformance/.generated/can-i-use.ts +2 -2
  562. package/src/conformance/.generated/conformance-docs.ts +1 -1
  563. package/src/functions-rtdb/child.ts +115 -21
  564. package/src/functions-rtdb/development-runtime.ts +5 -1
  565. package/src/functions-rtdb/project.ts +8 -8
  566. package/src/google-endpoints.ts +155 -0
  567. package/src/next/guard.ts +1 -1
  568. package/src/next/runtime-env.ts +5 -0
  569. package/src/next/with-pyric.ts +1 -1
  570. package/src/register/beacon.ts +232 -0
  571. package/src/register/index.ts +68 -6
  572. package/src/register/net-guard.ts +567 -0
  573. package/src/remote/index.ts +9 -9
  574. package/src/serve/ai-diagnostics-relay.ts +243 -0
  575. package/src/serve/ai-proxy.ts +327 -0
  576. package/src/serve/ai-status.ts +109 -0
  577. package/src/serve/ai-terminal-blocks.ts +210 -0
  578. package/src/serve/ai-terminal-text.ts +52 -0
  579. package/src/serve/beacon-route.ts +141 -0
  580. package/src/serve/bundler.ts +10 -10
  581. package/src/serve/entries/active-auth-registry.ts +56 -0
  582. package/src/serve/entries/active-auth.ts +100 -0
  583. package/src/serve/entries/ai.ts +27 -1
  584. package/src/serve/entries/auth-helper-core.ts +5 -0
  585. package/src/serve/entries/auth-helper-dom.ts +27 -3
  586. package/src/serve/entries/auth-helper-runtime.ts +1 -1
  587. package/src/serve/entries/auth.ts +8 -0
  588. package/src/serve/entries/bridge-url.ts +1 -1
  589. package/src/serve/entries/firestore.ts +3 -3
  590. package/src/serve/entries/init.ts +78 -3
  591. package/src/serve/entries/keepalive.ts +1 -1
  592. package/src/serve/entries/runtime.ts +29 -14
  593. package/src/serve/entries/storage.ts +1 -1
  594. package/src/serve/entries/worker-runtime.ts +1 -1
  595. package/src/serve/init-payload.ts +4 -0
  596. package/src/serve/namespace.ts +117 -145
  597. package/src/serve/rules.ts +47 -22
  598. package/src/serve/runtime/chip-config.ts +16 -2
  599. package/src/serve/runtime/chip-dialog.ts +366 -0
  600. package/src/serve/runtime/chip-install.ts +10 -4
  601. package/src/serve/runtime/chip-user-search.ts +391 -0
  602. package/src/serve/runtime/chip.ts +177 -15
  603. package/src/serve/runtime/identity.ts +26 -0
  604. package/src/serve/runtime/manifest.ts +1 -1
  605. package/src/serve/runtime/status.ts +24 -0
  606. package/src/serve/sandbox-session.ts +19 -4
  607. package/src/serve/server.ts +18 -1
  608. package/src/serve/studio/disk-workspace.ts +76 -2
  609. package/src/serve/studio/routes.ts +63 -7
  610. package/src/serve/vite-ai-config.ts +37 -7
  611. package/src/serve/vite-module-swap.ts +0 -28
  612. package/src/serve/vite-plugin.ts +8 -8
  613. package/src/serve/vite-sandbox-generation.ts +16 -1
  614. package/src/serve/worker/client/auth.ts +1 -1
  615. package/src/serve/worker/client/core.ts +80 -3
  616. package/src/serve/worker/client/disconnect.ts +1 -1
  617. package/src/serve/worker/client/presence.ts +25 -5
  618. package/src/serve/worker/client.ts +1 -1
  619. package/src/serve/worker/context-resolver.ts +60 -0
  620. package/src/serve/worker/entry.ts +22 -18
  621. package/src/serve/worker/host/core.ts +9 -7
  622. package/src/serve/worker/host/storage.ts +2 -2
  623. package/src/serve/worker/host-ai.ts +15 -0
  624. package/src/serve/worker/host-auth.ts +1 -1
  625. package/src/serve/worker/index.ts +4 -1
  626. package/src/serve/worker/port-lifecycle.ts +45 -0
  627. package/src/serve/worker/protocol.ts +2 -1
  628. package/src/serve/worker/serve-init.ts +14 -3
  629. package/src/verify/fixture.ts +1 -1
  630. package/README.md.orig +0 -145
  631. package/dist/cli/dev-runner.d.ts.map +0 -1
  632. package/dist/cli/dev-runner.js.map +0 -1
  633. package/dist/serve/site-ui/_astro/_slug_.CXh9yTP1.css +0 -1
  634. package/dist/serve/site-ui/_astro/_slug_.CupVK4TM.css +0 -1
  635. package/dist/serve/site-ui/_astro/_studio_.CfxiQWkk.css +0 -1
  636. package/dist/serve/site-ui/_astro/app.BsFsMjn0.css +0 -1
  637. package/dist/serve/site-ui/_astro/app.Ce3MTLQm.js +0 -1
  638. package/dist/serve/site-ui/_astro/app.taqzyjD0.js +0 -11
  639. package/dist/serve/site-ui/_astro/sandbox-controls.BP4M5f1M.js +0 -1169
  640. package/dist/serve/site-ui/_astro/writes.C57paAj2.js +0 -99
  641. package/dist/serve/site-ui/docs/trust/storage-rules-stdlib-research/index.html +0 -582
  642. package/dist/serve/site-ui/docs/trust/storage-rules-stdlib-research.md +0 -448
@@ -220,16 +220,18 @@ export function lensDb(ctx: HostCtx, actAs?: AuthLens): Firestore {
220
220
  return handle;
221
221
  }
222
222
 
223
- export function authStateForLens(actAs: Extract<AuthLens, { mode: 'as' }>): { uid: string; token?: Record<string, unknown> } {
224
- return actAs.token === undefined
225
- ? { uid: actAs.uid }
226
- : { uid: actAs.uid, token: actAs.token };
223
+ export function authStateForLens(actAs: Extract<AuthLens, { mode: 'as' }>): { uid: string; token?: Record<string, unknown>; tenant?: string } {
224
+ const state: { uid: string; token?: Record<string, unknown>; tenant?: string } = { uid: actAs.uid };
225
+ if (actAs.token !== undefined) state.token = actAs.token;
226
+ if (actAs.tenant !== undefined) state.tenant = actAs.tenant;
227
+ return state;
227
228
  }
228
229
 
229
230
  export function lensCacheKey(actAs: Extract<AuthLens, { mode: 'as' }>): string {
230
- return actAs.token === undefined
231
- ? actAs.uid
232
- : `${actAs.uid}:${JSON.stringify(actAs.token)}`;
231
+ const parts = [actAs.uid];
232
+ if (actAs.tenant !== undefined) parts.push(`tenant:${actAs.tenant}`);
233
+ if (actAs.token !== undefined) parts.push(JSON.stringify(actAs.token));
234
+ return parts.join(':');
233
235
  }
234
236
 
235
237
  /** Cache key for a real port session; claims are part of authorization identity. */
@@ -68,8 +68,8 @@ function ensureStorage(ctx: HostCtx): FirebaseStorage {
68
68
  * `applyServeInit` (`serve-init.ts`), which opens the storage service
69
69
  * with `payload.storageRules` BEFORE any op can reach `ensureStorage`/
70
70
  * `lensStorage`, so every lens on a served worker enforces the
71
- * project's storage.rules (or runs open when the project has none,
72
- * matching Firestore/RTDB's no-rules posture). The lens split still
71
+ * project's storage.rules (or fails closed when the project has none,
72
+ * matching Firebase production's no-rules posture). The lens split still
73
73
  * matters for embedding/test hosts that open the service directly.
74
74
  * - `{ mode: 'admin' }` → the rules-BYPASS handle from
75
75
  * `pyric/storage/internal`'s admin plane — same per-sandbox store +
@@ -57,6 +57,21 @@ function resolveEngineConfig(wire: AiEngineConfigWire): NonNullable<AIOptions['e
57
57
  ...(wire.modelMap !== undefined ? { modelMap: wire.modelMap } : {}),
58
58
  };
59
59
  }
60
+ const isGeminiWire = wire.kind === 'gemini';
61
+ if (isGeminiWire) {
62
+ const result: Record<string, unknown> = {
63
+ kind: 'gemini',
64
+ };
65
+ const hasBaseUrl = wire.baseUrl !== undefined;
66
+ if (hasBaseUrl) {
67
+ result.baseUrl = wire.baseUrl;
68
+ }
69
+ const hasApiKey = wire.apiKey !== undefined;
70
+ if (hasApiKey) {
71
+ result.apiKey = wire.apiKey;
72
+ }
73
+ return result as unknown as NonNullable<AIOptions['engine']>;
74
+ }
60
75
  return {
61
76
  kind: 'scripted',
62
77
  ...(wire.script !== undefined
@@ -213,7 +213,7 @@ export async function handleAuthOp(ctx: HostCtx, port: PortLike, msg: OpMessage)
213
213
  } catch {
214
214
  session = null;
215
215
  }
216
- if (session) setPortSession(ctx, port, session);
216
+ setPortSession(ctx, port, session);
217
217
  ok(port, msg.id, session ? serializeUser(session.user) : null);
218
218
  } catch (e) { fail(port, msg.id, e); }
219
219
  break;
@@ -155,9 +155,12 @@ export {
155
155
  inMemoryPersistence,
156
156
  browserSessionPersistence,
157
157
  browserLocalPersistence,
158
- // Auth lens (Pyric Studio — admin / impersonation / app-session)
158
+ // Auth lens (Pyric Studio & Runtime Chip — admin / impersonation / app-session)
159
159
  setLens,
160
160
  getLens,
161
+ subscribeLens,
162
+ AUTH_LENS_STORAGE_KEY,
163
+ hydrateLensFromStorage,
161
164
  // Storage (Pyric Studio data browse): worker-backed FirebaseStorage mirror
162
165
  getStorage,
163
166
  ref,
@@ -0,0 +1,45 @@
1
+ import { cleanupPortWithDisconnect, type HostCtx, type PortLike } from './host.js';
2
+
3
+ /**
4
+ * SharedWorker port lifecycle manager.
5
+ *
6
+ * Tracks ports that close before asynchronous worker context initialization
7
+ * finishes, preventing dead-port leaks and ensuring that port cleanup / disconnect
8
+ * operations are drained as soon as the context becomes available.
9
+ */
10
+ export interface PortLifecycleManager {
11
+ /** Record port closure. Cleans up immediately if context is ready, or defers until resolution. */
12
+ onPortClosed(port: PortLike, currentCtx: HostCtx | null): void;
13
+ /** Drain all deferred closed ports against the newly resolved context. */
14
+ drainClosedPorts(ctx: HostCtx): void;
15
+ /** Check whether a port has already closed before processing queued messages. */
16
+ isPortClosed(port: PortLike): boolean;
17
+ }
18
+
19
+ export function createPortLifecycleManager(): PortLifecycleManager {
20
+ const closedPorts = new WeakSet<PortLike>();
21
+ const pendingClosedPorts = new Set<PortLike>();
22
+
23
+ return {
24
+ onPortClosed(port: PortLike, currentCtx: HostCtx | null): void {
25
+ closedPorts.add(port);
26
+ if (currentCtx !== null) {
27
+ void cleanupPortWithDisconnect(currentCtx, port).catch(() => undefined);
28
+ } else {
29
+ pendingClosedPorts.add(port);
30
+ }
31
+ },
32
+
33
+ drainClosedPorts(ctx: HostCtx): void {
34
+ if (pendingClosedPorts.size === 0) return;
35
+ for (const port of pendingClosedPorts) {
36
+ void cleanupPortWithDisconnect(ctx, port).catch(() => undefined);
37
+ }
38
+ pendingClosedPorts.clear();
39
+ },
40
+
41
+ isPortClosed(port: PortLike): boolean {
42
+ return closedPorts.has(port);
43
+ },
44
+ };
45
+ }
@@ -203,7 +203,8 @@ export type AiEngineConfigWire =
203
203
  model?: string;
204
204
  /** Explicit Gemini-model-id → upstream-model mapping. */
205
205
  modelMap?: Record<string, string>;
206
- };
206
+ }
207
+ | { kind: 'gemini'; baseUrl?: string; apiKey?: string };
207
208
 
208
209
  /**
209
210
  * Wire form of the Gemini error envelope an `AiBrokerError` carries
@@ -39,6 +39,7 @@ import {
39
39
  } from 'pyric/sandbox/internal';
40
40
  import type { InitPayload } from '../namespace.js';
41
41
  import { setupFirebaseActivityGuard } from './activity-bootstrap.js';
42
+ import { setupAiDiagnosticsRelay } from '../ai-diagnostics-relay.js';
42
43
  import { createWorkerDurableBackend, setupServerAuthFlush } from './durable-persistence.js';
43
44
  import { ensureAuth, getOrCreateInstanceId, type HostCtx } from './host.js';
44
45
  import { buildVerifyFixture, type PyricVerifyFixture } from '../../verify/fixture.js';
@@ -221,8 +222,8 @@ export function applyServeInit(
221
222
  };
222
223
  }
223
224
  }
225
+ const rtdb = ctx.rtdb ??= getDatabase(ctx.sandbox);
224
226
  if (payload.databaseRules) {
225
- const rtdb = ctx.rtdb ??= getDatabase(ctx.sandbox);
226
227
  rtdbSandbox.setRules(rtdb, payload.databaseRules);
227
228
  ctx.activeRules ??= {};
228
229
  ctx.activeRules.database = {
@@ -231,6 +232,10 @@ export function applyServeInit(
231
232
  status: 'active',
232
233
  messages: [],
233
234
  };
235
+ } else if (payload.permissive) {
236
+ rtdbSandbox.setDefaultPolicy(rtdb, 'allow');
237
+ } else {
238
+ rtdbSandbox.setDefaultPolicy(rtdb, 'deny');
234
239
  }
235
240
 
236
241
  // 1b. Storage rules — deployed ONCE, here, before any storage op can run.
@@ -241,8 +246,7 @@ export function applyServeInit(
241
246
  // always open storage with no `rules` option, so whichever call opens
242
247
  // the service first wins — making this the sanctioned place to
243
248
  // configure it. `payload.storageRules` is null when the project has no
244
- // storage.rules, matching the same open-by-default posture as no
245
- // firestore.rules / no database.rules.
249
+ // storage.rules, so the storage sandbox retains its fail-closed default.
246
250
  // The open ALSO claims the project-scoped IDB name
247
251
  // (`pyric-storage:<projectKey>`, issue #359) — which is why it now runs
248
252
  // unconditionally: a lazy first open from `ensureStorage`/`lensStorage`
@@ -600,6 +604,13 @@ export async function buildWorkerCtx(bootEnv: WorkerBootEnv): Promise<HostCtx> {
600
604
  // populate a report without replaying an old warning into a fresh terminal.
601
605
  setupFirebaseActivityGuard(ctx, env, payload?.activityToken);
602
606
 
607
+ // Same seam, AI's diagnostics: relay every broker `request_rejected`,
608
+ // `response_blocked`, and `model_substituted` event to the dev server's
609
+ // denial relay so a headless developer sees why the broker said no, why an
610
+ // answer came back empty, or which model actually answered. Live events
611
+ // only, so it is safe on either side of hydration.
612
+ setupAiDiagnosticsRelay({ subscribe: (listener) => ctx.sandbox.onEvent(listener) }, env.fetch);
613
+
603
614
  // Apply rules / seed / authUsers / capture BEFORE any port op runs (so
604
615
  // seeded users exist and project rules govern the first write), then mirror
605
616
  // auth to the committable server file (`--persist` only).
@@ -27,7 +27,7 @@ export interface PyricVerifyFixture {
27
27
  * SharedWorker's `instanceId`). Purely additive: `pyric verify` ignores it.
28
28
  * Present only on captures written by the worker's capture flush; used by
29
29
  * boot-time event hydration to SKIP priming a capture that belongs to a
30
- * DIFFERENT instance (e.g. another browser profile sharing one `pyric dev`),
30
+ * DIFFERENT instance (e.g. another browser profile sharing one `pyric sandbox`),
31
31
  * so someone else's session never shows up as yours. Absent on older /
32
32
  * standalone captures → hydration primes best-effort. */
33
33
  capturedBy?: string;
package/README.md.orig DELETED
@@ -1,145 +0,0 @@
1
- # `@pyric/cli`
2
-
3
- The Pyric CLI and programmatic helpers for local sandbox development,
4
- verification, artifact generation, and agent bridges.
5
-
6
- > **Alpha.** This package is an early alpha. Non-mirrored exports (e.g.
7
- > `@pyric/cli/serve/worker`, `@pyric/cli/verify`, `@pyric/cli/credentials/node`)
8
- > are experimental public-alpha surfaces that may change without notice. The
9
- > MCP tool surface (tool names and shapes) will consolidate during early
10
- > alpha — do not treat tool names as stable.
11
-
12
- Production project administration (deploy, Identity Toolkit configuration,
13
- hosted discovery) is **not** part of this package. Use
14
- [`firebase-tools`](https://firebase.google.com/docs/cli) or the Firebase
15
- Console to ship rules, indexes, hosting, and functions to a real project.
16
-
17
- ## CLI subcommands
18
-
19
- | Command | What it does |
20
- |---|---|
21
- | `pyric init [dir]` | Scaffold a pyric project — never prompts, idempotent, safe to rerun. `--template web` (default) creates a Vite app with canonical `firebase/*` imports; `--template static` creates a no-bundler app; `--template node` creates a script-style project. Run any template through `pyric dev` for sandbox resolution; inactive production tooling loads Firebase directly. Also `--name`, `--force` (overwrite scaffold-owned files), and `--json` (machine result on stdout). |
22
- | `pyric bridge` | Stand up an HTTP+WebSocket bridge an MCP client (Claude Code, Cursor) connects to (sandbox mode only) |
23
- | `pyric dev` | Local dev server with the pyric sandbox standing in for Firebase: serves `hosting.public`, resolves unmodified `firebase/*` imports to a pyric sandbox via a served import map, deploys + hot-reloads `firestore.rules` (SSE), opens an emulator-style sign-in helper for `signInWithPopup`/`signInWithRedirect`. The sandbox runs in a **SharedWorker by default** — one backend shared by every tab of the origin (live cross-tab sync), kept in the browser's IndexedDB so **your sandbox data — Firestore docs, auth users, RTDB, storage objects, and the traffic history — survives a refresh/restart by default** (see the persistence guide's coverage matrix for the exact tiers); a per-tab in-page sandbox is the fallback when SharedWorker is unavailable. Flags + exit codes: [CLI reference](docs/reference/cli.md#pyric-dev); persistence, ephemeral runs, clearing data, and SharedWorker tips: [persistence & multi-tab](docs/how-to/serve-persistence-and-multi-tab.md) |
24
- | `pyric snapshot` | Promote lived sandbox state (live `dev --persist`, else `.pyric/state/state.json`) to a committable fixture; `pyric dev --seed <fixture>` re-serves it (docs + users). `--out`, `--port`, `--force`, `--json` |
25
- | `pyric verify` | Replay a captured sandbox session against candidate rules (`--engine sandbox\|rules-test-api\|both`). Hosted Rules Test API needs SA/ADC via `FIREBASE_SA_BASE64` / `GOOGLE_APPLICATION_CREDENTIALS` |
26
- | `pyric can-i-use <feature>` | Query the canonical conformance model for availability, behaviour fidelity, assurance eligibility, caveats, and evidence. Only an exact canonical feature name exits 0; ambiguous names, spelling suggestions, and missing features exit 1. Accepts `--json`. |
27
- | `pyric mcp` | Start the stdio MCP server; attach to `pyric dev --bridge` when available or host a headless sandbox |
28
- | `pyric firestore rules lint <path>` | Lint a Firestore rules file |
29
- | `pyric firestore rules validate <path>` | Validate Firestore rules structure |
30
- | `pyric firestore rules simulate` | Run the local Firestore rules simulator |
31
- | `pyric firestore rules resolve <path>` | Resolve `2+modules` imports into a Firebase rules artifact |
32
- | `pyric firestore indexes generate <path...>` | Derive composite-index definitions from application source |
33
- | `pyric storage rules lint <path>` / `simulate` | Run local Storage rules lint or simulation |
34
- | `pyric storage rules resolve <path> --out storage.rules` | Resolve `storage.modules.rules` into a deployable Storage rules artifact |
35
- | `pyric database rules lint <path>` | Lint a Realtime Database rules JSON file |
36
- | `pyric database rules validate <path>` | Validate Realtime Database rules expressions |
37
- | `pyric database rules simulate` | Run the local Realtime Database rules simulator |
38
- | `pyric database rules generate` | Compile a constraints module to local `database.rules.json` without contacting production |
39
-
40
- Every command's full flags, defaults, exit codes, and environment variables are
41
- in the **[CLI reference](docs/reference/cli.md)**. Task guides and the rest of
42
- the docs are indexed in **[docs/](docs/README.md)**.
43
-
44
- ### Persistence caveats (documented limits)
45
-
46
- - **Anonymous users don't persist** (no round-trip key) — but their *documents
47
- do*. An app that calls `signInAnonymously` on load mints a new uid every
48
- reload under `--persist`, so docs owned by prior anonymous uids accumulate
49
- unreachably. Use the sign-in helper (or seeded users) for owner-based data
50
- you want durable.
51
- - **The state file is not a point-in-time snapshot** — firestore and auth
52
- sections flush on independent debounces; a crash between them can persist
53
- docs whose owner user hasn't flushed yet (or vice versa).
54
- - **One writer tab at a time (in-page fallback only)** — when several per-tab
55
- in-page sandboxes share one `.pyric/state` file, the first tab to flush holds
56
- the writer lock; others run read-only (console warning + `persistReadOnly`
57
- diagnostic) so they can't erase the writer's data. On the default SharedWorker
58
- path this can't happen — the single worker is the sole writer.
59
- - **Loss window** — the final unsaved change can be lost if the tab CLOSES
60
- within the flush debounce while the state exceeds ~60KB (keepalive cap);
61
- smaller states flush on unload, and reloads are always safe. A reset (or
62
- any delete-all) that empties a non-empty state first preserves the prior
63
- file at `.pyric/state/state.json.bak`.
64
-
65
- ### Agent onboarding (init → dev → MCP)
66
-
67
- Three parseable steps, no flags to discover:
68
-
69
- ```bash
70
- pyric init myapp --json # → {..., "nextSteps": [...]}
71
- cd myapp && bun install
72
- bun run dev:agent # pyric dev --bridge --seed seed.json
73
- ```
74
-
75
- Readiness probe: `GET <url>/__pyric/init.json` → 200 once serving (body
76
- carries the live rules hash). MCP endpoint: `<url>/__pyric/mcp`. With
77
- `pyric dev --json`, stdout's single line carries `{url, port, mcpUrl,
78
- rulesHash}`.
79
-
80
- ## Programmatic subpaths
81
-
82
- | Subpath | Surface |
83
- |---|---|
84
- | `@pyric/cli/credentials/node` | `fromServiceAccount`, `fromAdc` — build a `ProjectScope` for the Rules Test API (`pyric verify --engine rules-test-api\|both`) |
85
- | `@pyric/cli/verify` | Captured-session replay for Firestore and RTDB rules |
86
- | `@pyric/cli/conformance` | Node query surface: `canIUse` returns full claims and evidence; `canIUseImport` resolves a published import to its canonical compatibility page. |
87
- | `@pyric/cli/conformance/browser` | Compact browser query surface: `canIUse` returns availability, fidelity, assurance, summary, caveats, and the evidence slug without the full claim graph. |
88
- | `@pyric/cli/assurance` | Assurance campaign types and tools |
89
- | `@pyric/cli/assurance/browser` | Browser attachment for assurance campaigns |
90
- | `@pyric/cli/bridge` | `createBridge`, `startServer` (Node) / `connectBridge` (browser via conditional export). Vite integration is `pyric({ bridge })` in `@pyric/cli/vite`. |
91
- | `@pyric/cli/bridge/client` | Browser bridge client helpers |
92
- | `@pyric/cli/vite` | `pyric(opts)`, the dev-only firebase→sandbox swap plugin. Opts: `rules`, `persist`/`fresh`, `seed`, `capture`, `bridge` (MCP), `ui` (Pyric Studio at `/__pyric/ui/`, parity with `dev --ui`). |
93
- | `@pyric/cli/discover` | Credential-free crawl helpers for sandbox discovery (`crawl`, `findCollectionGroup`, `createFirestoreDiscoverTools`). Not registered on the default MCP bridge. |
94
- | `@pyric/cli/serve/worker` | SharedWorker serve runtime |
95
- | `@pyric/cli/remote` | Remote / headless helpers |
96
- | `@pyric/cli/register` | Registration helpers |
97
-
98
- ## MCP tool surface (`pyric bridge`)
99
-
100
- The bridge composes its toolsets from the same factories used by its browser
101
- dispatcher so advertised and executable tools cannot drift. The canonical,
102
- always-current list is the
103
- [agent tool inventory](../../docs/agent-tools.md).
104
-
105
- **Sandbox-routed** — dispatched against the connected browser sandbox
106
- (`createFirestoreDataTools` + `createFirestoreSimulatorTools` +
107
- `createFirestoreInspectTools` + local RTDB inspection):
108
-
109
- - data: `firestore_get_document` / `_list_documents` / `_create_document` / `_add_document` / `_update_document` / `_delete_document` / `_batch_write` / `_query_where` / `firestore_create_with_auto_id`
110
- - stateful simulator session: `firestore_simulator_create` / `_execute` / `_read` / `_batch` / `_undo` / `_redo` / `_events` / `_transaction`
111
- - diagnostics: `sandbox_inspect` — single-call sandbox state/rules snapshot
112
- - RTDB authorization: `rtdb_simulate_access` — evaluates one operation against
113
- the rules and data currently installed in the connected sandbox
114
- - RTDB structure: `rtdb_crawl_structure` — returns a bounded structural view of
115
- current sandbox data without leaf values
116
-
117
- Assurance campaign tools remain available programmatically from
118
- `@pyric/cli/assurance`, but are not registered on the default MCP bridge.
119
-
120
- **In-process** — run on the bridge process itself (`createFirestoreRulesTools`
121
- without a live `ProjectScope`, so no Rules Test API tool):
122
-
123
- - `firestore_simulate_rules`
124
- - `rules_stdlib_list` / `_get` (Firestore or Storage), with
125
- `firestore_rules_stdlib_list` / `_get` retained as compatibility aliases
126
- - `rules_resolve_modules` (Firestore or Storage), with
127
- `firestore_resolve_modules` retained as a compatibility alias
128
- - `firestore_lint_rules`
129
- - `firestore_resolve_modules`
130
-
131
- ### Gaps from the playground tool surface
132
-
133
- The `packages/playground/` app ships richer diagnostic tools that
134
- the `pyric bridge` does NOT register out of the box today. They're
135
- playground-specific orchestrators built on top of `useRuntimeStore`
136
- and other browser-only state:
137
-
138
- - `inspect_firestore_traffic` — structured dump of the sandbox traffic log
139
- - `seed_firestore_data_as_admin` — admin-bypass bulk writes for fixture setup
140
- - `generate_fixture_from_session` — snapshot `sandbox.history()` as a replay fixture
141
- - `try_rules_edit` — replay events under a proposed rules edit
142
- - `debug_firestore_rules` — orchestrator over simulate + lint + history + state
143
-
144
- The underlying primitives (`sandbox.history()`, `pyric/sandbox/replay`, and the
145
- rules simulator) remain available for custom compositions.
@@ -1 +0,0 @@
1
- {"version":3,"file":"dev-runner.d.ts","sourceRoot":"","sources":["../../src/cli/dev-runner.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AACH,OAAO,EAAS,KAAK,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAM9D;;;;;;;;;;GAUG;AACH,wBAAsB,kBAAkB,CACtC,QAAQ,EAAE,MAAM,EAChB,IAAI,GAAE;IACJ,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,EAAE,OAAO,KAAK,CAAC;IACzB,KAAK,CAAC,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;CAClC,GACL,OAAO,CAAC,OAAO,CAAC,CAmBlB;AAID,MAAM,MAAM,cAAc,GAAG,KAAK,GAAG,MAAM,GAAG,MAAM,GAAG,KAAK,CAAC;AAE7D,0EAA0E;AAC1E,wBAAgB,oBAAoB,CAAC,GAAG,EAAE,MAAM,GAAG,cAAc,CAKhE;AAED,yEAAyE;AACzE,wBAAgB,aAAa,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAUxD;AAED,MAAM,WAAW,YAAY;IAC3B,2DAA2D;IAC3D,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,qDAAqD;IACrD,KAAK,EAAE,MAAM,CAAC;CACf;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE;IACpC,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,KAAK,EAAE,OAAO,CAAC;IACf,IAAI,EAAE,OAAO,CAAC;IACd,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,cAAc,EAAE,cAAc,CAAC;CAChC,GAAG,YAAY,GAAG,IAAI,CAWtB;AAID;;;;;;;GAOG;AACH,wBAAgB,iBAAiB,IAAI,MAAM,CAQ1C;AAED;;;;;GAKG;AACH,wBAAgB,aAAa,CAC3B,IAAI,EAAE,MAAM,CAAC,UAAU,EACvB,IAAI,EAAE;IAAE,QAAQ,EAAE,MAAM,CAAC;IAAC,WAAW,EAAE,MAAM,CAAA;CAAE,GAC9C,MAAM,CAAC,UAAU,CAOnB;AAED;;;;GAIG;AACH,wBAAgB,sBAAsB,CAAC,IAAI,EAAE;IAAE,QAAQ,EAAE,MAAM,CAAC;IAAC,WAAW,EAAE,MAAM,CAAA;CAAE,GAAG,MAAM,CAc9F;AAID;;;GAGG;AACH,wBAAgB,kBAAkB,CAChC,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,GAC5B;IAAE,IAAI,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IAAC,KAAK,IAAI,IAAI,CAAA;CAAE,CAkB9C;AAID,MAAM,WAAW,cAAc;IAC7B,uEAAuE;IACvE,MAAM,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC;IACxB;0EACsE;IACtE,MAAM,CAAC,GAAG,EAAE,MAAM,CAAC,OAAO,GAAG,IAAI,CAAC;IAClC,KAAK,EAAE,YAAY,CAAC;CACrB;AAKD;;;;GAIG;AACH,wBAAgB,aAAa,CAC3B,IAAI,EAAE,YAAY,EAClB,IAAI,EAAE;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAC,UAAU,CAAC;IAAC,IAAI,EAAE,OAAO,CAAA;CAAE,GAC3D,cAAc,CAiEhB"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"dev-runner.js","sourceRoot":"","sources":["../../src/cli/dev-runner.ts"],"names":[],"mappings":"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"}
@@ -1 +0,0 @@
1
- :root{--font-ui: "Inter", -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif;--font-mono: "JetBrains Mono", ui-monospace, SFMono-Regular, "SF Mono", Menlo, Consolas, monospace;--font-display: var(--font-ui);--fs-title: 17px;--fs-body: 13px;--fs-label: 12px;--fs-data: 12.5px;--fs-caption: 11.5px;--fs-micro: 10.5px;--tracking-micro: .06em;--space-1: 4px;--space-2: 8px;--space-3: 12px;--space-4: 16px;--space-5: 24px;--space-6: 32px}:root{--bg: #16161a;--panel: #1e1e24;--elevated: #24242c;--ink: #fbfbfe;--muted: #72728a;--faint: #72728a;--line: #2a2a35;--line-2: #3a3a48;--accent: #8f7fe8;--accent-tint: #1e1b2e;--accent-ink: #14102a;--deny: #ededee;--deny-ink: #0c0c0d;--deny-tint: #161618;--diff-add: #57b985;--diff-add-bg: #111d16;--diff-remove: #e2607a;--diff-remove-bg: #221318}@media(prefers-color-scheme:light){:root:not([data-theme]){--bg: #ffffff;--panel: #fafafa;--elevated: #ffffff;--ink: #16181d;--muted: #646b78;--faint: #9aa1ad;--line: #e7e8ec;--line-2: #d9dbe0;--accent: #6b57d6;--accent-tint: #f4f2fd;--accent-ink: #ffffff;--deny: #16181d;--deny-ink: #ffffff;--deny-tint: #f4f4f6;--diff-add: #1f8f4e;--diff-add-bg: #eef8f1;--diff-remove: #c2374b;--diff-remove-bg: #fceef0}}[data-theme=light]{--bg: #ffffff;--panel: #fafafa;--elevated: #ffffff;--ink: #16181d;--muted: #646b78;--faint: #9aa1ad;--line: #e7e8ec;--line-2: #d9dbe0;--accent: #6b57d6;--accent-tint: #f4f2fd;--accent-ink: #ffffff;--deny: #16181d;--deny-ink: #ffffff;--deny-tint: #f4f4f6;--diff-add: #1f8f4e;--diff-add-bg: #eef8f1;--diff-remove: #c2374b;--diff-remove-bg: #fceef0}:root{--code-bg: #0f0f17;--wide: 1440px;--gutter: clamp(16px, 3vw, 32px);color-scheme:dark}@media(prefers-color-scheme:light){:root:not([data-theme]){color-scheme:light}}[data-theme=light]{color-scheme:light}*{box-sizing:border-box}body{margin:0;background:var(--bg);color:var(--ink);font-family:var(--font-ui);font-feature-settings:"cv11","ss01";font-size:16px;line-height:1.7;-webkit-font-smoothing:antialiased}.studio__bar{border-bottom:1px solid var(--line);background:var(--panel);min-width:0;position:sticky;top:0;z-index:10}.studio__bar-inner{width:100%;max-width:var(--wide);margin:0 auto;height:54px;display:grid;grid-template-columns:auto 1fr;align-items:center;gap:16px;padding:0 var(--gutter);min-width:0}.studio__brand{font-size:13px;font-weight:600;color:var(--ink);text-decoration:none;flex-shrink:0}.studio__nav{display:flex;align-items:center;justify-content:flex-start;gap:4px;height:100%;min-width:0;overflow-x:auto;scrollbar-width:none}.studio__nav::-webkit-scrollbar{display:none}.studio__nav-tab{display:inline-flex;align-items:center;border-bottom:2px solid transparent;font-size:13px;font-weight:500;line-height:1.5;color:var(--muted);text-decoration:none;padding:0 12px;height:100%;white-space:nowrap;transition:color .12s,border-color .12s}.studio__nav-tab:hover{color:color-mix(in srgb,var(--ink) 80%,transparent)}.studio__nav-tab[aria-current=page]{color:var(--ink);border-bottom-color:var(--ink)}@media(max-width:760px){.studio__nav{scroll-snap-type:x proximity;padding-right:28px;mask-image:linear-gradient(to right,#000 calc(100% - 28px),transparent);-webkit-mask-image:linear-gradient(to right,#000 calc(100% - 28px),transparent)}.studio__nav-tab{scroll-snap-align:start}}.docs-shell{max-width:var(--wide);margin-inline:auto;padding:2.5rem var(--gutter) 5rem;display:grid;grid-template-columns:minmax(200px,240px) minmax(0,1fr) minmax(180px,220px);column-gap:clamp(var(--space-6),4vw,calc(var(--space-6) * 2.5));row-gap:3rem;align-items:start}.docs-nav{position:sticky;top:calc(54px + 1.5rem);max-height:calc(100vh - 54px - 4rem);max-height:calc(100dvh - 54px - 4rem);overflow-y:auto;padding-bottom:var(--space-6);display:grid;align-content:start;gap:var(--space-3);font-size:.8125rem;line-height:1.5}.docs-nav-toplink{display:flex;align-items:center;min-height:2.125rem;padding:var(--space-1) var(--space-3);border-radius:.375rem;font-weight:600;color:var(--ink);text-decoration:none;transition:background-color .12s}.docs-nav-toplink:hover{background:color-mix(in srgb,var(--panel) 70%,transparent)}.docs-nav-toplink[aria-current=page]{background:var(--panel)}.docs-nav-group>summary{cursor:pointer;list-style:none;display:flex;align-items:center;justify-content:space-between;gap:var(--space-2);min-height:2.125rem;padding:var(--space-1) var(--space-3);border-radius:.375rem;font-weight:600;color:var(--ink);transition:background-color .12s}.docs-nav-group>summary:hover{background:color-mix(in srgb,var(--panel) 70%,transparent)}.docs-nav-group>summary::-webkit-details-marker{display:none}.docs-nav-group>summary:after{content:"›";display:inline-block;color:var(--faint);font-weight:400;transition:transform .12s}.docs-nav-group[open]>summary:after{transform:rotate(90deg)}.docs-nav-group-body{display:grid;gap:var(--space-5);padding:var(--space-1) 0 var(--space-2)}.docs-nav-heading{margin:0 0 var(--space-1);padding-inline:var(--space-3);font-size:.6875rem;font-weight:600;text-transform:uppercase;letter-spacing:var(--tracking-micro, .06em);color:var(--ink)}.docs-nav ul{margin:0;padding:0;list-style:none;display:grid;gap:var(--space-1)}.docs-nav li{min-width:0}.docs-nav a{display:flex;align-items:center;min-height:2.125rem;padding:var(--space-1) var(--space-3);border-radius:.375rem;color:var(--muted);text-decoration:none;background:transparent;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;transition:background-color .12s,color .12s}.docs-nav a:hover{color:var(--ink);background:color-mix(in srgb,var(--panel) 70%,transparent)}.docs-nav a[aria-current]{color:var(--ink)}.docs-nav a[aria-current=page]{background:var(--panel);font-weight:500}.docs-nav-drawer{display:none}.doc-main{width:100%;max-width:72ch;margin-inline:auto;min-width:0;font-size:1rem}.doc-toc{position:sticky;top:calc(54px + 1.5rem);max-height:calc(100vh - 54px - 4rem);max-height:calc(100dvh - 54px - 4rem);overflow-y:auto;padding-bottom:var(--space-6);display:grid;align-content:start;font-size:.8125rem}.doc-toc-heading{margin:0 0 .625rem;font-family:var(--font-mono);font-size:var(--fs-micro, 10.5px);font-weight:500;text-transform:uppercase;letter-spacing:var(--tracking-micro, .06em);color:var(--muted)}.doc-toc ul{margin:0;padding:0;list-style:none;display:grid;gap:.375rem;border-left:1px solid var(--line)}.doc-toc li{min-width:0}.doc-toc a{display:block;padding-left:.75rem;margin-left:-1px;border-left:1px solid transparent;color:var(--muted);text-decoration:none;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.doc-toc li[data-depth="3"] a{padding-left:1.5rem}.doc-toc a:hover{color:var(--ink)}.doc-toc a.active{color:var(--accent);border-left-color:var(--accent)}.docs-search{position:relative}.docs-search-field{display:flex;align-items:center;gap:var(--space-2);min-height:2.125rem;padding:0 var(--space-3);border:1px solid var(--line);border-radius:.375rem;background:var(--panel)}.docs-search-icon{flex-shrink:0;color:var(--faint)}.docs-search-input{flex:1;min-width:0;border:none;outline:none;background:transparent;color:var(--ink);font:inherit;font-size:.8125rem}.docs-search-input::placeholder{color:var(--faint)}.docs-search-kbd{flex-shrink:0;font-family:var(--font-mono);font-size:var(--fs-micro, 10.5px);color:var(--faint);border:1px solid var(--line);border-radius:.25rem;padding:.0625rem .3125rem;background:var(--elevated)}.docs-search-results{position:absolute;top:calc(100% + var(--space-1));left:0;right:0;z-index:20;margin:0;padding:var(--space-1);list-style:none;display:grid;gap:2px;background:var(--elevated);border:1px solid var(--line);border-radius:.5rem;box-shadow:0 12px 28px #00000059;max-height:60vh;overflow-y:auto}.docs-search-results li{min-width:0}.docs-search-results a{display:grid;gap:2px;padding:var(--space-2) var(--space-3);border-radius:.375rem;text-decoration:none;color:var(--ink)}.docs-search-results a:hover{background:var(--panel)}.docs-search-result-title{font-size:.8125rem;color:var(--ink)}.docs-search-result-meta{font-size:var(--fs-caption, 11.5px);color:var(--faint)}.docs-search-empty{padding:var(--space-2) var(--space-3);color:var(--faint);font-size:.8125rem}.docs-breadcrumbs{margin:0 0 var(--rhythm-group);font-size:var(--fs-caption, 11.5px)}.docs-breadcrumbs ol{display:flex;flex-wrap:wrap;align-items:center;gap:.375rem;margin:0;padding:0;list-style:none}.docs-breadcrumbs li{display:flex;align-items:center;gap:.375rem;min-width:0}.docs-breadcrumbs a{color:var(--muted);text-decoration:none}.docs-breadcrumbs a:hover{color:var(--ink);text-decoration:underline}.docs-breadcrumbs [aria-current=page],.docs-breadcrumbs-sep{color:var(--faint)}.docs-nav,.doc-toc,.docs-search-results,.prose pre,.prose .table-scroll{scrollbar-width:thin;scrollbar-color:var(--line-2) transparent}.docs-nav::-webkit-scrollbar,.doc-toc::-webkit-scrollbar,.docs-search-results::-webkit-scrollbar,.prose pre::-webkit-scrollbar,.prose .table-scroll::-webkit-scrollbar{width:8px;height:8px}.docs-nav::-webkit-scrollbar-track,.doc-toc::-webkit-scrollbar-track,.docs-search-results::-webkit-scrollbar-track,.prose pre::-webkit-scrollbar-track,.prose .table-scroll::-webkit-scrollbar-track{background:transparent}.docs-nav::-webkit-scrollbar-thumb,.doc-toc::-webkit-scrollbar-thumb,.docs-search-results::-webkit-scrollbar-thumb,.prose pre::-webkit-scrollbar-thumb,.prose .table-scroll::-webkit-scrollbar-thumb{background-color:var(--line-2);border-radius:999px;border:2px solid transparent;background-clip:content-box}.prose h1{font-size:1.75rem;font-weight:650;line-height:1.25;letter-spacing:-.02em}.prose h2{font-size:1.3125rem;font-weight:600;line-height:1.3;letter-spacing:-.01em}.prose h3{font-size:1.0625rem;font-weight:600;line-height:1.35}.prose h4{font-size:.9375rem;font-weight:600}.prose a{color:var(--accent);text-decoration:underline;text-decoration-color:color-mix(in srgb,var(--accent) 40%,transparent);text-underline-offset:2px}.prose a:hover{text-decoration-color:var(--accent)}a.external-link:after{content:"";display:inline-block;vertical-align:baseline;width:.625em;height:.625em;margin-left:.2em;background-color:currentColor;-webkit-mask:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3E%3Cpath d='M4.5 2.5h9v9h-2V5.91l-6.8 6.8-1.41-1.42 6.79-6.79H4.5v-2z'/%3E%3C/svg%3E") no-repeat center / contain;mask:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3E%3Cpath d='M4.5 2.5h9v9h-2V5.91l-6.8 6.8-1.41-1.42 6.79-6.79H4.5v-2z'/%3E%3C/svg%3E") no-repeat center / contain}.prose strong{font-weight:600;color:var(--ink)}.prose code{font-family:var(--font-mono);font-size:.85em;background:var(--panel);border:1px solid var(--line);border-radius:.25rem;padding:.0625rem .3125rem}.prose pre{border:1px solid var(--line);border-radius:.375rem;padding:.875rem 1rem;overflow-x:auto;font-size:.8125rem;line-height:1.6}.prose pre.astro-code{background-color:var(--code-bg)!important}.prose pre code{background:none;border:none;padding:0;font-size:inherit}.prose ul,.prose ol{padding-inline-start:1.5rem}.prose li::marker{color:var(--muted)}.prose blockquote{position:relative;margin-inline:0;padding-inline:0;padding-block:var(--rhythm-para);color:var(--muted)}.prose blockquote:before{content:"";position:absolute;inset-block:0;left:calc(-1 * var(--space-4));width:2px;background:var(--line-2)}.prose hr{border:none;border-top:1px solid var(--line)}.prose .table-scroll{max-width:100%;overflow-x:auto}.prose table{width:auto;border-collapse:collapse;font-size:.875rem}.prose th,.prose td{border:0;border-bottom:1px solid var(--line);padding:.5rem 2rem .5rem 0;text-align:left;vertical-align:top}.prose th:last-child,.prose td:last-child{padding-right:0}.prose th{font-family:var(--font-mono);font-size:.6875rem;text-transform:uppercase;letter-spacing:var(--tracking-micro, .06em);color:var(--muted);white-space:nowrap;border-bottom-color:var(--line-2)}.prose td code{white-space:nowrap}pre,code,kbd,samp{font-variant-ligatures:none}.prose .compat-key{display:flex;flex-wrap:wrap;gap:var(--space-1) var(--space-5);margin:1rem 0;font-size:var(--fs-caption);color:var(--muted)}.prose .compat-key-item{display:inline-flex;align-items:center;gap:var(--space-2);white-space:nowrap}.prose .compat-list{margin:1rem 0}.prose .compat-list--plain .compat-line{grid-template-columns:1fr}.prose .compat-line{display:grid;grid-template-columns:.75rem 1fr auto;column-gap:var(--space-3);align-items:start;padding:var(--space-2) 0}.prose .compat-main{display:flex;flex-direction:column;gap:1px;min-width:0}.prose .compat-api{font-family:var(--font-mono);font-size:.9rem;color:var(--ink);overflow-wrap:anywhere}.prose .compat-sub{font-size:.8125rem;color:var(--ink)}.prose .compat-category{color:var(--muted)}.prose .compat-row{border-bottom:1px solid var(--line)}.prose .compat-row:last-child{border-bottom:0}.prose summary.compat-line{cursor:pointer;list-style:none}.prose summary.compat-line::-webkit-details-marker{display:none}.prose summary.compat-line:after{content:"›";color:var(--faint);transition:transform .12s}.prose details[open]>summary.compat-line:after{transform:rotate(90deg)}.prose .compat-dot{width:8px;height:8px;border-radius:50%;background:var(--muted);flex-shrink:0}.prose .compat-line .compat-dot{margin-top:.4em}.prose .compat-dot[data-status=ok]{background:var(--diff-add)}.prose .compat-dot[data-status=diverged]{background:var(--accent)}.prose .compat-dot[data-status=bug]{background:var(--diff-remove)}.prose .compat-dot[data-status=unsupported]{background:var(--line-2)}.prose .compat-dot[data-status=unverified]{background:transparent;box-shadow:inset 0 0 0 1px var(--faint)}.prose .compat-status{font-family:var(--font-mono);font-size:var(--fs-caption);color:var(--muted)}.prose .compat-behavior{font-size:.875rem}.prose .compat-evidence{margin:0 0 var(--space-2) calc(.75rem + var(--space-3))}.prose .compat-probe,.prose .compat-note{margin-top:2px;font-size:var(--fs-caption);color:var(--muted);overflow-wrap:anywhere}.prose .compat-probe{font-family:var(--font-mono)}.prose .compat-list code,.prose .compat-key code{background:none;border:0;padding:0;color:inherit}.prose h1,.prose h2,.prose h3,.prose h4{scroll-margin-top:calc(54px + 1.5rem)}@media(max-width:1080px){.docs-shell{grid-template-columns:240px minmax(0,1fr)}.doc-toc{display:none}}@media(max-width:800px){.docs-shell{grid-template-columns:minmax(0,1fr);gap:1.5rem;padding-top:1.5rem}.docs-shell>.docs-nav{display:none}.docs-nav-drawer{display:block;border:1px solid var(--line);background:var(--panel)}.docs-nav-drawer>summary{cursor:pointer;padding:.625rem 1rem;font-family:var(--font-mono);font-size:.75rem;text-transform:uppercase;letter-spacing:var(--tracking-micro, .06em);color:var(--muted);list-style:none}.docs-nav-drawer>summary:after{content:" ▾"}.docs-nav-drawer .docs-nav{display:grid;position:static;max-height:none;padding:0 1rem 1rem}}.docs-nav-group-body--reference{gap:var(--space-3)}
@@ -1 +0,0 @@
1
- .prose .conformance-flow{display:flex;flex-wrap:wrap;align-items:stretch;gap:var(--space-2)}.prose .flow-step{flex:1 1 0;min-width:92px;display:flex;flex-direction:column;justify-content:center;gap:var(--space-1);padding:var(--space-3);text-align:center;background:var(--panel);border:1px solid var(--line);border-radius:8px;font-size:.9rem;font-weight:550;line-height:1.3;color:var(--ink)}.prose .flow-sub{font-size:var(--fs-caption);font-weight:400;color:var(--muted)}.prose .flow-arrow{display:flex;align-items:center;color:var(--faint);font-size:1.1rem}.prose .compat-stat{display:flex;flex-direction:column;gap:var(--space-3);padding-top:var(--space-4);border-top:1px solid var(--line)}.prose .compat-stat-surface{font-size:.85rem;color:var(--muted);font-variant-numeric:tabular-nums}.prose .compat-stat-surface strong,.prose .compat-stat-item strong{color:var(--ink)}.prose .compat-stat-figure{display:flex;align-items:baseline;flex-wrap:wrap;gap:var(--space-3);line-height:1}.prose .compat-stat-pct{font-size:2.75rem;font-weight:750;line-height:1;letter-spacing:-.02em;color:var(--ink);font-variant-numeric:tabular-nums}.prose .compat-stat-label{font-size:1rem;color:var(--muted)}.prose .compat-stat-denom{font-size:.85rem;color:var(--faint);font-variant-numeric:tabular-nums}.prose .compat-stat-bar{display:flex;gap:2px;width:100%;height:10px;border-radius:5px;overflow:hidden}.prose .compat-stat-seg{flex-basis:0;min-width:0;background:var(--muted)}.prose .compat-stat-seg[data-status=ok]{background:var(--diff-add)}.prose .compat-stat-seg[data-status=unsupported]{background:var(--line-2)}.prose .compat-stat-seg[data-status=unverified]{background:transparent;box-shadow:inset 0 0 0 1px var(--faint)}.prose .compat-stat-seg[data-status=diverged]{background:repeating-linear-gradient(135deg,var(--accent) 0 4px,color-mix(in srgb,var(--accent) 45%,transparent) 4px 7px)}.prose .compat-stat-seg[data-status=bug]{background:repeating-linear-gradient(45deg,var(--diff-remove) 0 3px,color-mix(in srgb,var(--diff-remove) 40%,transparent) 3px 6px)}.prose .compat-stat-key{padding:0;display:flex;flex-wrap:wrap;gap:var(--space-2) var(--space-4);list-style:none}.prose .compat-stat-item{display:inline-flex;align-items:center;gap:var(--space-2);font-size:var(--fs-caption);color:var(--muted);font-variant-numeric:tabular-nums}.prose .compat-stat-note{font-size:var(--fs-caption);color:var(--muted)}.prose .compat-meters{display:flex;flex-direction:column;gap:var(--space-2)}.prose .compat-meter{display:grid;grid-template-columns:minmax(9rem,auto) 1fr auto;align-items:center;gap:var(--space-3);font-size:var(--fs-caption);color:var(--muted);font-variant-numeric:tabular-nums}.prose .compat-meter-label{color:var(--muted)}.prose .compat-meter-value{color:var(--ink);font-weight:600;text-align:right}.prose .compat-meter-track{display:block;width:100%;height:8px;border-radius:4px;background:var(--line-2);overflow:hidden}.prose .compat-meter-fill{display:block;height:100%;border-radius:4px;background:var(--diff-add)}.prose .compat-meter-track--mini{height:5px;margin-top:var(--space-1)}.prose .compat-score-table{width:100%;border-collapse:collapse;font-size:.875rem}.prose .compat-score-table thead th{text-align:left;font-size:.6875rem;font-weight:600;text-transform:uppercase;letter-spacing:.06em;color:var(--ink-3, #667);padding:var(--space-2) var(--space-3);border-bottom:1px solid var(--line)}.prose .compat-score-table td,.prose .compat-score-table th[scope=row]{padding:var(--space-2) var(--space-3);border-bottom:1px solid var(--line);vertical-align:middle;text-align:left}.prose .compat-score-table th[scope=row]{font-weight:600;white-space:nowrap}.prose .compat-score-cell{white-space:nowrap}.prose .compat-score-cell .compat-score-pct{font-variant-numeric:tabular-nums;font-weight:600;margin-right:var(--space-2)}.prose .compat-score-cell .compat-meter-track--mini{display:inline-block;width:8rem;vertical-align:middle}.prose .compat-score-detail{color:var(--ink-3, #667);font-size:.8125rem;white-space:nowrap}.prose .compat-score-row--overall th[scope=row],.prose .compat-score-row--overall td{border-top:2px solid var(--line);border-bottom:0}.prose .compat-score-tbd{color:var(--ink-3, #667);font-size:.8125rem;font-style:italic}.prose .compat-score-stack{display:grid;gap:var(--space-1)}.prose .compat-score-bar{display:flex;align-items:center;gap:var(--space-2)}.prose .compat-score-bar .compat-meter-track{flex:1 1 auto}.prose .compat-score-basis{font-size:.8125rem;color:var(--ink-3, #667)}.prose .compat-score-row--rules .compat-score-cell{white-space:normal}.prose .compat-score-row--rules th[scope=row]{vertical-align:top}.prose .compat-score-group{display:grid;gap:var(--space-3)}.prose .compat-score-engine{display:grid;grid-template-columns:minmax(10rem,.7fr) minmax(14rem,1.3fr);align-items:start;gap:var(--space-3)}.prose .compat-score-engine-name{padding-top:1px;color:var(--ink);font-weight:550}@media(max-width:760px){.prose .compat-score-engine{grid-template-columns:1fr;gap:var(--space-1)}}:root{--rhythm-para: .875rem;--rhythm-group: 1.5rem;--rhythm-subsection: 2.25rem;--rhythm-section: 3.25rem;--rhythm-list: calc(var(--rhythm-para) * .75)}.prose>*,.prose blockquote>*,.prose li>*,.prose .compat-stat>*{margin-block:0}.prose>*+*{margin-block-start:var(--rhythm-group)}.prose>*+h2{margin-block-start:var(--rhythm-section)}.prose>*+h3,.prose>*+h4{margin-block-start:var(--rhythm-subsection)}.prose>h1+*,.prose>h2+*,.prose>h3+*,.prose>h4+*{margin-block-start:var(--rhythm-para)}.prose>p+p{margin-block-start:var(--rhythm-para)}.prose>p+ul,.prose>p+ol,.prose>p+blockquote{margin-block-start:var(--rhythm-para)}.prose li+li{margin-block-start:var(--rhythm-list)}.prose li>ul,.prose li>ol{margin-block-start:var(--rhythm-list)}.prose li>*+*,.prose blockquote>*+*{margin-block-start:var(--rhythm-para)}.api-reference-header{margin:0 0 2.5rem;padding:0 0 2rem;border-bottom:1px solid var(--line)}.api-reference-kicker{margin:0 0 .65rem;color:var(--muted);font-size:var(--fs-micro);font-weight:600;letter-spacing:var(--tracking-micro);text-transform:uppercase}.api-reference-header h1{margin:0;color:var(--ink);font-size:clamp(1.7rem,4vw,2.45rem);font-weight:600;letter-spacing:-.035em}.api-reference-header h1 code{padding:0;color:inherit;background:transparent;font:inherit}.api-reference-meta,.api-reference-source{margin:.7rem 0 0;color:var(--muted);font-size:var(--fs-body)}.api-reference-source{margin-top:.3rem}.api-reference-evidence{display:inline-block;margin-top:1rem;color:var(--ink);font-size:var(--fs-label);font-weight:600;text-underline-offset:.18em}.api-reference-body>h2{margin-top:3.75rem;padding-bottom:.65rem;border-bottom:1px solid var(--line)}.api-reference-body>h3{margin-top:2.75rem}.api-reference-body>h3 code{font-size:inherit}.api-reference-body h4{margin-top:1.8rem}.api-reference-body h5,.api-reference-body h6{margin-top:1.35rem}.api-reference-body pre{overflow-x:auto}.api-reference-body table{display:block;max-width:100%;overflow-x:auto;white-space:nowrap}.api-symbols{max-height:calc(100vh - 5rem);overflow:auto;scrollbar-width:thin}.api-symbol-filter{width:100%;margin:.2rem 0 1rem;padding:.5rem .6rem;border:1px solid var(--line);border-radius:.35rem;color:var(--ink);background:var(--panel);font:inherit;font-size:var(--fs-caption)}.api-symbol-filter:focus{border-color:var(--muted);outline:none}.api-symbol-group+.api-symbol-group{margin-top:1rem}.api-symbol-kind{display:block;margin-bottom:.35rem;color:var(--muted);font-size:var(--fs-micro);font-weight:600;letter-spacing:var(--tracking-micro);text-transform:uppercase}.api-symbol-group ul{margin:0;padding:0;list-style:none}.api-symbol-group li+li{margin-top:.22rem}.api-symbol-group li a{display:block;overflow:hidden;color:var(--muted);font-family:var(--font-mono);font-size:var(--fs-caption);text-overflow:ellipsis;white-space:nowrap}.api-symbol-group li a:hover,.api-symbol-kind:hover{color:var(--ink)}.api-symbol-empty{color:var(--muted);font-size:var(--fs-caption)}.docs-shell--example[data-astro-cid-mw7aashj]{max-width:100rem;grid-template-columns:minmax(200px,240px) minmax(0,1fr)}.docs-shell--example[data-astro-cid-mw7aashj] .doc-toc[data-astro-cid-mw7aashj]{display:none}.doc-main--example[data-astro-cid-mw7aashj]{max-width:70rem}@media(max-width:800px){.docs-shell--example[data-astro-cid-mw7aashj]{grid-template-columns:minmax(0,1fr)}}.example-meta[data-astro-cid-sluz6xkv]{margin:0;color:var(--muted);font-family:var(--font-mono);font-size:.7rem;font-weight:500;letter-spacing:.04em;line-height:1.4;text-transform:uppercase}.example-gallery[data-astro-cid-aiymqahz]{display:grid;grid-template-columns:minmax(0,1fr);gap:1rem;margin:2rem 0}.example-card[data-astro-cid-aiymqahz]{display:block;min-width:0;border:1px solid var(--line);border-radius:.85rem;padding:clamp(1.15rem,2.5vw,1.6rem);background:var(--panel);color:inherit;text-decoration:none;transition:border-color .15s,background-color .15s}.example-card[data-astro-cid-aiymqahz]:hover{border-color:var(--line-2);background:color-mix(in srgb,var(--panel) 96%,var(--ink))}.example-card[data-astro-cid-aiymqahz]:focus-visible{outline:2px solid var(--accent);outline-offset:3px}.example-card[data-astro-cid-aiymqahz].is-showcase{border-left-color:var(--line-2)}.example-card[data-astro-cid-aiymqahz] h2[data-astro-cid-aiymqahz]{margin:.45rem 0;color:var(--ink);font-size:1.2rem;line-height:1.3}.example-summary[data-astro-cid-aiymqahz]{max-width:62ch;margin:0;color:var(--muted);line-height:1.55}.example-action[data-astro-cid-aiymqahz]{display:inline-flex;gap:.35rem;align-items:center;margin-top:1rem;color:var(--ink);font-family:var(--font-mono);font-size:.72rem}.example-header[data-astro-cid-3f5pqdpq]{margin:0 0 1.5rem}.example-header[data-astro-cid-3f5pqdpq] h1[data-astro-cid-3f5pqdpq]{margin:.5rem 0 0;color:var(--ink);font-size:clamp(1.75rem,3vw,2.35rem);font-weight:600;line-height:1.15;letter-spacing:-.025em}.example-header[data-astro-cid-3f5pqdpq] div[data-astro-cid-3f5pqdpq]{max-width:58ch;margin-top:.8rem;color:var(--muted);font-size:1rem;line-height:1.55}.example-stage[data-astro-cid-xgvwrve7]{width:100%;margin:0;border:1px solid var(--line);border-radius:.5rem;overflow:hidden;background:#15151d}iframe[data-astro-cid-xgvwrve7]{display:block;width:100%;height:17rem;border:0;overflow:hidden;background:#15151d}.is-showcase[data-astro-cid-xgvwrve7] iframe[data-astro-cid-xgvwrve7]{height:35rem}.pyric-example[data-astro-cid-2qfr4sn2]{display:grid;min-width:0;gap:1.5rem;margin:0}.example-live[data-astro-cid-2qfr4sn2],.example-source[data-astro-cid-2qfr4sn2]{min-width:0}.example-panel-heading[data-astro-cid-2qfr4sn2]{display:flex;justify-content:space-between;gap:1rem;padding:.65rem .8rem;border:1px solid var(--line);border-bottom:0;border-radius:.5rem .5rem 0 0;background:var(--panel);color:var(--muted);font-family:var(--font-mono);font-size:.7rem}.example-live[data-astro-cid-2qfr4sn2] .example-stage{border-radius:0 0 .5rem .5rem}.source-heading[data-astro-cid-2qfr4sn2]{display:flex;align-items:baseline;justify-content:space-between;gap:1rem;margin-bottom:.75rem}.source-heading[data-astro-cid-2qfr4sn2] h2[data-astro-cid-2qfr4sn2]{margin:0;color:var(--ink);font-size:1.15rem;font-weight:600}.source-heading[data-astro-cid-2qfr4sn2] p[data-astro-cid-2qfr4sn2]{margin:0;color:var(--muted);font-size:.78rem}.source-code[data-astro-cid-2qfr4sn2]{min-width:0;overflow:hidden;border:1px solid var(--line);border-radius:.5rem;background:var(--code-bg)}.source-code[data-astro-cid-2qfr4sn2] pre.astro-code{box-sizing:border-box;max-width:100%;max-height:30rem;margin:0;overflow:auto;padding:1rem;background-color:var(--code-bg)!important;font-size:.78rem;line-height:1.55}@media(max-width:640px){.example-panel-heading[data-astro-cid-2qfr4sn2],.source-heading[data-astro-cid-2qfr4sn2]{align-items:flex-start;flex-direction:column;gap:.3rem}}.source-explorer{overflow:hidden;border:1px solid var(--line);border-radius:.5rem;background:#111118}.source-toolbar{display:flex;align-items:center;justify-content:space-between;gap:1rem;padding:.7rem .8rem;border-bottom:1px solid #353540;color:#f4f4f7}.source-toolbar strong{font-size:.8rem}.source-toolbar button{border:1px solid #4a4a58;border-radius:.35rem;padding:.38rem .55rem;background:#24242f;color:#f4f4f7;cursor:pointer}.source-explorer pre.astro-code{max-height:34rem;margin:0;overflow:auto;padding:1rem;background-color:#111118!important;font:.76rem/1.55 JetBrains Mono,monospace}.example-doc-page[data-astro-cid-ghke3xma]{width:100%}.example-explanation[data-astro-cid-ghke3xma],.example-rules[data-astro-cid-ghke3xma]{max-width:72ch;margin-top:2.5rem}.example-rules[data-astro-cid-ghke3xma] h2[data-astro-cid-ghke3xma]{margin:0 0 .5rem;color:var(--ink);font-size:1.45rem}.example-rules[data-astro-cid-ghke3xma] p[data-astro-cid-ghke3xma]{margin:0 0 1rem;color:var(--muted);line-height:1.6}
@@ -1 +0,0 @@
1
- /*! tailwindcss v4.3.3 | MIT License | https://tailwindcss.com */@layer properties{@supports (((-webkit-hyphens:none)) and (not (margin-trim:inline))) or ((-moz-orient:inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--tw-rotate-x:initial;--tw-rotate-y:initial;--tw-rotate-z:initial;--tw-skew-x:initial;--tw-skew-y:initial;--tw-border-style:solid;--tw-leading:initial;--tw-font-weight:initial;--tw-tracking:initial;--tw-ordinal:initial;--tw-slashed-zero:initial;--tw-numeric-figure:initial;--tw-numeric-spacing:initial;--tw-numeric-fraction:initial;--tw-shadow:0 0 #0000;--tw-shadow-color:initial;--tw-shadow-alpha:100%;--tw-inset-shadow:0 0 #0000;--tw-inset-shadow-color:initial;--tw-inset-shadow-alpha:100%;--tw-ring-color:initial;--tw-ring-shadow:0 0 #0000;--tw-inset-ring-color:initial;--tw-inset-ring-shadow:0 0 #0000;--tw-ring-inset:initial;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-offset-shadow:0 0 #0000;--tw-outline-style:solid;--tw-blur:initial;--tw-brightness:initial;--tw-contrast:initial;--tw-grayscale:initial;--tw-hue-rotate:initial;--tw-invert:initial;--tw-opacity:initial;--tw-saturate:initial;--tw-sepia:initial;--tw-drop-shadow:initial;--tw-drop-shadow-color:initial;--tw-drop-shadow-alpha:100%;--tw-drop-shadow-size:initial}}}:root{--font-ui:"Inter", -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif;--font-mono:"JetBrains Mono", ui-monospace, SFMono-Regular, "SF Mono", Menlo, Consolas, monospace;--font-display:var(--font-ui);--fs-display:28px;--fs-title:17px;--fs-body:13px;--fs-label:12px;--fs-data:12.5px;--fs-caption:11.5px;--fs-micro:10.5px;--tracking-micro:.06em;--space-1:4px;--space-2:8px;--space-3:12px;--space-4:16px;--space-5:24px;--space-6:32px;--bg:#16161a;--panel:#1e1e24;--elevated:#24242c;--ink:#fbfbfe;--muted:#72728a;--faint:#72728a;--line:#2a2a35;--line-2:#3a3a48;--accent:#8f7fe8;--accent-tint:#1e1b2e;--accent-ink:#14102a;--deny:#ededee;--deny-ink:#0c0c0d;--deny-tint:#161618;--diff-add:#57b985;--diff-add-bg:#111d16;--diff-remove:#e2607a;--diff-remove-bg:#221318;--update-added-bg:#19402b;--update-modified-bg:#4a3512;--update-added-ink:#57d685;--update-modified-ink:#ffb300}@media(prefers-color-scheme:light){:root:not([data-theme]){--bg:#fff;--panel:#fafafa;--elevated:#fff;--ink:#16181d;--muted:#646b78;--faint:#9aa1ad;--line:#e7e8ec;--line-2:#d9dbe0;--accent:#6b57d6;--accent-tint:#f4f2fd;--accent-ink:#fff;--deny:#16181d;--deny-ink:#fff;--deny-tint:#f4f4f6;--diff-add:#1f8f4e;--diff-add-bg:#eef8f1;--diff-remove:#c2374b;--diff-remove-bg:#fceef0;--update-added-bg:#d9f4e3;--update-modified-bg:#ffedb3;--update-added-ink:#188038;--update-modified-ink:#9a5b00}}[data-theme=light]{--bg:#fff;--panel:#fafafa;--elevated:#fff;--ink:#16181d;--muted:#646b78;--faint:#9aa1ad;--line:#e7e8ec;--line-2:#d9dbe0;--accent:#6b57d6;--accent-tint:#f4f2fd;--accent-ink:#fff;--deny:#16181d;--deny-ink:#fff;--deny-tint:#f4f4f6;--diff-add:#1f8f4e;--diff-add-bg:#eef8f1;--diff-remove:#c2374b;--diff-remove-bg:#fceef0;--update-added-bg:#d9f4e3;--update-modified-bg:#ffedb3;--update-added-ink:#188038;--update-modified-ink:#9a5b00}[data-pyric-update=added]{--pyric-update-light:var(--update-added-bg);--pyric-update-ink:var(--update-added-ink)}[data-pyric-update=modified]{--pyric-update-light:var(--update-modified-bg);--pyric-update-ink:var(--update-modified-ink)}[data-pyric-update][data-pyric-update-cycle="0"]{animation:1.2s ease-out pyric-update-light-a}[data-pyric-update][data-pyric-update-cycle="1"]{animation:1.2s ease-out pyric-update-light-b}[data-pyric-update][data-pyric-update-cycle="0"] :is(.fs-doctree__key,.fs-doctree__value,[data-rtdb-key],[data-rtdb-value]){animation:1.2s ease-out pyric-update-text-a}[data-pyric-update][data-pyric-update-cycle="1"] :is(.fs-doctree__key,.fs-doctree__value,[data-rtdb-key],[data-rtdb-value]){animation:1.2s ease-out pyric-update-text-b}@keyframes pyric-update-light-a{0%{background-color:var(--pyric-update-light);color:var(--pyric-update-ink)}to{background-color:#0000}}@keyframes pyric-update-light-b{0%{background-color:var(--pyric-update-light);color:var(--pyric-update-ink)}to{background-color:#0000}}@keyframes pyric-update-text-a{0%{color:var(--pyric-update-ink)}}@keyframes pyric-update-text-b{0%{color:var(--pyric-update-ink)}}@media(prefers-reduced-motion:reduce){[data-pyric-update],[data-pyric-update] *{animation:none!important}}@layer theme{:root,:host{--font-sans:-apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", "Noto Sans", Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";--font-mono:var(--font-mono);--spacing:.25rem;--container-md:28rem;--container-xl:36rem;--container-2xl:42rem;--container-4xl:56rem;--container-5xl:64rem;--text-xs:.75rem;--text-xs--line-height:calc(1 / .75);--text-sm:.875rem;--text-sm--line-height:calc(1.25 / .875);--text-base:1rem;--text-base--line-height: 1.5 ;--font-weight-medium:500;--font-weight-semibold:600;--font-weight-bold:700;--tracking-wide:.025em;--tracking-wider:.05em;--leading-relaxed:1.625;--radius-md:.375rem;--radius-lg:.5rem;--default-transition-duration:.15s;--default-transition-timing-function:cubic-bezier(.4, 0, .2, 1);--default-font-family:var(--font-sans);--default-mono-font-family:var(--font-mono);--color-bg:var(--bg);--color-panel:var(--panel);--color-elevated:var(--elevated);--color-ink:var(--ink);--color-muted:var(--muted);--color-faint:var(--faint);--color-line:var(--line);--color-line-2:var(--line-2);--color-accent:var(--accent);--color-accent-tint:var(--accent-tint);--color-accent-ink:var(--accent-ink);--color-deny:var(--deny);--color-deny-ink:var(--deny-ink);--color-deny-tint:var(--deny-tint);--color-diff-add:var(--diff-add);--color-diff-add-bg:var(--diff-add-bg);--color-diff-remove:var(--diff-remove);--color-diff-remove-bg:var(--diff-remove-bg);--font-ui:var(--font-ui);--font-display:var(--font-display);--color-content-bg:var(--bg);--color-sidebar-bg:var(--panel);--color-border:var(--line);--color-border-strong:var(--line-2);--color-soft-white:var(--ink);--color-slate-gray:var(--muted);--color-label-white:var(--ink);--color-primary:var(--accent);--color-danger:var(--diff-remove);--color-warning:#f5a623;--color-info:var(--accent);--color-severity-low:var(--muted);--color-severity-medium:#f5a623;--color-severity-high:var(--diff-remove)}}@layer base{*,:after,:before,::backdrop{box-sizing:border-box;border:0 solid;margin:0;padding:0}::file-selector-button{box-sizing:border-box;border:0 solid;margin:0;padding:0}html,:host{-webkit-text-size-adjust:100%;tab-size:4;line-height:1.5;font-family:var(--default-font-family,-apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", "Noto Sans", Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji");font-feature-settings:var(--default-font-feature-settings,normal);font-variation-settings:var(--default-font-variation-settings,normal);-webkit-tap-highlight-color:transparent}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;-webkit-text-decoration:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-family:var(--default-mono-font-family,ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace);font-feature-settings:var(--default-mono-font-feature-settings,normal);font-variation-settings:var(--default-mono-font-variation-settings,normal);font-size:1em}small{font-size:80%}sub,sup{vertical-align:baseline;font-size:75%;line-height:0;position:relative}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}:-moz-focusring:where(:not(iframe)){outline:auto}progress{vertical-align:baseline}summary{display:list-item}ol,ul,menu{list-style:none}img,svg,video,canvas,audio,iframe,embed,object{vertical-align:middle;display:block}img,video{max-width:100%;height:auto}button,input,select,optgroup,textarea{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}::file-selector-button{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}:where(select:is([multiple],[size])) optgroup{font-weight:bolder}:where(select:is([multiple],[size])) optgroup option{padding-inline-start:20px}::file-selector-button{margin-inline-end:4px}::placeholder{opacity:1}@supports (not ((-webkit-appearance:-apple-pay-button))) or (contain-intrinsic-size:1px){::placeholder{color:currentColor}@supports (color:color-mix(in lab,red,red)){::placeholder{color:color-mix(in oklab,currentcolor 50%,transparent)}}}textarea{resize:vertical}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-date-and-time-value{min-height:1lh;text-align:inherit}::-webkit-datetime-edit{display:inline-flex}::-webkit-datetime-edit-fields-wrapper{padding:0}::-webkit-datetime-edit{padding-block:0}::-webkit-datetime-edit-year-field{padding-block:0}::-webkit-datetime-edit-month-field{padding-block:0}::-webkit-datetime-edit-day-field{padding-block:0}::-webkit-datetime-edit-hour-field{padding-block:0}::-webkit-datetime-edit-minute-field{padding-block:0}::-webkit-datetime-edit-second-field{padding-block:0}::-webkit-datetime-edit-millisecond-field{padding-block:0}::-webkit-datetime-edit-meridiem-field{padding-block:0}::-webkit-calendar-picker-indicator{line-height:1}:-moz-ui-invalid{box-shadow:none}button,input:where([type=button],[type=reset],[type=submit]){appearance:button}::file-selector-button{appearance:button}::-webkit-inner-spin-button{height:auto}::-webkit-outer-spin-button{height:auto}[hidden]:where(:not([hidden=until-found])){display:none!important}*,:before,:after{box-sizing:border-box}html,body,#root{height:100%;margin:0}body{background:var(--bg);color:var(--ink);font-family:var(--font-ui);-webkit-font-smoothing:antialiased;font-size:13px;line-height:1.5}.mono{font-family:var(--font-mono)}}@layer components;@layer utilities{.collapse{visibility:collapse}.invisible{visibility:hidden}.visible{visibility:visible}.absolute{position:absolute}.fixed{position:fixed}.relative{position:relative}.static{position:static}.sticky{position:sticky}.container{width:100%}@media(min-width:40rem){.container{max-width:40rem}}@media(min-width:48rem){.container{max-width:48rem}}@media(min-width:64rem){.container{max-width:64rem}}@media(min-width:80rem){.container{max-width:80rem}}@media(min-width:96rem){.container{max-width:96rem}}.mx-auto{margin-inline:auto}.mt-1{margin-top:var(--spacing)}.mt-1\.5{margin-top:calc(var(--spacing) * 1.5)}.mt-2{margin-top:calc(var(--spacing) * 2)}.mt-3{margin-top:calc(var(--spacing) * 3)}.mb-2{margin-bottom:calc(var(--spacing) * 2)}.mb-3{margin-bottom:calc(var(--spacing) * 3)}.block{display:block}.contents{display:contents}.flex{display:flex}.grid{display:grid}.hidden{display:none}.inline{display:inline}.inline-block{display:inline-block}.inline-flex{display:inline-flex}.table{display:table}.h-2{height:calc(var(--spacing) * 2)}.h-full{height:100%}.min-h-0{min-height:0}.w-2{width:calc(var(--spacing) * 2)}.w-3{width:calc(var(--spacing) * 3)}.w-fit{width:fit-content}.w-full{width:100%}.max-w-2xl{max-width:var(--container-2xl)}.max-w-4xl{max-width:var(--container-4xl)}.max-w-5xl{max-width:var(--container-5xl)}.max-w-md{max-width:var(--container-md)}.max-w-xl{max-width:var(--container-xl)}.min-w-0{min-width:0}.flex-1{flex:1}.shrink-0{flex-shrink:0}.grow{flex-grow:1}.transform{transform:var(--tw-rotate-x,) var(--tw-rotate-y,) var(--tw-rotate-z,) var(--tw-skew-x,) var(--tw-skew-y,)}.resize{resize:both}.grid-cols-\[1fr_320px\]{grid-template-columns:1fr 320px}.grid-cols-\[18rem_minmax\(0\,1fr\)\]{grid-template-columns:18rem minmax(0,1fr)}.flex-col{flex-direction:column}.flex-wrap{flex-wrap:wrap}.items-baseline{align-items:baseline}.items-center{align-items:center}.items-start{align-items:flex-start}.justify-between{justify-content:space-between}.justify-center{justify-content:center}.gap-0\.5{gap:calc(var(--spacing) * .5)}.gap-1{gap:var(--spacing)}.gap-2{gap:calc(var(--spacing) * 2)}.gap-3{gap:calc(var(--spacing) * 3)}.gap-4{gap:calc(var(--spacing) * 4)}.gap-x-2{column-gap:calc(var(--spacing) * 2)}.gap-y-1{row-gap:var(--spacing)}.truncate{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.overflow-auto{overflow:auto}.overflow-hidden{overflow:hidden}.rounded{border-radius:.25rem}.rounded-full{border-radius:3.40282e38px}.rounded-lg{border-radius:var(--radius-lg)}.rounded-md{border-radius:var(--radius-md)}.border{border-style:var(--tw-border-style);border-width:1px}.border-l{border-left-style:var(--tw-border-style);border-left-width:1px}.border-dashed{--tw-border-style:dashed;border-style:dashed}.border-border{border-color:var(--color-border)}.border-line{border-color:var(--color-line)}.bg-content-bg{background-color:var(--color-content-bg)}.bg-current{background-color:currentColor}.bg-danger\/10{background-color:var(--color-danger)}@supports (color:color-mix(in lab,red,red)){.bg-danger\/10{background-color:color-mix(in oklab,var(--color-danger) 10%,transparent)}}.bg-danger\/15{background-color:var(--color-danger)}@supports (color:color-mix(in lab,red,red)){.bg-danger\/15{background-color:color-mix(in oklab,var(--color-danger) 15%,transparent)}}.bg-panel{background-color:var(--color-panel)}.bg-primary\/15{background-color:var(--color-primary)}@supports (color:color-mix(in lab,red,red)){.bg-primary\/15{background-color:color-mix(in oklab,var(--color-primary) 15%,transparent)}}.bg-severity-high{background-color:var(--color-severity-high)}.bg-severity-low{background-color:var(--color-severity-low)}.bg-severity-medium{background-color:var(--color-severity-medium)}.bg-sidebar-bg{background-color:var(--color-sidebar-bg)}.p-2{padding:calc(var(--spacing) * 2)}.p-3{padding:calc(var(--spacing) * 3)}.p-5{padding:calc(var(--spacing) * 5)}.p-8{padding:calc(var(--spacing) * 8)}.px-1\.5{padding-inline:calc(var(--spacing) * 1.5)}.px-2{padding-inline:calc(var(--spacing) * 2)}.px-3{padding-inline:calc(var(--spacing) * 3)}.px-4{padding-inline:calc(var(--spacing) * 4)}.py-0\.5{padding-block:calc(var(--spacing) * .5)}.py-1{padding-block:var(--spacing)}.py-1\.5{padding-block:calc(var(--spacing) * 1.5)}.py-2{padding-block:calc(var(--spacing) * 2)}.py-3{padding-block:calc(var(--spacing) * 3)}.py-6{padding-block:calc(var(--spacing) * 6)}.py-16{padding-block:calc(var(--spacing) * 16)}.pl-3{padding-left:calc(var(--spacing) * 3)}.pl-4{padding-left:calc(var(--spacing) * 4)}.text-center{text-align:center}.text-left{text-align:left}.font-mono{font-family:var(--font-mono)}.text-base{font-size:var(--text-base);line-height:var(--tw-leading,var(--text-base--line-height))}.text-sm{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}.text-xs{font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height))}.text-\[0\.6rem\]{font-size:.6rem}.text-\[0\.7em\]{font-size:.7em}.text-\[0\.7rem\]{font-size:.7rem}.text-\[0\.65rem\]{font-size:.65rem}.leading-relaxed{--tw-leading:var(--leading-relaxed);line-height:var(--leading-relaxed)}.font-bold{--tw-font-weight:var(--font-weight-bold);font-weight:var(--font-weight-bold)}.font-medium{--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium)}.font-semibold{--tw-font-weight:var(--font-weight-semibold);font-weight:var(--font-weight-semibold)}.tracking-wide{--tw-tracking:var(--tracking-wide);letter-spacing:var(--tracking-wide)}.tracking-wider{--tw-tracking:var(--tracking-wider);letter-spacing:var(--tracking-wider)}.text-danger{color:var(--color-danger)}.text-diff-add{color:var(--color-diff-add)}.text-info{color:var(--color-info)}.text-muted{color:var(--color-muted)}.text-primary,.text-primary\/70{color:var(--color-primary)}@supports (color:color-mix(in lab,red,red)){.text-primary\/70{color:color-mix(in oklab,var(--color-primary) 70%,transparent)}}.text-slate-gray,.text-slate-gray\/80{color:var(--color-slate-gray)}@supports (color:color-mix(in lab,red,red)){.text-slate-gray\/80{color:color-mix(in oklab,var(--color-slate-gray) 80%,transparent)}}.text-soft-white{color:var(--color-soft-white)}.text-warning{color:var(--color-warning)}.lowercase{text-transform:lowercase}.uppercase{text-transform:uppercase}.italic{font-style:italic}.tabular-nums{--tw-numeric-spacing:tabular-nums;font-variant-numeric:var(--tw-ordinal,) var(--tw-slashed-zero,) var(--tw-numeric-figure,) var(--tw-numeric-spacing,) var(--tw-numeric-fraction,)}.line-through{text-decoration-line:line-through}.underline{text-decoration-line:underline}.decoration-primary\/40{-webkit-text-decoration-color:var(--color-primary);text-decoration-color:var(--color-primary)}@supports (color:color-mix(in lab,red,red)){.decoration-primary\/40{-webkit-text-decoration-color:color-mix(in oklab,var(--color-primary) 40%,transparent);text-decoration-color:color-mix(in oklab,var(--color-primary) 40%,transparent)}}.underline-offset-2{text-underline-offset:2px}.ring{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.outline{outline-style:var(--tw-outline-style);outline-width:1px}.blur{--tw-blur:blur(8px);filter:var(--tw-blur,) var(--tw-brightness,) var(--tw-contrast,) var(--tw-grayscale,) var(--tw-hue-rotate,) var(--tw-invert,) var(--tw-saturate,) var(--tw-sepia,) var(--tw-drop-shadow,)}.filter{filter:var(--tw-blur,) var(--tw-brightness,) var(--tw-contrast,) var(--tw-grayscale,) var(--tw-hue-rotate,) var(--tw-invert,) var(--tw-saturate,) var(--tw-sepia,) var(--tw-drop-shadow,)}.transition{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to,opacity,box-shadow,transform,translate,scale,rotate,filter,-webkit-backdrop-filter,backdrop-filter,display,content-visibility,overlay,pointer-events;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-colors{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.placeholder\:text-slate-gray::placeholder{color:var(--color-slate-gray)}@media(hover:hover){.hover\:bg-content-bg:hover{background-color:var(--color-content-bg)}.hover\:bg-primary\/25:hover{background-color:var(--color-primary)}@supports (color:color-mix(in lab,red,red)){.hover\:bg-primary\/25:hover{background-color:color-mix(in oklab,var(--color-primary) 25%,transparent)}}.hover\:text-soft-white:hover{color:var(--color-soft-white)}.hover\:decoration-primary:hover{-webkit-text-decoration-color:var(--color-primary);text-decoration-color:var(--color-primary)}}.disabled\:opacity-40:disabled{opacity:.4}.\[\&_\[data-pyric-empty-body\]\]\:mt-2 [data-pyric-empty-body]{margin-top:calc(var(--spacing) * 2)}.\[\&_\[data-pyric-empty-body\]\]\:max-w-md [data-pyric-empty-body]{max-width:var(--container-md)}.\[\&_\[data-pyric-empty-body\]\]\:text-sm [data-pyric-empty-body]{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}.\[\&_\[data-pyric-empty-body\]\]\:leading-relaxed [data-pyric-empty-body]{--tw-leading:var(--leading-relaxed);line-height:var(--leading-relaxed)}.\[\&_\[data-pyric-empty-body\]\]\:text-slate-gray [data-pyric-empty-body]{color:var(--color-slate-gray)}.\[\&_\[data-pyric-empty-title\]\]\:text-base [data-pyric-empty-title]{font-size:var(--text-base);line-height:var(--tw-leading,var(--text-base--line-height))}.\[\&_\[data-pyric-empty-title\]\]\:font-semibold [data-pyric-empty-title]{--tw-font-weight:var(--font-weight-semibold);font-weight:var(--font-weight-semibold)}.\[\&_\[data-pyric-empty-title\]\]\:text-soft-white [data-pyric-empty-title]{color:var(--color-soft-white)}.\[\&_\[data-pyric-selected\]\]\:text-primary [data-pyric-selected]{color:var(--color-primary)}.\[\&_button\]\:text-left button{text-align:left}}[data-pyric-ui=confirm-portal]{z-index:2000;place-items:center;padding:20px;display:grid;position:fixed;inset:0}[data-pyric-ui=confirm-overlay]{pointer-events:none;background:var(--bg);position:absolute;inset:0}@supports (color:color-mix(in lab,red,red)){[data-pyric-ui=confirm-overlay]{background:color-mix(in srgb,var(--bg) 72%,transparent)}}[data-pyric-ui=confirm-overlay]{-webkit-backdrop-filter:blur(2px);backdrop-filter:blur(2px)}[data-pyric-ui=confirm-dialog]{border:1px solid var(--line-2);background:var(--elevated);width:min(440px,100%);color:var(--ink);box-shadow:0 18px 60px var(--bg);border-radius:10px;padding:20px;position:relative}@supports (color:color-mix(in lab,red,red)){[data-pyric-ui=confirm-dialog]{box-shadow:0 18px 60px color-mix(in srgb,var(--bg) 75%,transparent)}}[data-pyric-confirm-title]{font-size:16px;font-weight:650}[data-pyric-confirm-body]{color:var(--muted);margin-top:10px;font-size:13px;line-height:1.55}[data-pyric-confirm-body] ul{max-height:180px;font-family:var(--font-mono);margin:0;padding-left:20px;font-size:12px;overflow:auto}[data-pyric-confirm-actions]{justify-content:flex-end;gap:10px;margin-top:20px;display:flex}[data-pyric-confirm-actions] button{appearance:none;border:1px solid var(--line-2);background:var(--panel);color:var(--ink);font:inherit;cursor:pointer;border-radius:7px;padding:7px 13px;font-size:12.5px}[data-pyric-confirm-confirm][data-pyric-destructive]{border-color:var(--diff-remove);background:var(--diff-remove);color:var(--deny-ink)}[data-pyric-ui=toast-region]{z-index:2100;gap:8px;width:min(360px,100vw - 36px);margin:0;padding:0;list-style:none;display:grid;position:fixed;top:18px;right:18px}[data-pyric-toast]{border:1px solid var(--line-2);background:var(--elevated);color:var(--ink);box-shadow:0 12px 36px var(--bg);border-radius:9px;padding:12px 36px 12px 14px;position:relative}@supports (color:color-mix(in lab,red,red)){[data-pyric-toast]{box-shadow:0 12px 36px color-mix(in srgb,var(--bg) 65%,transparent)}}[data-pyric-toast][data-pyric-toast-kind=error]{border-color:var(--diff-remove)}@supports (color:color-mix(in lab,red,red)){[data-pyric-toast][data-pyric-toast-kind=error]{border-color:color-mix(in srgb,var(--diff-remove) 55%,var(--line))}}[data-pyric-toast-title]{font-weight:600}[data-pyric-toast-body]{color:var(--muted);margin-top:5px;font-size:12px}[data-pyric-toast-dismiss]{color:var(--faint);cursor:pointer;background:0 0;border:0;position:absolute;top:8px;right:8px}.studio-chip{border:1px solid var(--line);background:var(--elevated);color:var(--muted);font-size:var(--fs-caption);white-space:nowrap;border-radius:999px;align-items:center;gap:6px;padding:3px 9px;line-height:1.2;text-decoration:none;display:inline-flex}.studio-selection-count{font-family:var(--font-mono);color:var(--ink);font-size:12px}.studio-selection-delete{appearance:none;border:1px solid var(--diff-remove)}@supports (color:color-mix(in lab,red,red)){.studio-selection-delete{border:1px solid color-mix(in srgb,var(--diff-remove) 45%,var(--line))}}.studio-selection-delete{background:var(--elevated);color:var(--diff-remove);font:inherit;cursor:pointer;border-radius:7px;padding:5px 11px;font-size:12px}.studio-selection-delete:disabled{opacity:.45;cursor:default}a.studio-chip:hover{border-color:var(--line-2);color:var(--ink)}.studio-chip__dot{background:var(--faint);border-radius:999px;flex:none;width:6px;height:6px}.studio-chip--live .studio-chip__dot{background:var(--accent)}.studio-chip--warn{color:var(--ink);border-color:var(--diff-remove)}@supports (color:color-mix(in lab,red,red)){.studio-chip--warn{border-color:color-mix(in srgb,var(--diff-remove) 45%,var(--line))}}.studio-chip--warn .studio-chip__dot{background:var(--diff-remove)}.studio-presence{display:inline-flex;position:relative}.studio-presence__trigger{appearance:none;font:inherit;cursor:pointer}.studio-presence__trigger:hover{border-color:var(--line-2);color:var(--ink)}.studio-presence__backdrop{z-index:40;position:fixed;inset:0}.studio-presence__panel{z-index:50;border:1px solid var(--line);background:var(--elevated);width:min(320px,100vw - 24px);box-shadow:0 8px 24px var(--ink);border-radius:10px;padding:12px 12px 10px;position:absolute;top:calc(100% + 6px);right:0}@supports (color:color-mix(in lab,red,red)){.studio-presence__panel{box-shadow:0 8px 24px color-mix(in srgb,var(--ink) 12%,transparent)}}.studio-presence__panel{color:var(--ink)}.studio-presence__lead{font-size:var(--fs-caption);color:var(--muted);margin:0 0 10px;line-height:1.45}.studio-presence__list{gap:8px;margin:0;padding:0;list-style:none;display:grid}.studio-presence__item{border:1px solid var(--line);background:var(--panel);border-radius:8px;padding:8px 9px}.studio-presence__item-head{align-items:center;gap:8px;margin-bottom:2px;display:flex}.studio-presence__kind{font-size:var(--fs-caption);color:var(--ink);font-weight:600}.studio-presence__this{letter-spacing:.04em;text-transform:uppercase;color:var(--accent);font-size:10px;font-weight:700}.studio-presence__route{font-family:var(--font-mono);color:var(--muted);text-overflow:ellipsis;white-space:nowrap;font-size:11.5px;overflow:hidden}.studio-presence__meta{color:var(--faint);margin-top:2px;font-size:11px}.studio-presence__boundary{color:var(--faint);margin:10px 0 0;font-size:11px;line-height:1.45}.studio-surface{container-type:inline-size}.studio-surface__intro{gap:6px;max-width:680px;margin-bottom:22px;display:grid}.studio-surface__eyebrow{color:var(--accent);font-size:var(--fs-micro);letter-spacing:var(--tracking-micro);text-transform:uppercase;margin:0;font-weight:700}.studio-surface__title{color:var(--ink);margin:0;font-size:clamp(18px,2vw,24px);font-weight:650;line-height:1.2}.studio-surface__copy{color:var(--muted);font-size:var(--fs-body);margin:0;line-height:1.6}.studio-grid{grid-template-columns:repeat(auto-fit,minmax(min(100%,260px),1fr));gap:12px;display:grid}.studio-card,.studio-panel{border:1px solid var(--line);background:var(--panel);border-radius:8px}.studio-card{appearance:none;min-height:132px;color:inherit;text-align:left;align-content:start;gap:10px;padding:16px;display:grid}button.studio-card{cursor:pointer}button.studio-card:hover{border-color:var(--line-2);background:var(--panel)}@supports (color:color-mix(in lab,red,red)){button.studio-card:hover{background:color-mix(in srgb,var(--panel) 80%,var(--elevated))}}.studio-badge{border:1px solid var(--line-2);color:var(--faint);font-size:var(--fs-caption);border-radius:999px;justify-content:center;align-items:center;padding:2px 7px;line-height:1.2;display:inline-flex}.studio-button{appearance:none;border:1px solid var(--line);background:var(--elevated);min-height:32px;color:var(--ink);font:inherit;font-size:var(--fs-label);cursor:pointer;border-radius:7px;justify-content:center;align-items:center;padding:7px 11px;display:inline-flex}.studio-button:hover{border-color:var(--line-2)}.studio-button:disabled{cursor:default;opacity:.55}.studio-button--primary{border-color:var(--accent)}@supports (color:color-mix(in lab,red,red)){.studio-button--primary{border-color:color-mix(in srgb,var(--accent) 55%,var(--line))}}.studio-button--primary{color:var(--accent)}.studio-button--danger{color:var(--diff-remove)}.studio-panel{padding:16px}.studio-panel__title{color:var(--ink);margin:0 0 10px;font-size:14px;font-weight:650}.studio-empty{place-items:center;min-height:min(560px,70vh);display:grid!important}.studio-empty__panel{border:1px dashed var(--line-2);background:var(--panel);text-align:center;border-radius:8px;width:min(100%,520px);padding:28px}.studio__palette-backdrop{background:var(--bg);position:fixed;inset:0}@supports (color:color-mix(in lab,red,red)){.studio__palette-backdrop{background:color-mix(in srgb,var(--bg) 55%,transparent)}}.studio__palette-backdrop{-webkit-backdrop-filter:blur(2px);backdrop-filter:blur(2px);z-index:50;justify-content:center;align-items:flex-start;padding-top:14vh;display:flex}.studio__palette{background:var(--elevated);border:1px solid var(--line-2);border-radius:12px;width:100%;max-width:560px;overflow:hidden;box-shadow:0 18px 48px -12px #00000059}.studio__palette-cmd{border-bottom:1px solid var(--line);align-items:center;gap:9px;padding:12px 14px;display:flex}.studio__palette-input{color:var(--ink);font:inherit;background:0 0;border:none;outline:none;flex:1;font-size:14px}.studio__palette-input::placeholder{color:var(--faint)}.studio__palette-list{max-height:52vh;margin:0;padding:6px;list-style:none;overflow:auto}.studio__palette-item{text-align:left;appearance:none;width:100%;font:inherit;cursor:pointer;background:0 0;border:none;border-radius:8px;flex-direction:column;gap:2px;padding:9px 11px;display:flex}.studio__palette-item[data-active]{background:var(--accent-tint)}.studio__palette-label{color:var(--ink);font-size:13px;font-weight:500}.studio__palette-item[aria-current=page] .studio__palette-label:after{content:"current";text-transform:uppercase;letter-spacing:.04em;color:var(--accent);margin-left:8px;font-size:10px;font-weight:400}.studio__palette-blurb{color:var(--muted);font-size:12px;line-height:1.45}.studio__palette-empty{text-align:center;color:var(--faint);padding:16px;font-size:13px}.studio__palette-run .studio__palette-label{color:var(--accent)}.studio__palette-running{color:var(--muted);margin:0;padding:16px;font-size:13px}.studio__palette-error{color:var(--diff-remove);margin:0;padding:4px 16px 14px;font-size:12px;line-height:1.5}@media(max-width:760px){.studio__palette-backdrop{padding-top:8vh}.studio__palette{max-width:none;margin:0 12px}.ai-set__field{flex-direction:column;align-items:stretch}}@property --tw-rotate-x{syntax:"*";inherits:false}@property --tw-rotate-y{syntax:"*";inherits:false}@property --tw-rotate-z{syntax:"*";inherits:false}@property --tw-skew-x{syntax:"*";inherits:false}@property --tw-skew-y{syntax:"*";inherits:false}@property --tw-border-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-leading{syntax:"*";inherits:false}@property --tw-font-weight{syntax:"*";inherits:false}@property --tw-tracking{syntax:"*";inherits:false}@property --tw-ordinal{syntax:"*";inherits:false}@property --tw-slashed-zero{syntax:"*";inherits:false}@property --tw-numeric-figure{syntax:"*";inherits:false}@property --tw-numeric-spacing{syntax:"*";inherits:false}@property --tw-numeric-fraction{syntax:"*";inherits:false}@property --tw-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-shadow-color{syntax:"*";inherits:false}@property --tw-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-inset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-shadow-color{syntax:"*";inherits:false}@property --tw-inset-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-ring-color{syntax:"*";inherits:false}@property --tw-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-ring-color{syntax:"*";inherits:false}@property --tw-inset-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-ring-inset{syntax:"*";inherits:false}@property --tw-ring-offset-width{syntax:"<length>";inherits:false;initial-value:0}@property --tw-ring-offset-color{syntax:"*";inherits:false;initial-value:#fff}@property --tw-ring-offset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-outline-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-blur{syntax:"*";inherits:false}@property --tw-brightness{syntax:"*";inherits:false}@property --tw-contrast{syntax:"*";inherits:false}@property --tw-grayscale{syntax:"*";inherits:false}@property --tw-hue-rotate{syntax:"*";inherits:false}@property --tw-invert{syntax:"*";inherits:false}@property --tw-opacity{syntax:"*";inherits:false}@property --tw-saturate{syntax:"*";inherits:false}@property --tw-sepia{syntax:"*";inherits:false}@property --tw-drop-shadow{syntax:"*";inherits:false}@property --tw-drop-shadow-color{syntax:"*";inherits:false}@property --tw-drop-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-drop-shadow-size{syntax:"*";inherits:false}.studio-loading[data-astro-cid-w5sm6wlz]{margin:0;min-height:100vh;display:grid;place-items:center;background:#16161a;color:#a1a1aa;font:14px Inter,system-ui,sans-serif}