@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,434 @@
1
+ import {
2
+ ASSURANCE_TARGET_SCHEMA,
3
+ AssuranceInputError,
4
+ type AssuranceActor,
5
+ type AssuranceObservation,
6
+ type AssuranceProbe,
7
+ type FirebaseOperation,
8
+ type LocalFirebaseTarget,
9
+ type MutationDimension,
10
+ type SecurityInvariant,
11
+ } from "./types.js";
12
+
13
+ const services = new Set(["firestore", "rtdb", "storage"]);
14
+ const dimensions = new Set<MutationDimension>([
15
+ "path",
16
+ "query",
17
+ "payload",
18
+ "operation",
19
+ ]);
20
+ const firestoreMethods = new Set([
21
+ "get",
22
+ "list",
23
+ "create",
24
+ "set",
25
+ "merge",
26
+ "update",
27
+ "delete",
28
+ ]);
29
+ const rtdbMethods = new Set(["get", "set", "update", "remove"]);
30
+ const storageMethods = new Set([
31
+ "get",
32
+ "list",
33
+ "upload",
34
+ "updateMetadata",
35
+ "delete",
36
+ ]);
37
+
38
+ function isRecord(value: unknown): value is Record<string, unknown> {
39
+ return !!value && typeof value === "object" && !Array.isArray(value);
40
+ }
41
+
42
+ function requiredString(
43
+ value: unknown,
44
+ message: string,
45
+ ): asserts value is string {
46
+ if (typeof value !== "string" || !value.trim()) {
47
+ throw new AssuranceInputError(message);
48
+ }
49
+ }
50
+
51
+ function enumValue(
52
+ value: unknown,
53
+ allowed: ReadonlySet<string>,
54
+ message: string,
55
+ ): asserts value is string {
56
+ if (typeof value !== "string" || !allowed.has(value)) {
57
+ throw new AssuranceInputError(message);
58
+ }
59
+ }
60
+
61
+ export function assertTarget(
62
+ target: unknown,
63
+ ): asserts target is LocalFirebaseTarget {
64
+ if (!isRecord(target)) {
65
+ throw new AssuranceInputError("target must be an object.");
66
+ }
67
+ if (target.schema !== ASSURANCE_TARGET_SCHEMA) {
68
+ throw new AssuranceInputError(
69
+ `target schema must be '${ASSURANCE_TARGET_SCHEMA}'.`,
70
+ );
71
+ }
72
+ if (target.network !== "forbid") {
73
+ throw new AssuranceInputError(
74
+ "assurance v1 requires target.network to be 'forbid'.",
75
+ );
76
+ }
77
+ if (!isRecord(target.rules)) {
78
+ throw new AssuranceInputError("target.rules must be an object.");
79
+ }
80
+ if (!isRecord(target.state)) {
81
+ throw new AssuranceInputError("target.state must be an object.");
82
+ }
83
+ if (
84
+ target.rules.firestore !== undefined &&
85
+ typeof target.rules.firestore !== "string"
86
+ ) {
87
+ throw new AssuranceInputError("target.rules.firestore must be a string.");
88
+ }
89
+ if (
90
+ target.rules.storage !== undefined &&
91
+ typeof target.rules.storage !== "string"
92
+ ) {
93
+ throw new AssuranceInputError("target.rules.storage must be a string.");
94
+ }
95
+ if (target.rules.rtdb !== undefined) {
96
+ if (!isRecord(target.rules.rtdb) || !isRecord(target.rules.rtdb.rules)) {
97
+ throw new AssuranceInputError(
98
+ "target.rules.rtdb must contain a rules object.",
99
+ );
100
+ }
101
+ }
102
+ if (
103
+ target.state.firestore !== undefined &&
104
+ !isRecord(target.state.firestore)
105
+ ) {
106
+ throw new AssuranceInputError("target.state.firestore must be an object.");
107
+ }
108
+ if (target.state.storage !== undefined) {
109
+ if (!Array.isArray(target.state.storage)) {
110
+ throw new AssuranceInputError("target.state.storage must be an array.");
111
+ }
112
+ for (const [index, object] of target.state.storage.entries()) {
113
+ if (!isRecord(object)) {
114
+ throw new AssuranceInputError(
115
+ `target.state.storage[${index}] must be an object.`,
116
+ );
117
+ }
118
+ requiredString(
119
+ object.path,
120
+ `target.state.storage[${index}] path is required.`,
121
+ );
122
+ if (typeof object.dataBase64 !== "string") {
123
+ throw new AssuranceInputError(
124
+ `target.state.storage[${index}] dataBase64 must be a string.`,
125
+ );
126
+ }
127
+ }
128
+ }
129
+ if (target.state.auth !== undefined) {
130
+ if (
131
+ !isRecord(target.state.auth) ||
132
+ !Array.isArray(target.state.auth.users)
133
+ ) {
134
+ throw new AssuranceInputError(
135
+ "target.state.auth must contain a users array.",
136
+ );
137
+ }
138
+ for (const [index, user] of target.state.auth.users.entries()) {
139
+ if (!isRecord(user)) {
140
+ throw new AssuranceInputError(
141
+ `target.state.auth.users[${index}] must be an object.`,
142
+ );
143
+ }
144
+ requiredString(
145
+ user.uid,
146
+ `target.state.auth.users[${index}] uid is required.`,
147
+ );
148
+ if (user.password !== undefined && typeof user.password !== "string") {
149
+ throw new AssuranceInputError(
150
+ `target.state.auth.users[${index}] password must be a string.`,
151
+ );
152
+ }
153
+ if (user.customClaims !== undefined && !isRecord(user.customClaims)) {
154
+ throw new AssuranceInputError(
155
+ `target.state.auth.users[${index}] customClaims must be an object.`,
156
+ );
157
+ }
158
+ }
159
+ }
160
+ }
161
+
162
+ export function assertActor(actor: unknown): asserts actor is AssuranceActor {
163
+ if (!isRecord(actor)) {
164
+ throw new AssuranceInputError("actor must be an object.");
165
+ }
166
+ requiredString(actor.id, "actor id is required.");
167
+ if (!isRecord(actor.acquisition)) {
168
+ throw new AssuranceInputError(
169
+ `actor '${actor.id}' must declare acquisition evidence.`,
170
+ );
171
+ }
172
+ const kind = actor.acquisition.kind;
173
+ enumValue(
174
+ kind,
175
+ new Set([
176
+ "anonymous-request",
177
+ "anonymous-account",
178
+ "password",
179
+ "fixture-user",
180
+ "synthetic",
181
+ ]),
182
+ `actor '${actor.id}' has invalid acquisition kind '${String(kind)}'.`,
183
+ );
184
+ if (kind === "password") {
185
+ requiredString(
186
+ actor.acquisition.email,
187
+ `actor '${actor.id}' password acquisition requires an email.`,
188
+ );
189
+ requiredString(
190
+ actor.acquisition.password,
191
+ `actor '${actor.id}' password acquisition requires a password.`,
192
+ );
193
+ }
194
+ if (kind === "fixture-user" || kind === "synthetic") {
195
+ requiredString(
196
+ actor.acquisition.uid,
197
+ `actor '${actor.id}' ${kind} acquisition requires a uid.`,
198
+ );
199
+ }
200
+ if (
201
+ kind === "synthetic" &&
202
+ actor.acquisition.token !== undefined &&
203
+ !isRecord(actor.acquisition.token)
204
+ ) {
205
+ throw new AssuranceInputError(
206
+ `actor '${actor.id}' synthetic token must be an object.`,
207
+ );
208
+ }
209
+ }
210
+
211
+ export function assertInvariant(
212
+ invariant: unknown,
213
+ ): asserts invariant is SecurityInvariant {
214
+ if (!isRecord(invariant)) {
215
+ throw new AssuranceInputError("invariant must be an object.");
216
+ }
217
+ requiredString(invariant.id, "invariant id is required.");
218
+ requiredString(
219
+ invariant.statement,
220
+ `invariant '${invariant.id}' statement is required.`,
221
+ );
222
+ enumValue(
223
+ invariant.service,
224
+ new Set([...services, "cross-service"]),
225
+ `invariant '${invariant.id}' has invalid service '${String(invariant.service)}'.`,
226
+ );
227
+ enumValue(
228
+ invariant.expected,
229
+ new Set(["ALLOW", "DENY"]),
230
+ `invariant '${invariant.id}' has invalid expected decision '${String(invariant.expected)}'.`,
231
+ );
232
+ enumValue(
233
+ invariant.source,
234
+ new Set(["declared", "authored-test", "captured", "derived", "agent"]),
235
+ `invariant '${invariant.id}' has invalid source '${String(invariant.source)}'.`,
236
+ );
237
+ enumValue(
238
+ invariant.confidence,
239
+ new Set(["authoritative", "strong", "tentative"]),
240
+ `invariant '${invariant.id}' has invalid confidence '${String(invariant.confidence)}'.`,
241
+ );
242
+ }
243
+
244
+ export function assertObservation(
245
+ observation: unknown,
246
+ ): asserts observation is AssuranceObservation {
247
+ if (!isRecord(observation)) {
248
+ throw new AssuranceInputError("observation must be an object.");
249
+ }
250
+ requiredString(observation.id, "observation id is required.");
251
+ requiredString(
252
+ observation.actorId,
253
+ `observation '${observation.id}' actorId is required.`,
254
+ );
255
+ if (observation.result !== "ALLOW") {
256
+ throw new AssuranceInputError(
257
+ `observation '${observation.id}' result must be 'ALLOW'.`,
258
+ );
259
+ }
260
+ enumValue(
261
+ observation.source,
262
+ new Set(["captured", "authored", "discovered"]),
263
+ `observation '${observation.id}' has invalid source '${String(observation.source)}'.`,
264
+ );
265
+ assertOperation(observation.operation, `observation '${observation.id}'`);
266
+ }
267
+
268
+ export function assertProbe(probe: unknown): asserts probe is AssuranceProbe {
269
+ if (!isRecord(probe)) {
270
+ throw new AssuranceInputError("probe must be an object.");
271
+ }
272
+ requiredString(probe.id, "probe id is required.");
273
+ requiredString(probe.actorId, `probe '${probe.id}' actorId is required.`);
274
+ requiredString(
275
+ probe.invariantId,
276
+ `probe '${probe.id}' invariantId is required.`,
277
+ );
278
+ assertOperation(probe.control, `probe '${probe.id}' control`);
279
+ if (!isRecord(probe.mutation)) {
280
+ throw new AssuranceInputError(`probe '${probe.id}' mutation is required.`);
281
+ }
282
+ enumValue(
283
+ probe.mutation.dimension,
284
+ dimensions,
285
+ `probe '${probe.id}' has invalid or unsupported mutation dimension '${String(probe.mutation.dimension)}'.`,
286
+ );
287
+ requiredString(
288
+ probe.mutation.description,
289
+ `probe '${probe.id}' mutation description is required.`,
290
+ );
291
+ assertOperation(
292
+ probe.mutation.operation,
293
+ `probe '${probe.id}' mutation operation`,
294
+ );
295
+ if (
296
+ probe.requires !== undefined &&
297
+ (!Array.isArray(probe.requires) ||
298
+ !probe.requires.every(
299
+ (item) =>
300
+ item !== null &&
301
+ typeof item === "object" &&
302
+ (item.kind === "construct" || item.kind === "registry-row") &&
303
+ typeof item.id === "string" &&
304
+ item.id.length > 0,
305
+ ))
306
+ ) {
307
+ throw new AssuranceInputError(
308
+ `probe '${probe.id}' requires must be an array of { kind: 'construct' | 'registry-row', id } nodes.`,
309
+ );
310
+ }
311
+ if (probe.control.service !== probe.mutation.operation.service) {
312
+ throw new AssuranceInputError(
313
+ `probe '${probe.id}' control and mutation must use the same service.`,
314
+ );
315
+ }
316
+
317
+ const changed = changedDimensions(probe.control, probe.mutation.operation);
318
+ if (changed.length !== 1 || changed[0] !== probe.mutation.dimension) {
319
+ const changeDescription =
320
+ changed.length === 0 ? "no dimensions" : changed.join(", ");
321
+ throw new AssuranceInputError(
322
+ `probe '${probe.id}' declares a '${probe.mutation.dimension}' mutation but changes ${changeDescription}.`,
323
+ );
324
+ }
325
+ }
326
+
327
+ function assertOperation(
328
+ operation: unknown,
329
+ label: string,
330
+ ): asserts operation is FirebaseOperation {
331
+ if (!isRecord(operation)) {
332
+ throw new AssuranceInputError(`${label} must be an object.`);
333
+ }
334
+ enumValue(
335
+ operation.service,
336
+ services,
337
+ `${label} has invalid service '${String(operation.service)}'.`,
338
+ );
339
+ requiredString(operation.path, `${label} path is required.`);
340
+ const allowedMethods =
341
+ operation.service === "firestore"
342
+ ? firestoreMethods
343
+ : operation.service === "rtdb"
344
+ ? rtdbMethods
345
+ : storageMethods;
346
+ enumValue(
347
+ operation.method,
348
+ allowedMethods,
349
+ `${label} has invalid ${operation.service} method '${String(operation.method)}'.`,
350
+ );
351
+ if (
352
+ operation.service === "firestore" &&
353
+ operation.data !== undefined &&
354
+ !isRecord(operation.data)
355
+ ) {
356
+ throw new AssuranceInputError(`${label} data must be an object.`);
357
+ }
358
+ if (
359
+ operation.service !== "storage" &&
360
+ operation.query !== undefined &&
361
+ !isRecord(operation.query)
362
+ ) {
363
+ throw new AssuranceInputError(`${label} query must be an object.`);
364
+ }
365
+ if (
366
+ operation.service === "storage" &&
367
+ operation.dataBase64 !== undefined &&
368
+ typeof operation.dataBase64 !== "string"
369
+ ) {
370
+ throw new AssuranceInputError(`${label} dataBase64 must be a string.`);
371
+ }
372
+ if (operation.service === "storage") {
373
+ if (
374
+ operation.contentType !== undefined &&
375
+ typeof operation.contentType !== "string"
376
+ ) {
377
+ throw new AssuranceInputError(`${label} contentType must be a string.`);
378
+ }
379
+ if (operation.customMetadata !== undefined) {
380
+ if (
381
+ !isRecord(operation.customMetadata) ||
382
+ !Object.values(operation.customMetadata).every(
383
+ (value) => typeof value === "string",
384
+ )
385
+ ) {
386
+ throw new AssuranceInputError(
387
+ `${label} customMetadata must contain only string values.`,
388
+ );
389
+ }
390
+ }
391
+ }
392
+ }
393
+
394
+ function stableValue(value: unknown): string {
395
+ if (value === undefined) return "undefined";
396
+ if (value === null || typeof value !== "object") return JSON.stringify(value);
397
+ if (Array.isArray(value)) return `[${value.map(stableValue).join(",")}]`;
398
+ const record = value as Record<string, unknown>;
399
+ return `{${Object.keys(record)
400
+ .sort()
401
+ .map((key) => `${JSON.stringify(key)}:${stableValue(record[key])}`)
402
+ .join(",")}}`;
403
+ }
404
+
405
+ function payload(operation: FirebaseOperation): unknown {
406
+ if (operation.service === "storage") {
407
+ return {
408
+ dataBase64: operation.dataBase64,
409
+ contentType: operation.contentType,
410
+ customMetadata: operation.customMetadata,
411
+ };
412
+ }
413
+ return operation.data;
414
+ }
415
+
416
+ function queryShape(operation: FirebaseOperation): unknown {
417
+ return operation.service === "storage" ? undefined : operation.query;
418
+ }
419
+
420
+ export function changedDimensions(
421
+ control: FirebaseOperation,
422
+ mutation: FirebaseOperation,
423
+ ): MutationDimension[] {
424
+ const changed: MutationDimension[] = [];
425
+ if (control.method !== mutation.method) changed.push("operation");
426
+ if (control.path !== mutation.path) changed.push("path");
427
+ if (stableValue(queryShape(control)) !== stableValue(queryShape(mutation))) {
428
+ changed.push("query");
429
+ }
430
+ if (stableValue(payload(control)) !== stableValue(payload(mutation))) {
431
+ changed.push("payload");
432
+ }
433
+ return changed;
434
+ }