@pyric/cli 0.1.0-alpha.10 → 0.1.0-alpha.12

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 (498) hide show
  1. package/README.md.orig +2 -2
  2. package/dist/assurance/.generated/conformance-verdicts.d.ts +16 -0
  3. package/dist/assurance/.generated/conformance-verdicts.d.ts.map +1 -1
  4. package/dist/assurance/.generated/conformance-verdicts.js +16 -0
  5. package/dist/assurance/.generated/conformance-verdicts.js.map +1 -1
  6. package/dist/bridge/server/peer.d.ts +1 -1
  7. package/dist/bridge/server.d.ts +1 -1
  8. package/dist/bridge/server.js +1 -1
  9. package/dist/cli/index.d.ts +11 -0
  10. package/dist/cli/index.d.ts.map +1 -1
  11. package/dist/cli/index.js +13 -1
  12. package/dist/cli/index.js.map +1 -1
  13. package/dist/cli/init.d.ts +3 -3
  14. package/dist/cli/init.d.ts.map +1 -1
  15. package/dist/cli/init.js +5 -5
  16. package/dist/cli/init.js.map +1 -1
  17. package/dist/cli/serve.d.ts.map +1 -1
  18. package/dist/cli/serve.js +8 -2
  19. package/dist/cli/serve.js.map +1 -1
  20. package/dist/conformance/.generated/can-i-use-browser.d.ts.map +1 -1
  21. package/dist/conformance/.generated/can-i-use-browser.js +1 -1
  22. package/dist/conformance/.generated/can-i-use-browser.js.map +1 -1
  23. package/dist/conformance/.generated/can-i-use.d.ts.map +1 -1
  24. package/dist/conformance/.generated/can-i-use.js +2 -2
  25. package/dist/conformance/.generated/can-i-use.js.map +1 -1
  26. package/dist/conformance/.generated/conformance-docs.d.ts +12 -0
  27. package/dist/conformance/.generated/conformance-docs.d.ts.map +1 -0
  28. package/dist/conformance/.generated/conformance-docs.js +2 -0
  29. package/dist/conformance/.generated/conformance-docs.js.map +1 -0
  30. package/dist/conformance/docs.d.ts +6 -0
  31. package/dist/conformance/docs.d.ts.map +1 -0
  32. package/dist/conformance/docs.js +6 -0
  33. package/dist/conformance/docs.js.map +1 -0
  34. package/dist/remote/index.d.ts.map +1 -1
  35. package/dist/remote/index.js +1 -0
  36. package/dist/remote/index.js.map +1 -1
  37. package/dist/serve/activity-guard.d.ts +4 -0
  38. package/dist/serve/activity-guard.d.ts.map +1 -0
  39. package/dist/serve/activity-guard.js +22 -0
  40. package/dist/serve/activity-guard.js.map +1 -0
  41. package/dist/serve/activity-route.d.ts +4 -0
  42. package/dist/serve/activity-route.d.ts.map +1 -0
  43. package/dist/serve/activity-route.js +157 -0
  44. package/dist/serve/activity-route.js.map +1 -0
  45. package/dist/serve/activity-warning.d.ts +4 -0
  46. package/dist/serve/activity-warning.d.ts.map +1 -0
  47. package/dist/serve/activity-warning.js +21 -0
  48. package/dist/serve/activity-warning.js.map +1 -0
  49. package/dist/serve/bridge-mount.d.ts +5 -0
  50. package/dist/serve/bridge-mount.d.ts.map +1 -1
  51. package/dist/serve/bridge-mount.js +1 -0
  52. package/dist/serve/bridge-mount.js.map +1 -1
  53. package/dist/serve/docs-ui/404.html +3 -0
  54. package/dist/serve/docs-ui/_astro/{_slug_.DPUwShm2.css → _slug_.CXh9yTP1.css} +1 -1
  55. package/dist/serve/docs-ui/_astro/_slug_.DUci-duz.css +1 -0
  56. package/dist/serve/docs-ui/docs/_rhythm/index.html +2 -1
  57. package/dist/serve/docs-ui/docs/agent/set-up-your-agent/index.html +3 -2
  58. package/dist/serve/docs-ui/docs/agent/set-up-your-agent.md +1 -1
  59. package/dist/serve/docs-ui/docs/agent/watch-and-review/index.html +2 -1
  60. package/dist/serve/docs-ui/docs/agent/work-with-an-agent/index.html +2 -1
  61. package/dist/serve/docs-ui/docs/ai-compat/index.html +2 -1
  62. package/dist/serve/docs-ui/docs/api-reference/index.html +51 -49
  63. package/dist/serve/docs-ui/docs/api-reference.md +3 -3
  64. package/dist/serve/docs-ui/docs/app-compat/index.html +2 -1
  65. package/dist/serve/docs-ui/docs/auth-compat/index.html +2 -1
  66. package/dist/serve/docs-ui/docs/build/ai-logic/index.html +18 -3
  67. package/dist/serve/docs-ui/docs/build/ai-logic.md +30 -2
  68. package/dist/serve/docs-ui/docs/build/authentication/index.html +2 -1
  69. package/dist/serve/docs-ui/docs/build/authentication.md +1 -1
  70. package/dist/serve/docs-ui/docs/build/cloud-firestore/index.html +2 -1
  71. package/dist/serve/docs-ui/docs/build/cloud-messaging/index.html +46 -2
  72. package/dist/serve/docs-ui/docs/build/cloud-messaging.md +56 -1
  73. package/dist/serve/docs-ui/docs/build/cloud-storage/index.html +2 -1
  74. package/dist/serve/docs-ui/docs/build/cloud-storage.md +1 -1
  75. package/dist/serve/docs-ui/docs/build/realtime-database/index.html +21 -3
  76. package/dist/serve/docs-ui/docs/build/realtime-database.md +25 -1
  77. package/dist/serve/docs-ui/docs/conformance-scores/index.html +2 -1
  78. package/dist/serve/docs-ui/docs/create-pyric-reference-api/index.html +61 -28
  79. package/dist/serve/docs-ui/docs/create-pyric-reference-api.md +65 -20
  80. package/dist/serve/docs-ui/docs/database-compat/index.html +2 -1
  81. package/dist/serve/docs-ui/docs/firestore-compat/index.html +6 -5
  82. package/dist/serve/docs-ui/docs/firestore-compat.md +4 -4
  83. package/dist/serve/docs-ui/docs/functions-rtdb-compat/index.html +2 -1
  84. package/dist/serve/docs-ui/docs/get-started/how-the-swap-works/index.html +2 -1
  85. package/dist/serve/docs-ui/docs/get-started/start-building/index.html +4 -3
  86. package/dist/serve/docs-ui/docs/get-started/start-building.md +2 -2
  87. package/dist/serve/docs-ui/docs/index.json +979 -579
  88. package/dist/serve/docs-ui/docs/messaging-compat/index.html +2 -1
  89. package/dist/serve/docs-ui/docs/observe/see-whats-happening/index.html +2 -1
  90. package/dist/serve/docs-ui/docs/observe/shape-your-data/index.html +2 -1
  91. package/dist/serve/docs-ui/docs/overview/index.html +2 -1
  92. package/dist/serve/docs-ui/docs/pyric-admin-app-reference-api/index.html +5 -4
  93. package/dist/serve/docs-ui/docs/pyric-admin-app-reference-api.md +3 -4
  94. package/dist/serve/docs-ui/docs/pyric-admin-auth-reference-api/index.html +5 -4
  95. package/dist/serve/docs-ui/docs/pyric-admin-auth-reference-api.md +3 -4
  96. package/dist/serve/docs-ui/docs/pyric-admin-database-reference-api/index.html +5 -4
  97. package/dist/serve/docs-ui/docs/pyric-admin-database-reference-api.md +3 -4
  98. package/dist/serve/docs-ui/docs/pyric-admin-firestore-reference-api/index.html +2503 -12
  99. package/dist/serve/docs-ui/docs/pyric-admin-firestore-reference-api.md +2219 -8
  100. package/dist/serve/docs-ui/docs/pyric-admin-messaging-reference-api/index.html +916 -0
  101. package/dist/serve/docs-ui/docs/pyric-admin-messaging-reference-api.md +706 -0
  102. package/dist/serve/docs-ui/docs/pyric-admin-storage-reference-api/index.html +4 -3
  103. package/dist/serve/docs-ui/docs/pyric-admin-storage-reference-api.md +2 -3
  104. package/dist/serve/docs-ui/docs/pyric-ai-reference-api/index.html +16 -11
  105. package/dist/serve/docs-ui/docs/pyric-ai-reference-api.md +14 -13
  106. package/dist/serve/docs-ui/docs/pyric-ai-scripting-reference-api/index.html +4 -3
  107. package/dist/serve/docs-ui/docs/pyric-ai-scripting-reference-api.md +2 -3
  108. package/dist/serve/docs-ui/docs/pyric-app-reference-api/index.html +7 -2
  109. package/dist/serve/docs-ui/docs/pyric-app-reference-api.md +5 -2
  110. package/dist/serve/docs-ui/docs/pyric-auth-reference-api/index.html +23 -12
  111. package/dist/serve/docs-ui/docs/pyric-auth-reference-api.md +15 -12
  112. package/dist/serve/docs-ui/docs/pyric-cli-assurance-browser-reference-api/index.html +10 -48
  113. package/dist/serve/docs-ui/docs/pyric-cli-assurance-browser-reference-api.md +11 -24
  114. package/dist/serve/docs-ui/docs/pyric-cli-assurance-reference-api/index.html +87 -97
  115. package/dist/serve/docs-ui/docs/pyric-cli-assurance-reference-api.md +53 -65
  116. package/dist/serve/docs-ui/docs/pyric-cli-bridge-client-reference-api/index.html +14 -15
  117. package/dist/serve/docs-ui/docs/pyric-cli-bridge-client-reference-api.md +19 -28
  118. package/dist/serve/docs-ui/docs/pyric-cli-bridge-reference-api/index.html +4 -3
  119. package/dist/serve/docs-ui/docs/pyric-cli-bridge-reference-api.md +2 -3
  120. package/dist/serve/docs-ui/docs/pyric-cli-conformance-browser-reference-api/index.html +3 -2
  121. package/dist/serve/docs-ui/docs/pyric-cli-conformance-browser-reference-api.md +1 -2
  122. package/dist/serve/docs-ui/docs/pyric-cli-conformance-docs-reference-api/index.html +51 -0
  123. package/dist/serve/docs-ui/docs/pyric-cli-conformance-docs-reference-api.md +36 -0
  124. package/dist/serve/docs-ui/docs/pyric-cli-conformance-reference-api/index.html +3 -2
  125. package/dist/serve/docs-ui/docs/pyric-cli-conformance-reference-api.md +1 -2
  126. package/dist/serve/docs-ui/docs/pyric-cli-credentials-node-reference-api/index.html +3 -2
  127. package/dist/serve/docs-ui/docs/pyric-cli-credentials-node-reference-api.md +1 -2
  128. package/dist/serve/docs-ui/docs/pyric-cli-discover-reference-api/index.html +3 -2
  129. package/dist/serve/docs-ui/docs/pyric-cli-discover-reference-api.md +1 -2
  130. package/dist/serve/docs-ui/docs/pyric-cli-register-reference-api/index.html +3 -2
  131. package/dist/serve/docs-ui/docs/pyric-cli-register-reference-api.md +1 -2
  132. package/dist/serve/docs-ui/docs/pyric-cli-remote-reference-api/index.html +1067 -83
  133. package/dist/serve/docs-ui/docs/pyric-cli-remote-reference-api.md +1291 -160
  134. package/dist/serve/docs-ui/docs/pyric-cli-serve-worker-reference-api/index.html +253 -157
  135. package/dist/serve/docs-ui/docs/pyric-cli-serve-worker-reference-api.md +179 -85
  136. package/dist/serve/docs-ui/docs/pyric-cli-verify-reference-api/index.html +72 -7
  137. package/dist/serve/docs-ui/docs/pyric-cli-verify-reference-api.md +22 -7
  138. package/dist/serve/docs-ui/docs/pyric-cli-vite-reference-api/index.html +33 -12
  139. package/dist/serve/docs-ui/docs/pyric-cli-vite-reference-api.md +15 -12
  140. package/dist/serve/docs-ui/docs/pyric-database-reference-api/index.html +18 -17
  141. package/dist/serve/docs-ui/docs/pyric-database-reference-api.md +19 -22
  142. package/dist/serve/docs-ui/docs/pyric-firestore-reference-api/index.html +1512 -545
  143. package/dist/serve/docs-ui/docs/pyric-firestore-reference-api.md +1311 -316
  144. package/dist/serve/docs-ui/docs/pyric-messaging-reference-api/index.html +5 -4
  145. package/dist/serve/docs-ui/docs/pyric-messaging-reference-api.md +3 -4
  146. package/dist/serve/docs-ui/docs/pyric-messaging-sw-reference-api/index.html +69 -369
  147. package/dist/serve/docs-ui/docs/pyric-messaging-sw-reference-api.md +103 -216
  148. package/dist/serve/docs-ui/docs/pyric-rules-reference-api/index.html +10 -9
  149. package/dist/serve/docs-ui/docs/pyric-rules-reference-api.md +9 -10
  150. package/dist/serve/docs-ui/docs/pyric-sandbox-database-reference-api/index.html +8 -7
  151. package/dist/serve/docs-ui/docs/pyric-sandbox-database-reference-api.md +6 -7
  152. package/dist/serve/docs-ui/docs/pyric-sandbox-firestore-reference-api/index.html +10 -9
  153. package/dist/serve/docs-ui/docs/pyric-sandbox-firestore-reference-api.md +9 -10
  154. package/dist/serve/docs-ui/docs/pyric-sandbox-reference-api/index.html +371 -884
  155. package/dist/serve/docs-ui/docs/pyric-sandbox-reference-api.md +369 -883
  156. package/dist/serve/docs-ui/docs/pyric-storage-reference-api/index.html +25 -17
  157. package/dist/serve/docs-ui/docs/pyric-storage-reference-api.md +21 -19
  158. package/dist/serve/docs-ui/docs/pyric-ui-agents-reference-api/index.html +3 -2
  159. package/dist/serve/docs-ui/docs/pyric-ui-agents-reference-api.md +1 -2
  160. package/dist/serve/docs-ui/docs/pyric-ui-auth-hooks-reference-api/index.html +63 -776
  161. package/dist/serve/docs-ui/docs/pyric-ui-auth-hooks-reference-api.md +69 -510
  162. package/dist/serve/docs-ui/docs/pyric-ui-auth-reference-api/index.html +22 -21
  163. package/dist/serve/docs-ui/docs/pyric-ui-auth-reference-api.md +29 -30
  164. package/dist/serve/docs-ui/docs/pyric-ui-events-hooks-reference-api/index.html +15 -168
  165. package/dist/serve/docs-ui/docs/pyric-ui-events-hooks-reference-api.md +17 -87
  166. package/dist/serve/docs-ui/docs/pyric-ui-events-reference-api/index.html +6 -5
  167. package/dist/serve/docs-ui/docs/pyric-ui-events-reference-api.md +5 -6
  168. package/dist/serve/docs-ui/docs/pyric-ui-firestore-hooks-reference-api/index.html +82 -970
  169. package/dist/serve/docs-ui/docs/pyric-ui-firestore-hooks-reference-api.md +104 -479
  170. package/dist/serve/docs-ui/docs/pyric-ui-firestore-reference-api/index.html +30 -29
  171. package/dist/serve/docs-ui/docs/pyric-ui-firestore-reference-api.md +54 -55
  172. package/dist/serve/docs-ui/docs/pyric-ui-primitives-reference-api/index.html +3 -2
  173. package/dist/serve/docs-ui/docs/pyric-ui-primitives-reference-api.md +1 -2
  174. package/dist/serve/docs-ui/docs/pyric-ui-rtdb-reference-api/index.html +5 -4
  175. package/dist/serve/docs-ui/docs/pyric-ui-rtdb-reference-api.md +3 -4
  176. package/dist/serve/docs-ui/docs/pyric-ui-rules-hooks-reference-api/index.html +9 -124
  177. package/dist/serve/docs-ui/docs/pyric-ui-rules-hooks-reference-api.md +7 -58
  178. package/dist/serve/docs-ui/docs/pyric-ui-rules-reference-api/index.html +24 -23
  179. package/dist/serve/docs-ui/docs/pyric-ui-rules-reference-api.md +31 -34
  180. package/dist/serve/docs-ui/docs/pyric-ui-storage-hooks-reference-api/index.html +104 -1385
  181. package/dist/serve/docs-ui/docs/pyric-ui-storage-hooks-reference-api.md +133 -817
  182. package/dist/serve/docs-ui/docs/pyric-ui-storage-reference-api/index.html +34 -33
  183. package/dist/serve/docs-ui/docs/pyric-ui-storage-reference-api.md +37 -38
  184. package/dist/serve/docs-ui/docs/pyric-ui-traffic-hooks-reference-api/index.html +116 -1169
  185. package/dist/serve/docs-ui/docs/pyric-ui-traffic-hooks-reference-api.md +142 -590
  186. package/dist/serve/docs-ui/docs/pyric-ui-traffic-reference-api/index.html +4 -3
  187. package/dist/serve/docs-ui/docs/pyric-ui-traffic-reference-api.md +3 -4
  188. package/dist/serve/docs-ui/docs/rules-compat/index.html +34 -1
  189. package/dist/serve/docs-ui/docs/rules-compat.md +32 -0
  190. package/dist/serve/docs-ui/docs/secure/audit-your-rules/index.html +19 -2
  191. package/dist/serve/docs-ui/docs/secure/audit-your-rules.md +32 -0
  192. package/dist/serve/docs-ui/docs/secure/firestore-rules-limits/index.html +2 -1
  193. package/dist/serve/docs-ui/docs/secure/read-a-denial/index.html +2 -1
  194. package/dist/serve/docs-ui/docs/secure/rtdb-rules-in-typescript/index.html +2 -1
  195. package/dist/serve/docs-ui/docs/secure/rtdb-rules-in-typescript.md +1 -1
  196. package/dist/serve/docs-ui/docs/secure/rules-standard-library/index.html +2 -1
  197. package/dist/serve/docs-ui/docs/secure/secure-it-with-rules/index.html +2 -1
  198. package/dist/serve/docs-ui/docs/secure/simulate-and-lint/index.html +2 -1
  199. package/dist/serve/docs-ui/docs/secure/write-a-rules-test-suite/index.html +2 -1
  200. package/dist/serve/docs-ui/docs/ship/ship-to-production/index.html +2 -1
  201. package/dist/serve/docs-ui/docs/ship/test-in-node/index.html +2 -1
  202. package/dist/serve/docs-ui/docs/storage-compat/index.html +2 -1
  203. package/dist/serve/docs-ui/docs/trust/how-we-know-it-matches-firebase/index.html +2 -1
  204. package/dist/serve/docs-ui/docs/trust/versioning-and-compatibility/index.html +2 -1
  205. package/dist/serve/docs-ui/llms.txt +2 -1
  206. package/dist/serve/entries/ai.d.ts.map +1 -1
  207. package/dist/serve/entries/ai.js +39 -1
  208. package/dist/serve/entries/ai.js.map +1 -1
  209. package/dist/serve/entries/messaging-sw.d.ts.map +1 -1
  210. package/dist/serve/entries/messaging-sw.js +5 -1
  211. package/dist/serve/entries/messaging-sw.js.map +1 -1
  212. package/dist/serve/entries/messaging.d.ts.map +1 -1
  213. package/dist/serve/entries/messaging.js +7 -1
  214. package/dist/serve/entries/messaging.js.map +1 -1
  215. package/dist/serve/entries/runtime.d.ts.map +1 -1
  216. package/dist/serve/entries/runtime.js +20 -1
  217. package/dist/serve/entries/runtime.js.map +1 -1
  218. package/dist/serve/init-payload.d.ts +25 -0
  219. package/dist/serve/init-payload.d.ts.map +1 -1
  220. package/dist/serve/namespace.d.ts +39 -0
  221. package/dist/serve/namespace.d.ts.map +1 -1
  222. package/dist/serve/namespace.js +80 -1
  223. package/dist/serve/namespace.js.map +1 -1
  224. package/dist/serve/standalone-assets.d.ts +11 -9
  225. package/dist/serve/standalone-assets.d.ts.map +1 -1
  226. package/dist/serve/standalone-assets.js +6 -5
  227. package/dist/serve/standalone-assets.js.map +1 -1
  228. package/dist/serve/studio-ui/assets/{RulesCodeEditor-CXdSLKhO.js → RulesCodeEditor-CxVYcZXw.js} +1 -1
  229. package/dist/serve/studio-ui/assets/index-cpSfgQ7H.js +1218 -0
  230. package/dist/serve/studio-ui/assets/seed-DeuFKi4J.js +20 -0
  231. package/dist/serve/studio-ui/index.html +1 -1
  232. package/dist/serve/vite-plugin.d.ts +92 -15
  233. package/dist/serve/vite-plugin.d.ts.map +1 -1
  234. package/dist/serve/vite-plugin.js +281 -11
  235. package/dist/serve/vite-plugin.js.map +1 -1
  236. package/dist/serve/worker/activity-bootstrap.d.ts +8 -0
  237. package/dist/serve/worker/activity-bootstrap.d.ts.map +1 -0
  238. package/dist/serve/worker/activity-bootstrap.js +11 -0
  239. package/dist/serve/worker/activity-bootstrap.js.map +1 -0
  240. package/dist/serve/worker/client/connection.d.ts.map +1 -1
  241. package/dist/serve/worker/client/connection.js +17 -5
  242. package/dist/serve/worker/client/connection.js.map +1 -1
  243. package/dist/serve/worker/client/core.d.ts +2 -2
  244. package/dist/serve/worker/client/core.d.ts.map +1 -1
  245. package/dist/serve/worker/client/core.js +33 -5
  246. package/dist/serve/worker/client/core.js.map +1 -1
  247. package/dist/serve/worker/client/firestore-writes.d.ts.map +1 -1
  248. package/dist/serve/worker/client/firestore-writes.js +1 -0
  249. package/dist/serve/worker/client/firestore-writes.js.map +1 -1
  250. package/dist/serve/worker/client/messaging.d.ts +9 -1
  251. package/dist/serve/worker/client/messaging.d.ts.map +1 -1
  252. package/dist/serve/worker/client/messaging.js +15 -0
  253. package/dist/serve/worker/client/messaging.js.map +1 -1
  254. package/dist/serve/worker/client/studio.d.ts +10 -0
  255. package/dist/serve/worker/client/studio.d.ts.map +1 -1
  256. package/dist/serve/worker/client/studio.js +11 -0
  257. package/dist/serve/worker/client/studio.js.map +1 -1
  258. package/dist/serve/worker/durable-persistence.d.ts +12 -0
  259. package/dist/serve/worker/durable-persistence.d.ts.map +1 -0
  260. package/dist/serve/worker/durable-persistence.js +118 -0
  261. package/dist/serve/worker/durable-persistence.js.map +1 -0
  262. package/dist/serve/worker/entry.d.ts +7 -3
  263. package/dist/serve/worker/entry.d.ts.map +1 -1
  264. package/dist/serve/worker/entry.js +7 -3
  265. package/dist/serve/worker/entry.js.map +1 -1
  266. package/dist/serve/worker/host/core.d.ts +9 -5
  267. package/dist/serve/worker/host/core.d.ts.map +1 -1
  268. package/dist/serve/worker/host/core.js +34 -9
  269. package/dist/serve/worker/host/core.js.map +1 -1
  270. package/dist/serve/worker/host/dispatch.d.ts.map +1 -1
  271. package/dist/serve/worker/host/dispatch.js +9 -2
  272. package/dist/serve/worker/host/dispatch.js.map +1 -1
  273. package/dist/serve/worker/host/firestore-writes.d.ts.map +1 -1
  274. package/dist/serve/worker/host/firestore-writes.js +3 -2
  275. package/dist/serve/worker/host/firestore-writes.js.map +1 -1
  276. package/dist/serve/worker/host/studio.d.ts +1 -1
  277. package/dist/serve/worker/host/studio.d.ts.map +1 -1
  278. package/dist/serve/worker/host/studio.js +36 -1
  279. package/dist/serve/worker/host/studio.js.map +1 -1
  280. package/dist/serve/worker/host/subscriptions.d.ts.map +1 -1
  281. package/dist/serve/worker/host/subscriptions.js +27 -7
  282. package/dist/serve/worker/host/subscriptions.js.map +1 -1
  283. package/dist/serve/worker/host-context.d.ts +15 -0
  284. package/dist/serve/worker/host-context.d.ts.map +1 -1
  285. package/dist/serve/worker/host-context.js +10 -0
  286. package/dist/serve/worker/host-context.js.map +1 -1
  287. package/dist/serve/worker/host-messaging.d.ts.map +1 -1
  288. package/dist/serve/worker/host-messaging.js +9 -2
  289. package/dist/serve/worker/host-messaging.js.map +1 -1
  290. package/dist/serve/worker/index.d.ts +3 -2
  291. package/dist/serve/worker/index.d.ts.map +1 -1
  292. package/dist/serve/worker/index.js +4 -1
  293. package/dist/serve/worker/index.js.map +1 -1
  294. package/dist/serve/worker/protocol.d.ts +25 -3
  295. package/dist/serve/worker/protocol.d.ts.map +1 -1
  296. package/dist/serve/worker/protocol.js +2 -2
  297. package/dist/serve/worker/protocol.js.map +1 -1
  298. package/dist/serve/worker/serve-init.d.ts +23 -37
  299. package/dist/serve/worker/serve-init.d.ts.map +1 -1
  300. package/dist/serve/worker/serve-init.js +95 -172
  301. package/dist/serve/worker/serve-init.js.map +1 -1
  302. package/dist/vite.d.ts +4 -4
  303. package/dist/vite.d.ts.map +1 -1
  304. package/dist/vite.js +3 -3
  305. package/dist/vite.js.map +1 -1
  306. package/package.json +9 -4
  307. package/src/assurance/.generated/conformance-verdicts.ts +1090 -0
  308. package/src/assurance/attachment.ts +211 -0
  309. package/src/assurance/browser.ts +80 -0
  310. package/src/assurance/campaign.ts +496 -0
  311. package/src/assurance/capabilities.ts +446 -0
  312. package/src/assurance/cases.ts +43 -0
  313. package/src/assurance/index.ts +75 -0
  314. package/src/assurance/runner.ts +885 -0
  315. package/src/assurance/tool-names.ts +15 -0
  316. package/src/assurance/tools.ts +830 -0
  317. package/src/assurance/types.ts +352 -0
  318. package/src/assurance/validation.ts +434 -0
  319. package/src/bridge/client/bridge.ts +550 -0
  320. package/src/bridge/client/dispatch.ts +137 -0
  321. package/src/bridge/client.ts +45 -0
  322. package/src/bridge/protocol.ts +351 -0
  323. package/src/bridge/server/audit.ts +53 -0
  324. package/src/bridge/server/bridge.ts +597 -0
  325. package/src/bridge/server/headless.ts +160 -0
  326. package/src/bridge/server/json-schema-to-zod.ts +108 -0
  327. package/src/bridge/server/local-bridge.ts +66 -0
  328. package/src/bridge/server/logger.ts +50 -0
  329. package/src/bridge/server/mcp-contract.ts +93 -0
  330. package/src/bridge/server/mcp.ts +129 -0
  331. package/src/bridge/server/peer.ts +232 -0
  332. package/src/bridge/server/standalone.ts +347 -0
  333. package/src/bridge/server/tool-metadata.ts +99 -0
  334. package/src/bridge/server.ts +28 -0
  335. package/src/cli/can-i-use.ts +50 -0
  336. package/src/cli/cli.test.ts +493 -0
  337. package/src/cli/database-rules.ts +329 -0
  338. package/src/cli/dev-runner.ts +282 -0
  339. package/src/cli/firebase-json.ts +100 -0
  340. package/src/cli/firestore-indexes.ts +70 -0
  341. package/src/cli/index.ts +425 -0
  342. package/src/cli/init.ts +260 -0
  343. package/src/cli/mcp-proxy.ts +196 -0
  344. package/src/cli/parse-args.ts +80 -0
  345. package/src/cli/rules.ts +259 -0
  346. package/src/cli/scope.ts +67 -0
  347. package/src/cli/serve.ts +996 -0
  348. package/src/cli/service-commands.ts +73 -0
  349. package/src/cli/snapshot.ts +164 -0
  350. package/src/cli/storage-rules.ts +172 -0
  351. package/src/cli/verify.ts +416 -0
  352. package/src/conformance/.generated/can-i-use-browser.ts +113 -0
  353. package/src/conformance/.generated/can-i-use.ts +117 -0
  354. package/src/conformance/.generated/conformance-docs.ts +14 -0
  355. package/src/conformance/browser.ts +24 -0
  356. package/src/conformance/can-i-use-tool.ts +51 -0
  357. package/src/conformance/can-i-use.ts +18 -0
  358. package/src/conformance/docs.ts +8 -0
  359. package/src/conformance/index.ts +20 -0
  360. package/src/conformance/tools.ts +16 -0
  361. package/src/credentials/core/memoize-ttl.ts +142 -0
  362. package/src/credentials/core/types.ts +10 -0
  363. package/src/credentials/node/from-adc.ts +96 -0
  364. package/src/credentials/node/from-service-account.ts +133 -0
  365. package/src/credentials/node/index.ts +6 -0
  366. package/src/discover/concurrency.ts +127 -0
  367. package/src/discover/crawler-adapter.ts +142 -0
  368. package/src/discover/crawler.ts +1127 -0
  369. package/src/discover/credential-free.ts +27 -0
  370. package/src/discover/findCollectionGroup.ts +131 -0
  371. package/src/discover/firestore-source.ts +59 -0
  372. package/src/discover/index.ts +5 -0
  373. package/src/discover/merge.ts +523 -0
  374. package/src/discover/session.ts +402 -0
  375. package/src/discover/tools.ts +201 -0
  376. package/src/discover/types.ts +187 -0
  377. package/src/discover/wire.ts +324 -0
  378. package/src/functions-rtdb/child.ts +382 -0
  379. package/src/functions-rtdb/delivery.ts +7 -0
  380. package/src/functions-rtdb/discovery.ts +136 -0
  381. package/src/functions-rtdb/event.ts +64 -0
  382. package/src/functions-rtdb/execution.ts +111 -0
  383. package/src/functions-rtdb/in-memory-delivery.ts +40 -0
  384. package/src/functions-rtdb/project.ts +74 -0
  385. package/src/functions-rtdb/projection.ts +104 -0
  386. package/src/functions-rtdb/reference-pattern.ts +20 -0
  387. package/src/functions-rtdb/remote-delivery.ts +23 -0
  388. package/src/pkg-version.ts +49 -0
  389. package/src/register/esm-exports.ts +63 -0
  390. package/src/register/hooks.ts +30 -0
  391. package/src/register/index.ts +150 -0
  392. package/src/register/mapping.ts +33 -0
  393. package/src/remote/index.ts +1050 -0
  394. package/src/rtdb/crawl-snapshot.ts +118 -0
  395. package/src/rtdb/inspection.ts +137 -0
  396. package/src/rtdb/load-rules-document.ts +56 -0
  397. package/src/rtdb/rules-generation-tool.ts +38 -0
  398. package/src/rtdb/rules-json.ts +29 -0
  399. package/src/serve/activity-guard.ts +29 -0
  400. package/src/serve/activity-route.ts +164 -0
  401. package/src/serve/activity-warning.ts +26 -0
  402. package/src/serve/bridge-mount.ts +200 -0
  403. package/src/serve/bundler.ts +493 -0
  404. package/src/serve/capture-store.ts +65 -0
  405. package/src/serve/discovery.ts +199 -0
  406. package/src/serve/entries/ai.ts +292 -0
  407. package/src/serve/entries/app-backend.ts +4 -0
  408. package/src/serve/entries/app-client.ts +26 -0
  409. package/src/serve/entries/app-session-store.ts +47 -0
  410. package/src/serve/entries/app.ts +11 -0
  411. package/src/serve/entries/auth-helper-core.ts +181 -0
  412. package/src/serve/entries/auth-helper-dom.ts +134 -0
  413. package/src/serve/entries/auth-helper-runtime.ts +20 -0
  414. package/src/serve/entries/auth.ts +255 -0
  415. package/src/serve/entries/bridge-url.ts +31 -0
  416. package/src/serve/entries/database.ts +129 -0
  417. package/src/serve/entries/firestore.ts +232 -0
  418. package/src/serve/entries/init.ts +46 -0
  419. package/src/serve/entries/keepalive.ts +46 -0
  420. package/src/serve/entries/messaging-sw.ts +75 -0
  421. package/src/serve/entries/messaging.ts +96 -0
  422. package/src/serve/entries/runtime.ts +540 -0
  423. package/src/serve/entries/session-store.ts +97 -0
  424. package/src/serve/entries/storage.ts +92 -0
  425. package/src/serve/entries/tab-sync-wiring.ts +274 -0
  426. package/src/serve/entries/worker-runtime.ts +75 -0
  427. package/src/serve/init-payload.ts +42 -0
  428. package/src/serve/namespace.ts +675 -0
  429. package/src/serve/open-browser.ts +68 -0
  430. package/src/serve/rules.ts +272 -0
  431. package/src/serve/sandbox-marker.ts +31 -0
  432. package/src/serve/server.ts +428 -0
  433. package/src/serve/standalone-assets.ts +180 -0
  434. package/src/serve/state-store.ts +166 -0
  435. package/src/serve/studio/disk-project-store.ts +185 -0
  436. package/src/serve/studio/disk-workspace.ts +162 -0
  437. package/src/serve/studio/index.ts +20 -0
  438. package/src/serve/studio/routes.ts +237 -0
  439. package/src/serve/studio/store-types.ts +48 -0
  440. package/src/serve/studio/studio-storage.test.ts +289 -0
  441. package/src/serve/vite-plugin.ts +1102 -0
  442. package/src/serve/worker/activity-bootstrap.ts +24 -0
  443. package/src/serve/worker/client/admin-firestore.ts +38 -0
  444. package/src/serve/worker/client/ai.ts +124 -0
  445. package/src/serve/worker/client/auth.ts +489 -0
  446. package/src/serve/worker/client/connection.ts +202 -0
  447. package/src/serve/worker/client/core.ts +350 -0
  448. package/src/serve/worker/client/disconnect.ts +45 -0
  449. package/src/serve/worker/client/firestore-reads.ts +181 -0
  450. package/src/serve/worker/client/firestore-refs.ts +226 -0
  451. package/src/serve/worker/client/firestore-writes.ts +232 -0
  452. package/src/serve/worker/client/handles.ts +91 -0
  453. package/src/serve/worker/client/messaging.ts +119 -0
  454. package/src/serve/worker/client/presence.ts +174 -0
  455. package/src/serve/worker/client/rtdb.ts +311 -0
  456. package/src/serve/worker/client/rules.ts +63 -0
  457. package/src/serve/worker/client/service-worker-connection.ts +59 -0
  458. package/src/serve/worker/client/snapshots.ts +86 -0
  459. package/src/serve/worker/client/storage.ts +195 -0
  460. package/src/serve/worker/client/studio.ts +88 -0
  461. package/src/serve/worker/client.ts +57 -0
  462. package/src/serve/worker/durable-persistence.ts +137 -0
  463. package/src/serve/worker/entry.ts +179 -0
  464. package/src/serve/worker/host/admin-firestore.ts +88 -0
  465. package/src/serve/worker/host/connection.ts +179 -0
  466. package/src/serve/worker/host/core.ts +387 -0
  467. package/src/serve/worker/host/dispatch.ts +316 -0
  468. package/src/serve/worker/host/firestore-reads.ts +117 -0
  469. package/src/serve/worker/host/firestore-writes.ts +456 -0
  470. package/src/serve/worker/host/presence.ts +312 -0
  471. package/src/serve/worker/host/rtdb.ts +136 -0
  472. package/src/serve/worker/host/rules.ts +128 -0
  473. package/src/serve/worker/host/storage.ts +312 -0
  474. package/src/serve/worker/host/studio.ts +75 -0
  475. package/src/serve/worker/host/subscriptions.ts +238 -0
  476. package/src/serve/worker/host-ai.ts +165 -0
  477. package/src/serve/worker/host-auth.ts +469 -0
  478. package/src/serve/worker/host-context.ts +273 -0
  479. package/src/serve/worker/host-events.ts +94 -0
  480. package/src/serve/worker/host-messaging.ts +240 -0
  481. package/src/serve/worker/host.ts +47 -0
  482. package/src/serve/worker/index.ts +196 -0
  483. package/src/serve/worker/presence-timing.ts +15 -0
  484. package/src/serve/worker/protocol.ts +1112 -0
  485. package/src/serve/worker/serve-init.ts +606 -0
  486. package/src/serve/worker/service-worker-channel.ts +33 -0
  487. package/src/serve/worker/service-worker-relay.ts +86 -0
  488. package/src/serve/writer-lock.ts +53 -0
  489. package/src/verify/cases.ts +233 -0
  490. package/src/verify/fixture.ts +258 -0
  491. package/src/verify/index.ts +519 -0
  492. package/src/verify/tools.ts +108 -0
  493. package/src/version/compat-target.ts +17 -0
  494. package/src/vite.ts +17 -0
  495. package/dist/serve/docs-ui/docs/pyric-firestore-values-reference-api/index.html +0 -30
  496. package/dist/serve/docs-ui/docs/pyric-firestore-values-reference-api.md +0 -30
  497. package/dist/serve/studio-ui/assets/index-BvtQIpGn.js +0 -1211
  498. package/dist/serve/studio-ui/assets/seed-3DMedLL3.js +0 -2
