@pyric/cli 0.1.0-alpha.20 → 0.1.0-alpha.22

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (502) hide show
  1. package/README.md +64 -89
  2. package/dist/assurance/.generated/conformance-verdicts.d.ts +238 -1
  3. package/dist/assurance/.generated/conformance-verdicts.d.ts.map +1 -1
  4. package/dist/assurance/.generated/conformance-verdicts.js +238 -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/inlined-sdk-scanner.d.ts +6 -0
  71. package/dist/cli/inlined-sdk-scanner.d.ts.map +1 -0
  72. package/dist/cli/inlined-sdk-scanner.js +82 -0
  73. package/dist/cli/inlined-sdk-scanner.js.map +1 -0
  74. package/dist/cli/sandbox-interlock.d.ts +97 -0
  75. package/dist/cli/sandbox-interlock.d.ts.map +1 -0
  76. package/dist/cli/sandbox-interlock.js +112 -0
  77. package/dist/cli/sandbox-interlock.js.map +1 -0
  78. package/dist/cli/sandbox-runner.d.ts +20 -12
  79. package/dist/cli/sandbox-runner.d.ts.map +1 -1
  80. package/dist/cli/sandbox-runner.js +24 -21
  81. package/dist/cli/sandbox-runner.js.map +1 -1
  82. package/dist/cli/serve.d.ts +6 -10
  83. package/dist/cli/serve.d.ts.map +1 -1
  84. package/dist/cli/serve.js +57 -77
  85. package/dist/cli/serve.js.map +1 -1
  86. package/dist/cli/unsupported-runtime.d.ts +27 -0
  87. package/dist/cli/unsupported-runtime.d.ts.map +1 -0
  88. package/dist/cli/unsupported-runtime.js +63 -0
  89. package/dist/cli/unsupported-runtime.js.map +1 -0
  90. package/dist/conformance/.generated/can-i-use-browser.d.ts +1 -1
  91. package/dist/conformance/.generated/can-i-use-browser.d.ts.map +1 -1
  92. package/dist/conformance/.generated/can-i-use-browser.js +1 -1
  93. package/dist/conformance/.generated/can-i-use-browser.js.map +1 -1
  94. package/dist/conformance/.generated/can-i-use.d.ts +1 -1
  95. package/dist/conformance/.generated/can-i-use.d.ts.map +1 -1
  96. package/dist/conformance/.generated/can-i-use.js +1 -1
  97. package/dist/conformance/.generated/can-i-use.js.map +1 -1
  98. package/dist/conformance/.generated/conformance-docs.d.ts.map +1 -1
  99. package/dist/conformance/.generated/conformance-docs.js +1 -1
  100. package/dist/conformance/.generated/conformance-docs.js.map +1 -1
  101. package/dist/functions-rtdb/child.d.ts +37 -0
  102. package/dist/functions-rtdb/child.d.ts.map +1 -1
  103. package/dist/functions-rtdb/child.js +90 -21
  104. package/dist/functions-rtdb/child.js.map +1 -1
  105. package/dist/functions-rtdb/development-runtime.d.ts +3 -0
  106. package/dist/functions-rtdb/development-runtime.d.ts.map +1 -1
  107. package/dist/functions-rtdb/development-runtime.js +1 -0
  108. package/dist/functions-rtdb/development-runtime.js.map +1 -1
  109. package/dist/google-endpoints.d.ts +67 -0
  110. package/dist/google-endpoints.d.ts.map +1 -0
  111. package/dist/google-endpoints.js +119 -0
  112. package/dist/google-endpoints.js.map +1 -0
  113. package/dist/next/runtime-env.d.ts.map +1 -1
  114. package/dist/next/runtime-env.js +5 -0
  115. package/dist/next/runtime-env.js.map +1 -1
  116. package/dist/next/with-pyric.d.ts +1 -1
  117. package/dist/next/with-pyric.js +1 -1
  118. package/dist/register/beacon.d.ts +69 -0
  119. package/dist/register/beacon.d.ts.map +1 -0
  120. package/dist/register/beacon.js +199 -0
  121. package/dist/register/beacon.js.map +1 -0
  122. package/dist/register/index.d.ts.map +1 -1
  123. package/dist/register/index.js +65 -6
  124. package/dist/register/index.js.map +1 -1
  125. package/dist/register/net-guard.d.ts +110 -0
  126. package/dist/register/net-guard.d.ts.map +1 -0
  127. package/dist/register/net-guard.js +462 -0
  128. package/dist/register/net-guard.js.map +1 -0
  129. package/dist/serve/ai-diagnostics-relay.d.ts +63 -0
  130. package/dist/serve/ai-diagnostics-relay.d.ts.map +1 -0
  131. package/dist/serve/ai-diagnostics-relay.js +125 -0
  132. package/dist/serve/ai-diagnostics-relay.js.map +1 -0
  133. package/dist/serve/ai-proxy.d.ts +92 -0
  134. package/dist/serve/ai-proxy.d.ts.map +1 -0
  135. package/dist/serve/ai-proxy.js +269 -0
  136. package/dist/serve/ai-proxy.js.map +1 -0
  137. package/dist/serve/ai-status.d.ts +44 -0
  138. package/dist/serve/ai-status.d.ts.map +1 -0
  139. package/dist/serve/ai-status.js +77 -0
  140. package/dist/serve/ai-status.js.map +1 -0
  141. package/dist/serve/ai-terminal-blocks.d.ts +97 -0
  142. package/dist/serve/ai-terminal-blocks.d.ts.map +1 -0
  143. package/dist/serve/ai-terminal-blocks.js +128 -0
  144. package/dist/serve/ai-terminal-blocks.js.map +1 -0
  145. package/dist/serve/ai-terminal-text.d.ts +36 -0
  146. package/dist/serve/ai-terminal-text.d.ts.map +1 -0
  147. package/dist/serve/ai-terminal-text.js +48 -0
  148. package/dist/serve/ai-terminal-text.js.map +1 -0
  149. package/dist/serve/beacon-route.d.ts +53 -0
  150. package/dist/serve/beacon-route.d.ts.map +1 -0
  151. package/dist/serve/beacon-route.js +101 -0
  152. package/dist/serve/beacon-route.js.map +1 -0
  153. package/dist/serve/entries/active-auth-registry.d.ts +16 -0
  154. package/dist/serve/entries/active-auth-registry.d.ts.map +1 -0
  155. package/dist/serve/entries/active-auth-registry.js +48 -0
  156. package/dist/serve/entries/active-auth-registry.js.map +1 -0
  157. package/dist/serve/entries/active-auth.d.ts +18 -0
  158. package/dist/serve/entries/active-auth.d.ts.map +1 -0
  159. package/dist/serve/entries/active-auth.js +84 -0
  160. package/dist/serve/entries/active-auth.js.map +1 -0
  161. package/dist/serve/entries/auth-helper-core.d.ts +1 -0
  162. package/dist/serve/entries/auth-helper-core.d.ts.map +1 -1
  163. package/dist/serve/entries/auth-helper-core.js +4 -0
  164. package/dist/serve/entries/auth-helper-core.js.map +1 -1
  165. package/dist/serve/entries/auth-helper-dom.d.ts.map +1 -1
  166. package/dist/serve/entries/auth-helper-dom.js +28 -2
  167. package/dist/serve/entries/auth-helper-dom.js.map +1 -1
  168. package/dist/serve/entries/auth.d.ts.map +1 -1
  169. package/dist/serve/entries/auth.js +8 -0
  170. package/dist/serve/entries/auth.js.map +1 -1
  171. package/dist/serve/entries/bridge-url.d.ts +1 -1
  172. package/dist/serve/entries/bridge-url.js +1 -1
  173. package/dist/serve/entries/init.d.ts.map +1 -1
  174. package/dist/serve/entries/init.js +70 -4
  175. package/dist/serve/entries/init.js.map +1 -1
  176. package/dist/serve/entries/runtime.d.ts.map +1 -1
  177. package/dist/serve/entries/runtime.js +9 -0
  178. package/dist/serve/entries/runtime.js.map +1 -1
  179. package/dist/serve/namespace.d.ts +14 -5
  180. package/dist/serve/namespace.d.ts.map +1 -1
  181. package/dist/serve/namespace.js +57 -124
  182. package/dist/serve/namespace.js.map +1 -1
  183. package/dist/serve/runtime/chip-config.d.ts.map +1 -1
  184. package/dist/serve/runtime/chip-config.js +16 -2
  185. package/dist/serve/runtime/chip-config.js.map +1 -1
  186. package/dist/serve/runtime/chip-dialog.d.ts +18 -0
  187. package/dist/serve/runtime/chip-dialog.d.ts.map +1 -0
  188. package/dist/serve/runtime/chip-dialog.js +315 -0
  189. package/dist/serve/runtime/chip-dialog.js.map +1 -0
  190. package/dist/serve/runtime/chip-install.d.ts +2 -0
  191. package/dist/serve/runtime/chip-install.d.ts.map +1 -1
  192. package/dist/serve/runtime/chip-install.js +9 -4
  193. package/dist/serve/runtime/chip-install.js.map +1 -1
  194. package/dist/serve/runtime/chip-user-search.d.ts +16 -0
  195. package/dist/serve/runtime/chip-user-search.d.ts.map +1 -0
  196. package/dist/serve/runtime/chip-user-search.js +354 -0
  197. package/dist/serve/runtime/chip-user-search.js.map +1 -0
  198. package/dist/serve/runtime/chip.d.ts +10 -0
  199. package/dist/serve/runtime/chip.d.ts.map +1 -1
  200. package/dist/serve/runtime/chip.js +118 -15
  201. package/dist/serve/runtime/chip.js.map +1 -1
  202. package/dist/serve/runtime/identity.d.ts +17 -0
  203. package/dist/serve/runtime/identity.d.ts.map +1 -0
  204. package/dist/serve/runtime/identity.js +10 -0
  205. package/dist/serve/runtime/identity.js.map +1 -0
  206. package/dist/serve/sandbox-session.d.ts +7 -0
  207. package/dist/serve/sandbox-session.d.ts.map +1 -1
  208. package/dist/serve/sandbox-session.js +2 -0
  209. package/dist/serve/sandbox-session.js.map +1 -1
  210. package/dist/serve/site-ui/_astro/{RulesCodeEditor.XtDmHOlN.js → RulesCodeEditor.DsTAsKIa.js} +1 -1
  211. package/dist/serve/site-ui/_astro/app.CMmTxyhL.js +1 -0
  212. package/dist/serve/site-ui/_astro/app.DhALsVii.js +115 -0
  213. package/dist/serve/site-ui/_astro/{chess-showcase.B72XYeoh.js → chess-showcase.Bn_pP6UJ.js} +2 -2
  214. package/dist/serve/site-ui/_astro/{example-runtime.C25_lx6Z.js → example-runtime.CXopTGv7.js} +1 -1
  215. package/dist/serve/site-ui/_astro/sandbox-controls.rOuZTOUG.js +510 -0
  216. package/dist/serve/site-ui/_astro/{seed.Co0yUJY5.js → seed.lywYbXZ0.js} +2 -2
  217. package/dist/serve/site-ui/_astro/writes.BsPBG3dp.js +653 -0
  218. package/dist/serve/site-ui/auth/index.html +1 -1
  219. package/dist/serve/site-ui/docs/_rhythm/index.html +1 -1
  220. package/dist/serve/site-ui/docs/agent/set-up-your-agent/index.html +1 -1
  221. package/dist/serve/site-ui/docs/agent/watch-and-review/index.html +1 -1
  222. package/dist/serve/site-ui/docs/agent/work-with-an-agent/index.html +1 -1
  223. package/dist/serve/site-ui/docs/ai-compat/index.html +1 -1
  224. package/dist/serve/site-ui/docs/api-reference/index.html +8 -1
  225. package/dist/serve/site-ui/docs/api-reference.md +7 -0
  226. package/dist/serve/site-ui/docs/app-compat/index.html +1 -1
  227. package/dist/serve/site-ui/docs/auth-compat/index.html +3 -3
  228. package/dist/serve/site-ui/docs/auth-compat.md +2 -2
  229. package/dist/serve/site-ui/docs/build/ai-logic/index.html +6 -1
  230. package/dist/serve/site-ui/docs/build/ai-logic.md +6 -0
  231. package/dist/serve/site-ui/docs/build/authentication/index.html +2 -2
  232. package/dist/serve/site-ui/docs/build/authentication.md +1 -1
  233. package/dist/serve/site-ui/docs/build/cloud-firestore/index.html +4 -2
  234. package/dist/serve/site-ui/docs/build/cloud-firestore.md +4 -0
  235. package/dist/serve/site-ui/docs/build/cloud-messaging/index.html +1 -1
  236. package/dist/serve/site-ui/docs/build/cloud-storage/index.html +1 -1
  237. package/dist/serve/site-ui/docs/build/realtime-database/index.html +1 -1
  238. package/dist/serve/site-ui/docs/conformance-scores/index.html +14 -2
  239. package/dist/serve/site-ui/docs/conformance-scores.md +13 -1
  240. package/dist/serve/site-ui/docs/create-pyric-reference-api/index.html +1 -1
  241. package/dist/serve/site-ui/docs/database-compat/index.html +44 -44
  242. package/dist/serve/site-ui/docs/database-compat.md +43 -43
  243. package/dist/serve/site-ui/docs/examples/chess/index.html +1 -1
  244. package/dist/serve/site-ui/docs/examples/index.html +1 -1
  245. package/dist/serve/site-ui/docs/firestore-compat/index.html +4 -4
  246. package/dist/serve/site-ui/docs/firestore-compat.md +3 -3
  247. package/dist/serve/site-ui/docs/firestore-flutter-compat/index.html +319 -0
  248. package/dist/serve/site-ui/docs/firestore-flutter-compat.md +344 -0
  249. package/dist/serve/site-ui/docs/firestore-kotlin-compat/index.html +319 -0
  250. package/dist/serve/site-ui/docs/firestore-kotlin-compat.md +344 -0
  251. package/dist/serve/site-ui/docs/firestore-swift-compat/index.html +490 -0
  252. package/dist/serve/site-ui/docs/firestore-swift-compat.md +517 -0
  253. package/dist/serve/site-ui/docs/functions-rtdb-compat/index.html +1 -1
  254. package/dist/serve/site-ui/docs/get-started/backend-bundlers/index.html +105 -0
  255. package/dist/serve/site-ui/docs/get-started/backend-bundlers.md +165 -0
  256. package/dist/serve/site-ui/docs/get-started/flutter/index.html +98 -0
  257. package/dist/serve/site-ui/docs/get-started/flutter.md +105 -0
  258. package/dist/serve/site-ui/docs/get-started/how-the-swap-works/index.html +1 -1
  259. package/dist/serve/site-ui/docs/get-started/nextjs/index.html +1 -1
  260. package/dist/serve/site-ui/docs/get-started/start-building/index.html +1 -1
  261. package/dist/serve/site-ui/docs/get-started/vite/index.html +1 -1
  262. package/dist/serve/site-ui/docs/index.json +3211 -1471
  263. package/dist/serve/site-ui/docs/messaging-compat/index.html +1 -1
  264. package/dist/serve/site-ui/docs/observe/resolve-runtime-status/index.html +4 -3
  265. package/dist/serve/site-ui/docs/observe/resolve-runtime-status.md +3 -1
  266. package/dist/serve/site-ui/docs/observe/see-whats-happening/index.html +1 -1
  267. package/dist/serve/site-ui/docs/observe/shape-your-data/index.html +1 -1
  268. package/dist/serve/site-ui/docs/observe/switch-and-impersonate-identities/index.html +110 -0
  269. package/dist/serve/site-ui/docs/observe/switch-and-impersonate-identities.md +134 -0
  270. package/dist/serve/site-ui/docs/overview/index.html +1 -1
  271. package/dist/serve/site-ui/docs/pyric-admin-app-reference-api/index.html +1 -1
  272. package/dist/serve/site-ui/docs/pyric-admin-auth-reference-api/index.html +1 -1
  273. package/dist/serve/site-ui/docs/pyric-admin-database-reference-api/index.html +1 -1
  274. package/dist/serve/site-ui/docs/pyric-admin-firestore-reference-api/index.html +1 -1
  275. package/dist/serve/site-ui/docs/pyric-admin-messaging-reference-api/index.html +1 -1
  276. package/dist/serve/site-ui/docs/pyric-admin-reference-api/index.html +1 -1
  277. package/dist/serve/site-ui/docs/pyric-admin-storage-reference-api/index.html +1 -1
  278. package/dist/serve/site-ui/docs/pyric-ai-reference-api/index.html +1 -1
  279. package/dist/serve/site-ui/docs/pyric-ai-scripting-reference-api/index.html +1 -1
  280. package/dist/serve/site-ui/docs/pyric-analytics-reference-api/index.html +124 -0
  281. package/dist/serve/site-ui/docs/pyric-analytics-reference-api.md +287 -0
  282. package/dist/serve/site-ui/docs/pyric-app-check-reference-api/index.html +87 -0
  283. package/dist/serve/site-ui/docs/pyric-app-check-reference-api.md +199 -0
  284. package/dist/serve/site-ui/docs/pyric-app-reference-api/index.html +1 -1
  285. package/dist/serve/site-ui/docs/pyric-auth-reference-api/index.html +6 -2
  286. package/dist/serve/site-ui/docs/pyric-auth-reference-api.md +2 -1
  287. package/dist/serve/site-ui/docs/pyric-cli-assurance-browser-reference-api/index.html +1 -1
  288. package/dist/serve/site-ui/docs/pyric-cli-assurance-reference-api/index.html +1 -1
  289. package/dist/serve/site-ui/docs/pyric-cli-bridge-client-reference-api/index.html +2 -2
  290. package/dist/serve/site-ui/docs/pyric-cli-bridge-client-reference-api.md +1 -1
  291. package/dist/serve/site-ui/docs/pyric-cli-bridge-reference-api/index.html +1 -1
  292. package/dist/serve/site-ui/docs/pyric-cli-bundler-reference-api/index.html +56 -0
  293. package/dist/serve/site-ui/docs/pyric-cli-bundler-reference-api.md +72 -0
  294. package/dist/serve/site-ui/docs/pyric-cli-conformance-browser-reference-api/index.html +4 -1
  295. package/dist/serve/site-ui/docs/pyric-cli-conformance-browser-reference-api.md +3 -0
  296. package/dist/serve/site-ui/docs/pyric-cli-conformance-docs-reference-api/index.html +1 -1
  297. package/dist/serve/site-ui/docs/pyric-cli-conformance-reference-api/index.html +4 -1
  298. package/dist/serve/site-ui/docs/pyric-cli-conformance-reference-api.md +3 -0
  299. package/dist/serve/site-ui/docs/pyric-cli-credentials-node-reference-api/index.html +1 -1
  300. package/dist/serve/site-ui/docs/pyric-cli-discover-reference-api/index.html +1 -1
  301. package/dist/serve/site-ui/docs/pyric-cli-next-reference-api/index.html +2 -2
  302. package/dist/serve/site-ui/docs/pyric-cli-next-reference-api.md +1 -1
  303. package/dist/serve/site-ui/docs/pyric-cli-register-app-bridge-reference-api/index.html +1 -1
  304. package/dist/serve/site-ui/docs/pyric-cli-register-reference-api/index.html +1 -1
  305. package/dist/serve/site-ui/docs/pyric-cli-remote-reference-api/index.html +34 -9
  306. package/dist/serve/site-ui/docs/pyric-cli-remote-reference-api.md +16 -8
  307. package/dist/serve/site-ui/docs/pyric-cli-serve-worker-reference-api/index.html +133 -93
  308. package/dist/serve/site-ui/docs/pyric-cli-serve-worker-reference-api.md +61 -1
  309. package/dist/serve/site-ui/docs/pyric-cli-verify-reference-api/index.html +2 -2
  310. package/dist/serve/site-ui/docs/pyric-cli-verify-reference-api.md +1 -1
  311. package/dist/serve/site-ui/docs/pyric-cli-vite-reference-api/index.html +2 -2
  312. package/dist/serve/site-ui/docs/pyric-cli-vite-reference-api.md +2 -2
  313. package/dist/serve/site-ui/docs/pyric-database-reference-api/index.html +2 -2
  314. package/dist/serve/site-ui/docs/pyric-database-reference-api.md +1 -1
  315. package/dist/serve/site-ui/docs/pyric-firestore-lite-reference-api/index.html +559 -0
  316. package/dist/serve/site-ui/docs/pyric-firestore-lite-reference-api.md +1240 -0
  317. package/dist/serve/site-ui/docs/pyric-firestore-reference-api/index.html +40 -11
  318. package/dist/serve/site-ui/docs/pyric-firestore-reference-api.md +18 -8
  319. package/dist/serve/site-ui/docs/pyric-functions-reference-api/index.html +67 -0
  320. package/dist/serve/site-ui/docs/pyric-functions-reference-api.md +149 -0
  321. package/dist/serve/site-ui/docs/pyric-messaging-reference-api/index.html +1 -1
  322. package/dist/serve/site-ui/docs/pyric-messaging-sw-reference-api/index.html +1 -1
  323. package/dist/serve/site-ui/docs/pyric-performance-reference-api/index.html +35 -0
  324. package/dist/serve/site-ui/docs/pyric-performance-reference-api.md +69 -0
  325. package/dist/serve/site-ui/docs/pyric-remote-config-reference-api/index.html +132 -0
  326. package/dist/serve/site-ui/docs/pyric-remote-config-reference-api.md +307 -0
  327. package/dist/serve/site-ui/docs/pyric-rules-reference-api/index.html +1 -1
  328. package/dist/serve/site-ui/docs/pyric-sandbox-database-reference-api/index.html +52 -17
  329. package/dist/serve/site-ui/docs/pyric-sandbox-database-reference-api.md +48 -9
  330. package/dist/serve/site-ui/docs/pyric-sandbox-firestore-reference-api/index.html +1 -1
  331. package/dist/serve/site-ui/docs/pyric-sandbox-reference-api/index.html +239 -49
  332. package/dist/serve/site-ui/docs/pyric-sandbox-reference-api.md +148 -31
  333. package/dist/serve/site-ui/docs/pyric-storage-reference-api/index.html +22 -4
  334. package/dist/serve/site-ui/docs/pyric-storage-reference-api.md +25 -3
  335. package/dist/serve/site-ui/docs/pyric-ui-agents-reference-api/index.html +26 -96
  336. package/dist/serve/site-ui/docs/pyric-ui-agents-reference-api.md +20 -51
  337. package/dist/serve/site-ui/docs/pyric-ui-auth-hooks-reference-api/index.html +1 -1
  338. package/dist/serve/site-ui/docs/pyric-ui-auth-reference-api/index.html +2 -2
  339. package/dist/serve/site-ui/docs/pyric-ui-auth-reference-api.md +1 -1
  340. package/dist/serve/site-ui/docs/pyric-ui-events-hooks-reference-api/index.html +1 -1
  341. package/dist/serve/site-ui/docs/pyric-ui-events-reference-api/index.html +1 -1
  342. package/dist/serve/site-ui/docs/pyric-ui-firestore-hooks-reference-api/index.html +1 -1
  343. package/dist/serve/site-ui/docs/pyric-ui-firestore-reference-api/index.html +2 -2
  344. package/dist/serve/site-ui/docs/pyric-ui-firestore-reference-api.md +1 -1
  345. package/dist/serve/site-ui/docs/pyric-ui-primitives-reference-api/index.html +124 -26
  346. package/dist/serve/site-ui/docs/pyric-ui-primitives-reference-api.md +58 -5
  347. package/dist/serve/site-ui/docs/pyric-ui-rtdb-reference-api/index.html +1 -1
  348. package/dist/serve/site-ui/docs/pyric-ui-rules-hooks-reference-api/index.html +1 -1
  349. package/dist/serve/site-ui/docs/pyric-ui-rules-reference-api/index.html +1 -1
  350. package/dist/serve/site-ui/docs/pyric-ui-storage-hooks-reference-api/index.html +1 -1
  351. package/dist/serve/site-ui/docs/pyric-ui-storage-reference-api/index.html +4 -5
  352. package/dist/serve/site-ui/docs/pyric-ui-storage-reference-api.md +3 -4
  353. package/dist/serve/site-ui/docs/pyric-ui-traffic-hooks-reference-api/index.html +1 -1
  354. package/dist/serve/site-ui/docs/pyric-ui-traffic-reference-api/index.html +1 -1
  355. package/dist/serve/site-ui/docs/reference/cli/index.html +6 -3
  356. package/dist/serve/site-ui/docs/reference/cli.md +8 -2
  357. package/dist/serve/site-ui/docs/rules-compat/index.html +10 -2
  358. package/dist/serve/site-ui/docs/rules-compat.md +9 -1
  359. package/dist/serve/site-ui/docs/secure/audit-your-rules/index.html +1 -1
  360. package/dist/serve/site-ui/docs/secure/firestore-rules-limits/index.html +1 -1
  361. package/dist/serve/site-ui/docs/secure/read-a-denial/index.html +1 -1
  362. package/dist/serve/site-ui/docs/secure/rtdb-rules-in-typescript/index.html +1 -1
  363. package/dist/serve/site-ui/docs/secure/rules-standard-library/index.html +1 -1
  364. package/dist/serve/site-ui/docs/secure/secure-it-with-rules/index.html +1 -1
  365. package/dist/serve/site-ui/docs/secure/simulate-and-lint/index.html +1 -1
  366. package/dist/serve/site-ui/docs/secure/write-a-rules-test-suite/index.html +1 -1
  367. package/dist/serve/site-ui/docs/ship/ship-to-production/index.html +1 -1
  368. package/dist/serve/site-ui/docs/ship/test-in-node/index.html +1 -1
  369. package/dist/serve/site-ui/docs/storage-compat/index.html +13 -13
  370. package/dist/serve/site-ui/docs/storage-compat.md +12 -12
  371. package/dist/serve/site-ui/docs/trust/how-we-know-it-matches-firebase/index.html +1 -1
  372. package/dist/serve/site-ui/docs/trust/rules-standard-library/index.html +1 -1
  373. package/dist/serve/site-ui/docs/trust/versioning-and-compatibility/index.html +1 -1
  374. package/dist/serve/site-ui/docs/tutorial/index.html +1 -1
  375. package/dist/serve/site-ui/examples/chess/index.html +1 -1
  376. package/dist/serve/site-ui/firestore/index.html +1 -1
  377. package/dist/serve/site-ui/llms.txt +13 -0
  378. package/dist/serve/site-ui/rtdb/index.html +1 -1
  379. package/dist/serve/site-ui/settings/index.html +1 -1
  380. package/dist/serve/site-ui/storage/index.html +1 -1
  381. package/dist/serve/site-ui/studio/index.html +1 -1
  382. package/dist/serve/site-ui/traffic/index.html +1 -1
  383. package/dist/serve/studio/disk-workspace.d.ts.map +1 -1
  384. package/dist/serve/studio/disk-workspace.js +64 -2
  385. package/dist/serve/studio/disk-workspace.js.map +1 -1
  386. package/dist/serve/vite-plugin.d.ts +7 -7
  387. package/dist/serve/vite-plugin.js +1 -1
  388. package/dist/serve/vite-plugin.js.map +1 -1
  389. package/dist/serve/vite-sandbox-generation.d.ts.map +1 -1
  390. package/dist/serve/vite-sandbox-generation.js +12 -0
  391. package/dist/serve/vite-sandbox-generation.js.map +1 -1
  392. package/dist/serve/worker/client/auth.js +1 -2
  393. package/dist/serve/worker/client/auth.js.map +1 -1
  394. package/dist/serve/worker/client/core.d.ts +21 -1
  395. package/dist/serve/worker/client/core.d.ts.map +1 -1
  396. package/dist/serve/worker/client/core.js +79 -3
  397. package/dist/serve/worker/client/core.js.map +1 -1
  398. package/dist/serve/worker/client.d.ts +1 -1
  399. package/dist/serve/worker/client.d.ts.map +1 -1
  400. package/dist/serve/worker/client.js +1 -1
  401. package/dist/serve/worker/client.js.map +1 -1
  402. package/dist/serve/worker/context-resolver.d.ts +30 -0
  403. package/dist/serve/worker/context-resolver.d.ts.map +1 -0
  404. package/dist/serve/worker/context-resolver.js +44 -0
  405. package/dist/serve/worker/context-resolver.js.map +1 -0
  406. package/dist/serve/worker/entry.js +23 -19
  407. package/dist/serve/worker/entry.js.map +1 -1
  408. package/dist/serve/worker/host/core.d.ts +1 -0
  409. package/dist/serve/worker/host/core.d.ts.map +1 -1
  410. package/dist/serve/worker/host/core.js +12 -6
  411. package/dist/serve/worker/host/core.js.map +1 -1
  412. package/dist/serve/worker/host/storage.js +2 -2
  413. package/dist/serve/worker/host-auth.js +1 -2
  414. package/dist/serve/worker/host-auth.js.map +1 -1
  415. package/dist/serve/worker/index.d.ts +1 -1
  416. package/dist/serve/worker/index.d.ts.map +1 -1
  417. package/dist/serve/worker/index.js +2 -2
  418. package/dist/serve/worker/index.js.map +1 -1
  419. package/dist/serve/worker/port-lifecycle.d.ts +18 -0
  420. package/dist/serve/worker/port-lifecycle.d.ts.map +1 -0
  421. package/dist/serve/worker/port-lifecycle.js +28 -0
  422. package/dist/serve/worker/port-lifecycle.js.map +1 -0
  423. package/dist/serve/worker/serve-init.d.ts.map +1 -1
  424. package/dist/serve/worker/serve-init.js +8 -2
  425. package/dist/serve/worker/serve-init.js.map +1 -1
  426. package/dist/verify/fixture.d.ts +1 -1
  427. package/package.json +16 -5
  428. package/src/assurance/.generated/conformance-verdicts.ts +238 -1
  429. package/src/bridge/client/dispatch.ts +52 -56
  430. package/src/bridge/client/tool-family-factories.ts +34 -0
  431. package/src/bridge/server/mcp-contract.ts +15 -59
  432. package/src/bridge/server/peer.ts +24 -1
  433. package/src/bridge/server/tool-family-factories.ts +40 -0
  434. package/src/bridge/server/tool-metadata.ts +29 -61
  435. package/src/bridge/tool-families.generated.ts +17 -0
  436. package/src/bridge/tool-families.ts +87 -0
  437. package/src/bridge/tool-family-records/conformance.ts +6 -0
  438. package/src/bridge/tool-family-records/firestore-data.ts +15 -0
  439. package/src/bridge/tool-family-records/firestore-inspect.ts +6 -0
  440. package/src/bridge/tool-family-records/firestore-rules.ts +15 -0
  441. package/src/bridge/tool-family-records/firestore-simulator.ts +16 -0
  442. package/src/bridge/tool-family-records/rtdb-inspection.ts +6 -0
  443. package/src/bundler/externals.ts +55 -0
  444. package/src/bundler/index.ts +21 -0
  445. package/src/cli/cli.test.ts +0 -44
  446. package/src/cli/inlined-sdk-scanner.ts +77 -0
  447. package/src/cli/sandbox-interlock.ts +167 -0
  448. package/src/cli/sandbox-runner.ts +37 -26
  449. package/src/cli/serve.ts +68 -69
  450. package/src/cli/unsupported-runtime.ts +68 -0
  451. package/src/conformance/.generated/can-i-use-browser.ts +2 -2
  452. package/src/conformance/.generated/can-i-use.ts +2 -2
  453. package/src/conformance/.generated/conformance-docs.ts +1 -1
  454. package/src/functions-rtdb/child.ts +115 -21
  455. package/src/functions-rtdb/development-runtime.ts +4 -0
  456. package/src/google-endpoints.ts +155 -0
  457. package/src/next/runtime-env.ts +5 -0
  458. package/src/next/with-pyric.ts +1 -1
  459. package/src/register/beacon.ts +232 -0
  460. package/src/register/index.ts +68 -6
  461. package/src/register/net-guard.ts +567 -0
  462. package/src/serve/ai-diagnostics-relay.ts +243 -0
  463. package/src/serve/ai-proxy.ts +327 -0
  464. package/src/serve/ai-status.ts +109 -0
  465. package/src/serve/ai-terminal-blocks.ts +210 -0
  466. package/src/serve/ai-terminal-text.ts +52 -0
  467. package/src/serve/beacon-route.ts +141 -0
  468. package/src/serve/entries/active-auth-registry.ts +56 -0
  469. package/src/serve/entries/active-auth.ts +100 -0
  470. package/src/serve/entries/auth-helper-core.ts +5 -0
  471. package/src/serve/entries/auth-helper-dom.ts +26 -2
  472. package/src/serve/entries/auth.ts +8 -0
  473. package/src/serve/entries/bridge-url.ts +1 -1
  474. package/src/serve/entries/init.ts +78 -3
  475. package/src/serve/entries/runtime.ts +10 -0
  476. package/src/serve/namespace.ts +73 -140
  477. package/src/serve/runtime/chip-config.ts +16 -2
  478. package/src/serve/runtime/chip-dialog.ts +366 -0
  479. package/src/serve/runtime/chip-install.ts +10 -4
  480. package/src/serve/runtime/chip-user-search.ts +391 -0
  481. package/src/serve/runtime/chip.ts +140 -15
  482. package/src/serve/runtime/identity.ts +26 -0
  483. package/src/serve/sandbox-session.ts +9 -0
  484. package/src/serve/studio/disk-workspace.ts +76 -2
  485. package/src/serve/vite-plugin.ts +8 -8
  486. package/src/serve/vite-sandbox-generation.ts +15 -0
  487. package/src/serve/worker/client/auth.ts +1 -1
  488. package/src/serve/worker/client/core.ts +80 -3
  489. package/src/serve/worker/client.ts +1 -1
  490. package/src/serve/worker/context-resolver.ts +60 -0
  491. package/src/serve/worker/entry.ts +22 -18
  492. package/src/serve/worker/host/core.ts +9 -7
  493. package/src/serve/worker/host/storage.ts +2 -2
  494. package/src/serve/worker/host-auth.ts +1 -1
  495. package/src/serve/worker/index.ts +4 -1
  496. package/src/serve/worker/port-lifecycle.ts +45 -0
  497. package/src/serve/worker/serve-init.ts +9 -2
  498. package/src/verify/fixture.ts +1 -1
  499. package/dist/serve/site-ui/_astro/app.B52xr-DK.js +0 -1
  500. package/dist/serve/site-ui/_astro/app.DWBraPUw.js +0 -12
  501. package/dist/serve/site-ui/_astro/sandbox-controls.DEpnKg-O.js +0 -1169
  502. package/dist/serve/site-ui/_astro/writes.rpjrFzmu.js +0 -102
