@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 @@
1
+ {"version":3,"file":"sandbox-runner.js","sourceRoot":"","sources":["../../src/cli/sandbox-runner.ts"],"names":[],"mappings":"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"}
@@ -9,7 +9,7 @@ interface HostingConfig {
9
9
  destination?: string;
10
10
  }>;
11
11
  }
12
- /** Extract the single hosting config `pyric dev` v1 supports. Arrays
12
+ /** Extract the single hosting config `pyric sandbox` supports. Arrays
13
13
  * (multi-site) take the first entry with a warning — multi-site is out of
14
14
  * scope (plan section 6). */
15
15
  export declare function extractHosting(config: FirebaseJson | null): HostingConfig | null;
@@ -21,7 +21,7 @@ export interface ServeRuntime {
21
21
  payload: () => InitPayload;
22
22
  /** HTTP MCP endpoint when `--bridge` is on; null otherwise. */
23
23
  mcpUrl: string | null;
24
- /** The Studio app URL (`/__pyric/ui/`) when `--ui` is on and the build is
24
+ /** The Studio hub URL (`/__pyric/ui/studio`) when `--ui` is on and the build is
25
25
  * present; null otherwise. */
26
26
  uiUrl: string | null;
27
27
  /** Persistence summary (null when `--persist` is off). */
@@ -29,6 +29,12 @@ export interface ServeRuntime {
29
29
  restoredDocs: number;
30
30
  restoredUsers: number;
31
31
  } | null;
32
+ /** Handshake beacons posted to `/__pyric/beacon` so far, the interlock
33
+ * watchdog's only input. */
34
+ beaconCount: () => number;
35
+ /** The per-launch secret a beacon must present, placed in every child's
36
+ * `PYRIC_BEACON_TOKEN`. */
37
+ beaconToken: string;
32
38
  }
33
39
  /** The `--json` stdout contract — one line, keep stable; agents parse this.
34
40
  * Readiness probe: GET {url}/__pyric/init.json → 200 (body carries the live
@@ -73,6 +79,8 @@ export declare function startServe(opts: {
73
79
  * (the served project's file tree) + `/__pyric/projects` (single-project
74
80
  * store over `cwd`). The Studio app's `local` mode talks to these. */
75
81
  ui?: boolean;
82
+ /** Explicit opt-in to permissive mode (default-allow RTDB rules when unconfigured). */
83
+ permissive?: boolean;
76
84
  logger?: Parameters<typeof startStaticServer>[0]['logger'];
77
85
  }): Promise<ServeRuntime>;
78
86
  /**
@@ -87,7 +95,7 @@ export declare function bridgeEnabledFromFlags(flags: {
87
95
  * A dev child also implies the bridge: the runner injects
88
96
  * `PYRIC_SANDBOX=remote:<url>` into the child, whose remote client dials the
89
97
  * `/__pyric/sandbox` WS — without the bridge mount that upgrade 404s and
90
- * plain `pyric dev -- <cmd>` (or a detected dev script) breaks its own
98
+ * `pyric sandbox -- <cmd>` breaks its own
91
99
  * child. Pure + exported for unit coverage.
92
100
  */