@@ -1,1241 +1,188 @@
1
- <!DOCTYPE html><html lang="en"> <head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>API reference: @pyric/ui/traffic/hooks · Pyric Studio</title><meta name="description" content="Published declarations for @pyric/ui/traffic/hooks."><link rel="preconnect" href="https://fonts.googleapis.com"><link rel="preconnect" href="https://fonts.gstatic.com" crossorigin><link href="https://fonts.googleapis.com/css2?family=Inter:wght@300;400;500;600;700&family=JetBrains+Mono:wght@400;500;700&display=swap" rel="stylesheet"><link rel="stylesheet" href="/__pyric/ui/_astro/_slug_.DPUwShm2.css"></head> <body> <header class="studio__bar"> <div class="studio__bar-inner"> <a class="studio__brand" href="/__pyric/ui/" aria-label="Pyric Studio">Pyric</a> <nav class="studio__nav" aria-label="Studio tabs"> <a class="studio__nav-tab" href="/__pyric/ui/"> Home </a><a class="studio__nav-tab" href="/__pyric/ui/firestore"> Firestore </a><a class="studio__nav-tab" href="/__pyric/ui/auth"> Auth </a><a class="studio__nav-tab" href="/__pyric/ui/rtdb"> RTDB </a><a class="studio__nav-tab" href="/__pyric/ui/storage"> Storage </a><a class="studio__nav-tab" href="/__pyric/ui/traffic"> Traffic </a><a class="studio__nav-tab" href="/__pyric/ui/settings"> Settings </a><a class="studio__nav-tab" href="/__pyric/ui/docs" aria-current="page"> Docs </a> </nav> </div> </header> <div class="docs-shell"> <details class="docs-nav-drawer"> <summary>Navigate</summary> <nav class="docs-nav" aria-label="Documentation"> <div class="docs-search" data-index-url="/__pyric/ui/docs/index.json"> <div class="docs-search-field"> <svg class="docs-search-icon" viewBox="0 0 16 16" width="14" height="14" aria-hidden="true"> <path d="M11.5 11.5 15 15M13 7A6 6 0 1 1 1 7a6 6 0 0 1 12 0Z" fill="none" stroke="currentColor" stroke-width="1.4" stroke-linecap="round"></path> </svg> <input type="text" class="docs-search-input" placeholder="Search docs" aria-label="Search docs" autocomplete="off" spellcheck="false"> <kbd class="docs-search-kbd">⌘K</kbd> </div> <ul class="docs-search-results" hidden></ul> </div> <script type="module">let i=null;function d(t){return i||(i=fetch(t).then(e=>e.json())),i}function l(t,e){return t.title.toLowerCase().includes(e)||t.excerpt.toLowerCase().includes(e)?!0:t.headings.some(r=>r.text.toLowerCase().includes(e))}function u(t,e,r){if(e.innerHTML="",t.length===0){e.hidden=!1;{const n=document.createElement("li");n.className="docs-search-empty",n.textContent="No matches",e.appendChild(n)}return}e.hidden=!1;for(const n of t.slice(0,8)){const s=document.createElement("li"),c=document.createElement("a");c.href=n.path;const o=document.createElement("span");o.className="docs-search-result-title",o.textContent=n.title;const a=document.createElement("span");a.className="docs-search-result-meta",a.textContent=[n.group,n.section].filter(Boolean).join(" / "),c.append(o,a),s.appendChild(c),e.appendChild(s)}}document.querySelectorAll(".docs-search").forEach(t=>{const e=t.dataset.indexUrl,r=t.querySelector(".docs-search-input"),n=t.querySelector(".docs-search-results");r.addEventListener("input",async()=>{const s=r.value.trim().toLowerCase();if(!s){n.hidden=!0,n.innerHTML="";return}const{pages:c}=await d(e);r.value.trim().toLowerCase()===s&&u(c.filter(o=>l(o,s)),n)}),r.addEventListener("focus",()=>{d(e),n.childElementCount>0&&(n.hidden=!1)}),r.addEventListener("keydown",s=>{s.key==="Escape"&&(r.value="",n.hidden=!0,n.innerHTML="",r.blur())}),r.addEventListener("blur",()=>{window.setTimeout(()=>{n.hidden=!0},150)})});document.addEventListener("keydown",t=>{if(!(t.metaKey||t.ctrlKey)||t.key.toLowerCase()!=="k")return;const e=[...document.querySelectorAll(".docs-search-input")].find(r=>r.offsetParent!==null);e&&(t.preventDefault(),e.focus(),e.select())});</script> <a class="docs-nav-toplink" href="/__pyric/ui/docs/overview/"> Overview </a><details class="docs-nav-group"> <summary>Get started</summary> <div class="docs-nav-group-body"> <div class="docs-nav-section"> <ul> <li> <a href="/__pyric/ui/docs/get-started/start-building/"> Quickstart </a> </li><li> <a href="/__pyric/ui/docs/get-started/how-the-swap-works/"> How the swap works </a> </li> </ul> </div> </div> </details><details class="docs-nav-group"> <summary>Build</summary> <div class="docs-nav-group-body"> <div class="docs-nav-section"> <ul> <li> <a href="/__pyric/ui/docs/build/authentication/"> Authentication </a> </li><li> <a href="/__pyric/ui/docs/build/cloud-firestore/"> Cloud Firestore </a> </li><li> <a href="/__pyric/ui/docs/build/realtime-database/"> Realtime Database </a> </li><li> <a href="/__pyric/ui/docs/build/cloud-storage/"> Cloud Storage </a> </li><li> <a href="/__pyric/ui/docs/build/cloud-messaging/"> Cloud Messaging </a> </li><li> <a href="/__pyric/ui/docs/build/ai-logic/"> AI Logic </a> </li> </ul> </div> </div> </details><details class="docs-nav-group"> <summary>Secure &amp; debug</summary> <div class="docs-nav-group-body"> <div class="docs-nav-section"> <ul> <li> <a href="/__pyric/ui/docs/secure/secure-it-with-rules/"> Security Rules </a> </li><li> <a href="/__pyric/ui/docs/secure/simulate-and-lint/"> Simulate and lint before you deploy </a> </li><li> <a href="/__pyric/ui/docs/secure/write-a-rules-test-suite/"> Write a rules test suite </a> </li><li> <a href="/__pyric/ui/docs/secure/read-a-denial/"> Read a denial and understand it </a> </li><li> <a href="/__pyric/ui/docs/secure/rules-standard-library/"> The rules standard library </a> </li><li> <a href="/__pyric/ui/docs/secure/rtdb-rules-in-typescript/"> RTDB rules in TypeScript </a> </li><li> <a href="/__pyric/ui/docs/secure/firestore-rules-limits/"> Rules limits </a> </li><li> <a href="/__pyric/ui/docs/secure/audit-your-rules/"> Audit rules and data </a> </li> </ul> </div> </div> </details><details class="docs-nav-group"> <summary>Observe &amp; shape</summary> <div class="docs-nav-group-body"> <div class="docs-nav-section"> <ul> <li> <a href="/__pyric/ui/docs/observe/see-whats-happening/"> Traffic &amp; rule verdicts </a> </li><li> <a href="/__pyric/ui/docs/observe/shape-your-data/"> Seed, snapshot, replay </a> </li> </ul> </div> </div> </details><details class="docs-nav-group"> <summary>Ship &amp; test</summary> <div class="docs-nav-group-body"> <div class="docs-nav-section"> <ul> <li> <a href="/__pyric/ui/docs/ship/ship-to-production/"> Ship to production </a> </li><li> <a href="/__pyric/ui/docs/ship/test-in-node/"> Test in Node </a> </li> </ul> </div> </div> </details><details class="docs-nav-group"> <summary>Work with an agent</summary> <div class="docs-nav-group-body"> <div class="docs-nav-section"> <ul> <li> <a href="/__pyric/ui/docs/agent/set-up-your-agent/"> Connect an agent </a> </li><li> <a href="/__pyric/ui/docs/agent/work-with-an-agent/"> Use the MCP tools </a> </li><li> <a href="/__pyric/ui/docs/agent/watch-and-review/"> Watch in Pyric Studio </a> </li> </ul> </div> </div> </details><a class="docs-nav-toplink" href="/__pyric/ui/docs/trust/versioning-and-compatibility/"> Trust </a><details class="docs-nav-group"> <summary>Conformance</summary> <div class="docs-nav-group-body"> <div class="docs-nav-section"> <ul> <li> <a href="/__pyric/ui/docs/conformance-scores/"> Public API coverage </a> </li><li> <a href="/__pyric/ui/docs/trust/how-we-know-it-matches-firebase/"> How we know it matches Firebase </a> </li><li> <a href="/__pyric/ui/docs/app-compat/"> App </a> </li><li> <a href="/__pyric/ui/docs/ai-compat/"> AI Logic </a> </li><li> <a href="/__pyric/ui/docs/auth-compat/"> Auth </a> </li><li> <a href="/__pyric/ui/docs/firestore-compat/"> Firestore </a> </li><li> <a href="/__pyric/ui/docs/database-compat/"> Realtime Database </a> </li><li> <a href="/__pyric/ui/docs/storage-compat/"> Storage </a> </li><li> <a href="/__pyric/ui/docs/messaging-compat/"> Messaging </a> </li><li> <a href="/__pyric/ui/docs/functions-rtdb-compat/"> Functions · RTDB </a> </li><li> <a href="/__pyric/ui/docs/rules-compat/"> Rules </a> </li> </ul> </div> </div> </details> <details class="docs-nav-group" open> <summary>Reference</summary> <div class="docs-nav-group-body docs-nav-group-body--reference"> <div class="docs-nav-section"> <ul> <li> <a href="/__pyric/ui/docs/api-reference/"> API reference </a> </li> </ul> </div><div class="docs-nav-section"> <h2 class="docs-nav-heading">pyric</h2> <ul> <li> <a href="/__pyric/ui/docs/pyric-app-reference-api/"> pyric/app </a> </li><li> <a href="/__pyric/ui/docs/pyric-firestore-reference-api/"> pyric/firestore </a> </li><li> <a href="/__pyric/ui/docs/pyric-auth-reference-api/"> pyric/auth </a> </li><li> <a href="/__pyric/ui/docs/pyric-ai-reference-api/"> pyric/ai </a> </li><li> <a href="/__pyric/ui/docs/pyric-ai-scripting-reference-api/"> pyric/ai/scripting </a> </li><li> <a href="/__pyric/ui/docs/pyric-database-reference-api/"> pyric/database </a> </li><li> <a href="/__pyric/ui/docs/pyric-storage-reference-api/"> pyric/storage </a> </li><li> <a href="/__pyric/ui/docs/pyric-messaging-reference-api/"> pyric/messaging </a> </li><li> <a href="/__pyric/ui/docs/pyric-messaging-sw-reference-api/"> pyric/messaging/sw </a> </li><li> <a href="/__pyric/ui/docs/pyric-rules-reference-api/"> pyric/rules </a> </li><li> <a href="/__pyric/ui/docs/pyric-firestore-values-reference-api/"> pyric/firestore-values </a> </li><li> <a href="/__pyric/ui/docs/pyric-sandbox-reference-api/"> pyric/sandbox </a> </li><li> <a href="/__pyric/ui/docs/pyric-sandbox-firestore-reference-api/"> pyric/sandbox/firestore </a> </li><li> <a href="/__pyric/ui/docs/pyric-sandbox-database-reference-api/"> pyric/sandbox/database </a> </li> </ul> </div><div class="docs-nav-section"> <h2 class="docs-nav-heading">pyric-admin</h2> <ul> <li> <a href="/__pyric/ui/docs/pyric-admin-app-reference-api/"> pyric-admin/app </a> </li><li> <a href="/__pyric/ui/docs/pyric-admin-firestore-reference-api/"> pyric-admin/firestore </a> </li><li> <a href="/__pyric/ui/docs/pyric-admin-auth-reference-api/"> pyric-admin/auth </a> </li><li> <a href="/__pyric/ui/docs/pyric-admin-database-reference-api/"> pyric-admin/database </a> </li><li> <a href="/__pyric/ui/docs/pyric-admin-storage-reference-api/"> pyric-admin/storage </a> </li> </ul> </div><div class="docs-nav-section"> <h2 class="docs-nav-heading">create-pyric</h2> <ul> <li> <a href="/__pyric/ui/docs/create-pyric-reference-api/"> create-pyric </a> </li> </ul> </div><div class="docs-nav-section"> <h2 class="docs-nav-heading">@pyric/cli</h2> <ul> <li> <a href="/__pyric/ui/docs/pyric-cli-credentials-node-reference-api/"> @pyric/cli/credentials/node </a> </li><li> <a href="/__pyric/ui/docs/pyric-cli-verify-reference-api/"> @pyric/cli/verify </a> </li><li> <a href="/__pyric/ui/docs/pyric-cli-conformance-reference-api/"> @pyric/cli/conformance </a> </li><li> <a href="/__pyric/ui/docs/pyric-cli-conformance-browser-reference-api/"> @pyric/cli/conformance/browser </a> </li><li> <a href="/__pyric/ui/docs/pyric-cli-assurance-reference-api/"> @pyric/cli/assurance </a> </li><li> <a href="/__pyric/ui/docs/pyric-cli-assurance-browser-reference-api/"> @pyric/cli/assurance/browser </a> </li><li> <a href="/__pyric/ui/docs/pyric-cli-bridge-reference-api/"> @pyric/cli/bridge </a> </li><li> <a href="/__pyric/ui/docs/pyric-cli-bridge-client-reference-api/"> @pyric/cli/bridge/client </a> </li><li> <a href="/__pyric/ui/docs/pyric-cli-discover-reference-api/"> @pyric/cli/discover </a> </li><li> <a href="/__pyric/ui/docs/pyric-cli-vite-reference-api/"> @pyric/cli/vite </a> </li><li> <a href="/__pyric/ui/docs/pyric-cli-serve-worker-reference-api/"> @pyric/cli/serve/worker </a> </li><li> <a href="/__pyric/ui/docs/pyric-cli-remote-reference-api/"> @pyric/cli/remote </a> </li><li> <a href="/__pyric/ui/docs/pyric-cli-register-reference-api/"> @pyric/cli/register </a> </li> </ul> </div><div class="docs-nav-section"> <h2 class="docs-nav-heading">@pyric/ui</h2> <ul> <li> <a href="/__pyric/ui/docs/pyric-ui-auth-reference-api/"> @pyric/ui/auth </a> </li><li> <a href="/__pyric/ui/docs/pyric-ui-auth-hooks-reference-api/"> @pyric/ui/auth/hooks </a> </li><li> <a href="/__pyric/ui/docs/pyric-ui-primitives-reference-api/"> @pyric/ui/primitives </a> </li><li> <a href="/__pyric/ui/docs/pyric-ui-firestore-reference-api/"> @pyric/ui/firestore </a> </li><li> <a href="/__pyric/ui/docs/pyric-ui-firestore-hooks-reference-api/"> @pyric/ui/firestore/hooks </a> </li><li> <a href="/__pyric/ui/docs/pyric-ui-rtdb-reference-api/"> @pyric/ui/rtdb </a> </li><li> <a href="/__pyric/ui/docs/pyric-ui-storage-reference-api/"> @pyric/ui/storage </a> </li><li> <a href="/__pyric/ui/docs/pyric-ui-storage-hooks-reference-api/"> @pyric/ui/storage/hooks </a> </li><li> <a href="/__pyric/ui/docs/pyric-ui-traffic-reference-api/"> @pyric/ui/traffic </a> </li><li> <a href="/__pyric/ui/docs/pyric-ui-traffic-hooks-reference-api/" aria-current="page"> @pyric/ui/traffic/hooks </a> </li><li> <a href="/__pyric/ui/docs/pyric-ui-events-reference-api/"> @pyric/ui/events </a> </li><li> <a href="/__pyric/ui/docs/pyric-ui-events-hooks-reference-api/"> @pyric/ui/events/hooks </a> </li><li> <a href="/__pyric/ui/docs/pyric-ui-agents-reference-api/"> @pyric/ui/agents </a> </li><li> <a href="/__pyric/ui/docs/pyric-ui-rules-reference-api/"> @pyric/ui/rules </a> </li><li> <a href="/__pyric/ui/docs/pyric-ui-rules-hooks-reference-api/"> @pyric/ui/rules/hooks </a> </li> </ul> </div> </div> </details> </nav> </details> <nav class="docs-nav" aria-label="Documentation"> <div class="docs-search" data-index-url="/__pyric/ui/docs/index.json"> <div class="docs-search-field"> <svg class="docs-search-icon" viewBox="0 0 16 16" width="14" height="14" aria-hidden="true"> <path d="M11.5 11.5 15 15M13 7A6 6 0 1 1 1 7a6 6 0 0 1 12 0Z" fill="none" stroke="currentColor" stroke-width="1.4" stroke-linecap="round"></path> </svg> <input type="text" class="docs-search-input" placeholder="Search docs" aria-label="Search docs" autocomplete="off" spellcheck="false"> <kbd class="docs-search-kbd">⌘K</kbd> </div> <ul class="docs-search-results" hidden></ul> </div> <a class="docs-nav-toplink" href="/__pyric/ui/docs/overview/" id="nav-group-overview"> Overview </a><details class="docs-nav-group" id="nav-group-get-started"> <summary>Get started</summary> <div class="docs-nav-group-body"> <div class="docs-nav-section"> <ul> <li> <a href="/__pyric/ui/docs/get-started/start-building/"> Quickstart </a> </li><li> <a href="/__pyric/ui/docs/get-started/how-the-swap-works/"> How the swap works </a> </li> </ul> </div> </div> </details><details class="docs-nav-group" id="nav-group-build"> <summary>Build</summary> <div class="docs-nav-group-body"> <div class="docs-nav-section"> <ul> <li> <a href="/__pyric/ui/docs/build/authentication/"> Authentication </a> </li><li> <a href="/__pyric/ui/docs/build/cloud-firestore/"> Cloud Firestore </a> </li><li> <a href="/__pyric/ui/docs/build/realtime-database/"> Realtime Database </a> </li><li> <a href="/__pyric/ui/docs/build/cloud-storage/"> Cloud Storage </a> </li><li> <a href="/__pyric/ui/docs/build/cloud-messaging/"> Cloud Messaging </a> </li><li> <a href="/__pyric/ui/docs/build/ai-logic/"> AI Logic </a> </li> </ul> </div> </div> </details><details class="docs-nav-group" id="nav-group-secure-debug"> <summary>Secure &amp; debug</summary> <div class="docs-nav-group-body"> <div class="docs-nav-section"> <ul> <li> <a href="/__pyric/ui/docs/secure/secure-it-with-rules/"> Security Rules </a> </li><li> <a href="/__pyric/ui/docs/secure/simulate-and-lint/"> Simulate and lint before you deploy </a> </li><li> <a href="/__pyric/ui/docs/secure/write-a-rules-test-suite/"> Write a rules test suite </a> </li><li> <a href="/__pyric/ui/docs/secure/read-a-denial/"> Read a denial and understand it </a> </li><li> <a href="/__pyric/ui/docs/secure/rules-standard-library/"> The rules standard library </a> </li><li> <a href="/__pyric/ui/docs/secure/rtdb-rules-in-typescript/"> RTDB rules in TypeScript </a> </li><li> <a href="/__pyric/ui/docs/secure/firestore-rules-limits/"> Rules limits </a> </li><li> <a href="/__pyric/ui/docs/secure/audit-your-rules/"> Audit rules and data </a> </li> </ul> </div> </div> </details><details class="docs-nav-group" id="nav-group-observe-shape"> <summary>Observe &amp; shape</summary> <div class="docs-nav-group-body"> <div class="docs-nav-section"> <ul> <li> <a href="/__pyric/ui/docs/observe/see-whats-happening/"> Traffic &amp; rule verdicts </a> </li><li> <a href="/__pyric/ui/docs/observe/shape-your-data/"> Seed, snapshot, replay </a> </li> </ul> </div> </div> </details><details class="docs-nav-group" id="nav-group-ship-test"> <summary>Ship &amp; test</summary> <div class="docs-nav-group-body"> <div class="docs-nav-section"> <ul> <li> <a href="/__pyric/ui/docs/ship/ship-to-production/"> Ship to production </a> </li><li> <a href="/__pyric/ui/docs/ship/test-in-node/"> Test in Node </a> </li> </ul> </div> </div> </details><details class="docs-nav-group" id="nav-group-work-with-an-agent"> <summary>Work with an agent</summary> <div class="docs-nav-group-body"> <div class="docs-nav-section"> <ul> <li> <a href="/__pyric/ui/docs/agent/set-up-your-agent/"> Connect an agent </a> </li><li> <a href="/__pyric/ui/docs/agent/work-with-an-agent/"> Use the MCP tools </a> </li><li> <a href="/__pyric/ui/docs/agent/watch-and-review/"> Watch in Pyric Studio </a> </li> </ul> </div> </div> </details><a class="docs-nav-toplink" href="/__pyric/ui/docs/trust/versioning-and-compatibility/" id="nav-group-trust"> Trust </a><details class="docs-nav-group" id="nav-group-conformance"> <summary>Conformance</summary> <div class="docs-nav-group-body"> <div class="docs-nav-section"> <ul> <li> <a href="/__pyric/ui/docs/conformance-scores/"> Public API coverage </a> </li><li> <a href="/__pyric/ui/docs/trust/how-we-know-it-matches-firebase/"> How we know it matches Firebase </a> </li><li> <a href="/__pyric/ui/docs/app-compat/"> App </a> </li><li> <a href="/__pyric/ui/docs/ai-compat/"> AI Logic </a> </li><li> <a href="/__pyric/ui/docs/auth-compat/"> Auth </a> </li><li> <a href="/__pyric/ui/docs/firestore-compat/"> Firestore </a> </li><li> <a href="/__pyric/ui/docs/database-compat/"> Realtime Database </a> </li><li> <a href="/__pyric/ui/docs/storage-compat/"> Storage </a> </li><li> <a href="/__pyric/ui/docs/messaging-compat/"> Messaging </a> </li><li> <a href="/__pyric/ui/docs/functions-rtdb-compat/"> Functions · RTDB </a> </li><li> <a href="/__pyric/ui/docs/rules-compat/"> Rules </a> </li> </ul> </div> </div> </details> <details class="docs-nav-group" id="nav-group-reference" open> <summary>Reference</summary> <div class="docs-nav-group-body docs-nav-group-body--reference"> <div class="docs-nav-section"> <ul> <li> <a href="/__pyric/ui/docs/api-reference/"> API reference </a> </li> </ul> </div><div class="docs-nav-section"> <h2 class="docs-nav-heading">pyric</h2> <ul> <li> <a href="/__pyric/ui/docs/pyric-app-reference-api/"> pyric/app </a> </li><li> <a href="/__pyric/ui/docs/pyric-firestore-reference-api/"> pyric/firestore </a> </li><li> <a href="/__pyric/ui/docs/pyric-auth-reference-api/"> pyric/auth </a> </li><li> <a href="/__pyric/ui/docs/pyric-ai-reference-api/"> pyric/ai </a> </li><li> <a href="/__pyric/ui/docs/pyric-ai-scripting-reference-api/"> pyric/ai/scripting </a> </li><li> <a href="/__pyric/ui/docs/pyric-database-reference-api/"> pyric/database </a> </li><li> <a href="/__pyric/ui/docs/pyric-storage-reference-api/"> pyric/storage </a> </li><li> <a href="/__pyric/ui/docs/pyric-messaging-reference-api/"> pyric/messaging </a> </li><li> <a href="/__pyric/ui/docs/pyric-messaging-sw-reference-api/"> pyric/messaging/sw </a> </li><li> <a href="/__pyric/ui/docs/pyric-rules-reference-api/"> pyric/rules </a> </li><li> <a href="/__pyric/ui/docs/pyric-firestore-values-reference-api/"> pyric/firestore-values </a> </li><li> <a href="/__pyric/ui/docs/pyric-sandbox-reference-api/"> pyric/sandbox </a> </li><li> <a href="/__pyric/ui/docs/pyric-sandbox-firestore-reference-api/"> pyric/sandbox/firestore </a> </li><li> <a href="/__pyric/ui/docs/pyric-sandbox-database-reference-api/"> pyric/sandbox/database </a> </li> </ul> </div><div class="docs-nav-section"> <h2 class="docs-nav-heading">pyric-admin</h2> <ul> <li> <a href="/__pyric/ui/docs/pyric-admin-app-reference-api/"> pyric-admin/app </a> </li><li> <a href="/__pyric/ui/docs/pyric-admin-firestore-reference-api/"> pyric-admin/firestore </a> </li><li> <a href="/__pyric/ui/docs/pyric-admin-auth-reference-api/"> pyric-admin/auth </a> </li><li> <a href="/__pyric/ui/docs/pyric-admin-database-reference-api/"> pyric-admin/database </a> </li><li> <a href="/__pyric/ui/docs/pyric-admin-storage-reference-api/"> pyric-admin/storage </a> </li> </ul> </div><div class="docs-nav-section"> <h2 class="docs-nav-heading">create-pyric</h2> <ul> <li> <a href="/__pyric/ui/docs/create-pyric-reference-api/"> create-pyric </a> </li> </ul> </div><div class="docs-nav-section"> <h2 class="docs-nav-heading">@pyric/cli</h2> <ul> <li> <a href="/__pyric/ui/docs/pyric-cli-credentials-node-reference-api/"> @pyric/cli/credentials/node </a> </li><li> <a href="/__pyric/ui/docs/pyric-cli-verify-reference-api/"> @pyric/cli/verify </a> </li><li> <a href="/__pyric/ui/docs/pyric-cli-conformance-reference-api/"> @pyric/cli/conformance </a> </li><li> <a href="/__pyric/ui/docs/pyric-cli-conformance-browser-reference-api/"> @pyric/cli/conformance/browser </a> </li><li> <a href="/__pyric/ui/docs/pyric-cli-assurance-reference-api/"> @pyric/cli/assurance </a> </li><li> <a href="/__pyric/ui/docs/pyric-cli-assurance-browser-reference-api/"> @pyric/cli/assurance/browser </a> </li><li> <a href="/__pyric/ui/docs/pyric-cli-bridge-reference-api/"> @pyric/cli/bridge </a> </li><li> <a href="/__pyric/ui/docs/pyric-cli-bridge-client-reference-api/"> @pyric/cli/bridge/client </a> </li><li> <a href="/__pyric/ui/docs/pyric-cli-discover-reference-api/"> @pyric/cli/discover </a> </li><li> <a href="/__pyric/ui/docs/pyric-cli-vite-reference-api/"> @pyric/cli/vite </a> </li><li> <a href="/__pyric/ui/docs/pyric-cli-serve-worker-reference-api/"> @pyric/cli/serve/worker </a> </li><li> <a href="/__pyric/ui/docs/pyric-cli-remote-reference-api/"> @pyric/cli/remote </a> </li><li> <a href="/__pyric/ui/docs/pyric-cli-register-reference-api/"> @pyric/cli/register </a> </li> </ul> </div><div class="docs-nav-section"> <h2 class="docs-nav-heading">@pyric/ui</h2> <ul> <li> <a href="/__pyric/ui/docs/pyric-ui-auth-reference-api/"> @pyric/ui/auth </a> </li><li> <a href="/__pyric/ui/docs/pyric-ui-auth-hooks-reference-api/"> @pyric/ui/auth/hooks </a> </li><li> <a href="/__pyric/ui/docs/pyric-ui-primitives-reference-api/"> @pyric/ui/primitives </a> </li><li> <a href="/__pyric/ui/docs/pyric-ui-firestore-reference-api/"> @pyric/ui/firestore </a> </li><li> <a href="/__pyric/ui/docs/pyric-ui-firestore-hooks-reference-api/"> @pyric/ui/firestore/hooks </a> </li><li> <a href="/__pyric/ui/docs/pyric-ui-rtdb-reference-api/"> @pyric/ui/rtdb </a> </li><li> <a href="/__pyric/ui/docs/pyric-ui-storage-reference-api/"> @pyric/ui/storage </a> </li><li> <a href="/__pyric/ui/docs/pyric-ui-storage-hooks-reference-api/"> @pyric/ui/storage/hooks </a> </li><li> <a href="/__pyric/ui/docs/pyric-ui-traffic-reference-api/"> @pyric/ui/traffic </a> </li><li> <a href="/__pyric/ui/docs/pyric-ui-traffic-hooks-reference-api/" aria-current="page"> @pyric/ui/traffic/hooks </a> </li><li> <a href="/__pyric/ui/docs/pyric-ui-events-reference-api/"> @pyric/ui/events </a> </li><li> <a href="/__pyric/ui/docs/pyric-ui-events-hooks-reference-api/"> @pyric/ui/events/hooks </a> </li><li> <a href="/__pyric/ui/docs/pyric-ui-agents-reference-api/"> @pyric/ui/agents </a> </li><li> <a href="/__pyric/ui/docs/pyric-ui-rules-reference-api/"> @pyric/ui/rules </a> </li><li> <a href="/__pyric/ui/docs/pyric-ui-rules-hooks-reference-api/"> @pyric/ui/rules/hooks </a> </li> </ul> </div> </div> </details> </nav> <main class="doc-main"> <nav class="docs-breadcrumbs" aria-label="Breadcrumb"> <ol> <li> <a href="/__pyric/ui/docs/api-reference/">API reference</a> </li><li> <span class="docs-breadcrumbs-sep" aria-hidden="true">/</span> <span>@pyric/ui</span> </li><li> <span class="docs-breadcrumbs-sep" aria-hidden="true">/</span> <span aria-current="page">@pyric/ui/traffic/hooks</span> </li> </ol> </nav> <header class="api-reference-header"> <p class="api-reference-kicker">API reference</p> <h1><code>@pyric/ui/traffic/hooks</code></h1> <p class="api-reference-meta"> 46 published symbols from <code>@pyric/ui</code> </p> <p class="api-reference-source">
1
+ <!DOCTYPE html><html lang="en"> <head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>API reference: @pyric/ui/traffic/hooks · Pyric Studio</title><meta name="description" content="Published declarations for @pyric/ui/traffic/hooks."><link rel="preconnect" href="https://fonts.googleapis.com"><link rel="preconnect" href="https://fonts.gstatic.com" crossorigin><link href="https://fonts.googleapis.com/css2?family=Inter:wght@300;400;500;600;700&family=JetBrains+Mono:wght@400;500;700&display=swap" rel="stylesheet"><link rel="stylesheet" href="/__pyric/ui/_astro/_slug_.CXh9yTP1.css">
2
+ <link rel="stylesheet" href="/__pyric/ui/_astro/_slug_.DUci-duz.css"></head> <body> <header class="studio__bar"> <div class="studio__bar-inner"> <a class="studio__brand" href="/__pyric/ui/" aria-label="Pyric Studio">Pyric</a> <nav class="studio__nav" aria-label="Studio tabs"> <a class="studio__nav-tab" href="/__pyric/ui/"> Home </a><a class="studio__nav-tab" href="/__pyric/ui/firestore"> Firestore </a><a class="studio__nav-tab" href="/__pyric/ui/auth"> Auth </a><a class="studio__nav-tab" href="/__pyric/ui/rtdb"> RTDB </a><a class="studio__nav-tab" href="/__pyric/ui/storage"> Storage </a><a class="studio__nav-tab" href="/__pyric/ui/traffic"> Traffic </a><a class="studio__nav-tab" href="/__pyric/ui/settings"> Settings </a><a class="studio__nav-tab" href="/__pyric/ui/docs" aria-current="page"> Docs </a> </nav> </div> </header> <div class="docs-shell"> <details class="docs-nav-drawer"> <summary>Navigate</summary> <nav class="docs-nav" aria-label="Documentation"> <div class="docs-search" data-index-url="/__pyric/ui/docs/index.json"> <div class="docs-search-field"> <svg class="docs-search-icon" viewBox="0 0 16 16" width="14" height="14" aria-hidden="true"> <path d="M11.5 11.5 15 15M13 7A6 6 0 1 1 1 7a6 6 0 0 1 12 0Z" fill="none" stroke="currentColor" stroke-width="1.4" stroke-linecap="round"></path> </svg> <input type="text" class="docs-search-input" placeholder="Search docs" aria-label="Search docs" autocomplete="off" spellcheck="false"> <kbd class="docs-search-kbd">⌘K</kbd> </div> <ul class="docs-search-results" hidden></ul> </div> <script type="module">let i=null;function d(t){return i||(i=fetch(t).then(e=>e.json())),i}function l(t,e){return t.title.toLowerCase().includes(e)||t.excerpt.toLowerCase().includes(e)?!0:t.headings.some(r=>r.text.toLowerCase().includes(e))}function u(t,e,r){if(e.innerHTML="",t.length===0){e.hidden=!1;{const n=document.createElement("li");n.className="docs-search-empty",n.textContent="No matches",e.appendChild(n)}return}e.hidden=!1;for(const n of t.slice(0,8)){const s=document.createElement("li"),c=document.createElement("a");c.href=n.path;const o=document.createElement("span");o.className="docs-search-result-title",o.textContent=n.title;const a=document.createElement("span");a.className="docs-search-result-meta",a.textContent=[n.group,n.section].filter(Boolean).join(" / "),c.append(o,a),s.appendChild(c),e.appendChild(s)}}document.querySelectorAll(".docs-search").forEach(t=>{const e=t.dataset.indexUrl,r=t.querySelector(".docs-search-input"),n=t.querySelector(".docs-search-results");r.addEventListener("input",async()=>{const s=r.value.trim().toLowerCase();if(!s){n.hidden=!0,n.innerHTML="";return}const{pages:c}=await d(e);r.value.trim().toLowerCase()===s&&u(c.filter(o=>l(o,s)),n)}),r.addEventListener("focus",()=>{d(e),n.childElementCount>0&&(n.hidden=!1)}),r.addEventListener("keydown",s=>{s.key==="Escape"&&(r.value="",n.hidden=!0,n.innerHTML="",r.blur())}),r.addEventListener("blur",()=>{window.setTimeout(()=>{n.hidden=!0},150)})});document.addEventListener("keydown",t=>{if(!(t.metaKey||t.ctrlKey)||t.key.toLowerCase()!=="k")return;const e=[...document.querySelectorAll(".docs-search-input")].find(r=>r.offsetParent!==null);e&&(t.preventDefault(),e.focus(),e.select())});</script> <a class="docs-nav-toplink" href="/__pyric/ui/docs/overview/"> Overview </a><details class="docs-nav-group"> <summary>Get started</summary> <div class="docs-nav-group-body"> <div class="docs-nav-section"> <ul> <li> <a href="/__pyric/ui/docs/get-started/start-building/"> Quickstart </a> </li><li> <a href="/__pyric/ui/docs/get-started/how-the-swap-works/"> How the swap works </a> </li> </ul> </div> </div> </details><details class="docs-nav-group"> <summary>Build</summary> <div class="docs-nav-group-body"> <div class="docs-nav-section"> <ul> <li> <a href="/__pyric/ui/docs/build/authentication/"> Authentication </a> </li><li> <a href="/__pyric/ui/docs/build/cloud-firestore/"> Cloud Firestore </a> </li><li> <a href="/__pyric/ui/docs/build/realtime-database/"> Realtime Database </a> </li><li> <a href="/__pyric/ui/docs/build/cloud-storage/"> Cloud Storage </a> </li><li> <a href="/__pyric/ui/docs/build/cloud-messaging/"> Cloud Messaging </a> </li><li> <a href="/__pyric/ui/docs/build/ai-logic/"> AI Logic </a> </li> </ul> </div> </div> </details><details class="docs-nav-group"> <summary>Secure &amp; debug</summary> <div class="docs-nav-group-body"> <div class="docs-nav-section"> <ul> <li> <a href="/__pyric/ui/docs/secure/secure-it-with-rules/"> Security Rules </a> </li><li> <a href="/__pyric/ui/docs/secure/simulate-and-lint/"> Simulate and lint before you deploy </a> </li><li> <a href="/__pyric/ui/docs/secure/write-a-rules-test-suite/"> Write a rules test suite </a> </li><li> <a href="/__pyric/ui/docs/secure/read-a-denial/"> Read a denial and understand it </a> </li><li> <a href="/__pyric/ui/docs/secure/rules-standard-library/"> The rules standard library </a> </li><li> <a href="/__pyric/ui/docs/secure/rtdb-rules-in-typescript/"> RTDB rules in TypeScript </a> </li><li> <a href="/__pyric/ui/docs/secure/firestore-rules-limits/"> Rules limits </a> </li><li> <a href="/__pyric/ui/docs/secure/audit-your-rules/"> Audit rules and data </a> </li> </ul> </div> </div> </details><details class="docs-nav-group"> <summary>Observe &amp; shape</summary> <div class="docs-nav-group-body"> <div class="docs-nav-section"> <ul> <li> <a href="/__pyric/ui/docs/observe/see-whats-happening/"> Traffic &amp; rule verdicts </a> </li><li> <a href="/__pyric/ui/docs/observe/shape-your-data/"> Seed, snapshot, replay </a> </li> </ul> </div> </div> </details><details class="docs-nav-group"> <summary>Ship &amp; test</summary> <div class="docs-nav-group-body"> <div class="docs-nav-section"> <ul> <li> <a href="/__pyric/ui/docs/ship/ship-to-production/"> Ship to production </a> </li><li> <a href="/__pyric/ui/docs/ship/test-in-node/"> Test in Node </a> </li> </ul> </div> </div> </details><details class="docs-nav-group"> <summary>Work with an agent</summary> <div class="docs-nav-group-body"> <div class="docs-nav-section"> <ul> <li> <a href="/__pyric/ui/docs/agent/set-up-your-agent/"> Connect an agent </a> </li><li> <a href="/__pyric/ui/docs/agent/work-with-an-agent/"> Use the MCP tools </a> </li><li> <a href="/__pyric/ui/docs/agent/watch-and-review/"> Watch in Pyric Studio </a> </li> </ul> </div> </div> </details><a class="docs-nav-toplink" href="/__pyric/ui/docs/trust/versioning-and-compatibility/"> Trust </a><details class="docs-nav-group"> <summary>Conformance</summary> <div class="docs-nav-group-body"> <div class="docs-nav-section"> <ul> <li> <a href="/__pyric/ui/docs/conformance-scores/"> Public API coverage </a> </li><li> <a href="/__pyric/ui/docs/trust/how-we-know-it-matches-firebase/"> How we know it matches Firebase </a> </li><li> <a href="/__pyric/ui/docs/app-compat/"> App </a> </li><li> <a href="/__pyric/ui/docs/ai-compat/"> AI Logic </a> </li><li> <a href="/__pyric/ui/docs/auth-compat/"> Auth </a> </li><li> <a href="/__pyric/ui/docs/firestore-compat/"> Firestore </a> </li><li> <a href="/__pyric/ui/docs/database-compat/"> Realtime Database </a> </li><li> <a href="/__pyric/ui/docs/storage-compat/"> Storage </a> </li><li> <a href="/__pyric/ui/docs/messaging-compat/"> Messaging </a> </li><li> <a href="/__pyric/ui/docs/functions-rtdb-compat/"> Functions · RTDB </a> </li><li> <a href="/__pyric/ui/docs/rules-compat/"> Rules </a> </li> </ul> </div> </div> </details> <details class="docs-nav-group" open> <summary>Reference</summary> <div class="docs-nav-group-body docs-nav-group-body--reference"> <div class="docs-nav-section"> <ul> <li> <a href="/__pyric/ui/docs/api-reference/"> API reference </a> </li> </ul> </div><div class="docs-nav-section"> <h2 class="docs-nav-heading">pyric</h2> <ul> <li> <a href="/__pyric/ui/docs/pyric-app-reference-api/"> pyric/app </a> </li><li> <a href="/__pyric/ui/docs/pyric-firestore-reference-api/"> pyric/firestore </a> </li><li> <a href="/__pyric/ui/docs/pyric-auth-reference-api/"> pyric/auth </a> </li><li> <a href="/__pyric/ui/docs/pyric-ai-reference-api/"> pyric/ai </a> </li><li> <a href="/__pyric/ui/docs/pyric-ai-scripting-reference-api/"> pyric/ai/scripting </a> </li><li> <a href="/__pyric/ui/docs/pyric-database-reference-api/"> pyric/database </a> </li><li> <a href="/__pyric/ui/docs/pyric-storage-reference-api/"> pyric/storage </a> </li><li> <a href="/__pyric/ui/docs/pyric-messaging-reference-api/"> pyric/messaging </a> </li><li> <a href="/__pyric/ui/docs/pyric-messaging-sw-reference-api/"> pyric/messaging/sw </a> </li><li> <a href="/__pyric/ui/docs/pyric-rules-reference-api/"> pyric/rules </a> </li><li> <a href="/__pyric/ui/docs/pyric-sandbox-reference-api/"> pyric/sandbox </a> </li><li> <a href="/__pyric/ui/docs/pyric-sandbox-firestore-reference-api/"> pyric/sandbox/firestore </a> </li><li> <a href="/__pyric/ui/docs/pyric-sandbox-database-reference-api/"> pyric/sandbox/database </a> </li> </ul> </div><div class="docs-nav-section"> <h2 class="docs-nav-heading">pyric-admin</h2> <ul> <li> <a href="/__pyric/ui/docs/pyric-admin-app-reference-api/"> pyric-admin/app </a> </li><li> <a href="/__pyric/ui/docs/pyric-admin-firestore-reference-api/"> pyric-admin/firestore </a> </li><li> <a href="/__pyric/ui/docs/pyric-admin-auth-reference-api/"> pyric-admin/auth </a> </li><li> <a href="/__pyric/ui/docs/pyric-admin-database-reference-api/"> pyric-admin/database </a> </li><li> <a href="/__pyric/ui/docs/pyric-admin-storage-reference-api/"> pyric-admin/storage </a> </li><li> <a href="/__pyric/ui/docs/pyric-admin-messaging-reference-api/"> pyric-admin/messaging </a> </li> </ul> </div><div class="docs-nav-section"> <h2 class="docs-nav-heading">create-pyric</h2> <ul> <li> <a href="/__pyric/ui/docs/create-pyric-reference-api/"> create-pyric </a> </li> </ul> </div><div class="docs-nav-section"> <h2 class="docs-nav-heading">@pyric/cli</h2> <ul> <li> <a href="/__pyric/ui/docs/pyric-cli-credentials-node-reference-api/"> @pyric/cli/credentials/node </a> </li><li> <a href="/__pyric/ui/docs/pyric-cli-verify-reference-api/"> @pyric/cli/verify </a> </li><li> <a href="/__pyric/ui/docs/pyric-cli-conformance-reference-api/"> @pyric/cli/conformance </a> </li><li> <a href="/__pyric/ui/docs/pyric-cli-conformance-browser-reference-api/"> @pyric/cli/conformance/browser </a> </li><li> <a href="/__pyric/ui/docs/pyric-cli-conformance-docs-reference-api/"> @pyric/cli/conformance/docs </a> </li><li> <a href="/__pyric/ui/docs/pyric-cli-assurance-reference-api/"> @pyric/cli/assurance </a> </li><li> <a href="/__pyric/ui/docs/pyric-cli-assurance-browser-reference-api/"> @pyric/cli/assurance/browser </a> </li><li> <a href="/__pyric/ui/docs/pyric-cli-bridge-reference-api/"> @pyric/cli/bridge </a> </li><li> <a href="/__pyric/ui/docs/pyric-cli-bridge-client-reference-api/"> @pyric/cli/bridge/client </a> </li><li> <a href="/__pyric/ui/docs/pyric-cli-discover-reference-api/"> @pyric/cli/discover </a> </li><li> <a href="/__pyric/ui/docs/pyric-cli-vite-reference-api/"> @pyric/cli/vite </a> </li><li> <a href="/__pyric/ui/docs/pyric-cli-serve-worker-reference-api/"> @pyric/cli/serve/worker </a> </li><li> <a href="/__pyric/ui/docs/pyric-cli-remote-reference-api/"> @pyric/cli/remote </a> </li><li> <a href="/__pyric/ui/docs/pyric-cli-register-reference-api/"> @pyric/cli/register </a> </li> </ul> </div><div class="docs-nav-section"> <h2 class="docs-nav-heading">@pyric/ui</h2> <ul> <li> <a href="/__pyric/ui/docs/pyric-ui-auth-reference-api/"> @pyric/ui/auth </a> </li><li> <a href="/__pyric/ui/docs/pyric-ui-auth-hooks-reference-api/"> @pyric/ui/auth/hooks </a> </li><li> <a href="/__pyric/ui/docs/pyric-ui-primitives-reference-api/"> @pyric/ui/primitives </a> </li><li> <a href="/__pyric/ui/docs/pyric-ui-firestore-reference-api/"> @pyric/ui/firestore </a> </li><li> <a href="/__pyric/ui/docs/pyric-ui-firestore-hooks-reference-api/"> @pyric/ui/firestore/hooks </a> </li><li> <a href="/__pyric/ui/docs/pyric-ui-rtdb-reference-api/"> @pyric/ui/rtdb </a> </li><li> <a href="/__pyric/ui/docs/pyric-ui-storage-reference-api/"> @pyric/ui/storage </a> </li><li> <a href="/__pyric/ui/docs/pyric-ui-storage-hooks-reference-api/"> @pyric/ui/storage/hooks </a> </li><li> <a href="/__pyric/ui/docs/pyric-ui-traffic-reference-api/"> @pyric/ui/traffic </a> </li><li> <a href="/__pyric/ui/docs/pyric-ui-traffic-hooks-reference-api/" aria-current="page"> @pyric/ui/traffic/hooks </a> </li><li> <a href="/__pyric/ui/docs/pyric-ui-events-reference-api/"> @pyric/ui/events </a> </li><li> <a href="/__pyric/ui/docs/pyric-ui-events-hooks-reference-api/"> @pyric/ui/events/hooks </a> </li><li> <a href="/__pyric/ui/docs/pyric-ui-agents-reference-api/"> @pyric/ui/agents </a> </li><li> <a href="/__pyric/ui/docs/pyric-ui-rules-reference-api/"> @pyric/ui/rules </a> </li><li> <a href="/__pyric/ui/docs/pyric-ui-rules-hooks-reference-api/"> @pyric/ui/rules/hooks </a> </li> </ul> </div> </div> </details> </nav> </details> <nav class="docs-nav" aria-label="Documentation"> <div class="docs-search" data-index-url="/__pyric/ui/docs/index.json"> <div class="docs-search-field"> <svg class="docs-search-icon" viewBox="0 0 16 16" width="14" height="14" aria-hidden="true"> <path d="M11.5 11.5 15 15M13 7A6 6 0 1 1 1 7a6 6 0 0 1 12 0Z" fill="none" stroke="currentColor" stroke-width="1.4" stroke-linecap="round"></path> </svg> <input type="text" class="docs-search-input" placeholder="Search docs" aria-label="Search docs" autocomplete="off" spellcheck="false"> <kbd class="docs-search-kbd">⌘K</kbd> </div> <ul class="docs-search-results" hidden></ul> </div> <a class="docs-nav-toplink" href="/__pyric/ui/docs/overview/" id="nav-group-overview"> Overview </a><details class="docs-nav-group" id="nav-group-get-started"> <summary>Get started</summary> <div class="docs-nav-group-body"> <div class="docs-nav-section"> <ul> <li> <a href="/__pyric/ui/docs/get-started/start-building/"> Quickstart </a> </li><li> <a href="/__pyric/ui/docs/get-started/how-the-swap-works/"> How the swap works </a> </li> </ul> </div> </div> </details><details class="docs-nav-group" id="nav-group-build"> <summary>Build</summary> <div class="docs-nav-group-body"> <div class="docs-nav-section"> <ul> <li> <a href="/__pyric/ui/docs/build/authentication/"> Authentication </a> </li><li> <a href="/__pyric/ui/docs/build/cloud-firestore/"> Cloud Firestore </a> </li><li> <a href="/__pyric/ui/docs/build/realtime-database/"> Realtime Database </a> </li><li> <a href="/__pyric/ui/docs/build/cloud-storage/"> Cloud Storage </a> </li><li> <a href="/__pyric/ui/docs/build/cloud-messaging/"> Cloud Messaging </a> </li><li> <a href="/__pyric/ui/docs/build/ai-logic/"> AI Logic </a> </li> </ul> </div> </div> </details><details class="docs-nav-group" id="nav-group-secure-debug"> <summary>Secure &amp; debug</summary> <div class="docs-nav-group-body"> <div class="docs-nav-section"> <ul> <li> <a href="/__pyric/ui/docs/secure/secure-it-with-rules/"> Security Rules </a> </li><li> <a href="/__pyric/ui/docs/secure/simulate-and-lint/"> Simulate and lint before you deploy </a> </li><li> <a href="/__pyric/ui/docs/secure/write-a-rules-test-suite/"> Write a rules test suite </a> </li><li> <a href="/__pyric/ui/docs/secure/read-a-denial/"> Read a denial and understand it </a> </li><li> <a href="/__pyric/ui/docs/secure/rules-standard-library/"> The rules standard library </a> </li><li> <a href="/__pyric/ui/docs/secure/rtdb-rules-in-typescript/"> RTDB rules in TypeScript </a> </li><li> <a href="/__pyric/ui/docs/secure/firestore-rules-limits/"> Rules limits </a> </li><li> <a href="/__pyric/ui/docs/secure/audit-your-rules/"> Audit rules and data </a> </li> </ul> </div> </div> </details><details class="docs-nav-group" id="nav-group-observe-shape"> <summary>Observe &amp; shape</summary> <div class="docs-nav-group-body"> <div class="docs-nav-section"> <ul> <li> <a href="/__pyric/ui/docs/observe/see-whats-happening/"> Traffic &amp; rule verdicts </a> </li><li> <a href="/__pyric/ui/docs/observe/shape-your-data/"> Seed, snapshot, replay </a> </li> </ul> </div> </div> </details><details class="docs-nav-group" id="nav-group-ship-test"> <summary>Ship &amp; test</summary> <div class="docs-nav-group-body"> <div class="docs-nav-section"> <ul> <li> <a href="/__pyric/ui/docs/ship/ship-to-production/"> Ship to production </a> </li><li> <a href="/__pyric/ui/docs/ship/test-in-node/"> Test in Node </a> </li> </ul> </div> </div> </details><details class="docs-nav-group" id="nav-group-work-with-an-agent"> <summary>Work with an agent</summary> <div class="docs-nav-group-body"> <div class="docs-nav-section"> <ul> <li> <a href="/__pyric/ui/docs/agent/set-up-your-agent/"> Connect an agent </a> </li><li> <a href="/__pyric/ui/docs/agent/work-with-an-agent/"> Use the MCP tools </a> </li><li> <a href="/__pyric/ui/docs/agent/watch-and-review/"> Watch in Pyric Studio </a> </li> </ul> </div> </div> </details><a class="docs-nav-toplink" href="/__pyric/ui/docs/trust/versioning-and-compatibility/" id="nav-group-trust"> Trust </a><details class="docs-nav-group" id="nav-group-conformance"> <summary>Conformance</summary> <div class="docs-nav-group-body"> <div class="docs-nav-section"> <ul> <li> <a href="/__pyric/ui/docs/conformance-scores/"> Public API coverage </a> </li><li> <a href="/__pyric/ui/docs/trust/how-we-know-it-matches-firebase/"> How we know it matches Firebase </a> </li><li> <a href="/__pyric/ui/docs/app-compat/"> App </a> </li><li> <a href="/__pyric/ui/docs/ai-compat/"> AI Logic </a> </li><li> <a href="/__pyric/ui/docs/auth-compat/"> Auth </a> </li><li> <a href="/__pyric/ui/docs/firestore-compat/"> Firestore </a> </li><li> <a href="/__pyric/ui/docs/database-compat/"> Realtime Database </a> </li><li> <a href="/__pyric/ui/docs/storage-compat/"> Storage </a> </li><li> <a href="/__pyric/ui/docs/messaging-compat/"> Messaging </a> </li><li> <a href="/__pyric/ui/docs/functions-rtdb-compat/"> Functions · RTDB </a> </li><li> <a href="/__pyric/ui/docs/rules-compat/"> Rules </a> </li> </ul> </div> </div> </details> <details class="docs-nav-group" id="nav-group-reference" open> <summary>Reference</summary> <div class="docs-nav-group-body docs-nav-group-body--reference"> <div class="docs-nav-section"> <ul> <li> <a href="/__pyric/ui/docs/api-reference/"> API reference </a> </li> </ul> </div><div class="docs-nav-section"> <h2 class="docs-nav-heading">pyric</h2> <ul> <li> <a href="/__pyric/ui/docs/pyric-app-reference-api/"> pyric/app </a> </li><li> <a href="/__pyric/ui/docs/pyric-firestore-reference-api/"> pyric/firestore </a> </li><li> <a href="/__pyric/ui/docs/pyric-auth-reference-api/"> pyric/auth </a> </li><li> <a href="/__pyric/ui/docs/pyric-ai-reference-api/"> pyric/ai </a> </li><li> <a href="/__pyric/ui/docs/pyric-ai-scripting-reference-api/"> pyric/ai/scripting </a> </li><li> <a href="/__pyric/ui/docs/pyric-database-reference-api/"> pyric/database </a> </li><li> <a href="/__pyric/ui/docs/pyric-storage-reference-api/"> pyric/storage </a> </li><li> <a href="/__pyric/ui/docs/pyric-messaging-reference-api/"> pyric/messaging </a> </li><li> <a href="/__pyric/ui/docs/pyric-messaging-sw-reference-api/"> pyric/messaging/sw </a> </li><li> <a href="/__pyric/ui/docs/pyric-rules-reference-api/"> pyric/rules </a> </li><li> <a href="/__pyric/ui/docs/pyric-sandbox-reference-api/"> pyric/sandbox </a> </li><li> <a href="/__pyric/ui/docs/pyric-sandbox-firestore-reference-api/"> pyric/sandbox/firestore </a> </li><li> <a href="/__pyric/ui/docs/pyric-sandbox-database-reference-api/"> pyric/sandbox/database </a> </li> </ul> </div><div class="docs-nav-section"> <h2 class="docs-nav-heading">pyric-admin</h2> <ul> <li> <a href="/__pyric/ui/docs/pyric-admin-app-reference-api/"> pyric-admin/app </a> </li><li> <a href="/__pyric/ui/docs/pyric-admin-firestore-reference-api/"> pyric-admin/firestore </a> </li><li> <a href="/__pyric/ui/docs/pyric-admin-auth-reference-api/"> pyric-admin/auth </a> </li><li> <a href="/__pyric/ui/docs/pyric-admin-database-reference-api/"> pyric-admin/database </a> </li><li> <a href="/__pyric/ui/docs/pyric-admin-storage-reference-api/"> pyric-admin/storage </a> </li><li> <a href="/__pyric/ui/docs/pyric-admin-messaging-reference-api/"> pyric-admin/messaging </a> </li> </ul> </div><div class="docs-nav-section"> <h2 class="docs-nav-heading">create-pyric</h2> <ul> <li> <a href="/__pyric/ui/docs/create-pyric-reference-api/"> create-pyric </a> </li> </ul> </div><div class="docs-nav-section"> <h2 class="docs-nav-heading">@pyric/cli</h2> <ul> <li> <a href="/__pyric/ui/docs/pyric-cli-credentials-node-reference-api/"> @pyric/cli/credentials/node </a> </li><li> <a href="/__pyric/ui/docs/pyric-cli-verify-reference-api/"> @pyric/cli/verify </a> </li><li> <a href="/__pyric/ui/docs/pyric-cli-conformance-reference-api/"> @pyric/cli/conformance </a> </li><li> <a href="/__pyric/ui/docs/pyric-cli-conformance-browser-reference-api/"> @pyric/cli/conformance/browser </a> </li><li> <a href="/__pyric/ui/docs/pyric-cli-conformance-docs-reference-api/"> @pyric/cli/conformance/docs </a> </li><li> <a href="/__pyric/ui/docs/pyric-cli-assurance-reference-api/"> @pyric/cli/assurance </a> </li><li> <a href="/__pyric/ui/docs/pyric-cli-assurance-browser-reference-api/"> @pyric/cli/assurance/browser </a> </li><li> <a href="/__pyric/ui/docs/pyric-cli-bridge-reference-api/"> @pyric/cli/bridge </a> </li><li> <a href="/__pyric/ui/docs/pyric-cli-bridge-client-reference-api/"> @pyric/cli/bridge/client </a> </li><li> <a href="/__pyric/ui/docs/pyric-cli-discover-reference-api/"> @pyric/cli/discover </a> </li><li> <a href="/__pyric/ui/docs/pyric-cli-vite-reference-api/"> @pyric/cli/vite </a> </li><li> <a href="/__pyric/ui/docs/pyric-cli-serve-worker-reference-api/"> @pyric/cli/serve/worker </a> </li><li> <a href="/__pyric/ui/docs/pyric-cli-remote-reference-api/"> @pyric/cli/remote </a> </li><li> <a href="/__pyric/ui/docs/pyric-cli-register-reference-api/"> @pyric/cli/register </a> </li> </ul> </div><div class="docs-nav-section"> <h2 class="docs-nav-heading">@pyric/ui</h2> <ul> <li> <a href="/__pyric/ui/docs/pyric-ui-auth-reference-api/"> @pyric/ui/auth </a> </li><li> <a href="/__pyric/ui/docs/pyric-ui-auth-hooks-reference-api/"> @pyric/ui/auth/hooks </a> </li><li> <a href="/__pyric/ui/docs/pyric-ui-primitives-reference-api/"> @pyric/ui/primitives </a> </li><li> <a href="/__pyric/ui/docs/pyric-ui-firestore-reference-api/"> @pyric/ui/firestore </a> </li><li> <a href="/__pyric/ui/docs/pyric-ui-firestore-hooks-reference-api/"> @pyric/ui/firestore/hooks </a> </li><li> <a href="/__pyric/ui/docs/pyric-ui-rtdb-reference-api/"> @pyric/ui/rtdb </a> </li><li> <a href="/__pyric/ui/docs/pyric-ui-storage-reference-api/"> @pyric/ui/storage </a> </li><li> <a href="/__pyric/ui/docs/pyric-ui-storage-hooks-reference-api/"> @pyric/ui/storage/hooks </a> </li><li> <a href="/__pyric/ui/docs/pyric-ui-traffic-reference-api/"> @pyric/ui/traffic </a> </li><li> <a href="/__pyric/ui/docs/pyric-ui-traffic-hooks-reference-api/" aria-current="page"> @pyric/ui/traffic/hooks </a> </li><li> <a href="/__pyric/ui/docs/pyric-ui-events-reference-api/"> @pyric/ui/events </a> </li><li> <a href="/__pyric/ui/docs/pyric-ui-events-hooks-reference-api/"> @pyric/ui/events/hooks </a> </li><li> <a href="/__pyric/ui/docs/pyric-ui-agents-reference-api/"> @pyric/ui/agents </a> </li><li> <a href="/__pyric/ui/docs/pyric-ui-rules-reference-api/"> @pyric/ui/rules </a> </li><li> <a href="/__pyric/ui/docs/pyric-ui-rules-hooks-reference-api/"> @pyric/ui/rules/hooks </a> </li> </ul> </div> </div> </details> </nav> <main class="doc-main"> <nav class="docs-breadcrumbs" aria-label="Breadcrumb"> <ol> <li> <a href="/__pyric/ui/docs/api-reference/">API reference</a> </li><li> <span class="docs-breadcrumbs-sep" aria-hidden="true">/</span> <span>@pyric/ui</span> </li><li> <span class="docs-breadcrumbs-sep" aria-hidden="true">/</span> <span aria-current="page">@pyric/ui/traffic/hooks</span> </li> </ol> </nav> <header class="api-reference-header"> <p class="api-reference-kicker">API reference</p> <h1><code>@pyric/ui/traffic/hooks</code></h1> <p class="api-reference-meta"> 46 published symbols from <code>@pyric/ui</code> </p> <p class="api-reference-source">
2
3
  Generated from the TypeScript declarations shipped at this import path.