@@ -5,21 +5,36 @@
5
5
  * only; in fallback mode it mints credentials via `createSignInCredential`
6
6
  * so OAuth users carry real provider metadata.
7
7
  */
8
- import { getAuth, sandbox as authSandbox } from 'pyric/auth';
8
+ import {
9
+ getAuth,
10
+ sandbox as authSandbox,
11
+ } from 'pyric/auth';
9
12
  import {
10
13
  getAuth as getWorkerAuth,
11
14
  listUsers,
15
+ setLens,
12
16
  } from '../worker/client.js';
17
+ import {
18
+ switchAllAuthUsers,
19
+ signOutAllAuths,
20
+ commitCredentialToAllAuths,
21
+ getActiveAuthUser,
22
+ subscribeToActiveAuth,
23
+ registerActiveAuth,
24
+ } from './active-auth.js';
13
25
  import { sandbox } from './runtime.js';
14
26
  import { useWorker, workerDb } from './worker-runtime.js';
15
- import { ServeAuthHelper } from './auth-helper-core.js';
27
+ import { ServeAuthHelper, customClaimsFromTokenClaims } from './auth-helper-core.js';
16
28
  import { installServeAuthResolver } from './auth-helper-runtime.js';
17
29
  import { mountAuthHelperDialog } from './auth-helper-dom.js';
