@pyric/cli 0.1.0-alpha.11 → 0.1.0-alpha.13

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 (424) hide show
  1. package/dist/cli/serve.js +4 -4
  2. package/dist/cli/serve.js.map +1 -1
  3. package/dist/conformance/.generated/can-i-use-browser.d.ts.map +1 -1
  4. package/dist/conformance/.generated/can-i-use-browser.js +1 -1
  5. package/dist/conformance/.generated/can-i-use-browser.js.map +1 -1
  6. package/dist/conformance/.generated/can-i-use.d.ts.map +1 -1
  7. package/dist/conformance/.generated/can-i-use.js +2 -2
  8. package/dist/conformance/.generated/can-i-use.js.map +1 -1
  9. package/dist/serve/bundler.d.ts +13 -8
  10. package/dist/serve/bundler.d.ts.map +1 -1
  11. package/dist/serve/bundler.js +31 -36
  12. package/dist/serve/bundler.js.map +1 -1
  13. package/dist/serve/docs-ui/docs/_rhythm/index.html +1 -1
  14. package/dist/serve/docs-ui/docs/agent/set-up-your-agent/index.html +1 -1
  15. package/dist/serve/docs-ui/docs/agent/watch-and-review/index.html +1 -1
  16. package/dist/serve/docs-ui/docs/agent/work-with-an-agent/index.html +1 -1
  17. package/dist/serve/docs-ui/docs/ai-compat/index.html +1 -1
  18. package/dist/serve/docs-ui/docs/api-reference/index.html +2 -2
  19. package/dist/serve/docs-ui/docs/api-reference.md +1 -1
  20. package/dist/serve/docs-ui/docs/app-compat/index.html +1 -1
  21. package/dist/serve/docs-ui/docs/auth-compat/index.html +1 -1
  22. package/dist/serve/docs-ui/docs/build/ai-logic/index.html +44 -22
  23. package/dist/serve/docs-ui/docs/build/ai-logic.md +69 -21
  24. package/dist/serve/docs-ui/docs/build/authentication/index.html +1 -1
  25. package/dist/serve/docs-ui/docs/build/cloud-firestore/index.html +1 -1
  26. package/dist/serve/docs-ui/docs/build/cloud-messaging/index.html +1 -1
  27. package/dist/serve/docs-ui/docs/build/cloud-storage/index.html +1 -1
  28. package/dist/serve/docs-ui/docs/build/realtime-database/index.html +1 -1
  29. package/dist/serve/docs-ui/docs/conformance-scores/index.html +1 -1
  30. package/dist/serve/docs-ui/docs/create-pyric-reference-api/index.html +1 -1
  31. package/dist/serve/docs-ui/docs/database-compat/index.html +1 -1
  32. package/dist/serve/docs-ui/docs/firestore-compat/index.html +1 -1
  33. package/dist/serve/docs-ui/docs/functions-rtdb-compat/index.html +1 -1
  34. package/dist/serve/docs-ui/docs/get-started/how-the-swap-works/index.html +2 -1
  35. package/dist/serve/docs-ui/docs/get-started/how-the-swap-works.md +2 -0
  36. package/dist/serve/docs-ui/docs/get-started/start-building/index.html +3 -2
  37. package/dist/serve/docs-ui/docs/get-started/start-building.md +3 -1
  38. package/dist/serve/docs-ui/docs/index.json +349 -29
  39. package/dist/serve/docs-ui/docs/messaging-compat/index.html +1 -1
  40. package/dist/serve/docs-ui/docs/observe/resolve-runtime-status/index.html +28 -0
  41. package/dist/serve/docs-ui/docs/observe/resolve-runtime-status.md +47 -0
  42. package/dist/serve/docs-ui/docs/observe/see-whats-happening/index.html +1 -1
  43. package/dist/serve/docs-ui/docs/observe/shape-your-data/index.html +1 -1
  44. package/dist/serve/docs-ui/docs/overview/index.html +1 -1
  45. package/dist/serve/docs-ui/docs/pyric-admin-app-reference-api/index.html +1 -1
  46. package/dist/serve/docs-ui/docs/pyric-admin-auth-reference-api/index.html +1 -1
  47. package/dist/serve/docs-ui/docs/pyric-admin-database-reference-api/index.html +1 -1
  48. package/dist/serve/docs-ui/docs/pyric-admin-firestore-reference-api/index.html +1 -1
  49. package/dist/serve/docs-ui/docs/pyric-admin-messaging-reference-api/index.html +916 -0
  50. package/dist/serve/docs-ui/docs/pyric-admin-messaging-reference-api.md +706 -0
  51. package/dist/serve/docs-ui/docs/pyric-admin-storage-reference-api/index.html +1 -1
  52. package/dist/serve/docs-ui/docs/pyric-ai-reference-api/index.html +1 -1
  53. package/dist/serve/docs-ui/docs/pyric-ai-scripting-reference-api/index.html +1 -1
  54. package/dist/serve/docs-ui/docs/pyric-app-reference-api/index.html +1 -1
  55. package/dist/serve/docs-ui/docs/pyric-auth-reference-api/index.html +1 -1
  56. package/dist/serve/docs-ui/docs/pyric-cli-assurance-browser-reference-api/index.html +1 -1
  57. package/dist/serve/docs-ui/docs/pyric-cli-assurance-reference-api/index.html +1 -1
  58. package/dist/serve/docs-ui/docs/pyric-cli-bridge-client-reference-api/index.html +1 -1
  59. package/dist/serve/docs-ui/docs/pyric-cli-bridge-reference-api/index.html +1 -1
  60. package/dist/serve/docs-ui/docs/pyric-cli-conformance-browser-reference-api/index.html +1 -1
  61. package/dist/serve/docs-ui/docs/pyric-cli-conformance-docs-reference-api/index.html +1 -1
  62. package/dist/serve/docs-ui/docs/pyric-cli-conformance-reference-api/index.html +1 -1
  63. package/dist/serve/docs-ui/docs/pyric-cli-credentials-node-reference-api/index.html +1 -1
  64. package/dist/serve/docs-ui/docs/pyric-cli-discover-reference-api/index.html +1 -1
  65. package/dist/serve/docs-ui/docs/pyric-cli-register-reference-api/index.html +1 -1
  66. package/dist/serve/docs-ui/docs/pyric-cli-remote-reference-api/index.html +1 -1
  67. package/dist/serve/docs-ui/docs/pyric-cli-serve-worker-reference-api/index.html +168 -76
  68. package/dist/serve/docs-ui/docs/pyric-cli-serve-worker-reference-api.md +156 -73
  69. package/dist/serve/docs-ui/docs/pyric-cli-verify-reference-api/index.html +1 -1
  70. package/dist/serve/docs-ui/docs/pyric-cli-vite-reference-api/index.html +11 -8
  71. package/dist/serve/docs-ui/docs/pyric-cli-vite-reference-api.md +17 -4
  72. package/dist/serve/docs-ui/docs/pyric-database-reference-api/index.html +1 -1
  73. package/dist/serve/docs-ui/docs/pyric-firestore-reference-api/index.html +1 -1
  74. package/dist/serve/docs-ui/docs/pyric-messaging-reference-api/index.html +1 -1
  75. package/dist/serve/docs-ui/docs/pyric-messaging-sw-reference-api/index.html +1 -1
  76. package/dist/serve/docs-ui/docs/pyric-rules-reference-api/index.html +1 -1
  77. package/dist/serve/docs-ui/docs/pyric-sandbox-database-reference-api/index.html +1 -1
  78. package/dist/serve/docs-ui/docs/pyric-sandbox-firestore-reference-api/index.html +1 -1
  79. package/dist/serve/docs-ui/docs/pyric-sandbox-reference-api/index.html +37 -14
  80. package/dist/serve/docs-ui/docs/pyric-sandbox-reference-api.md +28 -8
  81. package/dist/serve/docs-ui/docs/pyric-storage-reference-api/index.html +1 -1
  82. package/dist/serve/docs-ui/docs/pyric-ui-agents-reference-api/index.html +1 -1
  83. package/dist/serve/docs-ui/docs/pyric-ui-auth-hooks-reference-api/index.html +1 -1
  84. package/dist/serve/docs-ui/docs/pyric-ui-auth-reference-api/index.html +1 -1
  85. package/dist/serve/docs-ui/docs/pyric-ui-events-hooks-reference-api/index.html +1 -1
  86. package/dist/serve/docs-ui/docs/pyric-ui-events-reference-api/index.html +1 -1
  87. package/dist/serve/docs-ui/docs/pyric-ui-firestore-hooks-reference-api/index.html +1 -1
  88. package/dist/serve/docs-ui/docs/pyric-ui-firestore-reference-api/index.html +1 -1
  89. package/dist/serve/docs-ui/docs/pyric-ui-primitives-reference-api/index.html +1 -1
  90. package/dist/serve/docs-ui/docs/pyric-ui-rtdb-reference-api/index.html +1 -1
  91. package/dist/serve/docs-ui/docs/pyric-ui-rules-hooks-reference-api/index.html +1 -1
  92. package/dist/serve/docs-ui/docs/pyric-ui-rules-reference-api/index.html +1 -1
  93. package/dist/serve/docs-ui/docs/pyric-ui-storage-hooks-reference-api/index.html +1 -1
  94. package/dist/serve/docs-ui/docs/pyric-ui-storage-reference-api/index.html +1 -1
  95. package/dist/serve/docs-ui/docs/pyric-ui-traffic-hooks-reference-api/index.html +1 -1
  96. package/dist/serve/docs-ui/docs/pyric-ui-traffic-reference-api/index.html +1 -1
  97. package/dist/serve/docs-ui/docs/rules-compat/index.html +1 -1
  98. package/dist/serve/docs-ui/docs/secure/audit-your-rules/index.html +1 -1
  99. package/dist/serve/docs-ui/docs/secure/firestore-rules-limits/index.html +1 -1
  100. package/dist/serve/docs-ui/docs/secure/read-a-denial/index.html +1 -1
  101. package/dist/serve/docs-ui/docs/secure/rtdb-rules-in-typescript/index.html +1 -1
  102. package/dist/serve/docs-ui/docs/secure/rules-standard-library/index.html +1 -1
  103. package/dist/serve/docs-ui/docs/secure/secure-it-with-rules/index.html +1 -1
  104. package/dist/serve/docs-ui/docs/secure/simulate-and-lint/index.html +1 -1
  105. package/dist/serve/docs-ui/docs/secure/write-a-rules-test-suite/index.html +1 -1
  106. package/dist/serve/docs-ui/docs/ship/ship-to-production/index.html +1 -1
  107. package/dist/serve/docs-ui/docs/ship/test-in-node/index.html +1 -1
  108. package/dist/serve/docs-ui/docs/storage-compat/index.html +1 -1
  109. package/dist/serve/docs-ui/docs/trust/how-we-know-it-matches-firebase/index.html +1 -1
  110. package/dist/serve/docs-ui/docs/trust/versioning-and-compatibility/index.html +1 -1
  111. package/dist/serve/docs-ui/docs/tutorial/index.html +429 -0
  112. package/dist/serve/docs-ui/docs/tutorial.md +701 -0
  113. package/dist/serve/docs-ui/llms.txt +3 -1
  114. package/dist/serve/entries/init.d.ts.map +1 -1
  115. package/dist/serve/entries/init.js +3 -0
  116. package/dist/serve/entries/init.js.map +1 -1
  117. package/dist/serve/entries/runtime.d.ts.map +1 -1
  118. package/dist/serve/entries/runtime.js +20 -5
  119. package/dist/serve/entries/runtime.js.map +1 -1
  120. package/dist/serve/entries/worker-runtime.d.ts +2 -2
  121. package/dist/serve/entries/worker-runtime.d.ts.map +1 -1
  122. package/dist/serve/entries/worker-runtime.js +45 -10
  123. package/dist/serve/entries/worker-runtime.js.map +1 -1
  124. package/dist/serve/runtime/chip-config.d.ts +19 -0
  125. package/dist/serve/runtime/chip-config.d.ts.map +1 -0
  126. package/dist/serve/runtime/chip-config.js +19 -0
  127. package/dist/serve/runtime/chip-config.js.map +1 -0
  128. package/dist/serve/runtime/chip-install.d.ts +10 -0
  129. package/dist/serve/runtime/chip-install.d.ts.map +1 -0
  130. package/dist/serve/runtime/chip-install.js +15 -0
  131. package/dist/serve/runtime/chip-install.js.map +1 -0
  132. package/dist/serve/runtime/chip.d.ts +17 -0
  133. package/dist/serve/runtime/chip.d.ts.map +1 -0
  134. package/dist/serve/runtime/chip.js +257 -0
  135. package/dist/serve/runtime/chip.js.map +1 -0
  136. package/dist/serve/runtime/manifest.d.ts +22 -0
  137. package/dist/serve/runtime/manifest.d.ts.map +1 -0
  138. package/dist/serve/runtime/manifest.js +20 -0
  139. package/dist/serve/runtime/manifest.js.map +1 -0
  140. package/dist/serve/runtime/status.d.ts +49 -0
  141. package/dist/serve/runtime/status.d.ts.map +1 -0
  142. package/dist/serve/runtime/status.js +164 -0
  143. package/dist/serve/runtime/status.js.map +1 -0
  144. package/dist/serve/runtime/worker-connection.d.ts +4 -0
  145. package/dist/serve/runtime/worker-connection.d.ts.map +1 -0
  146. package/dist/serve/runtime/worker-connection.js +11 -0
  147. package/dist/serve/runtime/worker-connection.js.map +1 -0
  148. package/dist/serve/runtime/worker-generation.d.ts +14 -0
  149. package/dist/serve/runtime/worker-generation.d.ts.map +1 -0
  150. package/dist/serve/runtime/worker-generation.js +56 -0
  151. package/dist/serve/runtime/worker-generation.js.map +1 -0
  152. package/dist/serve/runtime/worker-replacement.d.ts +18 -0
  153. package/dist/serve/runtime/worker-replacement.d.ts.map +1 -0
  154. package/dist/serve/runtime/worker-replacement.js +29 -0
  155. package/dist/serve/runtime/worker-replacement.js.map +1 -0
  156. package/dist/serve/standalone-assets.d.ts +2 -2
  157. package/dist/serve/standalone-assets.d.ts.map +1 -1
  158. package/dist/serve/standalone-assets.js +1 -1
  159. package/dist/serve/standalone-assets.js.map +1 -1
  160. package/dist/serve/studio-ui/assets/{RulesCodeEditor-CxVYcZXw.js → RulesCodeEditor-BDlH-5lp.js} +1 -1
  161. package/dist/serve/studio-ui/assets/{index-cpSfgQ7H.js → index-Bf9SSE8L.js} +5 -5
  162. package/dist/serve/studio-ui/assets/{seed-DeuFKi4J.js → seed-D_UjxfOU.js} +1 -1
  163. package/dist/serve/studio-ui/index.html +1 -1
  164. package/dist/serve/vite-ai-config.d.ts +25 -0
  165. package/dist/serve/vite-ai-config.d.ts.map +1 -0
  166. package/dist/serve/vite-ai-config.js +45 -0
  167. package/dist/serve/vite-ai-config.js.map +1 -0
  168. package/dist/serve/vite-plugin.d.ts +17 -36
  169. package/dist/serve/vite-plugin.d.ts.map +1 -1
  170. package/dist/serve/vite-plugin.js +38 -57
  171. package/dist/serve/vite-plugin.js.map +1 -1
  172. package/dist/serve/vite-rules-source.d.ts +8 -0
  173. package/dist/serve/vite-rules-source.d.ts.map +1 -0
  174. package/dist/serve/vite-rules-source.js +23 -0
  175. package/dist/serve/vite-rules-source.js.map +1 -0
  176. package/dist/serve/vite-worker-runtime.d.ts +20 -0
  177. package/dist/serve/vite-worker-runtime.d.ts.map +1 -0
  178. package/dist/serve/vite-worker-runtime.js +25 -0
  179. package/dist/serve/vite-worker-runtime.js.map +1 -0
  180. package/dist/serve/worker/client/connection.d.ts +7 -2
  181. package/dist/serve/worker/client/connection.d.ts.map +1 -1
  182. package/dist/serve/worker/client/connection.js +13 -16
  183. package/dist/serve/worker/client/connection.js.map +1 -1
  184. package/dist/serve/worker/client/core.d.ts +7 -0
  185. package/dist/serve/worker/client/core.d.ts.map +1 -1
  186. package/dist/serve/worker/client/core.js +28 -0
  187. package/dist/serve/worker/client/core.js.map +1 -1
  188. package/dist/serve/worker/client/runtime-control.d.ts +8 -0
  189. package/dist/serve/worker/client/runtime-control.d.ts.map +1 -0
  190. package/dist/serve/worker/client/runtime-control.js +11 -0
  191. package/dist/serve/worker/client/runtime-control.js.map +1 -0
  192. package/dist/serve/worker/entry.js +44 -2
  193. package/dist/serve/worker/entry.js.map +1 -1
  194. package/dist/serve/worker/host/core.js +1 -1
  195. package/dist/serve/worker/host/core.js.map +1 -1
  196. package/dist/serve/worker/host/firestore-writes.d.ts.map +1 -1
  197. package/dist/serve/worker/host/firestore-writes.js +3 -2
  198. package/dist/serve/worker/host/firestore-writes.js.map +1 -1
  199. package/dist/serve/worker/host/studio.js +1 -1
  200. package/dist/serve/worker/host/studio.js.map +1 -1
  201. package/dist/serve/worker/host-context.d.ts +1 -1
  202. package/dist/serve/worker/host-context.d.ts.map +1 -1
  203. package/dist/serve/worker/index.d.ts +2 -1
  204. package/dist/serve/worker/index.d.ts.map +1 -1
  205. package/dist/serve/worker/index.js +2 -1
  206. package/dist/serve/worker/index.js.map +1 -1
  207. package/dist/serve/worker/protocol.d.ts +15 -1
  208. package/dist/serve/worker/protocol.d.ts.map +1 -1
  209. package/dist/serve/worker/protocol.js +2 -2
  210. package/dist/serve/worker/protocol.js.map +1 -1
  211. package/dist/serve/worker/retirement.d.ts +21 -0
  212. package/dist/serve/worker/retirement.d.ts.map +1 -0
  213. package/dist/serve/worker/retirement.js +97 -0
  214. package/dist/serve/worker/retirement.js.map +1 -0
  215. package/dist/serve/worker/serve-init.d.ts.map +1 -1
  216. package/dist/serve/worker/serve-init.js +5 -6
  217. package/dist/serve/worker/serve-init.js.map +1 -1
  218. package/dist/vite.d.ts +1 -0
  219. package/dist/vite.d.ts.map +1 -1
  220. package/dist/vite.js.map +1 -1
  221. package/package.json +6 -4
  222. package/src/assurance/.generated/conformance-verdicts.ts +1090 -0
  223. package/src/assurance/attachment.ts +211 -0
  224. package/src/assurance/browser.ts +80 -0
  225. package/src/assurance/campaign.ts +496 -0
  226. package/src/assurance/capabilities.ts +446 -0
  227. package/src/assurance/cases.ts +43 -0
  228. package/src/assurance/index.ts +75 -0
  229. package/src/assurance/runner.ts +885 -0
  230. package/src/assurance/tool-names.ts +15 -0
  231. package/src/assurance/tools.ts +830 -0
  232. package/src/assurance/types.ts +352 -0
  233. package/src/assurance/validation.ts +434 -0
  234. package/src/bridge/client/bridge.ts +550 -0
  235. package/src/bridge/client/dispatch.ts +137 -0
  236. package/src/bridge/client.ts +45 -0
  237. package/src/bridge/protocol.ts +351 -0
  238. package/src/bridge/server/audit.ts +53 -0
  239. package/src/bridge/server/bridge.ts +597 -0
  240. package/src/bridge/server/headless.ts +160 -0
  241. package/src/bridge/server/json-schema-to-zod.ts +108 -0
  242. package/src/bridge/server/local-bridge.ts +66 -0
  243. package/src/bridge/server/logger.ts +50 -0
  244. package/src/bridge/server/mcp-contract.ts +93 -0
  245. package/src/bridge/server/mcp.ts +129 -0
  246. package/src/bridge/server/peer.ts +232 -0
  247. package/src/bridge/server/standalone.ts +347 -0
  248. package/src/bridge/server/tool-metadata.ts +99 -0
  249. package/src/bridge/server.ts +28 -0
  250. package/src/cli/can-i-use.ts +50 -0
  251. package/src/cli/cli.test.ts +493 -0
  252. package/src/cli/database-rules.ts +329 -0
  253. package/src/cli/dev-runner.ts +282 -0
  254. package/src/cli/firebase-json.ts +100 -0
  255. package/src/cli/firestore-indexes.ts +70 -0
  256. package/src/cli/index.ts +425 -0
  257. package/src/cli/init.ts +260 -0
  258. package/src/cli/mcp-proxy.ts +196 -0
  259. package/src/cli/parse-args.ts +80 -0
  260. package/src/cli/rules.ts +259 -0
  261. package/src/cli/scope.ts +67 -0
  262. package/src/cli/serve.ts +996 -0
  263. package/src/cli/service-commands.ts +73 -0
  264. package/src/cli/snapshot.ts +164 -0
  265. package/src/cli/storage-rules.ts +172 -0
  266. package/src/cli/verify.ts +416 -0
  267. package/src/conformance/.generated/can-i-use-browser.ts +113 -0
  268. package/src/conformance/.generated/can-i-use.ts +117 -0
  269. package/src/conformance/.generated/conformance-docs.ts +14 -0
  270. package/src/conformance/browser.ts +24 -0
  271. package/src/conformance/can-i-use-tool.ts +51 -0
  272. package/src/conformance/can-i-use.ts +18 -0
  273. package/src/conformance/docs.ts +8 -0
  274. package/src/conformance/index.ts +20 -0
  275. package/src/conformance/tools.ts +16 -0
  276. package/src/credentials/core/memoize-ttl.ts +142 -0
  277. package/src/credentials/core/types.ts +10 -0
  278. package/src/credentials/node/from-adc.ts +96 -0
  279. package/src/credentials/node/from-service-account.ts +133 -0
  280. package/src/credentials/node/index.ts +6 -0
  281. package/src/discover/concurrency.ts +127 -0
  282. package/src/discover/crawler-adapter.ts +142 -0
  283. package/src/discover/crawler.ts +1127 -0
  284. package/src/discover/credential-free.ts +27 -0
  285. package/src/discover/findCollectionGroup.ts +131 -0
  286. package/src/discover/firestore-source.ts +59 -0
  287. package/src/discover/index.ts +5 -0
  288. package/src/discover/merge.ts +523 -0
  289. package/src/discover/session.ts +402 -0
  290. package/src/discover/tools.ts +201 -0
  291. package/src/discover/types.ts +187 -0
  292. package/src/discover/wire.ts +324 -0
  293. package/src/functions-rtdb/child.ts +382 -0
  294. package/src/functions-rtdb/delivery.ts +7 -0
  295. package/src/functions-rtdb/discovery.ts +136 -0
  296. package/src/functions-rtdb/event.ts +64 -0
  297. package/src/functions-rtdb/execution.ts +111 -0
  298. package/src/functions-rtdb/in-memory-delivery.ts +40 -0
  299. package/src/functions-rtdb/project.ts +74 -0
  300. package/src/functions-rtdb/projection.ts +104 -0
  301. package/src/functions-rtdb/reference-pattern.ts +20 -0
  302. package/src/functions-rtdb/remote-delivery.ts +23 -0
  303. package/src/pkg-version.ts +49 -0
  304. package/src/register/esm-exports.ts +63 -0
  305. package/src/register/hooks.ts +30 -0
  306. package/src/register/index.ts +150 -0
  307. package/src/register/mapping.ts +33 -0
  308. package/src/remote/index.ts +1050 -0
  309. package/src/rtdb/crawl-snapshot.ts +118 -0
  310. package/src/rtdb/inspection.ts +137 -0
  311. package/src/rtdb/load-rules-document.ts +56 -0
  312. package/src/rtdb/rules-generation-tool.ts +38 -0
  313. package/src/rtdb/rules-json.ts +29 -0
  314. package/src/serve/activity-guard.ts +29 -0
  315. package/src/serve/activity-route.ts +164 -0
  316. package/src/serve/activity-warning.ts +26 -0
  317. package/src/serve/bridge-mount.ts +200 -0
  318. package/src/serve/bundler.ts +519 -0
  319. package/src/serve/capture-store.ts +65 -0
  320. package/src/serve/discovery.ts +199 -0
  321. package/src/serve/entries/ai.ts +292 -0
  322. package/src/serve/entries/app-backend.ts +4 -0
  323. package/src/serve/entries/app-client.ts +26 -0
  324. package/src/serve/entries/app-session-store.ts +47 -0
  325. package/src/serve/entries/app.ts +11 -0
  326. package/src/serve/entries/auth-helper-core.ts +181 -0
  327. package/src/serve/entries/auth-helper-dom.ts +134 -0
  328. package/src/serve/entries/auth-helper-runtime.ts +20 -0
  329. package/src/serve/entries/auth.ts +255 -0
  330. package/src/serve/entries/bridge-url.ts +31 -0
  331. package/src/serve/entries/database.ts +129 -0
  332. package/src/serve/entries/firestore.ts +232 -0
  333. package/src/serve/entries/init.ts +49 -0
  334. package/src/serve/entries/keepalive.ts +46 -0
  335. package/src/serve/entries/messaging-sw.ts +75 -0
  336. package/src/serve/entries/messaging.ts +96 -0
  337. package/src/serve/entries/runtime.ts +556 -0
  338. package/src/serve/entries/session-store.ts +97 -0
  339. package/src/serve/entries/storage.ts +92 -0
  340. package/src/serve/entries/tab-sync-wiring.ts +274 -0
  341. package/src/serve/entries/worker-runtime.ts +135 -0
  342. package/src/serve/init-payload.ts +42 -0
  343. package/src/serve/namespace.ts +675 -0
  344. package/src/serve/open-browser.ts +68 -0
  345. package/src/serve/rules.ts +272 -0
  346. package/src/serve/runtime/chip-config.ts +30 -0
  347. package/src/serve/runtime/chip-install.ts +27 -0
  348. package/src/serve/runtime/chip.ts +282 -0
  349. package/src/serve/runtime/manifest.ts +37 -0
  350. package/src/serve/runtime/status.ts +216 -0
  351. package/src/serve/runtime/worker-connection.ts +14 -0
  352. package/src/serve/runtime/worker-generation.ts +75 -0
  353. package/src/serve/runtime/worker-replacement.ts +42 -0
  354. package/src/serve/sandbox-marker.ts +31 -0
  355. package/src/serve/server.ts +428 -0
  356. package/src/serve/standalone-assets.ts +180 -0
  357. package/src/serve/state-store.ts +166 -0
  358. package/src/serve/studio/disk-project-store.ts +185 -0
  359. package/src/serve/studio/disk-workspace.ts +162 -0
  360. package/src/serve/studio/index.ts +20 -0
  361. package/src/serve/studio/routes.ts +237 -0
  362. package/src/serve/studio/store-types.ts +48 -0
  363. package/src/serve/studio/studio-storage.test.ts +289 -0
  364. package/src/serve/vite-ai-config.ts +77 -0
  365. package/src/serve/vite-plugin.ts +1075 -0
  366. package/src/serve/vite-rules-source.ts +28 -0
  367. package/src/serve/vite-worker-runtime.ts +51 -0
  368. package/src/serve/worker/activity-bootstrap.ts +24 -0
  369. package/src/serve/worker/client/admin-firestore.ts +38 -0
  370. package/src/serve/worker/client/ai.ts +124 -0
  371. package/src/serve/worker/client/auth.ts +489 -0
  372. package/src/serve/worker/client/connection.ts +227 -0
  373. package/src/serve/worker/client/core.ts +384 -0
  374. package/src/serve/worker/client/disconnect.ts +45 -0
  375. package/src/serve/worker/client/firestore-reads.ts +181 -0
  376. package/src/serve/worker/client/firestore-refs.ts +226 -0
  377. package/src/serve/worker/client/firestore-writes.ts +232 -0
  378. package/src/serve/worker/client/handles.ts +91 -0
  379. package/src/serve/worker/client/messaging.ts +119 -0
  380. package/src/serve/worker/client/presence.ts +174 -0
  381. package/src/serve/worker/client/rtdb.ts +311 -0
  382. package/src/serve/worker/client/rules.ts +63 -0
  383. package/src/serve/worker/client/runtime-control.ts +22 -0
  384. package/src/serve/worker/client/service-worker-connection.ts +59 -0
  385. package/src/serve/worker/client/snapshots.ts +86 -0
  386. package/src/serve/worker/client/storage.ts +195 -0
  387. package/src/serve/worker/client/studio.ts +88 -0
  388. package/src/serve/worker/client.ts +57 -0
  389. package/src/serve/worker/durable-persistence.ts +137 -0
  390. package/src/serve/worker/entry.ts +223 -0
  391. package/src/serve/worker/host/admin-firestore.ts +88 -0
  392. package/src/serve/worker/host/connection.ts +179 -0
  393. package/src/serve/worker/host/core.ts +387 -0
  394. package/src/serve/worker/host/dispatch.ts +316 -0
  395. package/src/serve/worker/host/firestore-reads.ts +117 -0
  396. package/src/serve/worker/host/firestore-writes.ts +456 -0
  397. package/src/serve/worker/host/presence.ts +312 -0
  398. package/src/serve/worker/host/rtdb.ts +136 -0
  399. package/src/serve/worker/host/rules.ts +128 -0
  400. package/src/serve/worker/host/storage.ts +312 -0
  401. package/src/serve/worker/host/studio.ts +75 -0
  402. package/src/serve/worker/host/subscriptions.ts +238 -0
  403. package/src/serve/worker/host-ai.ts +165 -0
  404. package/src/serve/worker/host-auth.ts +469 -0
  405. package/src/serve/worker/host-context.ts +273 -0
  406. package/src/serve/worker/host-events.ts +94 -0
  407. package/src/serve/worker/host-messaging.ts +240 -0
  408. package/src/serve/worker/host.ts +47 -0
  409. package/src/serve/worker/index.ts +196 -0
  410. package/src/serve/worker/presence-timing.ts +15 -0
  411. package/src/serve/worker/protocol.ts +1124 -0
  412. package/src/serve/worker/retirement.ts +125 -0
  413. package/src/serve/worker/serve-init.ts +605 -0
  414. package/src/serve/worker/service-worker-channel.ts +33 -0
  415. package/src/serve/worker/service-worker-relay.ts +86 -0
  416. package/src/serve/writer-lock.ts +53 -0
  417. package/src/verify/cases.ts +233 -0
  418. package/src/verify/fixture.ts +258 -0
  419. package/src/verify/index.ts +519 -0
  420. package/src/verify/tools.ts +108 -0
  421. package/src/version/compat-target.ts +17 -0
  422. package/src/vite.ts +18 -0
  423. package/dist/serve/docs-ui/docs/pyric-firestore-values-reference-api/index.html +0 -31
  424. package/dist/serve/docs-ui/docs/pyric-firestore-values-reference-api.md +0 -29