3
- </p> </header> <article class="prose api-reference-body"> <!-- Generated from published package declarations via TypeDoc. Do not edit by hand; run bun run docs:api:generate. -->
4
- <h2 id="interfaces">Interfaces</h2>
4
+ </p> </header> <article class="prose api-reference-body"> <!-- Generated from published package declarations via TypeDoc. Rendered by the api-reference content loader. -->
5
+ <h2 id="references">References</h2>
6
+ <p><a id="billable_series_defs"></a></p>
7
+ <h3 id="billable_series_defs">BILLABLE_SERIES_DEFS</h3>
8
+ <p>Re-exports <a href="/docs/pyric-ui-traffic-reference-api/#billable_series_defs">BILLABLE_SERIES_DEFS</a></p>
9
+ <hr>
10
+ <p><a id="billableserieskey"></a></p>
11
+ <h3 id="billableserieskey">BillableSeriesKey</h3>
12
+ <p>Re-exports <a href="/docs/pyric-ui-traffic-reference-api/#billableserieskey">BillableSeriesKey</a></p>
13
+ <hr>
14
+ <p><a id="bucketbillablemetrics"></a></p>
15
+ <h3 id="bucketbillablemetrics">bucketBillableMetrics</h3>
16
+ <p>Re-exports <a href="/docs/pyric-ui-traffic-reference-api/#bucketbillablemetrics">bucketBillableMetrics</a></p>
17
+ <hr>
18
+ <p><a id="bucketrulesmetrics"></a></p>
19
+ <h3 id="bucketrulesmetrics">bucketRulesMetrics</h3>
20
+ <p>Re-exports <a href="/docs/pyric-ui-traffic-reference-api/#bucketrulesmetrics">bucketRulesMetrics</a></p>
21
+ <hr>
22
+ <p><a id="buckettraffic"></a></p>
23
+ <h3 id="buckettraffic">bucketTraffic</h3>
24
+ <p>Re-exports <a href="/docs/pyric-ui-traffic-reference-api/#buckettraffic">bucketTraffic</a></p>
25
+ <hr>
26
+ <p><a id="classifybillable"></a></p>
27
+ <h3 id="classifybillable">classifyBillable</h3>
28
+ <p>Re-exports <a href="/docs/pyric-ui-traffic-reference-api/#classifybillable">classifyBillable</a></p>
29
+ <hr>
30
+ <p><a id="classifyrules"></a></p>
31
+ <h3 id="classifyrules">classifyRules</h3>
32
+ <p>Re-exports <a href="/docs/pyric-ui-traffic-reference-api/#classifyrules">classifyRules</a></p>
33
+ <hr>
34
+ <p><a id="isadminevent"></a></p>
35
+ <h3 id="isadminevent">isAdminEvent</h3>
36
+ <p>Re-exports <a href="/docs/pyric-ui-traffic-reference-api/#isadminevent">isAdminEvent</a></p>
37
+ <hr>
5
38
  <p><a id="metricpoint"></a></p>
