@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,37 @@
1
+ /** Stable routes and identity used by the served runtime and its UI. */
2
+ export const PYRIC_WORKER_URL = '/__pyric/sdk/worker.js';
3
+ export const PYRIC_WORKER_NAME = 'pyric-shared-worker';
4
+ export const PYRIC_STUDIO_URL = '/__pyric/ui/';
5
+
6
+ export interface PyricRuntimeManifest {
7
+ studioUrl: string;
8
+ worker: {
9
+ url: string;
10
+ name: string;
11
+ /** Content epoch served by the current dev server; null in in-page mode. */
12
+ servedEpoch: string | null;
13
+ };
14
+ }
15
+
16
+ interface RuntimeDocument {
17
+ querySelector(selector: string): { getAttribute(name: string): string | null } | null;
18
+ }
19
+
20
+ /** Read the server-stamped worker epoch before application code starts. */
21
+ export function readPyricRuntimeManifest(
22
+ documentLike: RuntimeDocument | undefined = typeof document === 'undefined' ? undefined : document,
23
+ ): PyricRuntimeManifest {
24
+ const servedEpoch = documentLike
25
+ ?.querySelector('meta[name="pyric-worker-v"]')
26
+ ?.getAttribute('content')
27
+ ?.trim() || null;
28
+
29
+ return {
30
+ studioUrl: PYRIC_STUDIO_URL,
31
+ worker: {
32
+ url: PYRIC_WORKER_URL,
33
+ name: PYRIC_WORKER_NAME,
34
+ servedEpoch,
35
+ },
36
+ };
37
+ }
@@ -0,0 +1,216 @@
1
+ import type { SandboxEvent } from 'pyric/sandbox';
2
+ import type { PyricRuntimeManifest } from './manifest.js';
3
+ import { readPyricRuntimeManifest } from './manifest.js';
4
+
5
+ export type PyricRuntimeMode = 'starting' | 'shared-worker' | 'in-page';
6
+ export type PyricRuntimeErrorSource = 'sandbox' | 'worker' | 'runtime';
7
+
8
+ export interface PyricRuntimeError {
9
+ id: string;
10
+ source: PyricRuntimeErrorSource;
11
+ at: number;
12
+ message: string;
13
+ code?: string;
14
+ stack?: string;
15
+ service?: string;
16
+ method?: string;
17
+ path?: string;
18
+ }
19
+
20
+ export interface PyricRuntimeSnapshot {
21
+ manifest: PyricRuntimeManifest;
22
+ mode: PyricRuntimeMode;
23
+ servedEpoch: string | null;
24
+ runningEpoch: string | null;
25
+ updateAvailable: boolean;
26
+ updatingWorker: boolean;
27
+ errors: readonly PyricRuntimeError[];
28
+ }
29
+
30
+ export interface PyricRuntimeStatus {
31
+ getSnapshot(): PyricRuntimeSnapshot;
32
+ subscribe(listener: (snapshot: PyricRuntimeSnapshot) => void): () => void;
33
+ setWorker(input: { mode: Exclude<PyricRuntimeMode, 'starting'>; runningEpoch?: string | null }): void;
34
+ setWorkerUpdater(update: (() => Promise<void>) | null): void;
35
+ updateWorker(): Promise<void>;
36
+ reportError(error: unknown, source: PyricRuntimeErrorSource): void;
37
+ recordSandboxEvents(events: readonly SandboxEvent[]): void;
38
+ clearErrors(): void;
39
+ }
40
+
41
+ let nextErrorId = 0;
42
+
43
+ function errorCode(value: unknown): string | undefined {
44
+ if (!value || typeof value !== 'object') return undefined;
45
+ const code = (value as { code?: unknown }).code;
46
+ return typeof code === 'string' ? code : undefined;
47
+ }
48
+
49
+ /** Convert thrown values into a serializable, copyable runtime error. */
50
+ export function normalizePyricRuntimeError(
51
+ value: unknown,
52
+ source: PyricRuntimeErrorSource,
53
+ at = Date.now(),
54
+ id = `runtime-error-${++nextErrorId}`,
55
+ ): PyricRuntimeError {
56
+ if (value instanceof Error) {
57
+ return {
58
+ id,
59
+ source,
60
+ at,
61
+ message: value.message,
62
+ ...(errorCode(value) ? { code: errorCode(value) } : {}),
63
+ ...(value.stack ? { stack: value.stack } : {}),
64
+ };
65
+ }
66
+ if (typeof value === 'string') return { id, source, at, message: value };
67
+ if (value && typeof value === 'object') {
68
+ const message = (value as { message?: unknown }).message;
69
+ return {
70
+ id,
71
+ source,
72
+ at,
73
+ message: typeof message === 'string' ? message : String(value),
74
+ ...(errorCode(value) ? { code: errorCode(value) } : {}),
75
+ };
76
+ }
77
+ return { id, source, at, message: String(value) };
78
+ }
79
+
80
+ function sandboxError(event: SandboxEvent): PyricRuntimeError | null {
81
+ if (event.kind === 'runtime_error') {
82
+ return {
83
+ id: event.id,
84
+ source: 'sandbox',
85
+ at: event.at,
86
+ service: event.service,
87
+ method: event.method,
88
+ ...(event.path ? { path: event.path } : {}),
89
+ ...(event.error.code ? { code: event.error.code } : {}),
90
+ message: event.error.message,
91
+ };
92
+ }
93
+ if (event.kind === 'listener_errored' && event.error) {
94
+ return {
95
+ id: event.id,
96
+ source: 'sandbox',
97
+ at: event.at,
98
+ service: 'firestore',
99
+ method: 'listener',
100
+ ...('path' in event.target ? { path: event.target.path } : {}),
101
+ code: event.error.code,
102
+ message: event.error.message,
103
+ };
104
+ }
105
+ if (event.kind === 'listener' && event.phase === 'errored' && event.error) {
106
+ return {
107
+ id: event.id,
108
+ source: 'sandbox',
109
+ at: event.at,
110
+ service: event.service,
111
+ method: 'listener',
112
+ ...(event.target.path ? { path: event.target.path } : {}),
113
+ ...(event.error.code ? { code: event.error.code } : {}),
114
+ message: event.error.message,
115
+ };
116
+ }
117
+ return null;
118
+ }
119
+
120
+ /** Observable, bounded status model shared by the runtime and injected UI. */
121
+ export function createPyricRuntimeStatus(
122
+ manifest: PyricRuntimeManifest,
123
+ options: { maxErrors?: number } = {},
124
+ ): PyricRuntimeStatus {
125
+ const maxErrors = Math.max(1, options.maxErrors ?? 50);
126
+ const listeners = new Set<(snapshot: PyricRuntimeSnapshot) => void>();
127
+ const errorIds = new Set<string>();
128
+ let snapshot: PyricRuntimeSnapshot = {
129
+ manifest,
130
+ mode: 'starting',
131
+ servedEpoch: manifest.worker.servedEpoch,
132
+ runningEpoch: null,
133
+ updateAvailable: false,
134
+ updatingWorker: false,
135
+ errors: [],
136
+ };
137
+ let workerUpdater: (() => Promise<void>) | null = null;
138
+
139
+ const publish = (next: PyricRuntimeSnapshot): void => {
140
+ snapshot = next;
141
+ for (const listener of listeners) listener(snapshot);
142
+ };
143
+ const appendError = (error: PyricRuntimeError): void => {
144
+ if (errorIds.has(error.id)) return;
145
+ errorIds.add(error.id);
146
+ const errors = [...snapshot.errors, error].slice(-maxErrors);
147
+ const retained = new Set(errors.map((item) => item.id));
148
+ for (const id of errorIds) if (!retained.has(id)) errorIds.delete(id);
149
+ publish({ ...snapshot, errors });
150
+ };
151
+
152
+ return {
153
+ getSnapshot: () => snapshot,
154
+ subscribe(listener) {
155
+ listeners.add(listener);
156
+ listener(snapshot);
157
+ return () => listeners.delete(listener);
158
+ },
159
+ setWorker({ mode, runningEpoch = null }) {
160
+ const servedEpoch = manifest.worker.servedEpoch;
161
+ publish({
162
+ ...snapshot,
163
+ mode,
164
+ runningEpoch,
165
+ updateAvailable: Boolean(
166
+ mode === 'shared-worker'
167
+ && servedEpoch
168
+ && runningEpoch
169
+ && runningEpoch !== 'dev'
170
+ && servedEpoch !== runningEpoch,
171
+ ),
172
+ updatingWorker: false,
173
+ });
174
+ },
175
+ setWorkerUpdater(update) {
176
+ workerUpdater = update;
177
+ },
178
+ async updateWorker() {
179
+ if (!snapshot.updateAvailable || snapshot.updatingWorker || !workerUpdater) {
180
+ throw new Error('No Pyric worker update is available.');
181
+ }
182
+ publish({ ...snapshot, updatingWorker: true });
183
+ try {
184
+ await workerUpdater();
185
+ } catch (error) {
186
+ publish({ ...snapshot, updatingWorker: false });
187
+ appendError(normalizePyricRuntimeError(error, 'worker'));
188
+ throw error;
189
+ }
190
+ },
191
+ reportError(error, source) {
192
+ appendError(normalizePyricRuntimeError(error, source));
193
+ },
194
+ recordSandboxEvents(events) {
195
+ for (const event of events) {
196
+ const normalized = sandboxError(event);
197
+ if (normalized) appendError(normalized);
198
+ }
199
+ },
200
+ clearErrors() {
201
+ errorIds.clear();
202
+ publish({ ...snapshot, errors: [] });
203
+ },
204
+ };
205
+ }
206
+
207
+ declare global {
208
+ // eslint-disable-next-line no-var
209
+ var __pyricRuntime: PyricRuntimeStatus | undefined;
210
+ }
211
+
212
+ /** One global status source even when the runtime and UI are separate bundles. */
213
+ export function getPyricRuntimeStatus(): PyricRuntimeStatus {
214
+ return globalThis.__pyricRuntime
215
+ ??= createPyricRuntimeStatus(readPyricRuntimeManifest());
216
+ }
@@ -0,0 +1,14 @@
1
+ import type { ClientDb } from '../worker/client/handles.js';
2
+
3
+ /** Construct the control connection without letting a browser policy failure abort runtime boot. */
4
+ export function connectRuntimeWorker(
5
+ connect: () => ClientDb,
6
+ reportError: (error: unknown) => void,
7
+ ): ClientDb | null {
8
+ try {
9
+ return connect();
10
+ } catch (error) {
11
+ reportError(error);
12
+ return null;
13
+ }
14
+ }
@@ -0,0 +1,75 @@
1
+ import { PYRIC_WORKER_NAME } from './manifest.js';
2
+
3
+ export const PYRIC_WORKER_GENERATION_KEY = 'pyric:worker-generation';
4
+ const PYRIC_WORKER_GENERATION_PROBE_KEY = 'pyric:worker-generation-probe';
5
+
6
+ interface EpochStorage {
7
+ getItem(key: string): string | null;
8
+ setItem(key: string, value: string): void;
9
+ removeItem?(key: string): void;
10
+ }
11
+
12
+ /** Select the replacement generation only after this page was told to move. */
13
+ export function workerNameForEpoch(
14
+ _servedEpoch: string | null,
15
+ storage: EpochStorage | undefined,
16
+ ): string {
17
+ if (!storage) return PYRIC_WORKER_NAME;
18
+ try {
19
+ const generation = storage.getItem(PYRIC_WORKER_GENERATION_KEY);
20
+ return generation && /^[a-f0-9]{16}$/.test(generation)
21
+ ? `${PYRIC_WORKER_NAME}:${generation}`
22
+ : PYRIC_WORKER_NAME;
23
+ } catch {
24
+ return PYRIC_WORKER_NAME;
25
+ }
26
+ }
27
+
28
+ /** Persist the generation boundary before a page reloads. */
29
+ export function rememberWorkerEpoch(
30
+ epoch: string,
31
+ storage: EpochStorage | undefined,
32
+ ): void {
33
+ if (!/^[a-f0-9]{16}$/.test(epoch)) {
34
+ throw new Error('Pyric cannot replace the worker: invalid served worker epoch.');
35
+ }
36
+ if (!storage) {
37
+ throw new Error(
38
+ 'Pyric cannot replace the worker because origin storage is unavailable. Close all tabs for this origin and reopen the app.',
39
+ );
40
+ }
41
+ try {
42
+ storage.setItem(PYRIC_WORKER_GENERATION_KEY, epoch);
43
+ if (storage.getItem(PYRIC_WORKER_GENERATION_KEY) !== epoch) {
44
+ throw new Error('the worker generation could not be read back');
45
+ }
46
+ } catch (cause) {
47
+ throw new Error(
48
+ 'Pyric cannot replace the worker because origin storage is unavailable. Close all tabs for this origin and reopen the app.',
49
+ { cause },
50
+ );
51
+ }
52
+ }
53
+
54
+ /** Prove origin storage works without publishing a successor generation. */
55
+ export function preflightWorkerEpochStorage(storage: EpochStorage | undefined): void {
56
+ if (!storage?.removeItem) {
57
+ throw new Error(
58
+ 'Pyric cannot replace the worker because origin storage is unavailable. Close all tabs for this origin and reopen the app.',
59
+ );
60
+ }
61
+ try {
62
+ const previousProbe = storage.getItem(PYRIC_WORKER_GENERATION_PROBE_KEY);
63
+ storage.setItem(PYRIC_WORKER_GENERATION_PROBE_KEY, 'ok');
64
+ if (storage.getItem(PYRIC_WORKER_GENERATION_PROBE_KEY) !== 'ok') {
65
+ throw new Error('the worker generation probe could not be read back');
66
+ }
67
+ if (previousProbe === null) storage.removeItem(PYRIC_WORKER_GENERATION_PROBE_KEY);
68
+ else storage.setItem(PYRIC_WORKER_GENERATION_PROBE_KEY, previousProbe);
69
+ } catch (cause) {
70
+ throw new Error(
71
+ 'Pyric cannot replace the worker because origin storage is unavailable. Close all tabs for this origin and reopen the app.',
72
+ { cause },
73
+ );
74
+ }
75
+ }
@@ -0,0 +1,42 @@
1
+ interface WorkerReplacementOptions {
2
+ targetEpoch: string;
3
+ retire(): Promise<void>;
4
+ subscribeReload(listener: (epoch: string) => void): () => void;
5
+ preflight(): void;
6
+ commitGeneration(epoch: string): void;
7
+ onPreparationError?(error: unknown): void;
8
+ reload(): void;
9
+ schedule?: (run: () => void) => void;
10
+ }
11
+
12
+ export interface WorkerReplacement {
13
+ request(): Promise<void>;
14
+ dispose(): void;
15
+ }
16
+
17
+ /** Coordinate one reload per page after the old SharedWorker announces retirement. */
18
+ export function createWorkerReplacement(options: WorkerReplacementOptions): WorkerReplacement {
19
+ const schedule = options.schedule ?? ((run) => { setTimeout(run, 100); });
20
+ let reloadScheduled = false;
21
+ const unsubscribe = options.subscribeReload((epoch) => {
22
+ if (reloadScheduled) return;
23
+ try {
24
+ options.commitGeneration(epoch);
25
+ } catch (error) {
26
+ options.onPreparationError?.(error);
27
+ return;
28
+ }
29
+ reloadScheduled = true;
30
+ schedule(options.reload);
31
+ });
32
+ return {
33
+ async request() {
34
+ // Verify that this page can persist the successor before asking the old
35
+ // worker to retire, but do not publish that successor until the worker
36
+ // announces that its drain and capture barrier completed.
37
+ options.preflight();
38
+ await options.retire();
39
+ },
40
+ dispose: unsubscribe,
41
+ };
42
+ }
@@ -0,0 +1,31 @@
1
+ /**
2
+ * The sandbox-build marker — the single source of truth shared by the three
3
+ * places that produce or read it: the Vite plugin stamps it into a
4
+ * `vite build --mode pyric` output's `index.html`; `pyric dev` trusts it (a
5
+ * marked dist bundles pyric's in-page adapters, so its assets never inline the
6
+ * real SDK and the inlined-firebase scanner is skipped).
7
+ *
8
+ * Dependency-free (fs/path only) so the dev server can read it without pulling
9
+ * in the browser bundler.
10
+ */
11
+ import { existsSync, readFileSync } from 'node:fs';
12
+ import { join } from 'node:path';
13
+
14
+ /** The attribute stamped into a sandbox build's `index.html` head. Presence in
15
+ * an asset's text is the signal — the value is fixed, never parsed. */
16
+ export const SANDBOX_BUILD_MARKER = 'data-pyric-sandbox-build';
17
+
18
+ /** The full `<meta>` tag the plugin injects at the start of `<head>`. */
19
+ export const SANDBOX_BUILD_META = `<meta name="pyric-sandbox-build" content="1" ${SANDBOX_BUILD_MARKER}>`;
20
+
21
+ /** True when `dir`'s `index.html` carries the sandbox-build marker. Missing or
22
+ * unreadable index → false (treated as an ordinary build). */
23
+ export function hasSandboxBuildMarker(dir: string): boolean {
24
+ const index = join(dir, 'index.html');
25
+ if (!existsSync(index)) return false;
26
+ try {
27
+ return readFileSync(index, 'utf8').includes(SANDBOX_BUILD_MARKER);
28
+ } catch {
29
+ return false;
30
+ }
31
+ }