@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
@@ -0,0 +1,167 @@
1
+ /**
2
+ * The interlock: the launcher's statement about interception in the child it
3
+ * is about to start, plus the warn-only watchdog for the child's answer.
4
+ *
5
+ * The status line is knowable synchronously from the env `pyric sandbox` just
6
+ * assembled: guard mode, whether NODE_OPTIONS really carries the register
7
+ * import, and where the child's handshake beacon will land. The watchdog is
8
+ * the other half: a child still alive well after launch that never posted a
9
+ * beacon is probably not intercepted.
10
+ */
11
+ import { beaconEndpoint } from '../register/beacon.js';
12
+ import { parseGuardMode, type GuardMode } from '../register/net-guard.js';
13
+ import { detectUnsupportedRuntime, formatUnsupportedRuntimeWarning } from './unsupported-runtime.js';
14
+
15
+ /**
16
+ * What `pyric sandbox` can say about the interception it is about to hand the
17
+ * child, entirely from the env it just assembled: no waiting, no round trip.
18
+ */
19
+ export interface InterlockStatus {
20
+ /** Net-guard mode the child will run under (`PYRIC_GUARD`, default warn). */
21
+ readonly guard: GuardMode;
22
+ /** Whether `NODE_OPTIONS` actually carries the register `--import`. */
23
+ readonly registerImported: boolean;
24
+ /** Where the child's handshake beacon will land, or null when the
25
+ * activator carries no bridge URL. */
26
+ readonly beacon: string | null;
27
+ }
28
+
29
+ /**
30
+ * Read the interlock off the child env. Everything here is synchronous by
31
+ * construction: it is a statement about the launch, printed before anything at
32
+ * runtime has had a chance to go wrong.
33
+ */
34
+ export function describeInterlock(
35
+ childEnv: NodeJS.ProcessEnv,
36
+ registerUrl: string,
37
+ ): InterlockStatus {
38
+ return {
39
+ guard: parseGuardMode(childEnv.PYRIC_GUARD),
40
+ registerImported: (childEnv.NODE_OPTIONS ?? '').includes(`--import ${registerUrl}`),
41
+ beacon: beaconEndpoint(childEnv.PYRIC_SANDBOX),
42
+ };
43
+ }
44
+
45
+ /**
46
+ * The startup status line, alongside the other `✔ <service>` checks.
47
+ *
48
+ * The healthy line is deliberately short: one fact per field and nothing the
49
+ * reader has to skim past. The degraded line is long because it reports a
50
+ * broken launch, which is worth every word.
51
+ */
52
+ export function formatInterlockLine(status: InterlockStatus): string {
53
+ if (!status.registerImported) {
54
+ return (
55
+ `⚠ interlock guard=${status.guard}, register is NOT in the child's NODE_OPTIONS. ` +
56
+ `Its firebase-admin/firebase imports will NOT be rewritten and would reach LIVE Firebase.\n`
57
+ );
58
+ }
59
+ return `✔ interlock guard=${status.guard}, register loaded via NODE_OPTIONS\n`;
60
+ }
61
+
62
+ export interface LaunchCheckOptions {
63
+ /** The environment the child is about to receive. */
64
+ readonly childEnv: NodeJS.ProcessEnv;
65
+ /** Absolute `file:` URL of the register module, to look for in NODE_OPTIONS. */
66
+ readonly registerUrl: string;
67
+ /** The child's argv, for the unsupported-runtime check. */
68
+ readonly argv: readonly string[];
69
+ readonly write: (line: string) => void;
70
+ }
71
+
72
+ /**
73
+ * Every statement the launcher makes about the child, printed in one block
74
+ * before the spawn, and the interlock status it derived on the way.
75
+ *
76
+ * Two checks: the interlock status line, from the env alone, and the
77
+ * unsupported-runtime warning for the other way interception can be absent, a
78
+ * child runtime that never evaluates Node loader hooks at all.
79
+ */
80
+ export function reportLaunchChecks(opts: LaunchCheckOptions): InterlockStatus {
81
+ const interlock = describeInterlock(opts.childEnv, opts.registerUrl);
82
+ opts.write(formatInterlockLine(interlock));
83
+ const unsupportedRuntime = detectUnsupportedRuntime(opts.argv);
84
+ if (unsupportedRuntime !== null) opts.write(formatUnsupportedRuntimeWarning(unsupportedRuntime));
85
+ return interlock;
86
+ }
87
+
88
+ /** How long a child may live without its beacon before we say something. */
89
+ const BEACON_GRACE_MS = 15_000;
90
+
91
+ export interface BeaconWatchdogOptions {
92
+ /** The child command, for attribution in the warning. */
93
+ readonly label: string;
94
+ /** The endpoint the child would post to. Null means nothing to watch. */
95
+ readonly beacon: string | null;
96
+ /** Whether a beacon from this child has been recorded. */
97
+ readonly sawBeacon: () => boolean;
98
+ /** Whether the child is still running. */
99
+ readonly isAlive: () => boolean;
100
+ readonly warn: (line: string) => void;
101
+ readonly graceMs?: number;
102
+ }
103
+
104
+ export interface BeaconWatchdog {
105
+ /** Cancel a pending check. Idempotent. */
106
+ stop(): void;
107
+ }
108
+
109
+ /** The warning itself: one paragraph naming what the silence means and what
110
+ * to check. Kept separate so its exact wording is testable. */
111
+ export function formatMissingBeaconWarning(opts: {
112
+ label: string;
113
+ graceMs: number;
114
+ beacon: string;
115
+ }): string {
116
+ const seconds = Math.round(opts.graceMs / 1000);
117
+ return (
118
+ ` ⚠ interlock: \`${opts.label}\` has been running ${seconds}s without posting a register ` +
119
+ `beacon to ${opts.beacon}. Its firebase-admin/firebase imports are probably NOT routed to ` +
120
+ `the pyric sandbox, which means they would reach LIVE Firebase. Check that the command starts ` +
121
+ `a Node process (bun and deno do not evaluate Node loader hooks), that it does not overwrite ` +
122
+ `NODE_OPTIONS, and that NODE_ENV is not production. Warning only: nothing was blocked, and ` +
123
+ `this is reported once per child.`
124
+ );
125
+ }
126
+
127
+ /**
128
+ * The warn-only interlock watchdog.
129
+ *
130
+ * It never kills the child and never blocks a request. The reason is the
131
+ * signal's own honesty: beacon delivery is best-effort (see
132
+ * `register/beacon.ts`), and a plausible silent child is not the same thing as
133
+ * a broken one. A short-lived script that exits before its POST lands, a child
134
+ * that reaches the sandbox only through a grandchild, a dev server slow to
135
+ * boot: each would be killed by a fail-closed version of this check, and each
136
+ * is fine.
137
+ *
138
+ * So the heuristic is the simple, attributable one: the child is still alive
139
+ * `graceMs` after launch and no beacon has arrived. Both halves matter. An
140
+ * exited child was never expected to say anything, and a child whose beacon
141
+ * landed has already proved the point. One warning per child, guaranteed by
142
+ * the one-shot timer; the timer is unref'd so a watchdog can never be the
143
+ * reason a process stays up.
144
+ *
145
+ * `sawBeacon` is a count delta rather than a pid match, deliberately. The
146
+ * process that loads register is often a grandchild (`npm run dev` starts
147
+ * node, `next dev` starts its worker), so the spawned child's own pid is
148
+ * frequently not the pid in the beacon, and matching on it would warn about
149
+ * perfectly healthy launches. The delta's known imprecision runs the other
150
+ * way: a sibling runtime's beacon that lands inside the grace window can mask
151
+ * a real miss. Erring toward silence is the right bias for a warn-only check.
152
+ */
153
+ export function startBeaconWatchdog(opts: BeaconWatchdogOptions): BeaconWatchdog {
154
+ const beacon = opts.beacon;
155
+ if (beacon === null) return { stop: () => {} };
156
+ const graceMs = opts.graceMs ?? BEACON_GRACE_MS;
157
+ const timer = setTimeout(() => {
158
+ if (opts.sawBeacon() || !opts.isAlive()) return;
159
+ opts.warn(formatMissingBeaconWarning({ label: opts.label, graceMs, beacon }));
160
+ }, graceMs);
161
+ timer.unref?.();
162
+ return {
163
+ stop(): void {
164
+ clearTimeout(timer);
165
+ },
166
+ };
167
+ }
@@ -1,5 +1,6 @@
1
1
  /**
2
- * The `pyric dev` child runner "one command, not two" (adoption design):
2
+ * The `pyric sandbox` child runner starts the configured application command
3
+ * after the host is ready:
3
4
  * after the host is up, run the user's OWN dev command with the environment
4
5
  * activated so their unchanged firebase-admin/firebase imports resolve to the
5
6
  * pyric sandbox:
@@ -7,23 +8,21 @@
7
8
  * PYRIC_SANDBOX=remote:<serve url> (the activator)
8
9
  * NODE_OPTIONS += --import @pyric/cli/register (the substitution seam)
9
10
  *
10
- * Child-command precedence: explicit `pyric dev -- <cmd>` wins; else the
11
- * project package.json `dev` script (via the detected package manager); else
12
- * host-only (today's behavior). `--no-run` forces host-only; `--json`
13
- * defaults to host-only (an explicit `--` still wins — agents can opt in).
11
+ * Child-command precedence: `--no-run`, an explicit command, `--json`, the
12
+ * `pyric.json` command, then host-only. An explicit command still runs with
13
+ * `--json`.
14
14
  *
15
15
  * Everything decision-shaped here is pure and exported for the unit suite;
16
16
  * only `spawnDevChild` touches the process table.
17
17
  */