6
39
  <h3 id="metricpoint">MetricPoint</h3>
7
- <h4 id="properties">Properties</h4>
8
- <div class="table-scroll">
9
-
10
-
11
-
12
-
13
-
14
-
15
-
16
-
17
-
18
-
19
-
20
-
21
-
22
-
23
-
24
-
25
-
26
-
27
-
28
-
29
-
30
-
31
-
32
-
33
- <table><thead><tr><th align="left">Property</th><th align="left">Type</th><th align="left">Description</th></tr></thead><tbody><tr><td align="left"><a id="end"></a> <code>end</code></td><td align="left"><code>number</code></td><td align="left">-</td></tr><tr><td align="left"><a id="index"></a> <code>index</code></td><td align="left"><code>number</code></td><td align="left">0-based bucket index, left (oldest) to right (newest).</td></tr><tr><td align="left"><a id="start"></a> <code>start</code></td><td align="left"><code>number</code></td><td align="left">Half-open bounds of this bucket <code>[start, end)</code> in epoch-ms.</td></tr></tbody></table></div>
40
+ <p>Re-exports <a href="/docs/pyric-ui-traffic-reference-api/#metricpoint">MetricPoint</a></p>
34
41
  <hr>
35
42
  <p><a id="metricseries"></a></p>
36
43
  <h3 id="metricseries">MetricSeries</h3>