93
101
  export declare function bridgeEnabledFor(flags: {
@@ -95,7 +103,7 @@ export declare function bridgeEnabledFor(flags: {
95
103
  }, childPlan: unknown, functionsProject?: unknown): boolean;
96
104
  /**
97
105
  * Process-level last line of defense for the dev server: a single bad
98
- * request/WS interaction must never take `pyric dev` down. Node kills the
106
+ * request/WS interaction must never take `pyric sandbox` down. Node kills the
99
107
  * process on an unhandled rejection (default `--unhandled-rejections=throw`
100
108
  * since v15) and on any uncaught exception — and the serve process hosts
101
109
  * long-lived, browser-driven machinery (WS peers, SSE streams, file watchers,
@@ -108,15 +116,5 @@ export declare function bridgeEnabledFor(flags: {
108
116
  export declare function installServeProcessGuard(log: (message: string) => void, proc?: Pick<NodeJS.Process, 'on' | 'off'>): () => void;
109
117
  /** CLI entry. Resolves on SIGINT/SIGTERM after a clean stop. */
110
118
  export declare function runServe(parsed: ParsedArgs): Promise<number>;
111
- /**
112
- * Detect a bundler build that INLINED the real firebase SDK into its served
113
- * assets (`vite build` output). The served import map remaps only bare
114
- * `firebase/*` specifiers, so such a build cannot be sandboxed — its calls
115
- * reach real Google endpoints. Fingerprints are real-SDK-only endpoint hosts
116
- * that never appear in a sandbox-clean app (whose calls all route to
117
- * `/__pyric/*`). Bounded: depth ≤ 4, ≤ 200 script files, first hit per file.
118
- * Returns publicDir-relative paths of offending assets.
119
- */
120
- export declare function scanForInlinedFirebase(dir: string): string[];
121
119
  export {};
122
120
  //# sourceMappingURL=serve.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"serve.d.ts","sourceRoot":"","sources":["../../src/cli/serve.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"serve.d.ts","sourceRoot":"","sources":["../../src/cli/serve.ts"],"names":[],"mappings":"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"}
package/dist/cli/serve.js CHANGED
@@ -1,5 +1,5 @@
1
1
  /**
2
- * `pyric dev` local dev server with the pyric sandbox standing in for
2
+ * `pyric sandbox` is the local server with the Pyric sandbox standing in for
3
3
  * Firebase. Feels like `firebase serve` (banner, labeled lines, port 3473,
4
4
  * SIGINT shutdown) with the sandbox-flavored extras firebase can't do: the
5
5
  * served page runs an in-browser backend, your `firestore.rules` deploy into
@@ -10,22 +10,28 @@
10
10
  * rules load (fail fast on broken rules) → SDK bundle (cached per pyric
11
11
  * version) → static server with the `/__pyric/` namespace + HTML injection.
12
12
  */
13
- import { join, relative, resolve } from 'node:path';
14
- import { existsSync, readdirSync, readFileSync, statSync, watch as watchFile } from 'node:fs';
13
+ import { randomBytes } from 'node:crypto';
14
+ import { relative, resolve } from 'node:path';
15
+ import { existsSync, watch as watchFile } from 'node:fs';
15
16
  import { readFirebaseJson, readFirebaseRc } from './firebase-json.js';
16
17
  import { bundleSdk, bundleWorker, defaultSdkEntries, resolveSiteUiDir } from '../serve/bundler.js';
17
18
  import { isStandalone, materializeServeAssets, materializeSiteUi, embeddedWorkerVersion, } from '../serve/standalone-assets.js';
18
19
  import { hasSandboxBuildMarker } from '../serve/sandbox-marker.js';
20
+ import { formatBeaconReceipt } from '../serve/beacon-route.js';
21
+ import { formatAiStatusLine } from '../serve/ai-status.js';
19
22
  import { injectServeTags } from '../serve/html-injection.js';
20
23
  import { formatActivityWarning } from '../serve/activity-warning.js';
21
24
  import { consoleServeLogger, startStaticServer, stderrServeLogger } from '../serve/server.js';
22
25
  import { createBridgeMount } from '../serve/bridge-mount.js';
23
26
  import { openBrowser, shouldAutoOpen } from '../serve/open-browser.js';
24
- import { buildChildEnv, detectPackageManager, formatStartupEnvExport, readDevScript, registerModuleUrl, resolveDevChild, spawnDevChild, waitForSandboxPeer, } from './dev-runner.js';
27
+ import { readPyricConfig } from './pyric-config.js';
28
+ import { buildChildEnv, formatStartupEnvExport, registerModuleUrl, resolveSandboxChild, spawnSandboxChild, waitForSandboxPeer, } from './sandbox-runner.js';
29
+ import { reportLaunchChecks, startBeaconWatchdog, } from './sandbox-interlock.js';
30
+ import { scanForInlinedFirebase } from './inlined-sdk-scanner.js';
25
31
  import { createFunctionsDevelopmentRuntime, createHttpFunctionsPeerReadiness, } from '../functions-rtdb/development-runtime.js';
26
32
  import { discoverFunctionsRtdbProject, } from '../functions-rtdb/project.js';
27
33
  import { createSandboxSession, SandboxSeedError, } from '../serve/sandbox-session.js';
28
- /** Extract the single hosting config `pyric dev` v1 supports. Arrays
34
+ /** Extract the single hosting config `pyric sandbox` supports. Arrays
29
35
  * (multi-site) take the first entry with a warning — multi-site is out of
30
36
  * scope (plan section 6). */
31
37
  export function extractHosting(config) {
@@ -62,12 +68,17 @@ export function serveJsonLine(runtime) {
62
68
  */
63
69
  export async function startServe(opts) {
64
70
  const logger = opts.logger ?? consoleServeLogger();
71
+ // Handshake beacons from pyric-launched children, plus the per-launch secret
72
+ // that authorizes one. Both live here because the route does.
73
+ let beaconsSeen = 0;
74
+ const beaconCount = () => beaconsSeen;
75
+ const beaconToken = randomBytes(24).toString('base64url');
65
76
  // --fresh only means anything against the state.json file `--persist`
66
77
  // maintains — without `--persist` there is no file to discard, so
67
78
  // `--fresh` alone was a silent no-op (nothing happened, nothing said so).
68
79
  // Fail fast instead of pretending to reset something.
69
80
  if (opts.fresh && !opts.persist) {
70
- throw new Error('pyric dev: --fresh requires --persist (it discards .pyric/state/state.json). ' +
81
+ throw new Error('pyric sandbox: --fresh requires --persist (it discards .pyric/state/state.json). ' +
71
82
  'Browser-stored data is cleared from Studio → Settings → Reset, or DevTools → Clear site data.');
72
83
  }
73
84
  // firebase.json is optional for serving (firebase-serve parity: warn, then
@@ -81,9 +92,29 @@ export async function startServe(opts) {
81
92
  throw e;
82
93
  logger.note(' ⚠ no firebase.json found — serving the current directory without hosting config');
83
94
  }
95
+ const pyricConfig = await readPyricConfig(opts.cwd);
96
+ if (pyricConfig.rules) {
97
+ if (!config)
98
+ config = {};
99
+ if (typeof pyricConfig.rules === 'string') {
100
+ config.firestore = { ...config.firestore, rules: pyricConfig.rules };
101
+ }
102
+ else {
103
+ if (pyricConfig.rules.firestore) {
104
+ config.firestore = { ...config.firestore, rules: pyricConfig.rules.firestore };
105
+ }
106
+ if (pyricConfig.rules.database) {
107
+ config.database = { ...config.database, rules: pyricConfig.rules.database };
108
+ }
109
+ if (pyricConfig.rules.storage) {
110
+ const baseStorage = typeof config.storage === 'object' && !Array.isArray(config.storage) ? config.storage : {};
111
+ config.storage = { ...baseStorage, rules: pyricConfig.rules.storage };
112
+ }
113
+ }
114
+ }
84
115
  const hosting = extractHosting(config);
85
116
  if (Array.isArray(config?.hosting) && config.hosting.length > 1) {
86
- logger.note(' ⚠ multiple hosting sites configured pyric dev v1 serves the first entry only');
117
+ logger.note(' ⚠ multiple hosting sites configured. pyric sandbox serves the first entry only');
87
118
  }
88
119
  const publicDir = resolve(opts.cwd, hosting?.public ?? '.');
89
120
  if (!existsSync(publicDir)) {
@@ -93,29 +124,29 @@ export async function startServe(opts) {
93
124
  const looksLikeBuildOutput = /(^|[\\/])(dist|build|out)$/.test(publicDir);
94
125
  const hint = looksLikeBuildOutput
95
126
  ? `\n No build yet? Run \`bun run dev\` for the live sandbox dev server, ` +
96
- `or \`bun run build\` then \`pyric dev\` to preview the production build.`
127
+ `or \`bun run build\` then \`pyric sandbox\` to preview the production build.`
97
128
  : '';
98
- throw new Error(`pyric dev: hosting.public directory does not exist: ${publicDir}${hint}`);
129
+ throw new Error(`pyric sandbox: hosting.public directory does not exist: ${publicDir}${hint}`);
99
130
  }
100
131
  // The import map can only remap BARE `firebase/*` specifiers. A plain bundler
101
132
  // build (`vite build`) inlines the real SDK into the app chunk, leaving
102
- // nothing to intercept the page would then talk to REAL Firebase endpoints
133
+ // nothing to intercept: the page would then talk to REAL Firebase endpoints
103
134
  // with the sandbox's fake credentials while the injected banner claims
104
- // otherwise. That hole is structural, so `pyric dev` REFUSES such a dist
135
+ // otherwise. That hole is structural, so `pyric sandbox` refuses such a dist
105
136
  // rather than serving it. A pyric SANDBOX build (`vite build --mode
106
137
  // development`) carries the marker and bundles pyric's in-page adapters, so it
107
- // is trusted and the scan is skipped (marker present no real SDK to find).
138
+ // is trusted and the scan is skipped (marker present, no real SDK to find).
108
139
  if (!hasSandboxBuildMarker(publicDir)) {
109
140
  const inlined = scanForInlinedFirebase(publicDir);
110
141
  if (inlined.length > 0) {
111
- throw new Error(`pyric dev: ${inlined[0]} bundles the REAL firebase SDK, so this dist cannot be ` +
142
+ throw new Error(`pyric sandbox: ${inlined[0]} bundles the real Firebase SDK, so this dist cannot be ` +
112
143
  `sandboxed — its firebase/* calls would reach LIVE Google endpoints, not the ` +
113
144
  `pyric sandbox. Two ways forward:\n` +
114
- ` (a) plain \`pyric dev\` runs the child dev-server flow (the @pyric/cli/vite ` +
145
+ ` (a) \`pyric sandbox -- <command>\` runs the child server with the @pyric/cli/vite ` +
115
146
  `plugin swaps firebase/* live) — use \`bun run dev\`;\n` +
116
147
  ` (b) rebuild as a self-contained sandbox bundle and serve THAT: ` +
117
148
  `\`vite build --mode development\` (or pyric({ swapInBuild: true })) then ` +
118
- `\`pyric dev\`.\n` +
149
+ `\`pyric sandbox\`.\n` +
119
150
  `A plain \`vite build\` is your production build — deploy it, don't sandbox it.`);
120
151
  }
121
152
  }
@@ -189,6 +220,12 @@ export async function startServe(opts) {
189
220
  studio: opts.ui ? { siteUiDir } : false,
190
221
  bridgeUrl: () => mount && origin.port > 0 ? mount.wsUrl(origin) : null,
191
222
  activity: (incident) => logger.note(formatActivityWarning(incident)),
223
+ beaconToken,
224
+ beacon: (report) => {
225
+ beaconsSeen += 1;
226
+ logger.note(formatBeaconReceipt(report));
227
+ },
228
+ permissive: opts.permissive,
192
229
  logger,
193
230
  });
194
231
  }
@@ -196,9 +233,9 @@ export async function startServe(opts) {
196
233
  bundle.dispose?.();
197
234
  if (error instanceof SandboxSeedError) {
198
235
  if (error.kind === 'read') {
199
- throw new Error(`pyric dev: failed to read --seed ${error.path}: ${error.detail}`);
236
+ throw new Error(`pyric sandbox: failed to read --seed ${error.path}: ${error.detail}`);
200
237
  }
201
- throw new Error(`pyric dev: --seed must be a JSON object of "collection/doc" fields, ${error.detail}`);
238
+ throw new Error(`pyric sandbox: --seed must be a JSON object of "collection/doc" to fields, ${error.detail}`);
202
239
  }
203
240
  throw error;
204
241
  }
@@ -283,7 +320,7 @@ export async function startServe(opts) {
283
320
  if (bundle.dispose)
284
321
  handle.server.once('close', bundle.dispose);
285
322
  handle.server.once('close', () => void closeOwnedResources());
286
- const uiUrl = siteUiDir ? `${handle.url}/__pyric/ui/` : null;
323
+ const uiUrl = siteUiDir ? `${handle.url}/__pyric/ui/studio` : null;
287
324
  const docsUrl = siteUiDir ? `${handle.url}/__pyric/ui/docs/` : null;
288
325
  // Hot-reload: the static adapter observes the filesystem; the session owns
289
326
  // read/prepare/last-good replacement and event broadcast.
@@ -374,7 +411,7 @@ export async function startServe(opts) {
374
411
  logger.info(session.payload().storageRules
375
412
  ? `✔ rules ${session.summary.rules.storage.sourcePath} → deployed to the storage sandbox (hash ${session.summary.rules.storage.hash}; ` +
376
413
  `edits require a restart — storage rules do not hot-reload)`
377
- : `• rules no storage.rules — storage sandbox runs open (no rules configured)`);
414
+ : `• rules no storage.rules — storage sandbox denies client operations by default`);
378
415
  if (uiUrl) {
379
416
  logger.info(`✔ studio Pyric Studio: ${uiUrl}`);
380
417
  }
@@ -384,6 +421,13 @@ export async function startServe(opts) {
384
421
  if (mount) {
385
422
  logger.info(`✔ bridge MCP endpoint: ${mount.mcpUrl(origin)} (sandbox peers over ws at /__pyric/sandbox)`);
386
423
  }
424
+ // AI is a mounted service like the bridge: `/__pyric/ai-proxy` answers from
425
+ // the first request on, whether or not anything is configured. `pyric
426
+ // sandbox` has no AI flag, so the ENGINE is always the page's own `getAI()`
427
+ // choice (resolved lazily in the browser, since nothing here instantiates a
428
+ // broker to find out); what this server does decide is where the proxy
429
+ // forwards, and that is what the line reports.
430
+ logger.info(formatAiStatusLine({}));
387
431
  let persistSummary = null;
388
432
  const persistence = session.summary.persistence;
389
433
  if (persistence) {
@@ -427,7 +471,8 @@ export async function startServe(opts) {
427
471
  logger.note('');
428
472
  logger.note(' ⚠ the pyric sandbox runs IN the served page — keep the browser tab open.');
429
473
  logger.note(' Firestore/auth data and persistence stop when no page is open.');
430
- return { handle, publicDir, payload, uiUrl, mcpUrl: mount ? mount.mcpUrl(origin) : null, persist: persistSummary };
474
+ const mcpUrl = mount ? mount.mcpUrl(origin) : null;
475
+ return { handle, publicDir, payload, uiUrl, mcpUrl, persist: persistSummary, beaconCount, beaconToken };
431
476
  }
432
477
  /**
433
478
  * `--ui` implies `--bridge` (hybrid-MCP plan Phase 3): a Studio user almost
@@ -441,7 +486,7 @@ export function bridgeEnabledFromFlags(flags) {
441
486
  * A dev child also implies the bridge: the runner injects
442
487
  * `PYRIC_SANDBOX=remote:<url>` into the child, whose remote client dials the
443
488
  * `/__pyric/sandbox` WS — without the bridge mount that upgrade 404s and
444
- * plain `pyric dev -- <cmd>` (or a detected dev script) breaks its own
489
+ * `pyric sandbox -- <cmd>` breaks its own
445
490
  * child. Pure + exported for unit coverage.
446
491
  */
447
492
  export function bridgeEnabledFor(flags, childPlan, functionsProject = null) {
@@ -449,7 +494,7 @@ export function bridgeEnabledFor(flags, childPlan, functionsProject = null) {
449
494
  }
450
495
  /**
451
496
  * Process-level last line of defense for the dev server: a single bad
452
- * request/WS interaction must never take `pyric dev` down. Node kills the
497
+ * request/WS interaction must never take `pyric sandbox` down. Node kills the
453
498
  * process on an unhandled rejection (default `--unhandled-rejections=throw`
454
499
  * since v15) and on any uncaught exception — and the serve process hosts
455
500
  * long-lived, browser-driven machinery (WS peers, SSE streams, file watchers,
@@ -462,11 +507,11 @@ export function bridgeEnabledFor(flags, childPlan, functionsProject = null) {
462
507
  export function installServeProcessGuard(log, proc = process) {
463
508
  const describe = (reason) => reason instanceof Error ? (reason.stack ?? reason.message) : String(reason);
464
509
  const onRejection = (reason) => {
465
- log(` ✖ pyric dev: UNHANDLED REJECTION (the server was kept alive please report this):\n` +
510
+ log(` ✖ pyric sandbox: unhandled rejection. The server was kept alive. Please report this:\n` +
466
511
  ` ${describe(reason).split('\n').join('\n ')}`);
467
512
  };
468
513
  const onException = (err) => {
469
- log(` ✖ pyric dev: UNCAUGHT EXCEPTION (the server was kept alive please report this):\n` +
514
+ log(` ✖ pyric sandbox: uncaught exception. The server was kept alive. Please report this:\n` +
470
515
  ` ${describe(err).split('\n').join('\n ')}`);
471
516
  };
472
517
  proc.on('unhandledRejection', onRejection);
@@ -476,10 +521,48 @@ export function installServeProcessGuard(log, proc = process) {
476
521
  proc.off('uncaughtException', onException);
477
522
  };
478
523
  }
524
+ function resolveServePort(flagPort, configPort) {
525
+ if (typeof flagPort === 'string')
526
+ return Number(flagPort);
527
+ if (typeof flagPort === 'number')
528
+ return flagPort;
529
+ if (typeof configPort === 'number')
530
+ return configPort;
531
+ return 3473;
532
+ }
533
+ function resolveProjectIdentifier(flagProject, envProject, configProject, rcDefault) {
534
+ if (typeof flagProject === 'string' && flagProject.length > 0)
535
+ return flagProject;
536
+ if (typeof envProject === 'string' && envProject.length > 0)
537
+ return envProject;
538
+ if (typeof configProject === 'string' && configProject.length > 0)
539
+ return configProject;
540
+ if (typeof rcDefault === 'string' && rcDefault.length > 0)
541
+ return rcDefault;
542
+ return 'demo-project';
543
+ }
544
+ function resolveExplicitCommand(parsed) {
545
+ if (parsed.passthrough && parsed.passthrough.length > 0) {
546
+ return parsed.passthrough;
547
+ }
548
+ if (parsed.positional.length > 0) {
549
+ return parsed.positional;
550
+ }
551
+ return null;
552
+ }
479
553
  /** CLI entry. Resolves on SIGINT/SIGTERM after a clean stop. */
480
554
  export async function runServe(parsed) {
555
+ const cwd = process.cwd();
556
+ let pyricConfig = {};
557
+ try {
558
+ pyricConfig = await readPyricConfig(cwd);
559
+ }
560
+ catch (error) {
561
+ process.stderr.write(`${error instanceof Error ? error.message : String(error)}\n`);
562
+ return 2;
563
+ }
481
564
  const flagPort = parsed.flags.get('port');
482
- const port = typeof flagPort === 'string' ? Number(flagPort) : 3473;
565
+ const port = resolveServePort(flagPort, pyricConfig.port);
483
566
  if (!Number.isFinite(port) || port < 0 || port > 65535) {
484
567
  process.stderr.write(`pyric: invalid --port '${flagPort}'.\n`);
485
568
  return 1;
@@ -488,7 +571,7 @@ export async function runServe(parsed) {
488
571
  const host = typeof flagHost === 'string' ? flagHost : 'localhost';
489
572
  const only = parsed.flags.get('only');
490
573
  if (typeof only === 'string' && only !== 'hosting') {
491
- process.stderr.write(`pyric: --only '${only}' is not supported pyric dev v1 serves hosting (with the in-page sandbox standing in for firestore/auth).\n`);
574
+ process.stderr.write(`pyric: --only '${only}' is not supported. pyric sandbox serves hosting with the in-page sandbox standing in for Firestore and Auth.\n`);
492
575
  return 1;
493
576
  }
494
577
  const json = Boolean(parsed.flags.get('json'));
@@ -497,7 +580,6 @@ export async function runServe(parsed) {
497
580
  // Resolve the child plan BEFORE the server starts: a planned child implies
498
581
  // the bridge (see bridgeEnabledFor) — the child's injected PYRIC_SANDBOX
499
582
  // is useless without the /__pyric/sandbox WS mount.
500
- const cwd = process.cwd();
501
583
  let functionsProject;
502
584
  let functionsProjectId = null;
503
585
  try {
@@ -505,23 +587,19 @@ export async function runServe(parsed) {
505
587
  if (functionsProject) {
506
588
  const flagProject = parsed.flags.get('project');
507
589
  const rc = await readFirebaseRc(cwd);
508
- functionsProjectId =
509
- (typeof flagProject === 'string' ? flagProject : undefined) ??
510
- process.env.PYRIC_PROJECT ??
511
- rc?.projects?.default ??
512
- 'demo-project';
590
+ functionsProjectId = resolveProjectIdentifier(flagProject, process.env.PYRIC_PROJECT, pyricConfig.project, rc?.projects?.default);
513
591
  }
514
592
  }
515
593
  catch (error) {
516
594
  process.stderr.write(`${error instanceof Error ? error.message : String(error)}\n`);
517
595
  return 2;
518
596
  }
519
- const plan = resolveDevChild({
520
- passthrough: parsed.passthrough ?? [],
597
+ const explicitCommand = resolveExplicitCommand(parsed);
598
+ const plan = resolveSandboxChild({
599
+ explicitCommand,
600
+ configCommand: pyricConfig.command,
521
601
  noRun: Boolean(parsed.flags.get('no-run')),
522
602
  json,
523
- devScript: readDevScript(cwd),
524
- packageManager: detectPackageManager(cwd),
525
603
  });
526
604
  const bridgeOn = bridgeEnabledFor(parsed.flags, plan, functionsProject);
527
605
  let runtime;
@@ -537,6 +615,7 @@ export async function runServe(parsed) {
537
615
  watch: parsed.flags.get('no-watch') ? false : undefined,
538
616
  persist: Boolean(parsed.flags.get('persist')),
539
617
  fresh: Boolean(parsed.flags.get('fresh')),
618
+ permissive: Boolean(parsed.flags.get('permissive')),
540
619
  // --ui mounts the Pyric Studio storage routes (workspace + projects).
541
620
  ui: uiOn,
542
621
  // --no-capture disables the default-on session capture. The pattern
@@ -547,7 +626,7 @@ export async function runServe(parsed) {
547
626
  : undefined,
548
627
  project: typeof parsed.flags.get('project') === 'string'
549
628
  ? parsed.flags.get('project')
550
- : process.env.PYRIC_PROJECT ?? functionsProjectId ?? undefined,
629
+ : process.env.PYRIC_PROJECT ?? pyricConfig.project ?? functionsProjectId ?? undefined,
551
630
  });
552
631
  }
553
632
  catch (e) {
@@ -562,7 +641,7 @@ export async function runServe(parsed) {
562
641
  // (the banner went to stderr). Readiness probe: GET /__pyric/init.json.
563
642
  if (json)
564
643
  process.stdout.write(serveJsonLine(runtime) + '\n');
565
- // Footgun guard (hybrid-MCP plan Phase 3): plain `dev` mounts no MCP bridge,
644
+ // A host-only sandbox mounts no MCP bridge unless one is needed.
566
645
  // so a `pyric mcp-proxy` in an editor cannot attach. Nudge toward --bridge.
567
646
  if (!bridgeOn && !json) {
568
647
  process.stderr.write(' tip MCP? re-run with --bridge so an editor (Cursor / Claude / Antigravity) can attach via `pyric mcp-proxy`.\n');
@@ -582,6 +661,7 @@ export async function runServe(parsed) {
582
661
  void openBrowser(targetUrl);
583
662
  }
584
663
  let devChild = null;
664
+ let beaconWatchdog = null;
585
665
  let functionsRuntime = null;
586
666
  let resolveFunctionsExit;
587
667
  const functionsExited = new Promise((resolve) => { resolveFunctionsExit = resolve; });
@@ -603,6 +683,7 @@ export async function runServe(parsed) {
603
683
  ]);
604
684
  const stopAfterSignal = async () => {
605
685
  (json ? process.stderr : process.stdout).write('\nShutting down...\n');
686
+ beaconWatchdog?.stop();
606
687
  if (devChild && devChild.child.exitCode === null)
607
688
  devChild.signal(await signal);
608
689
  await functionsRuntime?.close().catch(() => undefined);
@@ -645,6 +726,7 @@ export async function runServe(parsed) {
645
726
  baseEnv: process.env,
646
727
  serveUrl: runtime.handle.url,
647
728
  registerUrl: registerModuleUrl(),
729
+ beaconToken: runtime.beaconToken,
648
730
  instance: `${functionsProjectId}-default-rtdb`,
649
731
  location: process.env.PYRIC_FUNCTIONS_RTDB_REGION ?? 'us-central1',
650
732
  projectId: functionsProjectId ?? 'demo-project',
@@ -657,7 +739,7 @@ export async function runServe(parsed) {
657
739
  const result = startOutcome.value;
658
740
  if (result.kind === 'no-peer') {
659
741
  process.stderr.write(` ⚠ functions not started — no browser tab connected after 30s. ` +
660
- `Open ${runtime.handle.url} and restart pyric dev.\n`);
742
+ `Open ${runtime.handle.url} and restart pyric sandbox.\n`);
661
743
  }
662
744
  else if (result.kind === 'failed') {
663
745
  process.stderr.write(`${result.error.message}\n`);
@@ -672,14 +754,13 @@ export async function runServe(parsed) {
672
754
  `from ${relative(cwd, functionsProject.entry)}\n`);
673
755
  for (const unsupported of ready.unsupportedTriggers) {
674
756
  process.stderr.write(` ⚠ functions export ${unsupported.exportName} uses unsupported trigger ` +
675
- `${unsupported.eventType}; it will not run in pyric dev.\n`);
757
+ `${unsupported.eventType}; it will not run in pyric sandbox.\n`);
676
758
  }
677
759
  }
678
760
  }
679
- // The child runner ("one command, not two"): run the user's own dev
680
- // command with the sandbox environment injected. Precedence: `-- <cmd>`
681
- // wins; else the package.json dev script; else host-only. --no-run forces
682
- // host-only; --json defaults to host-only (explicit `--` still wins).
761
+ // Run the explicit or configured command with the sandbox environment.
762
+ // `--no-run` forces host-only. `--json` skips the configured command, but an
763
+ // explicit command still runs.
683
764
  // (`plan` was resolved above so it could imply the bridge mount.)
684
765
  if (plan) {
685
766
  const info = json ? process.stderr : process.stdout;
@@ -698,20 +779,41 @@ export async function runServe(parsed) {
698
779
  info.write(` ⚠ no browser tab connected after 30s — starting your command anyway; sandbox ops will fail until ${runtime.handle.url} is open.\n`);
699
780
  }
700
781
  }
782
+ else if (!json) {
783
+ info.write(` ⓘ Auto-open is disabled (--no-open/CI). The pyric sandbox is browser-resident: ` +
784
+ `open ${runtime.handle.url} to connect if your command performs Firebase operations.\n`);
785
+ }
701
786
  info.write(`✔ run \`${plan.label}\` — firebase-admin/firebase imports are routed to the sandbox at ${runtime.handle.url}\n`);
702
- devChild = spawnDevChild(plan, {
703
- cwd,
704
- json,
705
- env: buildChildEnv(process.env, {
706
- serveUrl: runtime.handle.url,
707
- registerUrl: registerModuleUrl(),
708
- }),
787
+ const childEnv = buildChildEnv(process.env, {
788
+ serveUrl: runtime.handle.url,
789
+ registerUrl: registerModuleUrl(),
790
+ beaconToken: runtime.beaconToken,
791
+ });
792
+ // What we are handing the child, stated before it starts: the interlock
793
+ // line and the unsupported-runtime check.
794
+ const interlock = reportLaunchChecks({
795
+ childEnv,
796
+ registerUrl: registerModuleUrl(),
797
+ argv: plan.argv,
798
+ write: (line) => info.write(line),
799
+ });
800
+ devChild = spawnSandboxChild(plan, { cwd, json, env: childEnv });
801
+ // A child still alive well after launch that never posted a beacon is very
802
+ // likely not intercepted. `startBeaconWatchdog` says why this only warns.
803
+ const beaconsAtSpawn = runtime.beaconCount();
804
+ beaconWatchdog = startBeaconWatchdog({
805
+ label: plan.label,
806
+ beacon: interlock.beacon,
807
+ sawBeacon: () => runtime.beaconCount() > beaconsAtSpawn,
808
+ isAlive: () => devChild !== null && devChild.child.exitCode === null,
809
+ warn: (line) => void process.stderr.write(`${line}\n`),
709
810
  });
710
811
  }
711
812
  else if (!json) {
712
813
  process.stdout.write(formatStartupEnvExport({
713
814
  serveUrl: runtime.handle.url,
714
815
  registerUrl: registerModuleUrl(),
816
+ beaconToken: runtime.beaconToken,
715
817
  }));
716
818
  }
717
819
  return await new Promise((resolveExit) => {
@@ -722,6 +824,7 @@ export async function runServe(parsed) {
722
824
  return;
723
825
  settled = true;
724
826
  void (async () => {
827
+ beaconWatchdog?.stop();
725
828
  await functionsRuntime?.close().catch(() => undefined);
726
829
  if (devChild && devChild.child.exitCode === null) {
727
830
  devChild.signal('SIGTERM');
@@ -754,7 +857,7 @@ export async function runServe(parsed) {
754
857
  if (functionsRuntime) {
755
858
  void functionsExited.then((code) => {
756
859
  if (!settled && !shuttingDown) {
757
- process.stderr.write(`pyric dev: Functions child exited unexpectedly (code ${code}).\n`);
860
+ process.stderr.write(`pyric sandbox: Functions child exited unexpectedly (code ${code}).\n`);
758
861
  finish(code === 0 ? 1 : code);
759
862
  }
760
863
  });
@@ -762,68 +865,4 @@ export async function runServe(parsed) {
762
865
  void signal.then(shutdown);
763
866
  });
764
867
  }
765
- /**
766
- * Detect a bundler build that INLINED the real firebase SDK into its served
767
- * assets (`vite build` output). The served import map remaps only bare
768
- * `firebase/*` specifiers, so such a build cannot be sandboxed — its calls
769
- * reach real Google endpoints. Fingerprints are real-SDK-only endpoint hosts
770
- * that never appear in a sandbox-clean app (whose calls all route to
771
- * `/__pyric/*`). Bounded: depth ≤ 4, ≤ 200 script files, first hit per file.
772
- * Returns publicDir-relative paths of offending assets.
773
- */
774
- export function scanForInlinedFirebase(dir) {
775
- const FINGERPRINTS = [
776
- 'identitytoolkit.googleapis.com',
777
- 'firestore.googleapis.com',
778
- 'securetoken.googleapis.com',
779
- 'firebasedatabase.app',
780
- ];
781
- const hits = [];
782
- let scanned = 0;
783
- const walk = (d, rel, depth) => {
784
- if (depth > 4 || scanned >= 200)
785
- return;
786
- let names;
787
- try {
788
- names = readdirSync(d);
789
- }
790
- catch {
791
- return;
792
- }
793
- for (const name of names) {
794
- if (scanned >= 200)
795
- return;
796
- const p = join(d, name);
797
- const r = rel ? `${rel}/${name}` : name;
798
- let st;
799
- try {
800
- st = statSync(p);
801
- }
802
- catch {
803
- continue;
804
- }
805
- if (st.isDirectory()) {
806
- // The pyric namespace itself never lands in hosting.public, but a
807
- // node_modules inside a served dir would be a scan-cost trap.
808
- // Dot-directories (.next, .git, .pyric) are internal caches and must be ignored.
809
- if (name === 'node_modules' || name.startsWith('.'))
810
- continue;
811
- walk(p, r, depth + 1);
812
- }
813
- else if (/\.(js|mjs)$/.test(name)) {
814
- scanned++;
815
- try {
816
- const text = readFileSync(p, 'utf8');
817
- if (FINGERPRINTS.some((f) => text.includes(f)))
818
- hits.push(r);
819
- }
820
- catch {
821
- // unreadable asset: skip
822
- }
823
- }
824
- }
825
- };
826
- walk(dir, '', 0);
827
- return hits;
828
- }
829
868
  //# sourceMappingURL=serve.js.map