@@ -0,0 +1,63 @@
1
+ /**
2
+ * Rules deployment + status over the worker port — Firestore and RTDB rulesets.
3
+ */
4
+
5
+ import { nextId, rpc } from './core.js';
6
+ import type { ClientDb, ClientRtdb } from './handles.js';
7
+
8
+ // ─── setRules ────────────────────────────────────────────────────────────
9
+
10
+ /**
11
+ * Deploy new rules to the worker's sandbox. Active onSnapshot listeners
12
+ * that were allowed by the old rules may start receiving error callbacks
13
+ * if the new rules deny them.
14
+ */
15
+ export async function setRules(db: ClientDb, source: string): Promise<{ warnings: unknown[] }> {
16
+ const result = await rpc(db.port, {
17
+ t: 'op',
18
+ id: nextId(),
19
+ method: 'setRules',
20
+ source,
21
+ });
22
+ return result as { warnings: unknown[] };
23
+ }
24
+
25
+ export async function setFirestoreRules(
26
+ db: ClientDb,
27
+ source: string,
28
+ ): Promise<{ ok: boolean; warnings: unknown[]; messages: unknown[] }> {
29
+ const result = await rpc(db.port, {
30
+ t: 'op',
31
+ id: nextId(),
32
+ method: 'setFirestoreRules',
33
+ source,
34
+ });
35
+ return result as { ok: boolean; warnings: unknown[]; messages: unknown[] };
36
+ }
37
+
38
+ export async function setDatabaseRules(
39
+ db: ClientDb | ClientRtdb,
40
+ source: unknown,
41
+ ): Promise<{ ok: boolean; messages: unknown[] }> {
42
+ const result = await rpc(db.port, {
43
+ t: 'op',
44
+ id: nextId(),
45
+ method: 'setDatabaseRules',
46
+ source,
47
+ });
48
+ return result as { ok: boolean; messages: unknown[] };
49
+ }
50
+
51
+ export async function getActiveRules(
52
+ db: ClientDb | ClientRtdb,
53
+ service?: 'firestore' | 'database',
54
+ ): Promise<unknown> {
55
+ return rpc(db.port, { t: 'op', id: nextId(), method: 'getActiveRules', service });
56
+ }
57
+
58
+ export async function getRulesStatus(
59
+ db: ClientDb | ClientRtdb,
60
+ service?: 'firestore' | 'database',
61
+ ): Promise<unknown> {
62
+ return rpc(db.port, { t: 'op', id: nextId(), method: 'getRulesStatus', service });
63
+ }
@@ -0,0 +1,22 @@
1
+ import { nextId, rpcWithTimeout, subscribeRuntimeReload } from './core.js';
2
+ import type { ClientDb } from './handles.js';
3
+
4
+ /** Ask the current SharedWorker to drain accepted work and retire. */
5
+ export async function retireWorkerRuntime(
6
+ db: ClientDb,
7
+ targetEpoch: string,
8
+ options: { timeoutMs?: number } = {},
9
+ ): Promise<void> {
10
+ const timeoutMs = options.timeoutMs ?? 12_000;
11
+ await rpcWithTimeout(
12
+ db.port,
13
+ { t: 'op', id: nextId(), method: 'retireRuntime', targetEpoch },
14
+ timeoutMs,
15
+ `Timed out waiting for the Pyric worker to retire after ${timeoutMs}ms.`,
16
+ );
17
+ }
18
+
19
+ /** Observe the worker's all-pages reload signal. */
20
+ export function onWorkerRuntimeReload(listener: (epoch: string) => void): () => void {
21
+ return subscribeRuntimeReload((message) => listener(message.epoch));
22
+ }
@@ -0,0 +1,59 @@
1
+ /** MessagePort-shaped client transport from ServiceWorkerGlobalScope to the SharedWorker. */
2
+ import { wirePort } from './core.js';
3
+ import type { ClientDb, ClientPort } from './handles.js';
4
+ import {
5
+ SERVICE_WORKER_CHANNEL,
6
+ type ServiceWorkerChannelMessage,
7
+ } from '../service-worker-channel.js';
8
+
9
+ function newSessionId(): string {
10
+ return typeof crypto.randomUUID === 'function'
11
+ ? crypto.randomUUID()
12
+ : `${Date.now().toString(36)}-${Math.random().toString(36).slice(2)}`;
13
+ }
14
+
15
+ export function getServiceWorkerFirestore(appName: string): ClientDb {
16
+ if (typeof BroadcastChannel === 'undefined') {
17
+ throw new Error('BroadcastChannel is required to connect firebase/messaging/sw to the Pyric backend.');
18
+ }
19
+ const channel = new BroadcastChannel(SERVICE_WORKER_CHANNEL);
20
+ // Stable logical id + fresh realm id lets the host replace stale subscriptions
21
+ // without accepting late frames from the superseded Service Worker realm.
22
+ const clientId = `service-worker:${encodeURIComponent(appName)}`;
23
+ const sessionId = newSessionId();
24
+ channel.postMessage({
25
+ direction: 'host',
26
+ phase: 'attach',
27
+ clientId,
28
+ sessionId,
29
+ } satisfies ServiceWorkerChannelMessage);
30
+ const port: ClientPort = {
31
+ onmessage: null,
32
+ postMessage(message) {
33
+ channel.postMessage({
34
+ direction: 'host',
35
+ phase: 'message',
36
+ clientId,
37
+ sessionId,
38
+ message,
39
+ } satisfies ServiceWorkerChannelMessage);
40
+ },
41
+ start() {},
42
+ close() {
43
+ channel.close();
44
+ port.onmessage = null;
45
+ },
46
+ } satisfies ClientPort;
47
+ channel.onmessage = (event: MessageEvent<ServiceWorkerChannelMessage>) => {
48
+ const envelope = event.data;
49
+ if (
50
+ envelope.direction !== 'client'
51
+ || envelope.clientId !== clientId
52
+ || envelope.sessionId !== sessionId
53
+ ) return;
54
+ port.onmessage?.({ data: envelope.message } as MessageEvent);
55
+ };
56
+ const db = { __kind: 'client-db', port } satisfies ClientDb;
57
+ wirePort(db.port);
58
+ return db;
59
+ }
@@ -0,0 +1,86 @@
1
+ /**
2
+ * Firestore snapshot machinery for the worker client — wire-form document
3
+ * results rehydrated into the modular SDK's snapshot shapes. Shared by the
4
+ * read, listener, and transaction families.
5
+ */
6
+ import type { SerializedDocData } from '../protocol.js';
7
+ import { deserializeDocData } from '../protocol.js';
8
+ import type { ClientPort, DocRefHandle } from './handles.js';
9
+
10
+ // ─── Rehydration (class instance restoration) ─────────────────────────────
11
+
12
+ /**
13
+ * Deserialize doc data from wire form to real class instances.
14
+ *
15
+ * `deserializeDocData` (protocol.ts) now calls `rehydrateDocValue` from
16
+ * pyric/sandbox, which reconstructs REAL Timestamp, Bytes, and LatLng
17
+ * instances — not plain-object look-alikes. This means:
18
+ * - `snap.data().createdAt` is a real `Timestamp` with `.seconds`/`.nanos`
19
+ * - `snap.data().blob` is a real `Bytes` with `.data` (Uint8Array)
20
+ * - `snap.data().where` is a real `LatLng` with `.lat`/`.lng`
21
+ * Consumer code that uses `instanceof` checks or method calls will work
22
+ * correctly after deserialization.
23
+ */
24
+ function rehydrateDocData(serialized: SerializedDocData): Record<string, unknown> {
25
+ return deserializeDocData(serialized) as Record<string, unknown>;
26
+ }
27
+
28
+ // ─── Snapshot deserialization helpers ────────────────────────────────────
29
+
30
+ export interface RawDocResult {
31
+ id: string;
32
+ path?: string;
33
+ exists: boolean;
34
+ data?: SerializedDocData;
35
+ }
36
+
37
+ export function makeDocSnapshot(raw: RawDocResult, port: ClientPort): ClientDocSnapshot {
38
+ const data = raw.exists && raw.data ? rehydrateDocData(raw.data) : undefined;
39
+ const path = raw.path ?? raw.id;
40
+ const ref: DocRefHandle = {
41
+ __kind: 'doc-ref',
42
+ descriptor: { __ref: 'doc', path },
43
+ port,
44
+ id: raw.id,
45
+ path,
46
+ };
47
+ return {
48
+ id: raw.id,
49
+ path,
50
+ // Query snapshot refs are real worker handles, not path-only lookalikes:
51
+ // Firebase callers may pass `snapshot.ref` straight into deleteDoc/setDoc.
52
+ ref,
53
+ exists: () => raw.exists,
54
+ data: () => data,
55
+ };
56
+ }
57
+
58
+ export interface RawQueryResult {
59
+ docs: RawDocResult[];
60
+ }
61
+
62
+ export function makeQuerySnapshot(raw: RawQueryResult, port: ClientPort): ClientQuerySnapshot {
63
+ const docs = raw.docs.map((doc) => makeDocSnapshot(doc, port));
64
+ return {
65
+ size: docs.length,
66
+ empty: docs.length === 0,
67
+ docs,
68
+ };
69
+ }
70
+
71
+ // ─── Client snapshot types ────────────────────────────────────────────────
72
+
73
+ export interface ClientDocSnapshot {
74
+ readonly id: string;
75
+ readonly path: string;
76
+ /** Full port-carrying reference, usable by write APIs. */
77
+ readonly ref: DocRefHandle;
78
+ exists(): boolean;
79
+ data(): Record<string, unknown> | undefined;
80
+ }
81
+
82
+ export interface ClientQuerySnapshot {
83
+ readonly size: number;
84
+ readonly empty: boolean;
85
+ readonly docs: ClientDocSnapshot[];
86
+ }
@@ -0,0 +1,195 @@
1
+ /**
2
+ * Worker-backed FirebaseStorage mirror (Pyric Studio data browse) — client-side
3
+ * ref path math plus `listAll`/`getMetadata`/`getBlob`/`getDownloadURL` reads and the base64
4
+ * byte ops (`uploadBytes`/`getBytes`/`deleteObject`) over the worker port.
5
+ */
6
+
7
+ import { bytesToBase64, base64ToBytes, storagePayloadTooLarge, MAX_STORAGE_OP_BYTES } from '../protocol.js';
8
+ import type { FullMetadata } from 'pyric/storage';
9
+ import { dataRpc, nextId, wirePort } from './core.js';
10
+ import { lastSegment } from './handles.js';
11
+ import type { ClientDb, ClientPort } from './handles.js';
12
+
13
+ // ─── Storage (Pyric Studio data browse) ───────────────────────────────────
14
+ // A worker-backed `FirebaseStorage` mirror: `ref` is client-side (path math),
15
+ // `listAll`/`getMetadata`/`getBlob`/`getDownloadURL` RPC to the host (which enforces rules).
16
+ // Mutations are a follow-up.
17
+
18
+ /** Worker-backed Storage handle (carries the shared `MessagePort`). */
19
+ export interface ClientFirebaseStorage {
20
+ readonly __kind: 'client-storage';
21
+ readonly port: ClientPort;
22
+ }
23
+
24
+ /** Worker-backed Storage reference (path + name; carries the port for ops). */
25
+ export interface ClientStorageReference {
26
+ readonly __kind: 'storage-ref';
27
+ readonly port: ClientPort;
28
+ readonly fullPath: string;
29
+ readonly name: string;
30
+ }
31
+
32
+ /** Strip leading/trailing slashes (the worker keyspace uses bare paths). */
33
+ function normalizeStorageRefPath(path: string): string {
34
+ return path.replace(/^\/+|\/+$/g, '');
35
+ }
36
+
37
+ /**
38
+ * Get the worker-backed Storage handle. Like `getAuth`, accepts an existing
39
+ * `ClientDb` (reusing its port) or a worker URL (standalone).
40
+ */
41
+ export function getStorage(source: ClientDb | string | URL, name?: string): ClientFirebaseStorage {
42
+ let port: ClientPort;
43
+ if (typeof source === 'object' && '__kind' in source && source.__kind === 'client-db') {
44
+ port = source.port;
45
+ } else {
46
+ if (typeof SharedWorker === 'undefined') {
47
+ throw new Error(
48
+ 'SharedWorker is not available. ' +
49
+ 'Open this page over http:// (not file://) and use a supported browser.',
50
+ );
51
+ }
52
+ const worker = new SharedWorker(source as string | URL, {
53
+ type: 'classic',
54
+ name: name ?? 'pyric-shared-worker',
55
+ });
56
+ port = worker.port;
57
+ port.start();
58
+ wirePort(port);
59
+ }
60
+ return { __kind: 'client-storage', port };
61
+ }
62
+
63
+ /** Build a Storage reference. Mirrors `pyric/storage`'s `ref(storage, path?)` /
64
+ * `ref(parentRef, path)`. Client-side path math; no RPC. */
65
+ export function ref(
66
+ parent: ClientFirebaseStorage | ClientStorageReference,
67
+ path?: string,
68
+ ): ClientStorageReference {
69
+ const rel = normalizeStorageRefPath(path ?? '');
70
+ let fullPath: string;
71
+ if (parent.__kind === 'client-storage') {
72
+ fullPath = rel;
73
+ } else {
74
+ const base = parent.fullPath;
75
+ fullPath = rel ? (base ? `${base}/${rel}` : rel) : base;
76
+ }
77
+ return { __kind: 'storage-ref', port: parent.port, fullPath, name: lastSegment(fullPath) };
78
+ }
79
+
80
+ /** Enumerate immediate child items + sub-prefixes under a ref (Pyric Studio
81
+ * data browse). The host enforces `read` rules on the scanned prefix. */
82
+ export async function listAll(
83
+ reference: ClientStorageReference,
84
+ ): Promise<{ items: ClientStorageReference[]; prefixes: ClientStorageReference[] }> {
85
+ const r = (await dataRpc(reference.port, {
86
+ t: 'op', id: nextId(), method: 'storage.listAll', path: reference.fullPath,
87
+ })) as { items: Array<{ fullPath: string; name: string }>; prefixes: Array<{ fullPath: string; name: string }> };
88
+ const mk = (e: { fullPath: string; name: string }): ClientStorageReference => ({
89
+ __kind: 'storage-ref', port: reference.port, fullPath: e.fullPath, name: e.name,
90
+ });
91
+ return { items: r.items.map(mk), prefixes: r.prefixes.map(mk) };
92
+ }
93
+
94
+ /** Read an object's metadata (Pyric Studio inspector). */
95
+ export async function getMetadata(reference: ClientStorageReference): Promise<FullMetadata> {
96
+ return (await dataRpc(reference.port, {
97
+ t: 'op', id: nextId(), method: 'storage.getMetadata', path: reference.fullPath,
98
+ })) as FullMetadata;
99
+ }
100
+
101
+ /** Read an object's bytes as a Blob (Pyric Studio inspector preview).
102
+ * MessagePort-only — a Blob cannot cross the JSON bridge relay. */
103
+ export async function getBlob(reference: ClientStorageReference): Promise<Blob> {
104
+ return (await dataRpc(reference.port, {
105
+ t: 'op', id: nextId(), method: 'storage.getBlob', path: reference.fullPath,
106
+ })) as Blob;
107
+ }
108
+
109
+ /** Return a page-owned URL for an object read through the SharedWorker. */
110
+ export async function getDownloadURL(reference: ClientStorageReference): Promise<string> {
111
+ return URL.createObjectURL(await getBlob(reference));
112
+ }
113
+
114
+ // ─── Storage mutations + JSON-safe reads (worker-mode byte ops) ───────────
115
+ // Backed by the base64 `storage.putBytes` / `storage.getBytes` /
116
+ // `storage.deleteObject` ops (remote sandbox, slice 2). Studio's data lens is
117
+ // attached by `dataRpc`; ordinary served-app bundles have no default lens and
118
+ // therefore remain app-session operations. Storage rules apply when the
119
+ // HOST configured them on the sandbox's storage service — the served
120
+ // worker's `applyServeInit` (serve-init.ts) does this at boot, before any op
121
+ // can reach the host, so worker-mode storage enforces the project's
122
+ // storage.rules the same as Firestore/RTDB (open only when the project has
123
+ // none); the admin lens matters for embedding/test hosts that pre-open the
124
+ // service with rules. Raw payloads are capped at 8 MiB
125
+ // (`MAX_STORAGE_OP_BYTES`) — same cap the host enforces.
126
+
127
+ /** Mirror of `pyric/storage`'s `SettableMetadata` (plain JSON on the wire). */
128
+ export interface ClientSettableMetadata {
129
+ contentType?: string;
130
+ cacheControl?: string;
131
+ contentDisposition?: string;
132
+ contentEncoding?: string;
133
+ contentLanguage?: string;
134
+ customMetadata?: { [key: string]: string };
135
+ }
136
+
137
+ /** Upload bytes at the reference's path (replaces existing content).
138
+ * Mirrors `pyric/storage`'s `uploadBytes` result shape. */
139
+ export async function uploadBytes(
140
+ reference: ClientStorageReference,
141
+ data: Blob | Uint8Array | ArrayBuffer,
142
+ metadata?: ClientSettableMetadata,
143
+ ): Promise<{ ref: ClientStorageReference; metadata: FullMetadata }> {
144
+ const bytes =
145
+ data instanceof Blob
146
+ ? new Uint8Array(await data.arrayBuffer())
147
+ : data instanceof ArrayBuffer
148
+ ? new Uint8Array(data)
149
+ : data;
150
+ if (bytes.byteLength > MAX_STORAGE_OP_BYTES) {
151
+ throw storagePayloadTooLarge(bytes.byteLength, `uploadBytes payload for '${reference.fullPath}'`);
152
+ }
153
+ // contentType precedence mirrors pyric/storage: caller metadata → Blob.type.
154
+ const contentType =
155
+ metadata?.contentType ?? (data instanceof Blob && data.type ? data.type : undefined);
156
+ const stored = (await dataRpc(reference.port, {
157
+ t: 'op',
158
+ id: nextId(),
159
+ method: 'storage.putBytes',
160
+ path: reference.fullPath,
161
+ dataB64: bytesToBase64(bytes),
162
+ ...(contentType !== undefined ? { contentType } : {}),
163
+ ...(metadata !== undefined ? { metadata: metadata as Record<string, unknown> } : {}),
164
+ })) as FullMetadata;
165
+ return { ref: reference, metadata: stored };
166
+ }
167
+
168
+ /** Read an object's bytes (JSON-safe base64 op → `ArrayBuffer`). Mirrors
169
+ * `pyric/storage`'s `getBytes`, including the optional client-side cap. */
170
+ export async function getBytes(
171
+ reference: ClientStorageReference,
172
+ maxDownloadSizeBytes?: number,
173
+ ): Promise<ArrayBuffer> {
174
+ const res = (await dataRpc(reference.port, {
175
+ t: 'op', id: nextId(), method: 'storage.getBytes', path: reference.fullPath,
176
+ })) as { dataB64: string; size: number };
177
+ if (typeof maxDownloadSizeBytes === 'number' && res.size > maxDownloadSizeBytes) {
178
+ const err = new Error(
179
+ `storage/quota-exceeded: object at '${reference.fullPath}' is ${res.size} bytes — ` +
180
+ `over the requested maxDownloadSizeBytes (${maxDownloadSizeBytes}).`,
181
+ ) as Error & { code: string };
182
+ err.code = 'storage/quota-exceeded';
183
+ throw err;
184
+ }
185
+ const bytes = base64ToBytes(res.dataB64);
186
+ return bytes.buffer.slice(bytes.byteOffset, bytes.byteOffset + bytes.byteLength) as ArrayBuffer;
187
+ }
188
+
189
+ /** Delete the object at the reference's path (idempotent — missing = no-op,
190
+ * matching the sandbox backend's delete semantics). */
191
+ export async function deleteObject(reference: ClientStorageReference): Promise<void> {
192
+ await dataRpc(reference.port, {
193
+ t: 'op', id: nextId(), method: 'storage.deleteObject', path: reference.fullPath,
194
+ });
195
+ }
@@ -0,0 +1,88 @@
1
+ /**
2
+ * Pyric Studio cross-service surfaces over the worker port — the unified event
3
+ * stream (`subscribeEvents`/`eventHistory`) and the sandbox snapshot export
4
+ * used by the rules re-run flow.
5
+ */
6
+
7
+ import type { InboundMessage } from '../protocol.js';
8
+ import type { SandboxEvent, SandboxSnapshot } from 'pyric/sandbox';
9
+ import { closeSubscription, nextId, nextSubId, openEventSubscription, rpc } from './core.js';
10
+ import type { ClientDb, Unsubscribe } from './handles.js';
11
+
12
+ // ════════════════════════════════════════════════════════════════════════
13
+ // EVENT STREAM (Pyric Studio keystone — onEvent/history over the port)
14
+ // ════════════════════════════════════════════════════════════════════════
15
+ //
16
+ // Surfaces the worker sandbox's unified cross-service event stream to the page.
17
+ // `subscribeEvents(db, cb)` registers a stream sub: the worker first delivers
18
+ // `sandbox.history()` as one batch, then streams each live `SandboxEvent` as a
19
+ // single-element batch. `eventHistory(db)` is a one-shot history fetch (a fresh
20
+ // short-lived sub) for consumers that want a snapshot without staying live.
21
+ //
22
+ // These mirror `sandbox.onEvent(cb)` / `sandbox.history()` so a consumer can
23
+ // adapt them into the same `{ onEvent, history }`-shaped source the in-process
24
+ // sandbox exposes (e.g. Studio's `feedFromSandboxLike`).
25
+
26
+ /**
27
+ * Subscribe to the worker sandbox's unified event stream. The callback fires
28
+ * with each delivered BATCH of events — the FIRST call carries the initial
29
+ * `history()` snapshot (possibly empty), each subsequent call carries one live
30
+ * event. Returns an unsubscribe that deregisters on the worker.
31
+ *
32
+ * This is the live counterpart to `sandbox.onEvent` + an initial `history()`
33
+ * fold, collapsed into one subscription so a late subscriber never misses the
34
+ * backlog.
35
+ */
36
+ export function subscribeEvents(
37
+ db: ClientDb,
38
+ callback: (events: readonly SandboxEvent[]) => void,
39
+ ): Unsubscribe {
40
+ const subId = nextSubId();
41
+ const port = db.port;
42
+ openEventSubscription(
43
+ port,
44
+ subId,
45
+ callback,
46
+ { t: 'sub', subId, target: 'events' } satisfies InboundMessage,
47
+ );
48
+ return () => {
49
+ closeSubscription(port, subId);
50
+ };
51
+ }
52
+
53
+ /**
54
+ * Fetch the worker sandbox's event history as a one-shot snapshot (every event
55
+ * so far). Opens a transient stream sub, resolves with the initial history
56
+ * batch, and tears the sub down immediately — so it never holds a live
57
+ * subscription. Useful for a late, snapshot-only consumer.
58
+ */
59
+ export function eventHistory(db: ClientDb): Promise<readonly SandboxEvent[]> {
60
+ return new Promise((resolve) => {
61
+ const unsub = subscribeEvents(db, (events) => {
62
+ // The first delivery is the history snapshot; resolve + unsubscribe.
63
+ unsub();
64
+ resolve(events);
65
+ });
66
+ });
67
+ }
68
+
69
+ /**
70
+ * Export the current sandbox snapshot (Pyric Studio rules re-run). Studio forks
71
+ * it locally to test a denied op against edited rules or re-issue it as the
72
+ * attempting user, on a throwaway branch (no live mutation).
73
+ */
74
+ export async function getSnapshot(db: ClientDb): Promise<SandboxSnapshot> {
75
+ return (await rpc(db.port, { t: 'op', id: nextId(), method: 'getSnapshot' })) as SandboxSnapshot;
76
+ }
77
+
78
+ /**
79
+ * Sandbox-owned full reset (issue #359): `sandbox.resetAll()` on the worker.
80
+ * Clears the Firestore env, the signed-in session, and EVERY registered
81
+ * persistable service — auth users, the RTDB tree, storage objects. Resolves
82
+ * once the worker acks (all services finished clearing). This is the served
83
+ * counterpart of calling `sandbox.resetAll()` on an in-process sandbox.
84
+ */
85
+ export async function resetAll(db: ClientDb): Promise<{ errors: string[] }> {
86
+ const reply = await rpc(db.port, { t: 'op', id: nextId(), method: 'resetAll' });
87
+ return (reply ?? { errors: [] }) as { errors: string[] };
88
+ }
@@ -0,0 +1,57 @@
1
+ /**
2
+ * Worker client SDK — mirrors `pyric/firestore` (+ `pyric/auth`, `pyric/storage`,
3
+ * and the RTDB modular subset) for the SharedWorker data plane. App code can
4
+ * swap its `pyric/firestore` import for this module (via an import-map) and have
5
+ * every operation route to the single worker-hosted sandbox instead of an
6
+ * in-page one — same function names, same argument shapes, same return types.
7
+ *
8
+ * This module is a re-export barrel over the per-family modules under `client/`:
9
+ * - `core` transport singleton (RPC correlation, subscriber maps,
10
+ * port wiring, the Studio auth-lens + op-issuer stamp)
11
+ * - `handles` opaque port-carrying handle types + `Unsubscribe`
12
+ * - `snapshots` firestore snapshot rehydration + snapshot types
13
+ * - `connection` connect, worker version/instance, state/branches, relay
14
+ * - `firestore-refs` ref / query / sentinel descriptor factories (no RPC)
15
+ * - `firestore-reads` read + aggregate execution + `onSnapshot`
16
+ * - `firestore-writes` writes + `writeBatch` + `runTransaction`
17
+ * - `rules` Firestore/RTDB rules deploy + status
18
+ * - `admin-firestore` admin-lens document ops
19
+ * - `rtdb` RTDB modular subset
20
+ * - `studio` event stream, confirm-policy, sandbox snapshot
21
+ * - `auth` per-port auth surface
22
+ * - `storage` worker-backed storage mirror
23
+ * - `messaging` token lifecycle + foreground/background subscriptions
24
+ *
25
+ * The barrel is part of the worker's PUBLIC shape: `serve/worker/index.ts`
26
+ * re-exports from here for the `@pyric/cli/serve/worker` package subpath.
27
+ */
28
+
29
+ // Shared core: lens/issuer controls + the handle and snapshot types.
30
+ export { setLens, getLens, setOpIssuer } from './client/core.js';
31
+ export type {
32
+ ClientDb,
33
+ ClientRtdb,
34
+ RtdbRefHandle,
35
+ RtdbDataSnapshot,
36
+ DocRefHandle,
37
+ CollRefHandle,
38
+ QueryHandle,
39
+ AnyHandle,
40
+ Unsubscribe,
41
+ } from './client/handles.js';
42
+ export type { ClientDocSnapshot, ClientQuerySnapshot } from './client/snapshots.js';
43
+
44
+ // API families. Each module exports only its public surface; internal helpers
45
+ // stay unexported, so `export *` re-exports exactly the published symbols.
46
+ export * from './client/connection.js';
47
+ export * from './client/firestore-refs.js';
48
+ export * from './client/firestore-reads.js';
49
+ export * from './client/firestore-writes.js';
50
+ export * from './client/rules.js';
51
+ export * from './client/admin-firestore.js';
52
+ export * from './client/rtdb.js';
53
+ export * from './client/studio.js';
54
+ export * from './client/presence.js';
55
+ export * from './client/auth.js';
56
+ export * from './client/storage.js';
57
+ export * from './client/ai.js';