37
- <h4 id="properties-1">Properties</h4>
38
- <div class="table-scroll">
39
-
40
-
41
-
42
-
43
-
44
-
45
-
46
-
47
-
48
-
49
-
50
-
51
-
52
-
53
-
54
-
55
-
56
-
57
-
58
-
59
-
60
-
61
-
62
-
63
-
64
-
65
-
66
-
67
-
68
- <table><thead><tr><th align="left">Property</th><th align="left">Type</th><th align="left">Description</th></tr></thead><tbody><tr><td align="left"><a id="key"></a> <code>key</code></td><td align="left"><code>string</code></td><td align="left">-</td></tr><tr><td align="left"><a id="label"></a> <code>label</code></td><td align="left"><code>string</code></td><td align="left">-</td></tr><tr><td align="left"><a id="total"></a> <code>total</code></td><td align="left"><code>number</code></td><td align="left">Sum of <code>values</code> — the period total (the legend/card number).</td></tr><tr><td align="left"><a id="values"></a> <code>values</code></td><td align="left"><code>number</code>[]</td><td align="left">One count per bucket, aligned with <code>points</code>.</td></tr></tbody></table></div>
44
+ <p>Re-exports <a href="/docs/pyric-ui-traffic-reference-api/#metricseries">MetricSeries</a></p>
69
45
  <hr>
70
46
  <p><a id="ruleheatmapentry"></a></p>
71
47
  <h3 id="ruleheatmapentry">RuleHeatmapEntry</h3>
72
- <h4 id="properties-2">Properties</h4>
73
- <div class="table-scroll">
74
-
75
-
76
-
77
-
78
-
79
-
80
-
81
-
82
-
83
-
84
-
85
-
86
-
87
-
88
-
89
-
90
-
91
-
92
-
93
-
94
-
95
-
96
-
97
-
98
-
99
-
100
-
101
-
102
-
103
-
104
-
105
-
106
-
107
-
108
-
109
-
110
-
111
-
112
-
113
-
114
-
115
-
116
-
117
-
118
- <table><thead><tr><th align="left">Property</th><th align="left">Type</th><th align="left">Description</th></tr></thead><tbody><tr><td align="left"><a id="allows"></a> <code>allows</code></td><td align="left"><code>number</code></td><td align="left">-</td></tr><tr><td align="left"><a id="denies"></a> <code>denies</code></td><td align="left"><code>number</code></td><td align="left">-</td></tr><tr><td align="left"><a id="denyratio"></a> <code>denyRatio</code></td><td align="left"><code>number</code></td><td align="left"><code>denies / total</code> — 0 when the rule never denied.</td></tr><tr><td align="left"><a id="operations"></a> <code>operations</code></td><td align="left"><code>string</code>[]</td><td align="left">Union of all operations seen matching this rule.</td></tr><tr><td align="left"><a id="ruleindex"></a> <code>ruleIndex</code></td><td align="left"><code>number</code></td><td align="left">The rule’s index in the rules file.</td></tr><tr><td align="left"><a id="total-1"></a> <code>total</code></td><td align="left"><code>number</code></td><td align="left">Total events that matched this rule.</td></tr><tr><td align="left"><a id="unsupported"></a> <code>unsupported</code></td><td align="left"><code>number</code></td><td align="left">-</td></tr></tbody></table></div>
48
+ <p>Re-exports <a href="/docs/pyric-ui-traffic-reference-api/#ruleheatmapentry">RuleHeatmapEntry</a></p>
49
+ <hr>
50
+ <p><a id="rules_series_defs"></a></p>
51
+ <h3 id="rules_series_defs">RULES_SERIES_DEFS</h3>
52
+ <p>Re-exports <a href="/docs/pyric-ui-traffic-reference-api/#rules_series_defs">RULES_SERIES_DEFS</a></p>
53
+ <hr>
54
+ <p><a id="rulesserieskey"></a></p>
55
+ <h3 id="rulesserieskey">RulesSeriesKey</h3>
56
+ <p>Re-exports <a href="/docs/pyric-ui-traffic-reference-api/#rulesserieskey">RulesSeriesKey</a></p>
119
57
  <hr>
120
58
  <p><a id="timewindow"></a></p>
121
59
  <h3 id="timewindow">TimeWindow</h3>
122
- <p>A half-open time window <code>[start, end)</code> in epoch-ms. The timeline
123
- buckets events whose <code>at</code> falls inside it; events outside are
124
- dropped from the histogram (but still counted in <code>outOfWindow</code>).</p>
125
- <h4 id="properties-3">Properties</h4>
126
- <div class="table-scroll">
127
-
128
-
129
-
130
-
131
-
132
-
133
-
134
-
135
-
136
-
137
-
138
-
139
-
140
-
141
-
142
-
143
- <table><thead><tr><th align="left">Property</th><th align="left">Type</th></tr></thead><tbody><tr><td align="left"><a id="end-1"></a> <code>end</code></td><td align="left"><code>number</code></td></tr><tr><td align="left"><a id="start-1"></a> <code>start</code></td><td align="left"><code>number</code></td></tr></tbody></table></div>
60
+ <p>Re-exports <a href="/docs/pyric-ui-traffic-reference-api/#timewindow">TimeWindow</a></p>
144
61
  <hr>
145
62
  <p><a id="trafficbucket"></a></p>
146
63
  <h3 id="trafficbucket">TrafficBucket</h3>
147
- <h4 id="properties-4">Properties</h4>
148
- <div class="table-scroll">
149
-
150
-
151
-
152
-
153
-
154
-
155
-
156
-
157
-
158
-
159
-
160
-
161
-
162
-
163
-
164
-
165
-
166
-
167
-
168
-
169
-
170
-
171
-
172
-
173
-
174
-
175
-
176
-
177
-
178
-
179
-
180
-
181
-
182
-
183
-
184
-
185
-
186
-
187
-
188
-
189
-
190
-
191
-
192
-
193
-
194
-
195
-
196
-
197
-
198
- <table><thead><tr><th align="left">Property</th><th align="left">Type</th><th align="left">Description</th></tr></thead><tbody><tr><td align="left"><a id="allows-1"></a> <code>allows</code></td><td align="left"><code>number</code></td><td align="left"><code>count - denies</code> — allowed + unsupported. The “non-deny” stack.</td></tr><tr><td align="left"><a id="count"></a> <code>count</code></td><td align="left"><code>number</code></td><td align="left">Total events that fell in this bucket.</td></tr><tr><td align="left"><a id="denies-1"></a> <code>denies</code></td><td align="left"><code>number</code></td><td align="left">How many of <code>count</code> were denied.</td></tr><tr><td align="left"><a id="denyheightratio"></a> <code>denyHeightRatio</code></td><td align="left"><code>number</code></td><td align="left"><code>denies / maxCount</code> — 0..1. The deny sub-stack height as a fraction of the tallest bucket, so the deny segment is drawn to the same scale as the full bar. Drives <code>--pyric-bucket-deny-h</code>.</td></tr><tr><td align="left"><a id="end-2"></a> <code>end</code></td><td align="left"><code>number</code></td><td align="left">-</td></tr><tr><td align="left"><a id="heightratio"></a> <code>heightRatio</code></td><td align="left"><code>number</code></td><td align="left"><code>count / maxCount</code> across all buckets — 0..1. The full bar height as a fraction of the tallest bucket. Drives <code>--pyric-bucket-h</code>.</td></tr><tr><td align="left"><a id="index-1"></a> <code>index</code></td><td align="left"><code>number</code></td><td align="left">0-based bucket index, left (oldest) to right (newest).</td></tr><tr><td align="left"><a id="start-2"></a> <code>start</code></td><td align="left"><code>number</code></td><td align="left">Half-open bounds of this bucket <code>[start, end)</code> in epoch-ms.</td></tr></tbody></table></div>
64
+ <p>Re-exports <a href="/docs/pyric-ui-traffic-reference-api/#trafficbucket">TrafficBucket</a></p>
199
65
  <hr>
200
66
  <p><a id="trafficcounts"></a></p>
201
67
  <h3 id="trafficcounts">TrafficCounts</h3>
202
- <h4 id="properties-5">Properties</h4>
203
- <div class="table-scroll">
204
-
205
-
206
-
207
-
208
-
209
-
210
-
211
-
212
-
213
-
214
-
215
-
216
-
217
-
218
-
219
-
220
-
221
-
222
-
223
-
224
-
225
-
226
-
227
-
228
- <table><thead><tr><th align="left">Property</th><th align="left">Type</th><th align="left">Description</th></tr></thead><tbody><tr><td align="left"><a id="denied"></a> <code>denied</code></td><td align="left"><code>number</code></td><td align="left">Of those, how many were denied.</td></tr><tr><td align="left"><a id="listener"></a> <code>listener</code></td><td align="left"><code>number</code></td><td align="left">Of those, how many are listener re-evals.</td></tr><tr><td align="left"><a id="total-2"></a> <code>total</code></td><td align="left"><code>number</code></td><td align="left">Events currently in the buffer.</td></tr></tbody></table></div>
68
+ <p>Re-exports <a href="/docs/pyric-ui-traffic-reference-api/#trafficcounts">TrafficCounts</a></p>
229
69
  <hr>
230
70
  <p><a id="trafficfilterstate"></a></p>
231
71
  <h3 id="trafficfilterstate">TrafficFilterState</h3>
232
- <h4 id="properties-6">Properties</h4>
233
- <div class="table-scroll">
234
-
235
-
236
-
237
-
238
-
239
-
240
-
241
-
242
-
243
-
244
-
245
-
246
-
247
-
248
-
249
-
250
-
251
-
252
-
253
-
254
- <table><thead><tr><th align="left">Property</th><th align="left">Type</th></tr></thead><tbody><tr><td align="left"><a id="origin"></a> <code>origin</code></td><td align="left"><a href="#trafficoriginfilter"><code>TrafficOriginFilter</code></a></td></tr><tr><td align="left"><a id="pathquery"></a> <code>pathQuery</code></td><td align="left"><code>string</code></td></tr><tr><td align="left"><a id="result"></a> <code>result</code></td><td align="left"><a href="#trafficresultfilter"><code>TrafficResultFilter</code></a></td></tr></tbody></table></div>
72
+ <p>Re-exports <a href="/docs/pyric-ui-traffic-reference-api/#trafficfilterstate">TrafficFilterState</a></p>
255
73
  <hr>
256
74
  <p><a id="trafficgroup"></a></p>
257
75
  <h3 id="trafficgroup">TrafficGroup</h3>
258
- <h4 id="properties-7">Properties</h4>
259
- <div class="table-scroll">
260
-
261
-
262
-
263
-
264
-
265
-
266
-
267
-
268
-
269
-
270
-
271
-
272
-
273
-
274
-
275
-
276
-
277
-
278
-
279
-
280
-
281
-
282
-
283
-
284
-
285
-
286
-
287
-
288
-
289
-
290
-
291
-
292
-
293
-
294
-
295
-
296
-
297
-
298
-
299
- <table><thead><tr><th align="left">Property</th><th align="left">Type</th><th align="left">Description</th></tr></thead><tbody><tr><td align="left"><a id="count-1"></a> <code>count</code></td><td align="left"><code>number</code></td><td align="left">-</td></tr><tr><td align="left"><a id="denies-2"></a> <code>denies</code></td><td align="left"><code>number</code></td><td align="left">-</td></tr><tr><td align="left"><a id="events"></a> <code>events</code></td><td align="left"><code>TrafficEvent</code>[]</td><td align="left">-</td></tr><tr><td align="left"><a id="key-1"></a> <code>key</code></td><td align="left"><code>string</code></td><td align="left"><code>groupId</code> for batch/transaction; a synthetic key for listener runs. Stable enough for a React key.</td></tr><tr><td align="left"><a id="kind"></a> <code>kind</code></td><td align="left"><a href="#trafficgroupkind-1"><code>TrafficGroupKind</code></a></td><td align="left">-</td></tr><tr><td align="left"><a id="type"></a> <code>type</code></td><td align="left"><code>"group"</code></td><td align="left">-</td></tr></tbody></table></div>
76
+ <p>Re-exports <a href="/docs/pyric-ui-traffic-reference-api/#trafficgroup">TrafficGroup</a></p>
77
+ <hr>
78
+ <p><a id="trafficgroupkind"></a></p>
79
+ <h3 id="trafficgroupkind">TrafficGroupKind</h3>
80
+ <p>Re-exports <a href="/docs/pyric-ui-traffic-reference-api/#trafficgroupkind-1">TrafficGroupKind</a></p>
81
+ <hr>
82
+ <p><a id="trafficlogitem"></a></p>
83
+ <h3 id="trafficlogitem">TrafficLogItem</h3>
84
+ <p>Re-exports <a href="/docs/pyric-ui-traffic-reference-api/#trafficlogitem">TrafficLogItem</a></p>
300
85
  <hr>
301
86
  <p><a id="trafficmetricsresult"></a></p>
302
87
  <h3 id="trafficmetricsresult">TrafficMetricsResult</h3>
303
- <h4 id="properties-8">Properties</h4>
304
- <div class="table-scroll">
305
-
306
-
307
-
308
-
309
-
310
-
311
-
312
-
313
-
314
-
315
-
316
-
317
-
318
-
319
-
320
-
321
-
322
-
323
-
324
-
325
-
326
-
327
-
328
-
329
- <table><thead><tr><th align="left">Property</th><th align="left">Type</th><th align="left">Description</th></tr></thead><tbody><tr><td align="left"><a id="maxvalue"></a> <code>maxValue</code></td><td align="left"><code>number</code></td><td align="left">The largest single-bucket value across every series — the shared y-scale divisor a chart would use by default.</td></tr><tr><td align="left"><a id="points"></a> <code>points</code></td><td align="left"><a href="#metricpoint"><code>MetricPoint</code></a>[]</td><td align="left">-</td></tr><tr><td align="left"><a id="series"></a> <code>series</code></td><td align="left"><a href="#metricseries"><code>MetricSeries</code></a>[]</td><td align="left">-</td></tr></tbody></table></div>
88
+ <p>Re-exports <a href="/docs/pyric-ui-traffic-reference-api/#trafficmetricsresult">TrafficMetricsResult</a></p>
89
+ <hr>
90
+ <p><a id="trafficoriginfilter"></a></p>
91
+ <h3 id="trafficoriginfilter">TrafficOriginFilter</h3>
92
+ <p>Re-exports <a href="/docs/pyric-ui-traffic-reference-api/#trafficoriginfilter">TrafficOriginFilter</a></p>
93
+ <hr>
94
+ <p><a id="trafficresultfilter"></a></p>
95
+ <h3 id="trafficresultfilter">TrafficResultFilter</h3>
96
+ <p>Re-exports <a href="/docs/pyric-ui-traffic-reference-api/#trafficresultfilter">TrafficResultFilter</a></p>
330
97
  <hr>
331
98
  <p><a id="trafficsingle"></a></p>
332
99
  <h3 id="trafficsingle">TrafficSingle</h3>
333
- <h4 id="properties-9">Properties</h4>
334
- <div class="table-scroll">
335
-
336
-
337
-
338
-
339
-
340
-
341
-
342
-
343
-
344
-
345
-
346
-
347
-
348
-
349
-
350
-
351
- <table><thead><tr><th align="left">Property</th><th align="left">Type</th></tr></thead><tbody><tr><td align="left"><a id="event"></a> <code>event</code></td><td align="left"><code>TrafficEvent</code></td></tr><tr><td align="left"><a id="type-1"></a> <code>type</code></td><td align="left"><code>"single"</code></td></tr></tbody></table></div>
100
+ <p>Re-exports <a href="/docs/pyric-ui-traffic-reference-api/#trafficsingle">TrafficSingle</a></p>
352
101
  <hr>
353
102
  <p><a id="trafficstatbucket"></a></p>
354
103
  <h3 id="trafficstatbucket">TrafficStatBucket</h3>
355
- <h4 id="properties-10">Properties</h4>
356
- <div class="table-scroll">
357
-
358
-
359
-
360
-
361
-
362
-
363
-
364
-
365
-
366
-
367
-
368
-
369
-
370
-
371
-
372
-
373
- <table><thead><tr><th align="left">Property</th><th align="left">Type</th></tr></thead><tbody><tr><td align="left"><a id="count-2"></a> <code>count</code></td><td align="left"><code>number</code></td></tr><tr><td align="left"><a id="key-2"></a> <code>key</code></td><td align="left"><code>string</code></td></tr></tbody></table></div>
104
+ <p>Re-exports <a href="/docs/pyric-ui-traffic-reference-api/#trafficstatbucket">TrafficStatBucket</a></p>
374
105
  <hr>
375
106
  <p><a id="trafficstatssummary"></a></p>
376
107
  <h3 id="trafficstatssummary">TrafficStatsSummary</h3>
377
- <h4 id="properties-11">Properties</h4>
378
- <div class="table-scroll">
379
-
380
-
381
-
382
-
383
-
384
-
385
-
386
-
387
-
388
-
389
-
390
-
391
-
392
-
393
-
394
-
395
-
396
-
397
-
398
-
399
-
400
-
401
-
402
-
403
-
404
-
405
-
406
-
407
-
408
-
409
-
410
-
411
-
412
-
413
-
414
-
415
-
416
-
417
-
418
-
419
-
420
-
421
-
422
-
423
-
424
-
425
-
426
-
427
-
428
- <table><thead><tr><th align="left">Property</th><th align="left">Type</th><th align="left">Description</th></tr></thead><tbody><tr><td align="left"><a id="allows-2"></a> <code>allows</code></td><td align="left"><code>number</code></td><td align="left">-</td></tr><tr><td align="left"><a id="bymethod"></a> <code>byMethod</code></td><td align="left"><a href="#trafficstatbucket"><code>TrafficStatBucket</code></a>[]</td><td align="left">Counts by method, sorted descending.</td></tr><tr><td align="left"><a id="byorigin"></a> <code>byOrigin</code></td><td align="left"><a href="#trafficstatbucket"><code>TrafficStatBucket</code></a>[]</td><td align="left">Counts by origin, sorted descending.</td></tr><tr><td align="left"><a id="bypath"></a> <code>byPath</code></td><td align="left"><a href="#trafficstatbucket"><code>TrafficStatBucket</code></a>[]</td><td align="left">Counts by path, sorted descending, capped at <code>topPaths</code>.</td></tr><tr><td align="left"><a id="denies-3"></a> <code>denies</code></td><td align="left"><code>number</code></td><td align="left">-</td></tr><tr><td align="left"><a id="denyrate"></a> <code>denyRate</code></td><td align="left"><code>number</code></td><td align="left"><code>denies / total</code> — 0 for an empty buffer.</td></tr><tr><td align="left"><a id="total-3"></a> <code>total</code></td><td align="left"><code>number</code></td><td align="left">-</td></tr><tr><td align="left"><a id="unsupported-1"></a> <code>unsupported</code></td><td align="left"><code>number</code></td><td align="left">-</td></tr></tbody></table></div>
108
+ <p>Re-exports <a href="/docs/pyric-ui-traffic-reference-api/#trafficstatssummary">TrafficStatsSummary</a></p>
109
+ <hr>
110
+ <p><a id="usebillablemetrics"></a></p>
111
+ <h3 id="usebillablemetrics">useBillableMetrics</h3>
112
+ <p>Re-exports <a href="/docs/pyric-ui-traffic-reference-api/#usebillablemetrics">useBillableMetrics</a></p>
113
+ <hr>
114
+ <p><a id="useruleheatmap"></a></p>
115
+ <h3 id="useruleheatmap">useRuleHeatmap</h3>
116
+ <p>Re-exports <a href="/docs/pyric-ui-traffic-reference-api/#useruleheatmap">useRuleHeatmap</a></p>
429
117
  <hr>
430
118
  <p><a id="useruleheatmapoptions"></a></p>
431
119
  <h3 id="useruleheatmapoptions">UseRuleHeatmapOptions</h3>
432
- <h4 id="properties-12">Properties</h4>
433
- <div class="table-scroll">
434
-
435
-
436
-
437
-
438
-
439
-
440
-
441
-
442
-
443
-
444
-
445
-
446
- <table><thead><tr><th align="left">Property</th><th align="left">Type</th></tr></thead><tbody><tr><td align="left"><a id="events-1"></a> <code>events</code></td><td align="left"><code>TrafficEvent</code>[]</td></tr></tbody></table></div>
120
+ <p>Re-exports <a href="/docs/pyric-ui-traffic-reference-api/#useruleheatmapoptions">UseRuleHeatmapOptions</a></p>
447
121
  <hr>