18
18
  import { spawn, type ChildProcess } from 'node:child_process';
19
- import { existsSync, readFileSync } from 'node:fs';
20
- import { join } from 'node:path';
19
+ import { SHELL_OPERATORS } from './unsupported-runtime.js';
21
20
 
22
21
  // ─── First-run race guard ───────────────────────────────────────────────────
23
22
 
24
23
  /**
25
24
  * Wait (bounded) for a browser tab to register as the bridge's sandbox peer
26
- * before the child spawns. `pyric dev` opens the tab and spawns the child in
25
+ * before the child spawns. `pyric sandbox` opens the tab and spawns the child in
27
26
  * the same breath; a child whose first line is a sandbox op otherwise races
28
27
  * the tab's boot and dies on the no-tab fail-fast — the exact first-run of
29
28
  * the two-command story. Polls `/__pyric/health` (`sandboxConnected`).
@@ -63,65 +62,74 @@ export async function waitForSandboxPeer(
63
62
 
64
63
  // ─── Child-command resolution (pure) ───────────────────────────────────────
65
64
 
66
- export type PackageManager = 'bun' | 'pnpm' | 'yarn' | 'npm';
67
-
68
- /** Lockfile sniff, mirroring how init/vendor pick their install hints. */
69
- export function detectPackageManager(cwd: string): PackageManager {
70
- if (existsSync(join(cwd, 'bun.lock')) || existsSync(join(cwd, 'bun.lockb'))) return 'bun';
71
- if (existsSync(join(cwd, 'pnpm-lock.yaml'))) return 'pnpm';
72
- if (existsSync(join(cwd, 'yarn.lock'))) return 'yarn';
73
- return 'npm';
65
+ export interface SandboxChildPlan {
66
+ /** argv to spawn — argv[0] is the executable. */
67
+ argv: string[];
68
+ /** Human-readable command for the pre-spawn line. */
69
+ label: string;
74
70
  }
75
71
 
76
- /** The project's `dev` script, or null (no package.json / no script). */
77
- export function readDevScript(cwd: string): string | null {
78
- try {
79
- const pkg = JSON.parse(readFileSync(join(cwd, 'package.json'), 'utf8')) as {
80
- scripts?: Record<string, unknown>;
81
- };
82
- const dev = pkg.scripts?.dev;
83
- return typeof dev === 'string' && dev.trim().length > 0 ? dev : null;
84
- } catch {
85
- return null;
72
+ export type DevChildPlan = SandboxChildPlan;
73
+
74
+ /**
75
+ * Tokenize a command string into an argv array, preserving quoted strings.
76
+ */
77
+ export function parseCommandString(cmd: string): string[] {
78
+ const parts: string[] = [];
79
+ const regex = /[^\s"']+|"([^"]*)"|'([^']*)'/g;
80
+ let match: RegExpExecArray | null;
81
+ while ((match = regex.exec(cmd)) !== null) {
82
+ if (match[1] !== undefined) {
83
+ parts.push(match[1]);
84
+ } else if (match[2] !== undefined) {
85
+ parts.push(match[2]);
86
+ } else {
87
+ parts.push(match[0]);
88
+ }
86
89
  }
90
+ return parts;
87
91
  }
88
92
 
89
- export interface DevChildPlan {
90
- /** argv to spawn — argv[0] is the executable, no shell. */
91
- argv: string[];
92
- /** Human-readable command for the pre-spawn line. */
93
- label: string;
93
+ export interface ResolveSandboxChildOptions {
94
+ explicitCommand?: string[] | null;
95
+ passthrough?: string[];
96
+ configCommand?: string | null;
97
+ noRun?: boolean;
98
+ json?: boolean;
94
99
  }
95
100
 
96
101
  /**
97
102
  * Decide what (if anything) to run after the host is up.
98
103
  *
99
- * Matrix:
100
- * --no-run → null, always
101
- * `-- <cmd>` → that command (wins over everything else)
102
- * --json (no `--`) → null (machine mode defaults to host-only)
103
- * package.json dev script `<pm> run dev`
104
- * none of the above → null (host-only, today's behavior)
105
- *
106
- * A `dev` script that itself invokes `pyric dev` is treated as absent —
107
- * running it would recurse forever (pyric dev → npm run dev → pyric dev …).
104
+ * Precedence:
105
+ * --no-run → null, always
106
+ * explicit CLI command (args or `--`) → that command (wins over everything else)
107
+ * --json (with no explicit command) → null (machine mode defaults to host-only)
108
+ * pyric.json `command` parsed command argv
109
+ * none of the above → null (host-only)
108
110
  */
109
- export function resolveDevChild(opts: {
110
- passthrough: string[];
111
- noRun: boolean;
112
- json: boolean;
113
- devScript: string | null;
114
- packageManager: PackageManager;
115
- }): DevChildPlan | null {
111
+ export function resolveSandboxChild(opts: ResolveSandboxChildOptions): SandboxChildPlan | null {
116
112
  if (opts.noRun) return null;
117
- if (opts.passthrough.length > 0) {
118
- return { argv: [...opts.passthrough], label: opts.passthrough.join(' ') };
113
+
114
+ let activeCommand: string[] | null = null;
115
+ if (opts.explicitCommand && opts.explicitCommand.length > 0) {
116
+ activeCommand = opts.explicitCommand;
117
+ } else if (opts.passthrough && opts.passthrough.length > 0) {
118
+ activeCommand = opts.passthrough;
119
119
  }
120
+
121
+ if (activeCommand !== null) {
122
+ return { argv: [...activeCommand], label: activeCommand.join(' ') };
123
+ }
124
+
120
125
  if (opts.json) return null;
121
- if (opts.devScript && !/(^|[\s;&|])pyric\s+dev\b/.test(opts.devScript)) {
122
- const label = `${opts.packageManager} run dev`;
123
- return { argv: [opts.packageManager, 'run', 'dev'], label };
126
+
127
+ if (opts.configCommand && opts.configCommand.trim().length > 0) {
128
+ const trimmed = opts.configCommand.trim();
129
+ const argv = parseCommandString(trimmed);
130
+ return { argv, label: trimmed };
124
131
  }
132
+
125
133
  return null;
126
134
  }
127
135
 
@@ -145,41 +153,60 @@ export function registerModuleUrl(): string {
145
153
  return new URL('../register/index.js', import.meta.url).href;
146
154
  }
147
155
 
156
+ /** What the launcher has to put in a child's environment for interception. */
157
+ export interface ChildActivation {
158
+ /** The serve host the child's sandbox calls reach. */
159
+ readonly serveUrl: string;
160
+ /** Absolute `file:` URL of the register module. */
161
+ readonly registerUrl: string;
162
+ /** The per-launch secret the child's handshake beacon must present.
163
+ * Absent when the launcher runs no beacon receiver, as the Vite plugin's
164
+ * Functions runtime does; the child then reports on stderr only. */
165
+ readonly beaconToken?: string | undefined;
166
+ }
167
+
148
168
  /**
149
- * Child env: sets the activator and APPENDS the loader to NODE_OPTIONS —
150
- * never replaces it (the user's own --inspect / --max-old-space-size etc.
151
- * must survive). `file:` URLs are percent-encoded, so no quoting is needed
152
- * even for paths with spaces.
169
+ * Child env: sets the activator and the beacon secret, and APPENDS the loader
170
+ * to NODE_OPTIONS rather than replacing it (the user's own --inspect /
171
+ * --max-old-space-size and so on must survive). `file:` URLs are
172
+ * percent-encoded, so no quoting is needed even for paths with spaces.
153
173
  */
154
174
  export function buildChildEnv(
155
175
  base: NodeJS.ProcessEnv,
156
- opts: { serveUrl: string; registerUrl: string },
176
+ opts: ChildActivation,
157
177
  ): NodeJS.ProcessEnv {
158
178
  const importFlag = `--import ${opts.registerUrl}`;
159
- return {
179
+ const env: NodeJS.ProcessEnv = {
160
180
  ...base,
161
181
  PYRIC_SANDBOX: `remote:${opts.serveUrl}`,
162
182
  NODE_OPTIONS: base.NODE_OPTIONS ? `${base.NODE_OPTIONS} ${importFlag}` : importFlag,
163
183
  };
184
+ if (opts.beaconToken !== undefined) env.PYRIC_BEACON_TOKEN = opts.beaconToken;
185
+ return env;
164
186
  }
165
187
 
166
188
  /**
167
189
  * Format copy-pasteable POSIX export statements for host-only startup.
168
190
  * Grouped in a cleanly formatted console block for easy selection and copying
169
191
  * into a separate terminal (for example, when running Next.js independently).
192
+ *
193
+ * The beacon secret is part of the block: without it a process started this
194
+ * way still intercepts, but the dev server cannot confirm that it did.
170
195
  */
171
- export function formatStartupEnvExport(opts: { serveUrl: string; registerUrl: string }): string {
172
- const pyricSandbox = `remote:${opts.serveUrl}`;
173
- const nodeOptions = `--import ${opts.registerUrl}`;
174
- const line1 = `export PYRIC_SANDBOX="${pyricSandbox}"`;
175
- const line2 = `export NODE_OPTIONS="${nodeOptions}"`;
176
- const divider = '─'.repeat(Math.max(line1.length, line2.length) + 4);
196
+ export function formatStartupEnvExport(opts: ChildActivation): string {
197
+ const lines = [`export PYRIC_SANDBOX="remote:${opts.serveUrl}"`];
198
+ if (opts.beaconToken !== undefined) {
199
+ lines.push(`export PYRIC_BEACON_TOKEN="${opts.beaconToken}"`);
200
+ }
201
+ lines.push(`export NODE_OPTIONS="--import ${opts.registerUrl}"`);
202
+ const width = Math.max(...lines.map((line) => line.length));
203
+ const divider = '─'.repeat(width + 4);
204
+ const body = lines.map((line) => ` ${line}\n`).join('');
177
205
  return (
178
206
  '\n' +
179
207
  ' To run external commands against this sandbox, paste in another terminal:\n' +
180
208
  ` ${divider}\n` +
181
- ` ${line1}\n` +
182
- ` ${line2}\n` +
209
+ body +
183
210
  ` ${divider}\n`
184
211
  );
185
212
  }
@@ -215,37 +242,64 @@ export function createLinePrefixer(
215
242
 
216
243
  // ─── Spawn + lifecycle ─────────────────────────────────────────────────────
217
244
 
218
- export interface DevChildHandle {
219
- /** Resolves with the exit code to propagate once the child is gone. */
245
+ /** How long a signalled child may linger before SIGKILL. */
246
+ const FORCE_KILL_AFTER_MS = 2_000;
247
+
248
+ export interface SandboxChildHandle {
220
249
  exited: Promise<number>;
221
- /** Forward a signal (Ctrl-C / SIGTERM). Marks the exit as user-initiated
222
- * so the propagated code is 0, and SIGKILLs a child that lingers. */
223
250
  signal(sig: NodeJS.Signals): void;
224
251
  child: ChildProcess;
225
252
  }
226
253
 
227
- /** How long a signalled child may linger before SIGKILL. */
228
- const FORCE_KILL_AFTER_MS = 2_000;
254
+ export type DevChildHandle = SandboxChildHandle;
229
255
 
230
256
  /**
231
257
  * Spawn the child with inherited stdin and `[dev]`-prefixed stdout/stderr.
232
258
  * In `--json` mode ALL child output goes to stderr — stdout carries exactly
233
259
  * the one machine line (the serve --json contract).
234
260
  */
235
- export function spawnDevChild(
236
- plan: DevChildPlan,
261
+ export function spawnSandboxChild(
262
+ plan: SandboxChildPlan,
237
263
  opts: { cwd: string; env: NodeJS.ProcessEnv; json: boolean },
238
- ): DevChildHandle {
239
- const [command, ...args] = plan.argv;
240
- const child = spawn(command!, args, {
241
- cwd: opts.cwd,
242
- env: opts.env,
243
- stdio: ['inherit', 'pipe', 'pipe'],
244
- // Own a process group so shutdown reaches package-manager grandchildren
245
- // (for example `bun run dev` -> `node server.js`) rather than orphaning
246
- // the actual dev server when only the runner exits.
247
- detached: process.platform !== 'win32',
248
- });
264
+ ): SandboxChildHandle {
265
+ const parts = [...plan.argv];
266
+ const env: NodeJS.ProcessEnv = { ...opts.env };
267
+
268
+ // 1. Extract leading KEY=VAL assignments (e.g. PORT=8080 node server.js)
269
+ while (parts.length > 0 && /^[A-Za-z_][A-Za-z0-9_]*=/.test(parts[0]!)) {
270
+ const token = parts.shift()!;
271
+ const eq = token.indexOf('=');
272
+ const key = token.slice(0, eq);
273
+ const val = token.slice(eq + 1);
274
+ env[key] = val;
275
+ }
276
+
277
+ // 2. Check for discrete shell operators (&&, ||, |, ;) among top-level tokens
278
+ const hasShellOperators = parts.some((token) => SHELL_OPERATORS.has(token));
279
+
280
+ // The bun/deno warning is emitted by the launch seam in serve.ts, alongside
281
+ // the interlock line, so every pre-spawn statement about the child prints in
282
+ // one block and in order.
283
+
284
+ const [command, ...args] = parts;
285
+ let child: ChildProcess;
286
+ if (hasShellOperators) {
287
+ child = spawn(plan.label, [], {
288
+ cwd: opts.cwd,
289
+ env,
290
+ stdio: ['inherit', 'pipe', 'pipe'],
291
+ shell: true,
292
+ detached: process.platform !== 'win32',
293
+ });
294
+ } else {
295
+ child = spawn(command!, args, {
296
+ cwd: opts.cwd,
297
+ env,
298
+ stdio: ['inherit', 'pipe', 'pipe'],
299
+ shell: process.platform === 'win32',
300
+ detached: process.platform !== 'win32',
301
+ });
302
+ }
249
303
 
250
304
  const outTarget = opts.json ? process.stderr : process.stdout;
251
305
  const out = createLinePrefixer('[dev] ', (line) => outTarget.write(line));
@@ -267,7 +321,7 @@ export function spawnDevChild(
267
321
 
268
322
  const exited = new Promise<number>((resolve) => {
269
323
  child.once('error', (e) => {
270
- process.stderr.write(`pyric dev: failed to run \`${plan.label}\`: ${e.message}\n`);
324
+ process.stderr.write(`pyric sandbox: failed to run \`${plan.label}\`: ${e.message}\n`);
271
325
  resolve(1);
272
326
  });
273
327
  child.once('exit', (code, signal) => {
@@ -301,3 +355,5 @@ export function spawnDevChild(
301
355
  },
302
356
  };
303
357
  }
358
+
359
+ export const spawnDevChild = spawnSandboxChild;