18
30
  import { installPyricRuntimeChip } from '../runtime/chip-install.js';
19
31
  import { getPyricRuntimeStatus } from '../runtime/status.js';
32
+ import { projectRuntimeIdentity } from '../runtime/identity.js';
20
33
 
21
34
  const localAuth = useWorker ? null : getAuth(sandbox);
22
35
  const workerAuth = useWorker && workerDb ? getWorkerAuth(workerDb) : null;
36
+ if (workerAuth) registerActiveAuth(workerAuth);
37
+ if (localAuth) registerActiveAuth(localAuth);
23
38
  const helper = workerAuth
24
39
  ? new ServeAuthHelper({
25
40
  list: async () => (await listUsers(workerAuth)).map((user) => ({
@@ -56,7 +71,67 @@ if (localAuth) authSandbox.setAuthFlowResolver(localAuth, resolver);
56
71
 
57
72
  if (typeof document !== 'undefined' && typeof window !== 'undefined') {
58
73
  mountAuthHelperDialog(helper);
59
- installPyricRuntimeChip({ runtime: getPyricRuntimeStatus(), document });
74
+ installPyricRuntimeChip({
75
+ runtime: getPyricRuntimeStatus(),
76
+ document,
77
+ identity: {
78
+ listUsers: async () => {
79
+ if (workerAuth) {
80
+ return listUsers(workerAuth);
81
+ }
82
+ if (localAuth) {
83
+ return authSandbox.listUsers(localAuth);
84
+ }
85
+ return [];
86
+ },
87
+ switchUser: async (uid: string) => {
88
+ await switchAllAuthUsers(uid);
89
+ setLens(undefined);
90
+ },
91
+ signOut: async () => {
92
+ await signOutAllAuths();
93
+ setLens(undefined);
94
+ },
95
+ openCreateUser: async () => {
96
+ try {
97
+ const cred = await helper.promptCreateUser('password');
98
+ const tokenResult = await cred.user.getIdTokenResult();
99
+ const customClaims = customClaimsFromTokenClaims(
100
+ (tokenResult.claims ?? {}) as Record<string, unknown>,
101
+ );
102
+ const identity = {
103
+ uid: cred.user.uid,
104
+ email: cred.user.email,
105
+ displayName: cred.user.displayName,
106
+ customClaims,
107
+ providerId: 'password',
108
+ };
109
+ await commitCredentialToAllAuths(identity);
110
+ await switchAllAuthUsers(identity.uid);
111
+ setLens(undefined);
112
+ } catch (err) {
113
+ console.error('[pyric] openCreateUser error:', err);
114
+ }
115
+ },
116
+ getCurrentUser: () => {
117
+ const active = getActiveAuthUser();
118
+ if (active) return active;
119
+ if (workerAuth?.currentUser) {
120
+ return projectRuntimeIdentity(workerAuth.currentUser);
121
+ }
122
+ if (localAuth?.currentUser) {
123
+ return projectRuntimeIdentity(localAuth.currentUser);
124
+ }
125
+ return null;
126
+ },
127
+ subscribeAuth: (listener) => {
128
+ const unsubActive = subscribeToActiveAuth((user) => {
129
+ listener(projectRuntimeIdentity(user));
130
+ });
131
+ return unsubActive;
132
+ },
133
+ },
134
+ });
60
135
  }
61
136
 
62
137
  export {};
@@ -34,6 +34,7 @@ import { toPageOriginWsUrl } from './bridge-url.js';
34
34
  import { buildVerifyFixture } from '../../verify/fixture.js';
35
35
  import type { InitPayload } from '../init-payload.js';
36
36
  import { setupFirebaseActivityGuard } from '../activity-guard.js';
37
+ import { setupAiDiagnosticsRelay } from '../ai-diagnostics-relay.js';
37
38
  import { getPyricRuntimeStatus } from '../runtime/status.js';
38
39
  export { sandbox } from './app-backend.js';
39
40
  import { sandbox } from './app-backend.js';
@@ -391,6 +392,15 @@ if (!useWorker && activityTokenFromPayload) {
391
392
  );
392
393
  }
393
394
 
395
+ // Same plane split for the AI broker's diagnostics: an in-page sandbox runs
396
+ // its own broker, so its `request_rejected`, `response_blocked`, and
397
+ // `model_substituted` events need the same relay to reach the dev terminal.
398
+ // Unlike the activity guard this needs no capability token (the denial relay
399
+ // it rides carries none).
400
+ if (!useWorker) {
401
+ setupAiDiagnosticsRelay({ subscribe: (listener) => sandbox.onEvent(listener) }, fetch);
402
+ }
403
+
394
404
  // ── provenance (flow doc section 3a): make the shim's presence unmistakable.
395
405
  // Source says `firebase/*`; what runs is the pyric sandbox — say so loudly
396
406
  // once, and explain any stack frame that points into /__pyric/sdk/. ────────
@@ -6,6 +6,8 @@
6
6
  * the injected init script + shared chunks)
7
7
  * /__pyric/init.json the page init payload (rules, bridge URL) —
8
8
  * fetched by the runtime chunk at module init
9
+ * /__pyric/beacon the handshake beacon a pyric-launched child
10
+ * POSTs once its interception is installed
9
11
  *
10
12
  * Bridge routes (`/__pyric/mcp`, `/__pyric/sandbox`) mount here in P2.
11
13
  */
@@ -21,7 +23,11 @@ import { createStudioRoutes, type StudioRouteOptions } from './studio/index.js';
21
23
  import { pipeFileToResponse, getHeader, isAllowedHost, isAllowedOrigin, type ServeLogger } from './server.js';
22
24
  import type { InitPayload } from './init-payload.js';
23
25
  import { handleActivity } from './activity-route.js';
26
+ import { handleAiProxy, AI_PROXY_ROUTE } from './ai-proxy.js';
27
+ import { aiTerminalBlockFor, type AiDiagnosticPayload } from './ai-terminal-blocks.js';
24
28
  import { createSiteTreeHandler } from './site-tree.js';
29
+ import { BEACON_PATH, type BeaconReport } from '../register/beacon.js';
30
+ import { handleBeacon } from './beacon-route.js';
25
31
  export type { InitPayload } from './init-payload.js';
26
32
 
27
33
  /**
@@ -119,138 +125,22 @@ export interface NamespaceOptions {
119
125
  * (local Ollama). Always mounted — the route only touches the network
120
126
  * when a request arrives. */
121
127
  aiProxyUpstream?: string;
122
- /** Where hot-reload/diagnostic lines print (rules reload, denial relay).
123
- * Absent diagnostics are dropped (a caller that wires no logger opts out
124
- * silently rather than falling back to raw `console`). */
128
+ /** Receives one handshake beacon per pyric-launched child (`POST
129
+ * /__pyric/beacon`, sent by `@pyric/cli/register` once its hooks and
130
+ * net-guard are installed). Absent means the route still 204s; the child
131
+ * must never be able to fail on its own proof-of-life. */
132
+ beacon?: (report: BeaconReport) => void;
133
+ /** The per-launch secret a beacon must present in `x-pyric-beacon-token`,
134
+ * which the launcher puts in the child's `PYRIC_BEACON_TOKEN`. Absent means
135
+ * one is generated that nobody holds, so the route accepts nothing. */
136
+ beaconToken?: string;
137
+ /** Where hot-reload/diagnostic lines print (rules reload, denial relay,
138
+ * AI broker diagnostics, ai-proxy upstream failures). Absent ⇒ diagnostics
139
+ * are dropped (a caller that wires no logger opts out silently rather than
140
+ * falling back to raw `console`). */
125
141
  logger?: ServeLogger;
126
142
  }
127
143
 
128
- // ─── AI proxy (`/__pyric/ai-proxy` — pyric/ai, cdd-deltas #98.2) ───────────
129
-
130
- /** Default upstream: local Ollama's OpenAI-compatible endpoint. */
131
- export const AI_PROXY_DEFAULT_UPSTREAM = 'http://localhost:11434/v1';
132
-
133
- /**
134
- * Request headers that must NOT be forwarded upstream: origin-sensitive
135
- * browser context (`origin`/`referer`/`cookie` — the upstream is a different
136
- * origin and must never see the page's), hop-by-hop headers, and the two the
137
- * proxy re-derives (`host`, `content-length`). `accept-encoding` is dropped
138
- * so fetch negotiates its own compression and the streamed body needs no
139
- * length fixups.
140
- */
141
- const AI_PROXY_STRIPPED_HEADERS = new Set([
142
- 'host',
143
- 'origin',
144
- 'referer',
145
- 'cookie',
146
- 'connection',
147
- 'content-length',
148
- 'accept-encoding',
149
- 'keep-alive',
150
- 'proxy-authorization',
151
- 'te',
152
- 'trailer',
153
- 'transfer-encoding',
154
- 'upgrade',
155
- ]);
156
-
157
- /**
158
- * Handle `POST /__pyric/ai-proxy/<suffix>` — a same-origin passthrough to the
159
- * configured OpenAI-compatible upstream, so the browser openai engine
160
- * (running in the served page or the SharedWorker host) reaches a localhost
161
- * upstream like Ollama with ZERO CORS setup (no `OLLAMA_ORIGINS`, ever).
162
- *
163
- * Behavior:
164
- * - POST only (the OpenAI chat-completions surface is POST); 405 otherwise.
165
- * - the path suffix + query ride through verbatim
166
- * (`/__pyric/ai-proxy/chat/completions` → `<upstream>/chat/completions`).
167
- * - the request body is forwarded verbatim; headers minus the
168
- * origin-sensitive/hop-by-hop set above (`authorization` DOES forward —
169
- * upstreams may require a key).
170
- * - the response body is STREAMED through chunk-by-chunk — SSE passthrough
171
- * must never buffer, or `stream: true` completions would arrive all at
172
- * once at the end.
173
- * - an unreachable upstream answers 502 with a plain-text explanation.
174
- */
175
- async function handleAiProxy(
176
- configuredUpstream: string | undefined,
177
- req: IncomingMessage,
178
- res: ServerResponse,
179
- url: URL,
180
- ): Promise<void> {
181
- if (req.method !== 'POST') {
182
- res.writeHead(405, { allow: 'POST' }).end('method not allowed');
183
- return;
184
- }
185
- const upstreamBase = (
186
- configuredUpstream ??
187
- process.env.PYRIC_AI_PROXY_UPSTREAM ??
188
- AI_PROXY_DEFAULT_UPSTREAM
189
- ).replace(/\/$/, '');
190
- const suffix = url.pathname.slice('/__pyric/ai-proxy'.length);
191
- const target = `${upstreamBase}${suffix}${url.search}`;
192
-
193
- // Buffer the REQUEST body (small JSON payloads); the RESPONSE streams.
194
- const raw = await new Promise<Buffer>((resolve, reject) => {
195
- const chunks: Buffer[] = [];
196
- req.on('data', (c: Buffer) => chunks.push(c));
197
- req.on('end', () => resolve(Buffer.concat(chunks)));
198
- req.on('error', reject);
199
- });
200
- // Copy into a plain-ArrayBuffer view — fetch's BodyInit typing rejects
201
- // Buffer's ArrayBufferLike backing.
202
- const body = new Uint8Array(raw.byteLength);
203
- body.set(raw);
204
-
205
- const headers: Record<string, string> = {};
206
- for (const [key, value] of Object.entries(req.headers)) {
207
- if (value === undefined) continue;
208
- if (AI_PROXY_STRIPPED_HEADERS.has(key.toLowerCase())) continue;
209
- headers[key] = Array.isArray(value) ? value.join(', ') : value;
210
- }
211
-
212
- let upstream: Response;
213
- try {
214
- upstream = await fetch(target, { method: 'POST', headers, body });
215
- } catch (e) {
216
- res.writeHead(502, { 'content-type': 'text/plain' });
217
- res.end(
218
- `pyric dev ai-proxy: upstream ${target} unreachable: ` +
219
- `${e instanceof Error ? e.message : String(e)}\n` +
220
- 'Set PYRIC_AI_PROXY_UPSTREAM to an OpenAI-compatible base URL ' +
221
- `(default ${AI_PROXY_DEFAULT_UPSTREAM}).`,
222
- );
223
- return;
224
- }
225
-
226
- const responseHeaders: Record<string, string> = { 'cache-control': 'no-store' };
227
- const contentType = upstream.headers.get('content-type');
228
- if (contentType) responseHeaders['content-type'] = contentType;
229
- res.writeHead(upstream.status, responseHeaders);
230
- if (!upstream.body) {
231
- res.end();
232
- return;
233
- }
234
- (res as ServerResponse & { flushHeaders?: () => void }).flushHeaders?.();
235
-
236
- // Chunk-by-chunk passthrough. A dropped client cancels the upstream read
237
- // so an abandoned SSE stream doesn't keep the upstream generating.
238
- const reader = upstream.body.getReader();
239
- res.on('close', () => {
240
- void reader.cancel().catch(() => {});
241
- });
242
- try {
243
- for (;;) {
244
- const { done, value } = await reader.read();
245
- if (done) break;
246
- res.write(value);
247
- }
248
- } catch {
249
- // Upstream or client dropped mid-stream — nothing to salvage.
250
- }
251
- res.end();
252
- }
253
-
254
144
  /** The page's persistence backend speaks this route:
255
145
  * GET /__pyric/state → whole envelope (404 when absent)
256
146
  * GET /__pyric/state?section=firestore → that section (404 when null)
@@ -390,6 +280,18 @@ async function handleCapture(
390
280
  // An agent driving `pyric dev` headlessly has no browser console to watch;
391
281
  // this is that visibility, printed to the terminal instead.
392
282
  //
283
+ // The route carries the AI broker's diagnostics on the same channel, relayed
284
+ // by `serve/ai-diagnostics-relay.ts` off the sandbox event stream:
285
+ // `request_rejected` (a malformed request) and `response_blocked` (a safety
286
+ // or recitation filter withheld the answer). Same category ("the sandbox
287
+ // refused your operation"), same terminal treatment, same throttle, so they
288
+ // ride here rather than opening parallel diagnostics channels.
289
+ // `model_substituted` (an engine answered as a model the code never named)
290
+ // rides along too: not a refusal, but the same "the sandbox quietly did
291
+ // something else" category. The payload's `kind` discriminates the four, and
292
+ // `ai-terminal-blocks.ts` holds one record per AI kind so this route
293
+ // dispatches through a table instead of a cascade.
294
+ //
393
295
  // A denied listener re-fires on every auth/rules change, so printing is
394
296
  // throttled per (path, message) pair — at most one line per window, and
395
297
  // silent (no output at all) on suppression rather than a "suppressed N more"
@@ -449,9 +351,21 @@ export function formatDenialBlock(payload: DenialRelayPayload): string {
449
351
  return lines.join('\n');
450
352
  }
451
353
 
452
- /** Handle `POST /__pyric/denials`. Always 204s (best-effort diagnostics —
453
- * a malformed body or a caller with no logger wired must never fail the
454
- * page that reported the denial). */
354
+ /**
355
+ * The throttle key separator: a NUL byte, written as an escape so the file
356
+ * stays greppable. It cannot occur in a Firestore path, a model id, or a
357
+ * rejection reason, so no (target, reason) pair can be spelled two ways.
358
+ */
359
+ const THROTTLE_KEY_SEPARATOR = '\x00';
360
+
361
+ /** Handle `POST /__pyric/denials`: a rules denial, or (discriminated by
362
+ * `kind`) an AI broker rejection, blocked response, or model substitution
363
+ * relayed off the sandbox event stream. All four share the throttle map: an
364
+ * agent retry loop re-sends the SAME malformed (or filter-tripping) AI
365
+ * request exactly the way a denied listener re-fires, so one line per
366
+ * (target, reason) per window is the right volume for every one of them.
367
+ * Always 204s (best-effort diagnostics: a malformed body or a caller with no
368
+ * logger wired must never fail the page that reported the refusal). */
455
369
  async function handleDenials(
456
370
  throttle: DenialThrottle,
457
371
  logger: ServeLogger | undefined,
@@ -463,15 +377,26 @@ async function handleDenials(
463
377
  return;
464
378
  }
465
379
  try {
466
- const payload = (await collectBody(req)) as DenialRelayPayload;
467
- const message = typeof payload.message === 'string' ? payload.message : 'permission denied';
468
- const path = payload.denialContext?.request?.path ?? '';
469
- const key = `${path}${message}`;
380
+ const payload = (await collectBody(req)) as DenialRelayPayload & AiDiagnosticPayload;
381
+ const aiBlock = aiTerminalBlockFor(payload.kind);
382
+ let target: string;
383
+ let reason: string;
384
+ let render: () => string;
385
+ if (aiBlock === null) {
386
+ target = payload.denialContext?.request?.path ?? '';
387
+ reason = typeof payload.message === 'string' ? payload.message : 'permission denied';
388
+ render = () => formatDenialBlock(payload);
389
+ } else {
390
+ target = aiBlock.throttleTarget(payload);
391
+ reason = aiBlock.throttleReason(payload);
392
+ render = () => aiBlock.format(payload);
393
+ }
394
+ const key = `${target}${THROTTLE_KEY_SEPARATOR}${reason}`;
470
395
  if (logger && throttle.shouldPrint(key, Date.now())) {
471
- logger.note(formatDenialBlock(payload));
396
+ logger.note(render());
472
397
  }
473
398
  } catch {
474
- /* malformed body drop it; this is a diagnostics side channel */
399
+ /* malformed body: drop it; this is a diagnostics side channel */
475
400
  }
476
401
  res.writeHead(204).end();
477
402
  }
@@ -480,6 +405,9 @@ export function createPyricNamespace(opts: NamespaceOptions) {
480
405
  const stateWriterLock = createWriterLock();
481
406
  const studioWriterLock = opts.studio?.writerLock ?? createWriterLock();
482
407
  const sessionToken = opts.sessionToken ?? randomBytes(24).toString('base64url');
408
+ // Fail closed: with no launcher-supplied secret the generated one is held by
409
+ // nobody, so `/__pyric/beacon` accepts nothing rather than everything.
410
+ const beaconToken = opts.beaconToken ?? randomBytes(24).toString('base64url');
483
411
  let studioRoutes: ((req: IncomingMessage, res: ServerResponse, url: URL) => Promise<boolean>) | null = null;
484
412
  if (opts.studio) {
485
413
  const studioOptions: StudioRouteOptions = {
@@ -534,8 +462,13 @@ export function createPyricNamespace(opts: NamespaceOptions) {
534
462
  opts.events.handle(req, res);
535
463
  return true;
536
464
  }
537
- if (url.pathname === '/__pyric/ai-proxy' || url.pathname.startsWith('/__pyric/ai-proxy/')) {
538
- return handleAiProxy(opts.aiProxyUpstream, req, res, url).then(() => true);
465
+ if (url.pathname === AI_PROXY_ROUTE || url.pathname.startsWith(`${AI_PROXY_ROUTE}/`)) {
466
+ return handleAiProxy(opts.aiProxyUpstream, denialThrottle, req, res, url, opts.logger).then(
467
+ () => true,
468
+ );
469
+ }
470
+ if (url.pathname === BEACON_PATH) {
471
+ return handleBeacon({ token: beaconToken, onBeacon: opts.beacon }, req, res).then(() => true);
539
472
  }
540
473
  if (url.pathname === '/__pyric/denials') {
541
474
  return handleDenials(denialThrottle, opts.logger, req, res).then(() => true);
@@ -17,8 +17,22 @@ interface RuntimeChipDocument {
17
17
  querySelector(selector: string): { getAttribute(name: string): string | null } | null;
18
18
  }
19
19
 
20
+ /** Read the browser-inlined chip value, preferring the `NEXT_PUBLIC_`-prefixed
21
+ * name (the only one Next.js is guaranteed to expose to client bundles) and
22
+ * falling back to the unprefixed name for other bundlers/back-compat. */
23
+ function bundlerRuntimeChipValue(): string | undefined {
24
+ if (typeof process === 'undefined' || typeof process.env === 'undefined') return undefined;
25
+ if (typeof process.env.NEXT_PUBLIC_PYRIC_RUNTIME_CHIP === 'string') {
26
+ return process.env.NEXT_PUBLIC_PYRIC_RUNTIME_CHIP;
27
+ }
28
+ if (typeof process.env.PYRIC_RUNTIME_CHIP === 'string') {
29
+ return process.env.PYRIC_RUNTIME_CHIP;
30
+ }
31
+ return undefined;
32
+ }
33
+
20
34
  function hasBundlerRuntimeChipConfig(): boolean {
21
- return typeof process !== 'undefined' && typeof process.env !== 'undefined' && typeof process.env.PYRIC_RUNTIME_CHIP === 'string';
35
+ return bundlerRuntimeChipValue() !== undefined;
22
36
  }
23
37
 
24
38
  /** Read plugin-authored values from DOM metadata or bundler environment variables, defaulting to collapsed UI when omitted. */
@@ -31,7 +45,7 @@ export function readPyricRuntimeChipConfig(
31
45
 
32
46
  const shouldFallbackToEnv = !hasMetaTag && hasBundlerRuntimeChipConfig();
33
47
  if (shouldFallbackToEnv) {
34
- value = process.env.PYRIC_RUNTIME_CHIP as string;
48
+ value = bundlerRuntimeChipValue() as string;
35
49
  }
36
50
  if (value === 'off') {
37
51
  return null;