448
122
  <p><a id="useruleheatmapresult"></a></p>
449
123
  <h3 id="useruleheatmapresult">UseRuleHeatmapResult</h3>
450
- <h4 id="properties-13">Properties</h4>
451
- <div class="table-scroll">
452
-
453
-
454
-
455
-
456
-
457
-
458
-
459
-
460
-
461
-
462
-
463
-
464
-
465
-
466
-
467
-
468
-
469
-
470
-
471
- <table><thead><tr><th align="left">Property</th><th align="left">Type</th><th align="left">Description</th></tr></thead><tbody><tr><td align="left"><a id="entries"></a> <code>entries</code></td><td align="left"><a href="#ruleheatmapentry"><code>RuleHeatmapEntry</code></a>[]</td><td align="left">Per-rule rollup, sorted by <code>total</code> descending (busiest first), ties broken by <code>ruleIndex</code> ascending.</td></tr><tr><td align="left"><a id="unmatchedcount"></a> <code>unmatchedCount</code></td><td align="left"><code>number</code></td><td align="left">Events that matched no rule — counted here, not attributed to any entry.</td></tr></tbody></table></div>
124
+ <p>Re-exports <a href="/docs/pyric-ui-traffic-reference-api/#useruleheatmapresult">UseRuleHeatmapResult</a></p>
125
+ <hr>
126
+ <p><a id="userulesmetrics"></a></p>
127
+ <h3 id="userulesmetrics">useRulesMetrics</h3>
128
+ <p>Re-exports <a href="/docs/pyric-ui-traffic-reference-api/#userulesmetrics">useRulesMetrics</a></p>
129
+ <hr>
130
+ <p><a id="usetrafficbuckets"></a></p>
131
+ <h3 id="usetrafficbuckets">useTrafficBuckets</h3>
132
+ <p>Re-exports <a href="/docs/pyric-ui-traffic-reference-api/#usetrafficbuckets">useTrafficBuckets</a></p>
472
133
  <hr>
473
134
  <p><a id="usetrafficbucketsoptions"></a></p>
474
135
  <h3 id="usetrafficbucketsoptions">UseTrafficBucketsOptions</h3>
475
- <h4 id="properties-14">Properties</h4>
476
- <div class="table-scroll">
477
-
478
-
479
-
480
-
481
-
482
-
483
-
484
-
485
-
486
-
487
-
488
-
489
-
490
-
491
-
492
-
493
-
494
-
495
-
496
-
497
-
498
-
499
-
500
-
501
- <table><thead><tr><th align="left">Property</th><th align="left">Type</th><th align="left">Description</th></tr></thead><tbody><tr><td align="left"><a id="bucketcount"></a> <code>bucketCount?</code></td><td align="left"><code>number</code></td><td align="left">Number of buckets to divide the window into. Default 30.</td></tr><tr><td align="left"><a id="events-2"></a> <code>events</code></td><td align="left"><code>TrafficEvent</code>[]</td><td align="left">-</td></tr><tr><td align="left"><a id="window"></a> <code>window</code></td><td align="left"><a href="#timewindow"><code>TimeWindow</code></a></td><td align="left">The time range to bucket over.</td></tr></tbody></table></div>
136
+ <p>Re-exports <a href="/docs/pyric-ui-traffic-reference-api/#usetrafficbucketsoptions">UseTrafficBucketsOptions</a></p>
502
137
  <hr>
503
138
  <p><a id="usetrafficbucketsresult"></a></p>
504
139
  <h3 id="usetrafficbucketsresult">UseTrafficBucketsResult</h3>
505
- <h4 id="properties-15">Properties</h4>
506
- <div class="table-scroll">
507
-
508
-
509
-
510
-
511
-
512
-
513
-
514
-
515
-
516
-
517
-
518
-
519
-
520
-
521
-
522
-
523
-
524
-
525
-
526
-
527
-
528
-
529
-
530
-
531
-
532
-
533
-
534
-
535
-
536
-
537
-
538
-
539
-
540
-
541
- <table><thead><tr><th align="left">Property</th><th align="left">Type</th><th align="left">Description</th></tr></thead><tbody><tr><td align="left"><a id="buckets"></a> <code>buckets</code></td><td align="left"><a href="#trafficbucket"><code>TrafficBucket</code></a>[]</td><td align="left">-</td></tr><tr><td align="left"><a id="denies-4"></a> <code>denies</code></td><td align="left"><code>number</code></td><td align="left">Sum of <code>denies</code> across buckets.</td></tr><tr><td align="left"><a id="maxcount"></a> <code>maxCount</code></td><td align="left"><code>number</code></td><td align="left">The largest single-bucket <code>count</code> — the height-ratio divisor.</td></tr><tr><td align="left"><a id="outofwindow"></a> <code>outOfWindow</code></td><td align="left"><code>number</code></td><td align="left">Events whose <code>at</code> fell outside <code>[window.start, window.end)</code>.</td></tr><tr><td align="left"><a id="total-4"></a> <code>total</code></td><td align="left"><code>number</code></td><td align="left">Sum of <code>count</code> across buckets (events inside the window).</td></tr></tbody></table></div>
140
+ <p>Re-exports <a href="/docs/pyric-ui-traffic-reference-api/#usetrafficbucketsresult">UseTrafficBucketsResult</a></p>
141
+ <hr>
142
+ <p><a id="usetrafficfilter"></a></p>
143
+ <h3 id="usetrafficfilter">useTrafficFilter</h3>
144
+ <p>Re-exports <a href="/docs/pyric-ui-traffic-reference-api/#usetrafficfilter">useTrafficFilter</a></p>
542
145
  <hr>
543
146
  <p><a id="usetrafficfilteroptions"></a></p>
544
147
  <h3 id="usetrafficfilteroptions">UseTrafficFilterOptions</h3>
545
- <h4 id="properties-16">Properties</h4>
546
- <div class="table-scroll">
547
-
548
-
549
-
550
-
551
-
552
-
553
-
554
-
555
-
556
-
557
-
558
-
559
-
560
-
561
-
562
-
563
-
564
-
565
-
566
-
567
-
568
-
569
-
570
-
571
-
572
-
573
-
574
-
575
-
576
- <table><thead><tr><th align="left">Property</th><th align="left">Type</th><th align="left">Description</th></tr></thead><tbody><tr><td align="left"><a id="events-3"></a> <code>events</code></td><td align="left"><code>TrafficEvent</code>[]</td><td align="left">-</td></tr><tr><td align="left"><a id="initialorigin"></a> <code>initialOrigin?</code></td><td align="left"><a href="#trafficoriginfilter"><code>TrafficOriginFilter</code></a></td><td align="left">Default <code>user</code> — the probe found listener traffic is 94–99.6% of events, so it’s hidden until explicitly asked for.</td></tr><tr><td align="left"><a id="initialpathquery"></a> <code>initialPathQuery?</code></td><td align="left"><code>string</code></td><td align="left">-</td></tr><tr><td align="left"><a id="initialresult"></a> <code>initialResult?</code></td><td align="left"><a href="#trafficresultfilter"><code>TrafficResultFilter</code></a></td><td align="left">Default <code>all</code> — the probe found ~75–80% allow in realistic sessions, so hiding either side loses diagnostic signal.</td></tr></tbody></table></div>
148
+ <p>Re-exports <a href="/docs/pyric-ui-traffic-reference-api/#usetrafficfilteroptions">UseTrafficFilterOptions</a></p>
577
149
  <hr>
578
150
  <p><a id="usetrafficfilterresult"></a></p>
579
151
  <h3 id="usetrafficfilterresult">UseTrafficFilterResult</h3>
580
- <h4 id="properties-17">Properties</h4>
581
- <div class="table-scroll">
582
-
583
-
584
-
585
-
586
-
587
-
588
-
589
-
590
-
591
-
592
-
593
-
594
-
595
-
596
-
597
-
598
-
599
-
600
-
601
-
602
-
603
-
604
-
605
-
606
-
607
-
608
-
609
-
610
-
611
-
612
-
613
-
614
-
615
-
616
- <table><thead><tr><th align="left">Property</th><th align="left">Type</th><th align="left">Description</th></tr></thead><tbody><tr><td align="left"><a id="filter"></a> <code>filter</code></td><td align="left"><a href="#trafficfilterstate"><code>TrafficFilterState</code></a></td><td align="left">-</td></tr><tr><td align="left"><a id="filtered"></a> <code>filtered</code></td><td align="left"><code>TrafficEvent</code>[]</td><td align="left">Events passing all three filters, in the input order.</td></tr><tr><td align="left"><a id="setorigin"></a> <code>setOrigin</code></td><td align="left">(<code>origin</code>: <a href="#trafficoriginfilter"><code>TrafficOriginFilter</code></a>) => <code>void</code></td><td align="left">-</td></tr><tr><td align="left"><a id="setpathquery"></a> <code>setPathQuery</code></td><td align="left">(<code>pathQuery</code>: <code>string</code>) => <code>void</code></td><td align="left">-</td></tr><tr><td align="left"><a id="setresult"></a> <code>setResult</code></td><td align="left">(<code>result</code>: <a href="#trafficresultfilter"><code>TrafficResultFilter</code></a>) => <code>void</code></td><td align="left">-</td></tr></tbody></table></div>
152
+ <p>Re-exports <a href="/docs/pyric-ui-traffic-reference-api/#usetrafficfilterresult">UseTrafficFilterResult</a></p>
153
+ <hr>
154
+ <p><a id="usetrafficgroups"></a></p>
155
+ <h3 id="usetrafficgroups">useTrafficGroups</h3>
156
+ <p>Re-exports <a href="/docs/pyric-ui-traffic-reference-api/#usetrafficgroups">useTrafficGroups</a></p>
617
157
  <hr>
618
158
  <p><a id="usetrafficgroupsoptions"></a></p>
619
159
  <h3 id="usetrafficgroupsoptions">UseTrafficGroupsOptions</h3>
620
- <h4 id="properties-18">Properties</h4>
621
- <div class="table-scroll">
622
-
623
-
624
-
625
-
626
-
627
-
628
-
629
-
630
-
631
-
632
-
633
-
634
-
635
-
636
-
637
-
638
-
639
-
640
-
641
-
642
-
643
-
644
-
645
-
646
- <table><thead><tr><th align="left">Property</th><th align="left">Type</th><th align="left">Description</th></tr></thead><tbody><tr><td align="left"><a id="events-4"></a> <code>events</code></td><td align="left"><code>TrafficEvent</code>[]</td><td align="left">-</td></tr><tr><td align="left"><a id="groupbatches"></a> <code>groupBatches?</code></td><td align="left"><code>boolean</code></td><td align="left">Collapse consecutive ops sharing a <code>groupId</code>. Default true.</td></tr><tr><td align="left"><a id="grouplistenerruns"></a> <code>groupListenerRuns?</code></td><td align="left"><code>boolean</code></td><td align="left">Collapse a consecutive run of listener re-evals from the same originating op into one group — the probe found a single write can trigger 250+ re-evals. Default true.</td></tr></tbody></table></div>
160
+ <p>Re-exports <a href="/docs/pyric-ui-traffic-reference-api/#usetrafficgroupsoptions">UseTrafficGroupsOptions</a></p>
647
161
  <hr>
648
162
  <p><a id="usetrafficgroupsresult"></a></p>
649
163
  <h3 id="usetrafficgroupsresult">UseTrafficGroupsResult</h3>
650
- <h4 id="properties-19">Properties</h4>
651
- <div class="table-scroll">
652
-
653
-
654
-
655
-
656
-
657
-
658
-
659
-
660
-
661
-
662
-
663
-
664
-
665
-
666
- <table><thead><tr><th align="left">Property</th><th align="left">Type</th><th align="left">Description</th></tr></thead><tbody><tr><td align="left"><a id="items"></a> <code>items</code></td><td align="left"><a href="#trafficlogitem"><code>TrafficLogItem</code></a>[]</td><td align="left">Events folded into a flat list of singles and groups, in the input order.</td></tr></tbody></table></div>
164
+ <p>Re-exports <a href="/docs/pyric-ui-traffic-reference-api/#usetrafficgroupsresult">UseTrafficGroupsResult</a></p>
667
165
  <hr>
668
166
  <p><a id="usetrafficmetricsoptions"></a></p>
669
167
  <h3 id="usetrafficmetricsoptions">UseTrafficMetricsOptions</h3>
670
- <h4 id="properties-20">Properties</h4>
671
- <div class="table-scroll">
672
-
673
-
674
-
675
-
676
-
677
-
678
-
679
-
680
-
681
-
682
-
683
-
684
-
685
-
686
-
687
-
688
-
689
-
690
-
691
-
692
-
693
-
694
-
695
-
696
-
697
-
698
-
699
-
700
-
701
- <table><thead><tr><th align="left">Property</th><th align="left">Type</th><th align="left">Description</th></tr></thead><tbody><tr><td align="left"><a id="bucketcount-1"></a> <code>bucketCount?</code></td><td align="left"><code>number</code></td><td align="left">Number of buckets to divide the window into. The window itself should already be sized to the session (sandbox sessions run minutes, not days) — bucket count doesn’t need to change, only the window a caller passes in. Default 24.</td></tr><tr><td align="left"><a id="events-5"></a> <code>events</code></td><td align="left"><code>TrafficEvent</code>[]</td><td align="left">-</td></tr><tr><td align="left"><a id="isadmin"></a> <code>isAdmin?</code></td><td align="left">(<code>event</code>: <code>Pick</code>&#x3C;<code>TrafficEvent</code>, <code>"origin"</code>>) => <code>boolean</code></td><td align="left">Override admin classification (e.g. a Studio caller with <code>authLens</code> provenance available — see the module doc). Defaults to <code>origin === 'admin'</code>.</td></tr><tr><td align="left"><a id="window-1"></a> <code>window</code></td><td align="left"><a href="#timewindow"><code>TimeWindow</code></a></td><td align="left">-</td></tr></tbody></table></div>
168
+ <p>Re-exports <a href="/docs/pyric-ui-traffic-reference-api/#usetrafficmetricsoptions">UseTrafficMetricsOptions</a></p>
169
+ <hr>
170
+ <p><a id="usetrafficmonitor"></a></p>
171
+ <h3 id="usetrafficmonitor">useTrafficMonitor</h3>
172
+ <p>Re-exports <a href="/docs/pyric-ui-traffic-reference-api/#usetrafficmonitor">useTrafficMonitor</a></p>
702
173
  <hr>
703
174
  <p><a id="usetrafficmonitoroptions"></a></p>
704
175
  <h3 id="usetrafficmonitoroptions">UseTrafficMonitorOptions</h3>
705
- <h4 id="properties-21">Properties</h4>
706
- <div class="table-scroll">
707
-
708
-
709
-
710
-
711
-
712
-
713
-
714
-
715
-
716
-
717
-
718
-
719
-
720
-
721
-
722
-
723
-
724
-
725
-
726
-
727
-
728
-
729
-
730
-
731
-
732
-
733
-
734
-
735
-
736
- <table><thead><tr><th align="left">Property</th><th align="left">Type</th><th align="left">Description</th></tr></thead><tbody><tr><td align="left"><a id="buffersize"></a> <code>bufferSize?</code></td><td align="left"><code>number</code></td><td align="left">Ring-buffer cap. Once exceeded, the oldest events are dropped. Default 5000 (~3 MB worst case — see the traffic-monitor probe findings).</td></tr><tr><td align="left"><a id="paused"></a> <code>paused?</code></td><td align="left"><code>boolean</code></td><td align="left">Whether the buffer starts paused. Default false.</td></tr><tr><td align="left"><a id="source"></a> <code>source</code></td><td align="left"><code>TrafficSource</code></td><td align="left">The subscription function — <code>sandbox.onRequest</code> satisfies this directly. Pass a stable reference; the hook re-subscribes on identity change.</td></tr><tr><td align="left"><a id="transform"></a> <code>transform?</code></td><td align="left">(<code>event</code>: <code>TrafficEvent</code>) => <code>TrafficEvent</code></td><td align="left">Runs per event before buffering — return a (possibly trimmed) event. Lets the consumer shrink oversized payloads without the library knowing payload semantics. Identity is read fresh on each event, so it need not be memoized.</td></tr></tbody></table></div>
176
+ <p>Re-exports <a href="/docs/pyric-ui-traffic-reference-api/#usetrafficmonitoroptions">UseTrafficMonitorOptions</a></p>
737
177
  <hr>
738
178
  <p><a id="usetrafficmonitorresult"></a></p>
739
179
  <h3 id="usetrafficmonitorresult">UseTrafficMonitorResult</h3>
740
- <h4 id="properties-22">Properties</h4>
741
- <div class="table-scroll">
742
-
743
-
744
-
745
-
746
-
747
-
748
-
749
-
750
-
751
-
752
-
753
-
754
-
755
-
756
-
757
-
758
-
759
-
760
-
761
-
762
-
763
-
764
-
765
-
766
-
767
-
768
-
769
-
770
-
771
-
772
-
773
-
774
-
775
-
776
-
777
-
778
-
779
-
780
-
781
- <table><thead><tr><th align="left">Property</th><th align="left">Type</th><th align="left">Description</th></tr></thead><tbody><tr><td align="left"><a id="clear"></a> <code>clear</code></td><td align="left">() => <code>void</code></td><td align="left">Empty the buffer.</td></tr><tr><td align="left"><a id="counts"></a> <code>counts</code></td><td align="left"><a href="#trafficcounts"><code>TrafficCounts</code></a></td><td align="left">-</td></tr><tr><td align="left"><a id="events-6"></a> <code>events</code></td><td align="left"><code>TrafficEvent</code>[]</td><td align="left">The buffered events, oldest first.</td></tr><tr><td align="left"><a id="ispaused"></a> <code>isPaused</code></td><td align="left"><code>boolean</code></td><td align="left">-</td></tr><tr><td align="left"><a id="pause"></a> <code>pause</code></td><td align="left">() => <code>void</code></td><td align="left">Stop appending — incoming events are dropped while paused.</td></tr><tr><td align="left"><a id="resume"></a> <code>resume</code></td><td align="left">() => <code>void</code></td><td align="left">Resume appending.</td></tr></tbody></table></div>
180
+ <p>Re-exports <a href="/docs/pyric-ui-traffic-reference-api/#usetrafficmonitorresult">UseTrafficMonitorResult</a></p>
181
+ <hr>
182
+ <p><a id="usetrafficstats"></a></p>
183
+ <h3 id="usetrafficstats">useTrafficStats</h3>
184
+ <p>Re-exports <a href="/docs/pyric-ui-traffic-reference-api/#usetrafficstats">useTrafficStats</a></p>
782
185
  <hr>
783
186
  <p><a id="usetrafficstatsoptions"></a></p>
784
187
  <h3 id="usetrafficstatsoptions">UseTrafficStatsOptions</h3>
785
- <h4 id="properties-23">Properties</h4>
786
- <div class="table-scroll">
787
-
788
-
789
-
790
-
791
-
792
-
793
-
794
-
795
-
796
-
797
-
798
-
799
-
800
-
801
-
802
-
803
-
804
-
805
-
806
- <table><thead><tr><th align="left">Property</th><th align="left">Type</th><th align="left">Description</th></tr></thead><tbody><tr><td align="left"><a id="events-7"></a> <code>events</code></td><td align="left"><code>TrafficEvent</code>[]</td><td align="left">-</td></tr><tr><td align="left"><a id="toppaths"></a> <code>topPaths?</code></td><td align="left"><code>number</code></td><td align="left">Cap on <code>byPath</code> entries — paths are unbounded. Default 10.</td></tr></tbody></table></div>
807
- <h2 id="type-aliases">Type Aliases</h2>
808
- <p><a id="billableserieskey"></a></p>
809
- <h3 id="billableserieskey">BillableSeriesKey</h3>
810
- <pre class="astro-code one-dark-pro" style="background-color:#282c34;color:#abb2bf; overflow-x: auto;" tabindex="0" data-language="ts"><code><span class="line"><span style="color:#C678DD">type</span><span style="color:#E5C07B"> BillableSeriesKey</span><span style="color:#56B6C2"> =</span><span style="color:#98C379"> "reads"</span><span style="color:#ABB2BF"> | </span><span style="color:#98C379">"writes"</span><span style="color:#ABB2BF"> | </span><span style="color:#98C379">"deletes"</span><span style="color:#ABB2BF">;</span></span></code></pre>
811
- <hr>
812
- <p><a id="rulesserieskey"></a></p>
813
- <h3 id="rulesserieskey">RulesSeriesKey</h3>
814
- <pre class="astro-code one-dark-pro" style="background-color:#282c34;color:#abb2bf; overflow-x: auto;" tabindex="0" data-language="ts"><code><span class="line"><span style="color:#C678DD">type</span><span style="color:#E5C07B"> RulesSeriesKey</span><span style="color:#56B6C2"> =</span><span style="color:#98C379"> "allows"</span><span style="color:#ABB2BF"> | </span><span style="color:#98C379">"denies"</span><span style="color:#ABB2BF"> | </span><span style="color:#98C379">"errors"</span><span style="color:#ABB2BF">;</span></span></code></pre>
815
- <hr>
816
- <p><a id="trafficgroupkind-1"></a></p>
817
- <h3 id="trafficgroupkind">TrafficGroupKind</h3>
818
- <pre class="astro-code one-dark-pro" style="background-color:#282c34;color:#abb2bf; overflow-x: auto;" tabindex="0" data-language="ts"><code><span class="line"><span style="color:#C678DD">type</span><span style="color:#E5C07B"> TrafficGroupKind</span><span style="color:#56B6C2"> =</span><span style="color:#98C379"> "batch"</span><span style="color:#ABB2BF"> | </span><span style="color:#98C379">"transaction"</span><span style="color:#ABB2BF"> | </span><span style="color:#98C379">"listener-run"</span><span style="color:#ABB2BF">;</span></span></code></pre>
819
- <hr>
820
- <p><a id="trafficlogitem"></a></p>
821
- <h3 id="trafficlogitem">TrafficLogItem</h3>
822
- <pre class="astro-code one-dark-pro" style="background-color:#282c34;color:#abb2bf; overflow-x: auto;" tabindex="0" data-language="ts"><code><span class="line"><span style="color:#C678DD">type</span><span style="color:#E5C07B"> TrafficLogItem</span><span style="color:#56B6C2"> =</span><span style="color:#E5C07B"> TrafficGroup</span><span style="color:#ABB2BF"> | </span><span style="color:#E5C07B">TrafficSingle</span><span style="color:#ABB2BF">;</span></span></code></pre>
823
- <hr>
824
- <p><a id="trafficoriginfilter"></a></p>
825
- <h3 id="trafficoriginfilter">TrafficOriginFilter</h3>
826
- <pre class="astro-code one-dark-pro" style="background-color:#282c34;color:#abb2bf; overflow-x: auto;" tabindex="0" data-language="ts"><code><span class="line"><span style="color:#C678DD">type</span><span style="color:#E5C07B"> TrafficOriginFilter</span><span style="color:#56B6C2"> =</span><span style="color:#98C379"> "user"</span><span style="color:#ABB2BF"> | </span><span style="color:#98C379">"all"</span><span style="color:#ABB2BF"> | </span><span style="color:#98C379">"listener"</span><span style="color:#ABB2BF">;</span></span></code></pre>
827
- <p><code>user</code> keeps everything that isn’t a listener re-eval (user ops
828
- plus their transaction/batch sub-ops); <code>listener</code> keeps only
829
- listener re-evals; <code>all</code> keeps everything.</p>
830
- <hr>
831
- <p><a id="trafficresultfilter"></a></p>
832
- <h3 id="trafficresultfilter">TrafficResultFilter</h3>
833
- <pre class="astro-code one-dark-pro" style="background-color:#282c34;color:#abb2bf; overflow-x: auto;" tabindex="0" data-language="ts"><code><span class="line"><span style="color:#C678DD">type</span><span style="color:#E5C07B"> TrafficResultFilter</span><span style="color:#56B6C2"> =</span><span style="color:#98C379"> "all"</span><span style="color:#ABB2BF"> | </span><span style="color:#98C379">"allow"</span><span style="color:#ABB2BF"> | </span><span style="color:#98C379">"deny"</span><span style="color:#ABB2BF">;</span></span></code></pre>
834
- <h2 id="variables">Variables</h2>
835
- <p><a id="billable_series_defs"></a></p>
836
- <h3 id="billable_series_defs">BILLABLE_SERIES_DEFS</h3>
837
- <pre class="astro-code one-dark-pro" style="background-color:#282c34;color:#abb2bf; overflow-x: auto;" tabindex="0" data-language="ts"><code><span class="line"><span style="color:#C678DD">const</span><span style="color:#E5C07B"> BILLABLE_SERIES_DEFS</span><span style="color:#ABB2BF">: </span><span style="color:#E5C07B">ReadonlyArray</span><span style="color:#ABB2BF">&#x3C;{</span></span>
838
- <span class="line"><span style="color:#E06C75"> key</span><span style="color:#ABB2BF">: </span><span style="color:#E5C07B">BillableSeriesKey</span><span style="color:#ABB2BF">;</span></span>
839
- <span class="line"><span style="color:#E06C75"> label</span><span style="color:#ABB2BF">: </span><span style="color:#E5C07B">string</span><span style="color:#ABB2BF">;</span></span>
840
- <span class="line"><span style="color:#ABB2BF">}>;</span></span></code></pre>
841
- <hr>
842
- <p><a id="rules_series_defs"></a></p>
843
- <h3 id="rules_series_defs">RULES_SERIES_DEFS</h3>
844
- <pre class="astro-code one-dark-pro" style="background-color:#282c34;color:#abb2bf; overflow-x: auto;" tabindex="0" data-language="ts"><code><span class="line"><span style="color:#C678DD">const</span><span style="color:#E5C07B"> RULES_SERIES_DEFS</span><span style="color:#ABB2BF">: </span><span style="color:#E5C07B">ReadonlyArray</span><span style="color:#ABB2BF">&#x3C;{</span></span>
845
- <span class="line"><span style="color:#E06C75"> key</span><span style="color:#ABB2BF">: </span><span style="color:#E5C07B">RulesSeriesKey</span><span style="color:#ABB2BF">;</span></span>
846
- <span class="line"><span style="color:#E06C75"> label</span><span style="color:#ABB2BF">: </span><span style="color:#E5C07B">string</span><span style="color:#ABB2BF">;</span></span>
847
- <span class="line"><span style="color:#ABB2BF">}>;</span></span></code></pre>
848
- <h2 id="functions">Functions</h2>
849
- <p><a id="bucketbillablemetrics"></a></p>
850
- <h3 id="bucketbillablemetrics">bucketBillableMetrics()</h3>
851
- <pre class="astro-code one-dark-pro" style="background-color:#282c34;color:#abb2bf; overflow-x: auto;" tabindex="0" data-language="ts"><code><span class="line"><span style="color:#C678DD">function</span><span style="color:#61AFEF"> bucketBillableMetrics</span><span style="color:#ABB2BF">(</span></span>
852
- <span class="line"><span style="color:#E06C75;font-style:italic"> events</span><span style="color:#ABB2BF">: </span><span style="color:#C678DD">readonly</span><span style="color:#E5C07B"> TrafficEvent</span><span style="color:#ABB2BF">[],</span></span>
853
- <span class="line"><span style="color:#E06C75;font-style:italic"> window</span><span style="color:#ABB2BF">: </span><span style="color:#E5C07B">TimeWindow</span><span style="color:#ABB2BF">,</span></span>
854
- <span class="line"><span style="color:#E06C75;font-style:italic"> bucketCount</span><span style="color:#C678DD">?</span><span style="color:#ABB2BF">: </span><span style="color:#E5C07B">number</span><span style="color:#ABB2BF">,</span></span>
855
- <span class="line"><span style="color:#61AFEF"> isAdmin</span><span style="color:#C678DD">?</span><span style="color:#ABB2BF">: (</span><span style="color:#E06C75;font-style:italic">event</span><span style="color:#ABB2BF">: </span><span style="color:#E5C07B">Pick</span><span style="color:#ABB2BF">&#x3C;</span><span style="color:#E5C07B">TrafficEvent</span><span style="color:#ABB2BF">, </span><span style="color:#98C379">"origin"</span><span style="color:#ABB2BF">>) </span><span style="color:#C678DD">=></span><span style="color:#E5C07B"> boolean</span><span style="color:#ABB2BF">): </span><span style="color:#E5C07B">TrafficMetricsResult</span><span style="color:#ABB2BF">;</span></span></code></pre>
856
- <p>Pure kernel behind <a href="#usebillablemetrics">useBillableMetrics</a> — usable outside React.</p>
857
- <h4 id="parameters">Parameters</h4>
858
- <div class="table-scroll">
859
-
860
-
861
-
862
-
863
-
864
-
865
-
866
-
867
-
868
-
869
-
870
-
871
-
872
-
873
-
874
-
875
-
876
-
877
-
878
-
879
-
880
-
881
-
882
-
883
- <table><thead><tr><th align="left">Parameter</th><th align="left">Type</th></tr></thead><tbody><tr><td align="left"><code>events</code></td><td align="left">readonly <code>TrafficEvent</code>[]</td></tr><tr><td align="left"><code>window</code></td><td align="left"><a href="#timewindow"><code>TimeWindow</code></a></td></tr><tr><td align="left"><code>bucketCount?</code></td><td align="left"><code>number</code></td></tr><tr><td align="left"><code>isAdmin?</code></td><td align="left">(<code>event</code>: <code>Pick</code>&#x3C;<code>TrafficEvent</code>, <code>"origin"</code>>) => <code>boolean</code></td></tr></tbody></table></div>
884
- <h4 id="returns">Returns</h4>
885
- <p><a href="#trafficmetricsresult"><code>TrafficMetricsResult</code></a></p>
886
- <hr>
887
- <p><a id="bucketrulesmetrics"></a></p>
888
- <h3 id="bucketrulesmetrics">bucketRulesMetrics()</h3>
889
- <pre class="astro-code one-dark-pro" style="background-color:#282c34;color:#abb2bf; overflow-x: auto;" tabindex="0" data-language="ts"><code><span class="line"><span style="color:#C678DD">function</span><span style="color:#61AFEF"> bucketRulesMetrics</span><span style="color:#ABB2BF">(</span></span>
890
- <span class="line"><span style="color:#E06C75;font-style:italic"> events</span><span style="color:#ABB2BF">: </span><span style="color:#C678DD">readonly</span><span style="color:#E5C07B"> TrafficEvent</span><span style="color:#ABB2BF">[],</span></span>
891
- <span class="line"><span style="color:#E06C75;font-style:italic"> window</span><span style="color:#ABB2BF">: </span><span style="color:#E5C07B">TimeWindow</span><span style="color:#ABB2BF">,</span></span>
892
- <span class="line"><span style="color:#E06C75;font-style:italic"> bucketCount</span><span style="color:#C678DD">?</span><span style="color:#ABB2BF">: </span><span style="color:#E5C07B">number</span><span style="color:#ABB2BF">,</span></span>
893
- <span class="line"><span style="color:#61AFEF"> isAdmin</span><span style="color:#C678DD">?</span><span style="color:#ABB2BF">: (</span><span style="color:#E06C75;font-style:italic">event</span><span style="color:#ABB2BF">: </span><span style="color:#E5C07B">Pick</span><span style="color:#ABB2BF">&#x3C;</span><span style="color:#E5C07B">TrafficEvent</span><span style="color:#ABB2BF">, </span><span style="color:#98C379">"origin"</span><span style="color:#ABB2BF">>) </span><span style="color:#C678DD">=></span><span style="color:#E5C07B"> boolean</span><span style="color:#ABB2BF">): </span><span style="color:#E5C07B">TrafficMetricsResult</span><span style="color:#ABB2BF">;</span></span></code></pre>
894
- <p>Pure kernel behind <a href="#userulesmetrics">useRulesMetrics</a> — usable outside React.</p>
895
- <h4 id="parameters-1">Parameters</h4>
896
- <div class="table-scroll">
897
-
898
-
899
-
900
-
901
-
902
-
903
-
904
-
905
-
906
-
907
-
908
-
909
-
910
-
911
-
912
-
913
-
914
-
915
-
916
-
917
-
918
-
919
-
920
-
921
- <table><thead><tr><th align="left">Parameter</th><th align="left">Type</th></tr></thead><tbody><tr><td align="left"><code>events</code></td><td align="left">readonly <code>TrafficEvent</code>[]</td></tr><tr><td align="left"><code>window</code></td><td align="left"><a href="#timewindow"><code>TimeWindow</code></a></td></tr><tr><td align="left"><code>bucketCount?</code></td><td align="left"><code>number</code></td></tr><tr><td align="left"><code>isAdmin?</code></td><td align="left">(<code>event</code>: <code>Pick</code>&#x3C;<code>TrafficEvent</code>, <code>"origin"</code>>) => <code>boolean</code></td></tr></tbody></table></div>
922
- <h4 id="returns-1">Returns</h4>
923
- <p><a href="#trafficmetricsresult"><code>TrafficMetricsResult</code></a></p>
924
- <hr>
925
- <p><a id="buckettraffic"></a></p>
926
- <h3 id="buckettraffic">bucketTraffic()</h3>
927
- <pre class="astro-code one-dark-pro" style="background-color:#282c34;color:#abb2bf; overflow-x: auto;" tabindex="0" data-language="ts"><code><span class="line"><span style="color:#C678DD">function</span><span style="color:#61AFEF"> bucketTraffic</span><span style="color:#ABB2BF">(</span></span>
928
- <span class="line"><span style="color:#E06C75;font-style:italic"> events</span><span style="color:#ABB2BF">: </span><span style="color:#E5C07B">TrafficEvent</span><span style="color:#ABB2BF">[],</span></span>
929
- <span class="line"><span style="color:#E06C75;font-style:italic"> window</span><span style="color:#ABB2BF">: </span><span style="color:#E5C07B">TimeWindow</span><span style="color:#ABB2BF">,</span></span>
930
- <span class="line"><span style="color:#E06C75;font-style:italic"> bucketCount</span><span style="color:#C678DD">?</span><span style="color:#ABB2BF">: </span><span style="color:#E5C07B">number</span><span style="color:#ABB2BF">): </span><span style="color:#E5C07B">UseTrafficBucketsResult</span><span style="color:#ABB2BF">;</span></span></code></pre>
931
- <p>The pure bucketing kernel behind <a href="#usetrafficbuckets">useTrafficBuckets</a> — usable
932
- outside React. Returns an empty result for a non-positive
933
- <code>bucketCount</code> or a zero/negative-width window.</p>
934
- <h4 id="parameters-2">Parameters</h4>
935
- <div class="table-scroll">
936
-
937
-
938
-
939
-
940
-
941
-
942
-
943
-
944
-
945
-
946
-
947
-
948
-
949
-
950
-
951
-
952
-
953
-
954
-
955
-
956
- <table><thead><tr><th align="left">Parameter</th><th align="left">Type</th></tr></thead><tbody><tr><td align="left"><code>events</code></td><td align="left"><code>TrafficEvent</code>[]</td></tr><tr><td align="left"><code>window</code></td><td align="left"><a href="#timewindow"><code>TimeWindow</code></a></td></tr><tr><td align="left"><code>bucketCount?</code></td><td align="left"><code>number</code></td></tr></tbody></table></div>
957
- <h4 id="returns-2">Returns</h4>
958
- <p><a href="#usetrafficbucketsresult"><code>UseTrafficBucketsResult</code></a></p>
959
- <hr>
960
- <p><a id="classifybillable"></a></p>
961
- <h3 id="classifybillable">classifyBillable()</h3>
962
- <pre class="astro-code one-dark-pro" style="background-color:#282c34;color:#abb2bf; overflow-x: auto;" tabindex="0" data-language="ts"><code><span class="line"><span style="color:#C678DD">function</span><span style="color:#61AFEF"> classifyBillable</span><span style="color:#ABB2BF">(</span><span style="color:#E06C75;font-style:italic">event</span><span style="color:#ABB2BF">: </span><span style="color:#E5C07B">Pick</span><span style="color:#ABB2BF">&#x3C;</span><span style="color:#E5C07B">TrafficEvent</span><span style="color:#ABB2BF">, </span><span style="color:#98C379">"method"</span><span style="color:#ABB2BF"> | </span><span style="color:#98C379">"result"</span><span style="color:#ABB2BF"> | </span><span style="color:#98C379">"origin"</span><span style="color:#ABB2BF">>, </span><span style="color:#61AFEF">isAdmin</span><span style="color:#C678DD">?</span><span style="color:#ABB2BF">: (</span><span style="color:#E06C75;font-style:italic">event</span><span style="color:#ABB2BF">: </span><span style="color:#E5C07B">Pick</span><span style="color:#ABB2BF">&#x3C;</span><span style="color:#E5C07B">TrafficEvent</span><span style="color:#ABB2BF">, </span><span style="color:#98C379">"origin"</span><span style="color:#ABB2BF">>) </span><span style="color:#C678DD">=></span><span style="color:#E5C07B"> boolean</span><span style="color:#ABB2BF">): </span><span style="color:#E5C07B">BillableSeriesKey</span><span style="color:#ABB2BF">;</span></span></code></pre>
963
- <p>Classify a billable op, or <code>null</code> if it isn’t one / never ran.</p>
964
- <h4 id="parameters-3">Parameters</h4>
965
- <div class="table-scroll">
966
-
967
-
968
-
969
-
970
-
971
-
972
-
973
-
974
-
975
-
976
-
977
-
978
-
979
-
980
-
981
-
982
- <table><thead><tr><th align="left">Parameter</th><th align="left">Type</th></tr></thead><tbody><tr><td align="left"><code>event</code></td><td align="left"><code>Pick</code>&#x3C;<code>TrafficEvent</code>, <code>"method"</code> | <code>"result"</code> | <code>"origin"</code>></td></tr><tr><td align="left"><code>isAdmin?</code></td><td align="left">(<code>event</code>: <code>Pick</code>&#x3C;<code>TrafficEvent</code>, <code>"origin"</code>>) => <code>boolean</code></td></tr></tbody></table></div>
983
- <h4 id="returns-3">Returns</h4>
984
- <p><a href="#billableserieskey"><code>BillableSeriesKey</code></a></p>
985
- <hr>
986
- <p><a id="classifyrules"></a></p>
987
- <h3 id="classifyrules">classifyRules()</h3>
988
- <pre class="astro-code one-dark-pro" style="background-color:#282c34;color:#abb2bf; overflow-x: auto;" tabindex="0" data-language="ts"><code><span class="line"><span style="color:#C678DD">function</span><span style="color:#61AFEF"> classifyRules</span><span style="color:#ABB2BF">(</span><span style="color:#E06C75;font-style:italic">event</span><span style="color:#ABB2BF">: </span><span style="color:#E5C07B">Pick</span><span style="color:#ABB2BF">&#x3C;</span><span style="color:#E5C07B">TrafficEvent</span><span style="color:#ABB2BF">, </span><span style="color:#98C379">"result"</span><span style="color:#ABB2BF"> | </span><span style="color:#98C379">"origin"</span><span style="color:#ABB2BF">>, </span><span style="color:#61AFEF">isAdmin</span><span style="color:#C678DD">?</span><span style="color:#ABB2BF">: (</span><span style="color:#E06C75;font-style:italic">event</span><span style="color:#ABB2BF">: </span><span style="color:#E5C07B">Pick</span><span style="color:#ABB2BF">&#x3C;</span><span style="color:#E5C07B">TrafficEvent</span><span style="color:#ABB2BF">, </span><span style="color:#98C379">"origin"</span><span style="color:#ABB2BF">>) </span><span style="color:#C678DD">=></span><span style="color:#E5C07B"> boolean</span><span style="color:#ABB2BF">): </span><span style="color:#E5C07B">RulesSeriesKey</span><span style="color:#ABB2BF">;</span></span></code></pre>
989
- <p>Classify a rules-engine verdict, or <code>null</code> if it isn’t one (bypassed,
990
- unsupported, or not-applicable).</p>
991
- <h4 id="parameters-4">Parameters</h4>
992
- <div class="table-scroll">
993
-
994
-
995
-
996
-
997
-
998
-
999
-
1000
-
1001
-
1002
-
1003
-
1004
-
1005
-
1006
-
1007
-
1008
-
1009
- <table><thead><tr><th align="left">Parameter</th><th align="left">Type</th></tr></thead><tbody><tr><td align="left"><code>event</code></td><td align="left"><code>Pick</code>&#x3C;<code>TrafficEvent</code>, <code>"result"</code> | <code>"origin"</code>></td></tr><tr><td align="left"><code>isAdmin?</code></td><td align="left">(<code>event</code>: <code>Pick</code>&#x3C;<code>TrafficEvent</code>, <code>"origin"</code>>) => <code>boolean</code></td></tr></tbody></table></div>
1010
- <h4 id="returns-4">Returns</h4>
1011
- <p><a href="#rulesserieskey"><code>RulesSeriesKey</code></a></p>
1012
- <hr>
1013
- <p><a id="isadminevent"></a></p>
1014
- <h3 id="isadminevent">isAdminEvent()</h3>
1015
- <pre class="astro-code one-dark-pro" style="background-color:#282c34;color:#abb2bf; overflow-x: auto;" tabindex="0" data-language="ts"><code><span class="line"><span style="color:#C678DD">function</span><span style="color:#61AFEF"> isAdminEvent</span><span style="color:#ABB2BF">(</span><span style="color:#E06C75;font-style:italic">event</span><span style="color:#ABB2BF">: </span><span style="color:#E5C07B">Pick</span><span style="color:#ABB2BF">&#x3C;</span><span style="color:#E5C07B">TrafficEvent</span><span style="color:#ABB2BF">, </span><span style="color:#98C379">"origin"</span><span style="color:#ABB2BF">>): </span><span style="color:#E5C07B">boolean</span><span style="color:#ABB2BF">;</span></span></code></pre>
1016
- <p>Default admin predicate: the one signal the public <code>TrafficEvent</code>
1017
- type declares. See the module doc for the known Firestore gap.</p>
1018
- <h4 id="parameters-5">Parameters</h4>
1019
- <div class="table-scroll">
1020
-
1021
-
1022
-
1023
-
1024
-
1025
-
1026
-
1027
-
1028
-
1029
-
1030
-
1031
-
1032
- <table><thead><tr><th align="left">Parameter</th><th align="left">Type</th></tr></thead><tbody><tr><td align="left"><code>event</code></td><td align="left"><code>Pick</code>&#x3C;<code>TrafficEvent</code>, <code>"origin"</code>></td></tr></tbody></table></div>
1033
- <h4 id="returns-5">Returns</h4>
1034
- <p><code>boolean</code></p>
1035
- <hr>
1036
- <p><a id="usebillablemetrics"></a></p>
1037
- <h3 id="usebillablemetrics">useBillableMetrics()</h3>
1038
- <pre class="astro-code one-dark-pro" style="background-color:#282c34;color:#abb2bf; overflow-x: auto;" tabindex="0" data-language="ts"><code><span class="line"><span style="color:#C678DD">function</span><span style="color:#61AFEF"> useBillableMetrics</span><span style="color:#ABB2BF">(</span><span style="color:#E06C75;font-style:italic">__namedParameters</span><span style="color:#ABB2BF">: </span><span style="color:#E5C07B">UseTrafficMetricsOptions</span><span style="color:#ABB2BF">): </span><span style="color:#E5C07B">TrafficMetricsResult</span><span style="color:#ABB2BF">;</span></span></code></pre>
1039
- <p>Reads / writes / deletes, bucketed over <code>window</code>. See the module doc
1040
- for the billable mapping + the “read ops, not billable reads” caveat.</p>
1041
- <h4 id="parameters-6">Parameters</h4>
1042
- <div class="table-scroll">
1043
-
1044
-
1045
-
1046
-
1047
-
1048
-
1049
-
1050
-
1051
-
1052
-
1053
-
1054
-
1055
- <table><thead><tr><th align="left">Parameter</th><th align="left">Type</th></tr></thead><tbody><tr><td align="left"><code>__namedParameters</code></td><td align="left"><a href="#usetrafficmetricsoptions"><code>UseTrafficMetricsOptions</code></a></td></tr></tbody></table></div>
1056
- <h4 id="returns-6">Returns</h4>
1057
- <p><a href="#trafficmetricsresult"><code>TrafficMetricsResult</code></a></p>
1058
- <hr>
1059
- <p><a id="useruleheatmap"></a></p>
1060
- <h3 id="useruleheatmap">useRuleHeatmap()</h3>
1061
- <pre class="astro-code one-dark-pro" style="background-color:#282c34;color:#abb2bf; overflow-x: auto;" tabindex="0" data-language="ts"><code><span class="line"><span style="color:#C678DD">function</span><span style="color:#61AFEF"> useRuleHeatmap</span><span style="color:#ABB2BF">(</span><span style="color:#E06C75;font-style:italic">__namedParameters</span><span style="color:#ABB2BF">: </span><span style="color:#E5C07B">UseRuleHeatmapOptions</span><span style="color:#ABB2BF">): </span><span style="color:#E5C07B">UseRuleHeatmapResult</span><span style="color:#ABB2BF">;</span></span></code></pre>
1062
- <p>Rolls a traffic buffer up by <code>matchedRule.ruleIndex</code>: how often
1063
- each rule fired, and how that split across allow / deny /
1064
- unsupported. Pure derivation — feed it the filtered or full
1065
- event list depending on what the heatmap should reflect.</p>
1066
- <h4 id="parameters-7">Parameters</h4>
1067
- <div class="table-scroll">
1068
-
1069
-
1070
-
1071
-
1072
-
1073
-
1074
-
1075
-
1076
-
1077
-
1078
-
1079
-
1080
- <table><thead><tr><th align="left">Parameter</th><th align="left">Type</th></tr></thead><tbody><tr><td align="left"><code>__namedParameters</code></td><td align="left"><a href="#useruleheatmapoptions"><code>UseRuleHeatmapOptions</code></a></td></tr></tbody></table></div>
1081
- <h4 id="returns-7">Returns</h4>
1082
- <p><a href="#useruleheatmapresult"><code>UseRuleHeatmapResult</code></a></p>
1083
- <hr>
1084
- <p><a id="userulesmetrics"></a></p>
1085
- <h3 id="userulesmetrics">useRulesMetrics()</h3>
1086
- <pre class="astro-code one-dark-pro" style="background-color:#282c34;color:#abb2bf; overflow-x: auto;" tabindex="0" data-language="ts"><code><span class="line"><span style="color:#C678DD">function</span><span style="color:#61AFEF"> useRulesMetrics</span><span style="color:#ABB2BF">(</span><span style="color:#E06C75;font-style:italic">__namedParameters</span><span style="color:#ABB2BF">: </span><span style="color:#E5C07B">UseTrafficMetricsOptions</span><span style="color:#ABB2BF">): </span><span style="color:#E5C07B">TrafficMetricsResult</span><span style="color:#ABB2BF">;</span></span></code></pre>
1087
- <p>Allows / denies / errors, bucketed over <code>window</code>. Excludes
1088
- rules-bypassed (admin) ops — see the module doc.</p>
1089
- <h4 id="parameters-8">Parameters</h4>
1090
- <div class="table-scroll">
1091
-
1092
-
1093
-
1094
-
1095
-
1096
-
1097
-
1098
-
1099
-
1100
-
1101
-
1102
-
1103
- <table><thead><tr><th align="left">Parameter</th><th align="left">Type</th></tr></thead><tbody><tr><td align="left"><code>__namedParameters</code></td><td align="left"><a href="#usetrafficmetricsoptions"><code>UseTrafficMetricsOptions</code></a></td></tr></tbody></table></div>
1104
- <h4 id="returns-8">Returns</h4>
1105
- <p><a href="#trafficmetricsresult"><code>TrafficMetricsResult</code></a></p>
1106
- <hr>
1107
- <p><a id="usetrafficbuckets"></a></p>
1108
- <h3 id="usetrafficbuckets">useTrafficBuckets()</h3>
1109
- <pre class="astro-code one-dark-pro" style="background-color:#282c34;color:#abb2bf; overflow-x: auto;" tabindex="0" data-language="ts"><code><span class="line"><span style="color:#C678DD">function</span><span style="color:#61AFEF"> useTrafficBuckets</span><span style="color:#ABB2BF">(</span><span style="color:#E06C75;font-style:italic">__namedParameters</span><span style="color:#ABB2BF">: </span><span style="color:#E5C07B">UseTrafficBucketsOptions</span><span style="color:#ABB2BF">): </span><span style="color:#E5C07B">UseTrafficBucketsResult</span><span style="color:#ABB2BF">;</span></span></code></pre>
1110
- <p>Buckets a traffic buffer into <code>bucketCount</code> equal time slices over
1111
- <code>window</code>, counting total + denied events per slice. Pure
1112
- derivation — the histogram component renders the result, this hook
1113
- (and <code>bucketTraffic</code> under it) owns the math.</p>
1114
- <p>Each bucket carries a <code>heightRatio</code> and <code>denyHeightRatio</code>
1115
- (0..1, scaled to the tallest bucket) so the consumer can map them
1116
- straight onto a bar height without re-finding the max.</p>
1117
- <h4 id="parameters-9">Parameters</h4>
1118
- <div class="table-scroll">
1119
-
1120
-
1121
-
1122
-
1123
-
1124
-
1125
-
1126
-
1127
-
1128
-
1129
-
1130
-
1131
- <table><thead><tr><th align="left">Parameter</th><th align="left">Type</th></tr></thead><tbody><tr><td align="left"><code>__namedParameters</code></td><td align="left"><a href="#usetrafficbucketsoptions"><code>UseTrafficBucketsOptions</code></a></td></tr></tbody></table></div>
1132
- <h4 id="returns-9">Returns</h4>
1133
- <p><a href="#usetrafficbucketsresult"><code>UseTrafficBucketsResult</code></a></p>
1134
- <hr>
1135
- <p><a id="usetrafficfilter"></a></p>
1136
- <h3 id="usetrafficfilter">useTrafficFilter()</h3>
1137
- <pre class="astro-code one-dark-pro" style="background-color:#282c34;color:#abb2bf; overflow-x: auto;" tabindex="0" data-language="ts"><code><span class="line"><span style="color:#C678DD">function</span><span style="color:#61AFEF"> useTrafficFilter</span><span style="color:#ABB2BF">(</span><span style="color:#E06C75;font-style:italic">__namedParameters</span><span style="color:#ABB2BF">: </span><span style="color:#E5C07B">UseTrafficFilterOptions</span><span style="color:#ABB2BF">): </span><span style="color:#E5C07B">UseTrafficFilterResult</span><span style="color:#ABB2BF">;</span></span></code></pre>
1138
- <p>Derives a filtered view over a traffic buffer along three
1139
- dimensions: origin, result, and a case-insensitive path substring.
1140
- Owns the filter state; pure derivation otherwise.</p>
1141
- <h4 id="parameters-10">Parameters</h4>
1142
- <div class="table-scroll">
1143
-
1144
-
1145
-
1146
-
1147
-
1148
-
1149
-
1150
-
1151
-
1152
-
1153
-
1154
-
1155
- <table><thead><tr><th align="left">Parameter</th><th align="left">Type</th></tr></thead><tbody><tr><td align="left"><code>__namedParameters</code></td><td align="left"><a href="#usetrafficfilteroptions"><code>UseTrafficFilterOptions</code></a></td></tr></tbody></table></div>
1156
- <h4 id="returns-10">Returns</h4>
1157
- <p><a href="#usetrafficfilterresult"><code>UseTrafficFilterResult</code></a></p>
1158
- <hr>
1159
- <p><a id="usetrafficgroups"></a></p>
1160
- <h3 id="usetrafficgroups">useTrafficGroups()</h3>
1161
- <pre class="astro-code one-dark-pro" style="background-color:#282c34;color:#abb2bf; overflow-x: auto;" tabindex="0" data-language="ts"><code><span class="line"><span style="color:#C678DD">function</span><span style="color:#61AFEF"> useTrafficGroups</span><span style="color:#ABB2BF">(</span><span style="color:#E06C75;font-style:italic">__namedParameters</span><span style="color:#ABB2BF">: </span><span style="color:#E5C07B">UseTrafficGroupsOptions</span><span style="color:#ABB2BF">): </span><span style="color:#E5C07B">UseTrafficGroupsResult</span><span style="color:#ABB2BF">;</span></span></code></pre>
1162
- <p>Folds a traffic buffer into a list of singles and collapsible
1163
- groups. Two grouping modes, both over <em>consecutive</em> events:</p>
1164
- <ul>
1165
- <li><code>groupId</code> — batch/transaction sub-ops sharing an id collapse
1166
- into one <code>batch</code> / <code>transaction</code> group.</li>
1167
- <li>listener runs — a consecutive run of listener re-evals from the
1168
- same originating op collapses into one <code>listener-run</code> group.
1169
- A run of length 1 stays a single (no point collapsing one row).</li>
1170
- </ul>
1171
- <p>Pure derivation; the input order is preserved.</p>
1172
- <h4 id="parameters-11">Parameters</h4>
1173
- <div class="table-scroll">
1174
-
1175
-
1176
-
1177
-
1178
-
1179
-
1180
-
1181
-
1182
-
1183
-
1184
-
1185
-
1186
- <table><thead><tr><th align="left">Parameter</th><th align="left">Type</th></tr></thead><tbody><tr><td align="left"><code>__namedParameters</code></td><td align="left"><a href="#usetrafficgroupsoptions"><code>UseTrafficGroupsOptions</code></a></td></tr></tbody></table></div>
1187
- <h4 id="returns-11">Returns</h4>
1188
- <p><a href="#usetrafficgroupsresult"><code>UseTrafficGroupsResult</code></a></p>
1189
- <hr>
1190
- <p><a id="usetrafficmonitor"></a></p>
1191
- <h3 id="usetrafficmonitor">useTrafficMonitor()</h3>
1192
- <pre class="astro-code one-dark-pro" style="background-color:#282c34;color:#abb2bf; overflow-x: auto;" tabindex="0" data-language="ts"><code><span class="line"><span style="color:#C678DD">function</span><span style="color:#61AFEF"> useTrafficMonitor</span><span style="color:#ABB2BF">(</span><span style="color:#E06C75;font-style:italic">__namedParameters</span><span style="color:#ABB2BF">: </span><span style="color:#E5C07B">UseTrafficMonitorOptions</span><span style="color:#ABB2BF">): </span><span style="color:#E5C07B">UseTrafficMonitorResult</span><span style="color:#ABB2BF">;</span></span></code></pre>
1193
- <p>Buffers a traffic stream into a capped ring buffer with
1194
- pause/resume/clear. Decoupled from <code>pyric/sandbox</code> — <code>source</code> is
1195
- just a <code>(cb) => unsubscribe</code> function.</p>
1196
- <p>Pause is consumer-side: while paused, the subscription stays
1197
- attached but incoming events are dropped (not queued). This
1198
- matches the probe decision — a <code>load-test</code>-shaped session can emit
1199
- 100k+ events, so queueing-while-paused would defeat the point.</p>
1200
- <h4 id="parameters-12">Parameters</h4>
1201
- <div class="table-scroll">
1202
-
1203
-
1204
-
1205
-
1206
-
1207
-
1208
-
1209
-
1210
-
1211
-
1212
-
1213
-
1214
- <table><thead><tr><th align="left">Parameter</th><th align="left">Type</th></tr></thead><tbody><tr><td align="left"><code>__namedParameters</code></td><td align="left"><a href="#usetrafficmonitoroptions"><code>UseTrafficMonitorOptions</code></a></td></tr></tbody></table></div>
1215
- <h4 id="returns-12">Returns</h4>
1216
- <p><a href="#usetrafficmonitorresult"><code>UseTrafficMonitorResult</code></a></p>
1217
- <hr>
1218
- <p><a id="usetrafficstats"></a></p>
1219
- <h3 id="usetrafficstats">useTrafficStats()</h3>
1220
- <pre class="astro-code one-dark-pro" style="background-color:#282c34;color:#abb2bf; overflow-x: auto;" tabindex="0" data-language="ts"><code><span class="line"><span style="color:#C678DD">function</span><span style="color:#61AFEF"> useTrafficStats</span><span style="color:#ABB2BF">(</span><span style="color:#E06C75;font-style:italic">__namedParameters</span><span style="color:#ABB2BF">: </span><span style="color:#E5C07B">UseTrafficStatsOptions</span><span style="color:#ABB2BF">): </span><span style="color:#E5C07B">TrafficStatsSummary</span><span style="color:#ABB2BF">;</span></span></code></pre>
1221
- <p>Aggregations over a traffic buffer: totals, deny rate, and counts
1222
- broken down by method, origin, and path. Pure derivation — feed it
1223
- the filtered or full event list depending on what the panel
1224
- should reflect.</p>
1225
- <h4 id="parameters-13">Parameters</h4>
1226
- <div class="table-scroll">
1227
-
1228
-
1229
-
1230
-
1231
-
1232
-
1233
-
1234
-
1235
-
1236
-
1237
-
1238
-
1239
- <table><thead><tr><th align="left">Parameter</th><th align="left">Type</th></tr></thead><tbody><tr><td align="left"><code>__namedParameters</code></td><td align="left"><a href="#usetrafficstatsoptions"><code>UseTrafficStatsOptions</code></a></td></tr></tbody></table></div>
1240
- <h4 id="returns-13">Returns</h4>
1241
- <p><a href="#trafficstatssummary"><code>TrafficStatsSummary</code></a></p> </article> </main> <aside class="doc-toc api-symbols" aria-label="API symbols"> <h2 class="doc-toc-heading">Symbols</h2> <input class="api-symbol-filter" type="search" placeholder="Filter symbols" aria-label="Filter API symbols" data-api-symbol-filter> <div class="api-symbol-groups" data-api-symbol-groups> <section class="api-symbol-group" data-api-symbol-group> <a class="api-symbol-kind" href="#interfaces"> Interfaces </a> <ul> <li data-api-symbol="metricpoint"> <a href="#metricpoint">MetricPoint</a> </li><li data-api-symbol="metricseries"> <a href="#metricseries">MetricSeries</a> </li><li data-api-symbol="ruleheatmapentry"> <a href="#ruleheatmapentry">RuleHeatmapEntry</a> </li><li data-api-symbol="timewindow"> <a href="#timewindow">TimeWindow</a> </li><li data-api-symbol="trafficbucket"> <a href="#trafficbucket">TrafficBucket</a> </li><li data-api-symbol="trafficcounts"> <a href="#trafficcounts">TrafficCounts</a> </li><li data-api-symbol="trafficfilterstate"> <a href="#trafficfilterstate">TrafficFilterState</a> </li><li data-api-symbol="trafficgroup"> <a href="#trafficgroup">TrafficGroup</a> </li><li data-api-symbol="trafficmetricsresult"> <a href="#trafficmetricsresult">TrafficMetricsResult</a> </li><li data-api-symbol="trafficsingle"> <a href="#trafficsingle">TrafficSingle</a> </li><li data-api-symbol="trafficstatbucket"> <a href="#trafficstatbucket">TrafficStatBucket</a> </li><li data-api-symbol="trafficstatssummary"> <a href="#trafficstatssummary">TrafficStatsSummary</a> </li><li data-api-symbol="useruleheatmapoptions"> <a href="#useruleheatmapoptions">UseRuleHeatmapOptions</a> </li><li data-api-symbol="useruleheatmapresult"> <a href="#useruleheatmapresult">UseRuleHeatmapResult</a> </li><li data-api-symbol="usetrafficbucketsoptions"> <a href="#usetrafficbucketsoptions">UseTrafficBucketsOptions</a> </li><li data-api-symbol="usetrafficbucketsresult"> <a href="#usetrafficbucketsresult">UseTrafficBucketsResult</a> </li><li data-api-symbol="usetrafficfilteroptions"> <a href="#usetrafficfilteroptions">UseTrafficFilterOptions</a> </li><li data-api-symbol="usetrafficfilterresult"> <a href="#usetrafficfilterresult">UseTrafficFilterResult</a> </li><li data-api-symbol="usetrafficgroupsoptions"> <a href="#usetrafficgroupsoptions">UseTrafficGroupsOptions</a> </li><li data-api-symbol="usetrafficgroupsresult"> <a href="#usetrafficgroupsresult">UseTrafficGroupsResult</a> </li><li data-api-symbol="usetrafficmetricsoptions"> <a href="#usetrafficmetricsoptions">UseTrafficMetricsOptions</a> </li><li data-api-symbol="usetrafficmonitoroptions"> <a href="#usetrafficmonitoroptions">UseTrafficMonitorOptions</a> </li><li data-api-symbol="usetrafficmonitorresult"> <a href="#usetrafficmonitorresult">UseTrafficMonitorResult</a> </li><li data-api-symbol="usetrafficstatsoptions"> <a href="#usetrafficstatsoptions">UseTrafficStatsOptions</a> </li> </ul> </section><section class="api-symbol-group" data-api-symbol-group> <a class="api-symbol-kind" href="#type-aliases"> Type Aliases </a> <ul> <li data-api-symbol="billableserieskey"> <a href="#billableserieskey">BillableSeriesKey</a> </li><li data-api-symbol="rulesserieskey"> <a href="#rulesserieskey">RulesSeriesKey</a> </li><li data-api-symbol="trafficgroupkind"> <a href="#trafficgroupkind">TrafficGroupKind</a> </li><li data-api-symbol="trafficlogitem"> <a href="#trafficlogitem">TrafficLogItem</a> </li><li data-api-symbol="trafficoriginfilter"> <a href="#trafficoriginfilter">TrafficOriginFilter</a> </li><li data-api-symbol="trafficresultfilter"> <a href="#trafficresultfilter">TrafficResultFilter</a> </li> </ul> </section><section class="api-symbol-group" data-api-symbol-group> <a class="api-symbol-kind" href="#variables"> Variables </a> <ul> <li data-api-symbol="billable_series_defs"> <a href="#billable_series_defs">BILLABLE_SERIES_DEFS</a> </li><li data-api-symbol="rules_series_defs"> <a href="#rules_series_defs">RULES_SERIES_DEFS</a> </li> </ul> </section><section class="api-symbol-group" data-api-symbol-group> <a class="api-symbol-kind" href="#functions"> Functions </a> <ul> <li data-api-symbol="bucketbillablemetrics()"> <a href="#bucketbillablemetrics">bucketBillableMetrics()</a> </li><li data-api-symbol="bucketrulesmetrics()"> <a href="#bucketrulesmetrics">bucketRulesMetrics()</a> </li><li data-api-symbol="buckettraffic()"> <a href="#buckettraffic">bucketTraffic()</a> </li><li data-api-symbol="classifybillable()"> <a href="#classifybillable">classifyBillable()</a> </li><li data-api-symbol="classifyrules()"> <a href="#classifyrules">classifyRules()</a> </li><li data-api-symbol="isadminevent()"> <a href="#isadminevent">isAdminEvent()</a> </li><li data-api-symbol="usebillablemetrics()"> <a href="#usebillablemetrics">useBillableMetrics()</a> </li><li data-api-symbol="useruleheatmap()"> <a href="#useruleheatmap">useRuleHeatmap()</a> </li><li data-api-symbol="userulesmetrics()"> <a href="#userulesmetrics">useRulesMetrics()</a> </li><li data-api-symbol="usetrafficbuckets()"> <a href="#usetrafficbuckets">useTrafficBuckets()</a> </li><li data-api-symbol="usetrafficfilter()"> <a href="#usetrafficfilter">useTrafficFilter()</a> </li><li data-api-symbol="usetrafficgroups()"> <a href="#usetrafficgroups">useTrafficGroups()</a> </li><li data-api-symbol="usetrafficmonitor()"> <a href="#usetrafficmonitor">useTrafficMonitor()</a> </li><li data-api-symbol="usetrafficstats()"> <a href="#usetrafficstats">useTrafficStats()</a> </li> </ul> </section> <p class="api-symbol-empty" data-api-symbol-empty hidden>No matching symbols</p> </div> </aside> </div> <script type="module">const a=document.querySelector("[data-api-symbol-filter]"),d=[...document.querySelectorAll("[data-api-symbol-group]")],n=document.querySelector("[data-api-symbol-empty]");a?.addEventListener("input",()=>{const t=a.value.trim().toLowerCase();let o=0;for(const i of d){let e=0;i.querySelectorAll("[data-api-symbol]").forEach(l=>{const r=!t||(l.dataset.apiSymbol??"").includes(t);l.hidden=!r,r&&e++}),i.hidden=e===0,o+=e}n&&(n.hidden=o>0)});</script> <script type="module">const s=new Map;document.querySelectorAll('.doc-toc a[href^="#"]').forEach(t=>s.set(decodeURIComponent(t.hash.slice(1)),t));if(s.size>0){const t=new Set,n=()=>{let o=null;for(const e of s.keys())if(t.has(e)){o=e;break}s.forEach((e,c)=>e.classList.toggle("active",c===o))},r=new IntersectionObserver(o=>{for(const e of o)e.isIntersecting?t.add(e.target.id):t.delete(e.target.id);n()},{rootMargin:"-72px 0px -60% 0px"});s.forEach((o,e)=>{const c=document.getElementById(e);c&&r.observe(c)})}</script> <script type="module">document.querySelector('.studio__nav [aria-current="page"]')?.scrollIntoView({block:"nearest",inline:"center"});</script> </body> </html>
188
+ <p>Re-exports <a href="/docs/pyric-ui-traffic-reference-api/#usetrafficstatsoptions">UseTrafficStatsOptions</a></p> </article> </main> <aside class="doc-toc api-symbols" aria-label="API symbols"> <h2 class="doc-toc-heading">Symbols</h2> <input class="api-symbol-filter" type="search" placeholder="Filter symbols" aria-label="Filter API symbols" data-api-symbol-filter> <div class="api-symbol-groups" data-api-symbol-groups> <section class="api-symbol-group" data-api-symbol-group> <a class="api-symbol-kind" href="#references"> References </a> <ul> <li data-api-symbol="billable_series_defs"> <a href="#billable_series_defs">BILLABLE_SERIES_DEFS</a> </li><li data-api-symbol="billableserieskey"> <a href="#billableserieskey">BillableSeriesKey</a> </li><li data-api-symbol="bucketbillablemetrics"> <a href="#bucketbillablemetrics">bucketBillableMetrics</a> </li><li data-api-symbol="bucketrulesmetrics"> <a href="#bucketrulesmetrics">bucketRulesMetrics</a> </li><li data-api-symbol="buckettraffic"> <a href="#buckettraffic">bucketTraffic</a> </li><li data-api-symbol="classifybillable"> <a href="#classifybillable">classifyBillable</a> </li><li data-api-symbol="classifyrules"> <a href="#classifyrules">classifyRules</a> </li><li data-api-symbol="isadminevent"> <a href="#isadminevent">isAdminEvent</a> </li><li data-api-symbol="metricpoint"> <a href="#metricpoint">MetricPoint</a> </li><li data-api-symbol="metricseries"> <a href="#metricseries">MetricSeries</a> </li><li data-api-symbol="ruleheatmapentry"> <a href="#ruleheatmapentry">RuleHeatmapEntry</a> </li><li data-api-symbol="rules_series_defs"> <a href="#rules_series_defs">RULES_SERIES_DEFS</a> </li><li data-api-symbol="rulesserieskey"> <a href="#rulesserieskey">RulesSeriesKey</a> </li><li data-api-symbol="timewindow"> <a href="#timewindow">TimeWindow</a> </li><li data-api-symbol="trafficbucket"> <a href="#trafficbucket">TrafficBucket</a> </li><li data-api-symbol="trafficcounts"> <a href="#trafficcounts">TrafficCounts</a> </li><li data-api-symbol="trafficfilterstate"> <a href="#trafficfilterstate">TrafficFilterState</a> </li><li data-api-symbol="trafficgroup"> <a href="#trafficgroup">TrafficGroup</a> </li><li data-api-symbol="trafficgroupkind"> <a href="#trafficgroupkind">TrafficGroupKind</a> </li><li data-api-symbol="trafficlogitem"> <a href="#trafficlogitem">TrafficLogItem</a> </li><li data-api-symbol="trafficmetricsresult"> <a href="#trafficmetricsresult">TrafficMetricsResult</a> </li><li data-api-symbol="trafficoriginfilter"> <a href="#trafficoriginfilter">TrafficOriginFilter</a> </li><li data-api-symbol="trafficresultfilter"> <a href="#trafficresultfilter">TrafficResultFilter</a> </li><li data-api-symbol="trafficsingle"> <a href="#trafficsingle">TrafficSingle</a> </li><li data-api-symbol="trafficstatbucket"> <a href="#trafficstatbucket">TrafficStatBucket</a> </li><li data-api-symbol="trafficstatssummary"> <a href="#trafficstatssummary">TrafficStatsSummary</a> </li><li data-api-symbol="usebillablemetrics"> <a href="#usebillablemetrics">useBillableMetrics</a> </li><li data-api-symbol="useruleheatmap"> <a href="#useruleheatmap">useRuleHeatmap</a> </li><li data-api-symbol="useruleheatmapoptions"> <a href="#useruleheatmapoptions">UseRuleHeatmapOptions</a> </li><li data-api-symbol="useruleheatmapresult"> <a href="#useruleheatmapresult">UseRuleHeatmapResult</a> </li><li data-api-symbol="userulesmetrics"> <a href="#userulesmetrics">useRulesMetrics</a> </li><li data-api-symbol="usetrafficbuckets"> <a href="#usetrafficbuckets">useTrafficBuckets</a> </li><li data-api-symbol="usetrafficbucketsoptions"> <a href="#usetrafficbucketsoptions">UseTrafficBucketsOptions</a> </li><li data-api-symbol="usetrafficbucketsresult"> <a href="#usetrafficbucketsresult">UseTrafficBucketsResult</a> </li><li data-api-symbol="usetrafficfilter"> <a href="#usetrafficfilter">useTrafficFilter</a> </li><li data-api-symbol="usetrafficfilteroptions"> <a href="#usetrafficfilteroptions">UseTrafficFilterOptions</a> </li><li data-api-symbol="usetrafficfilterresult"> <a href="#usetrafficfilterresult">UseTrafficFilterResult</a> </li><li data-api-symbol="usetrafficgroups"> <a href="#usetrafficgroups">useTrafficGroups</a> </li><li data-api-symbol="usetrafficgroupsoptions"> <a href="#usetrafficgroupsoptions">UseTrafficGroupsOptions</a> </li><li data-api-symbol="usetrafficgroupsresult"> <a href="#usetrafficgroupsresult">UseTrafficGroupsResult</a> </li><li data-api-symbol="usetrafficmetricsoptions"> <a href="#usetrafficmetricsoptions">UseTrafficMetricsOptions</a> </li><li data-api-symbol="usetrafficmonitor"> <a href="#usetrafficmonitor">useTrafficMonitor</a> </li><li data-api-symbol="usetrafficmonitoroptions"> <a href="#usetrafficmonitoroptions">UseTrafficMonitorOptions</a> </li><li data-api-symbol="usetrafficmonitorresult"> <a href="#usetrafficmonitorresult">UseTrafficMonitorResult</a> </li><li data-api-symbol="usetrafficstats"> <a href="#usetrafficstats">useTrafficStats</a> </li><li data-api-symbol="usetrafficstatsoptions"> <a href="#usetrafficstatsoptions">UseTrafficStatsOptions</a> </li> </ul> </section> <p class="api-symbol-empty" data-api-symbol-empty hidden>No matching symbols</p> </div> </aside> </div> <script type="module">const a=document.querySelector("[data-api-symbol-filter]"),d=[...document.querySelectorAll("[data-api-symbol-group]")],n=document.querySelector("[data-api-symbol-empty]");a?.addEventListener("input",()=>{const t=a.value.trim().toLowerCase();let o=0;for(const i of d){let e=0;i.querySelectorAll("[data-api-symbol]").forEach(l=>{const r=!t||(l.dataset.apiSymbol??"").includes(t);l.hidden=!r,r&&e++}),i.hidden=e===0,o+=e}n&&(n.hidden=o>0)});</script> <script type="module">const s=new Map;document.querySelectorAll('.doc-toc a[href^="#"]').forEach(t=>s.set(decodeURIComponent(t.hash.slice(1)),t));if(s.size>0){const t=new Set,n=()=>{let o=null;for(const e of s.keys())if(t.has(e)){o=e;break}s.forEach((e,c)=>e.classList.toggle("active",c===o))},r=new IntersectionObserver(o=>{for(const e of o)e.isIntersecting?t.add(e.target.id):t.delete(e.target.id);n()},{rootMargin:"-72px 0px -60% 0px"});s.forEach((o,e)=>{const c=document.getElementById(e);c&&r.observe(c)})}</script> <script type="module">document.querySelector('.studio__nav [aria-current="page"]')?.scrollIntoView({block:"nearest",inline:"center"});</script> </body> </html>