@pyric/cli 0.1.0-alpha.10

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 (903) hide show
  1. package/LICENSE +216 -0
  2. package/README.md +180 -0
  3. package/README.md.orig +141 -0
  4. package/dist/assurance/.generated/conformance-verdicts.d.ts +1071 -0
  5. package/dist/assurance/.generated/conformance-verdicts.d.ts.map +1 -0
  6. package/dist/assurance/.generated/conformance-verdicts.js +1070 -0
  7. package/dist/assurance/.generated/conformance-verdicts.js.map +1 -0
  8. package/dist/assurance/attachment.d.ts +24 -0
  9. package/dist/assurance/attachment.d.ts.map +1 -0
  10. package/dist/assurance/attachment.js +138 -0
  11. package/dist/assurance/attachment.js.map +1 -0
  12. package/dist/assurance/browser.d.ts +7 -0
  13. package/dist/assurance/browser.d.ts.map +1 -0
  14. package/dist/assurance/browser.js +68 -0
  15. package/dist/assurance/browser.js.map +1 -0
  16. package/dist/assurance/campaign.d.ts +41 -0
  17. package/dist/assurance/campaign.d.ts.map +1 -0
  18. package/dist/assurance/campaign.js +364 -0
  19. package/dist/assurance/campaign.js.map +1 -0
  20. package/dist/assurance/capabilities.d.ts +11 -0
  21. package/dist/assurance/capabilities.d.ts.map +1 -0
  22. package/dist/assurance/capabilities.js +282 -0
  23. package/dist/assurance/capabilities.js.map +1 -0
  24. package/dist/assurance/cases.d.ts +14 -0
  25. package/dist/assurance/cases.d.ts.map +1 -0
  26. package/dist/assurance/cases.js +27 -0
  27. package/dist/assurance/cases.js.map +1 -0
  28. package/dist/assurance/index.d.ts +10 -0
  29. package/dist/assurance/index.d.ts.map +1 -0
  30. package/dist/assurance/index.js +9 -0
  31. package/dist/assurance/index.js.map +1 -0
  32. package/dist/assurance/runner.d.ts +3 -0
  33. package/dist/assurance/runner.d.ts.map +1 -0
  34. package/dist/assurance/runner.js +633 -0
  35. package/dist/assurance/runner.js.map +1 -0
  36. package/dist/assurance/tool-names.d.ts +4 -0
  37. package/dist/assurance/tool-names.d.ts.map +1 -0
  38. package/dist/assurance/tool-names.js +14 -0
  39. package/dist/assurance/tool-names.js.map +1 -0
  40. package/dist/assurance/tools.d.ts +19 -0
  41. package/dist/assurance/tools.d.ts.map +1 -0
  42. package/dist/assurance/tools.js +737 -0
  43. package/dist/assurance/tools.js.map +1 -0
  44. package/dist/assurance/types.d.ts +347 -0
  45. package/dist/assurance/types.d.ts.map +1 -0
  46. package/dist/assurance/types.js +7 -0
  47. package/dist/assurance/types.js.map +1 -0
  48. package/dist/assurance/validation.d.ts +8 -0
  49. package/dist/assurance/validation.d.ts.map +1 -0
  50. package/dist/assurance/validation.js +269 -0
  51. package/dist/assurance/validation.js.map +1 -0
  52. package/dist/bridge/client/bridge.d.ts +133 -0
  53. package/dist/bridge/client/bridge.d.ts.map +1 -0
  54. package/dist/bridge/client/bridge.js +429 -0
  55. package/dist/bridge/client/bridge.js.map +1 -0
  56. package/dist/bridge/client/dispatch.d.ts +41 -0
  57. package/dist/bridge/client/dispatch.d.ts.map +1 -0
  58. package/dist/bridge/client/dispatch.js +111 -0
  59. package/dist/bridge/client/dispatch.js.map +1 -0
  60. package/dist/bridge/client.d.ts +24 -0
  61. package/dist/bridge/client.d.ts.map +1 -0
  62. package/dist/bridge/client.js +26 -0
  63. package/dist/bridge/client.js.map +1 -0
  64. package/dist/bridge/protocol.d.ts +227 -0
  65. package/dist/bridge/protocol.d.ts.map +1 -0
  66. package/dist/bridge/protocol.js +131 -0
  67. package/dist/bridge/protocol.js.map +1 -0
  68. package/dist/bridge/server/audit.d.ts +19 -0
  69. package/dist/bridge/server/audit.d.ts.map +1 -0
  70. package/dist/bridge/server/audit.js +46 -0
  71. package/dist/bridge/server/audit.js.map +1 -0
  72. package/dist/bridge/server/bridge.d.ts +126 -0
  73. package/dist/bridge/server/bridge.d.ts.map +1 -0
  74. package/dist/bridge/server/bridge.js +383 -0
  75. package/dist/bridge/server/bridge.js.map +1 -0
  76. package/dist/bridge/server/headless.d.ts +36 -0
  77. package/dist/bridge/server/headless.d.ts.map +1 -0
  78. package/dist/bridge/server/headless.js +142 -0
  79. package/dist/bridge/server/headless.js.map +1 -0
  80. package/dist/bridge/server/json-schema-to-zod.d.ts +37 -0
  81. package/dist/bridge/server/json-schema-to-zod.d.ts.map +1 -0
  82. package/dist/bridge/server/json-schema-to-zod.js +93 -0
  83. package/dist/bridge/server/json-schema-to-zod.js.map +1 -0
  84. package/dist/bridge/server/local-bridge.d.ts +33 -0
  85. package/dist/bridge/server/local-bridge.d.ts.map +1 -0
  86. package/dist/bridge/server/local-bridge.js +41 -0
  87. package/dist/bridge/server/local-bridge.js.map +1 -0
  88. package/dist/bridge/server/logger.d.ts +28 -0
  89. package/dist/bridge/server/logger.d.ts.map +1 -0
  90. package/dist/bridge/server/logger.js +42 -0
  91. package/dist/bridge/server/logger.js.map +1 -0
  92. package/dist/bridge/server/mcp-contract.d.ts +21 -0
  93. package/dist/bridge/server/mcp-contract.d.ts.map +1 -0
  94. package/dist/bridge/server/mcp-contract.js +63 -0
  95. package/dist/bridge/server/mcp-contract.js.map +1 -0
  96. package/dist/bridge/server/mcp.d.ts +26 -0
  97. package/dist/bridge/server/mcp.d.ts.map +1 -0
  98. package/dist/bridge/server/mcp.js +102 -0
  99. package/dist/bridge/server/mcp.js.map +1 -0
  100. package/dist/bridge/server/peer.d.ts +39 -0
  101. package/dist/bridge/server/peer.d.ts.map +1 -0
  102. package/dist/bridge/server/peer.js +189 -0
  103. package/dist/bridge/server/peer.js.map +1 -0
  104. package/dist/bridge/server/standalone.d.ts +49 -0
  105. package/dist/bridge/server/standalone.d.ts.map +1 -0
  106. package/dist/bridge/server/standalone.js +267 -0
  107. package/dist/bridge/server/standalone.js.map +1 -0
  108. package/dist/bridge/server/tool-metadata.d.ts +38 -0
  109. package/dist/bridge/server/tool-metadata.d.ts.map +1 -0
  110. package/dist/bridge/server/tool-metadata.js +84 -0
  111. package/dist/bridge/server/tool-metadata.js.map +1 -0
  112. package/dist/bridge/server.d.ts +21 -0
  113. package/dist/bridge/server.d.ts.map +1 -0
  114. package/dist/bridge/server.js +18 -0
  115. package/dist/bridge/server.js.map +1 -0
  116. package/dist/cli/can-i-use.d.ts +5 -0
  117. package/dist/cli/can-i-use.d.ts.map +1 -0
  118. package/dist/cli/can-i-use.js +49 -0
  119. package/dist/cli/can-i-use.js.map +1 -0
  120. package/dist/cli/database-rules.d.ts +43 -0
  121. package/dist/cli/database-rules.d.ts.map +1 -0
  122. package/dist/cli/database-rules.js +261 -0
  123. package/dist/cli/database-rules.js.map +1 -0
  124. package/dist/cli/dev-runner.d.ts +112 -0
  125. package/dist/cli/dev-runner.d.ts.map +1 -0
  126. package/dist/cli/dev-runner.js +239 -0
  127. package/dist/cli/dev-runner.js.map +1 -0
  128. package/dist/cli/firebase-json.d.ts +66 -0
  129. package/dist/cli/firebase-json.d.ts.map +1 -0
  130. package/dist/cli/firebase-json.js +60 -0
  131. package/dist/cli/firebase-json.js.map +1 -0
  132. package/dist/cli/firestore-indexes.d.ts +21 -0
  133. package/dist/cli/firestore-indexes.d.ts.map +1 -0
  134. package/dist/cli/firestore-indexes.js +39 -0
  135. package/dist/cli/firestore-indexes.js.map +1 -0
  136. package/dist/cli/index.d.ts +56 -0
  137. package/dist/cli/index.d.ts.map +1 -0
  138. package/dist/cli/index.js +387 -0
  139. package/dist/cli/index.js.map +1 -0
  140. package/dist/cli/init.d.ts +50 -0
  141. package/dist/cli/init.d.ts.map +1 -0
  142. package/dist/cli/init.js +182 -0
  143. package/dist/cli/init.js.map +1 -0
  144. package/dist/cli/mcp-proxy.d.ts +10 -0
  145. package/dist/cli/mcp-proxy.d.ts.map +1 -0
  146. package/dist/cli/mcp-proxy.js +129 -0
  147. package/dist/cli/mcp-proxy.js.map +1 -0
  148. package/dist/cli/parse-args.d.ts +20 -0
  149. package/dist/cli/parse-args.d.ts.map +1 -0
  150. package/dist/cli/parse-args.js +74 -0
  151. package/dist/cli/parse-args.js.map +1 -0
  152. package/dist/cli/rules.d.ts +55 -0
  153. package/dist/cli/rules.d.ts.map +1 -0
  154. package/dist/cli/rules.js +199 -0
  155. package/dist/cli/rules.js.map +1 -0
  156. package/dist/cli/scope.d.ts +12 -0
  157. package/dist/cli/scope.d.ts.map +1 -0
  158. package/dist/cli/scope.js +44 -0
  159. package/dist/cli/scope.js.map +1 -0
  160. package/dist/cli/serve.d.ts +122 -0
  161. package/dist/cli/serve.d.ts.map +1 -0
  162. package/dist/cli/serve.js +844 -0
  163. package/dist/cli/serve.js.map +1 -0
  164. package/dist/cli/service-commands.d.ts +8 -0
  165. package/dist/cli/service-commands.d.ts.map +1 -0
  166. package/dist/cli/service-commands.js +58 -0
  167. package/dist/cli/service-commands.js.map +1 -0
  168. package/dist/cli/snapshot.d.ts +22 -0
  169. package/dist/cli/snapshot.d.ts.map +1 -0
  170. package/dist/cli/snapshot.js +139 -0
  171. package/dist/cli/snapshot.js.map +1 -0
  172. package/dist/cli/storage-rules.d.ts +21 -0
  173. package/dist/cli/storage-rules.d.ts.map +1 -0
  174. package/dist/cli/storage-rules.js +121 -0
  175. package/dist/cli/storage-rules.js.map +1 -0
  176. package/dist/cli/verify.d.ts +23 -0
  177. package/dist/cli/verify.d.ts.map +1 -0
  178. package/dist/cli/verify.js +349 -0
  179. package/dist/cli/verify.js.map +1 -0
  180. package/dist/conformance/.generated/can-i-use-browser.d.ts +44 -0
  181. package/dist/conformance/.generated/can-i-use-browser.d.ts.map +1 -0
  182. package/dist/conformance/.generated/can-i-use-browser.js +67 -0
  183. package/dist/conformance/.generated/can-i-use-browser.js.map +1 -0
  184. package/dist/conformance/.generated/can-i-use.d.ts +61 -0
  185. package/dist/conformance/.generated/can-i-use.d.ts.map +1 -0
  186. package/dist/conformance/.generated/can-i-use.js +68 -0
  187. package/dist/conformance/.generated/can-i-use.js.map +1 -0
  188. package/dist/conformance/browser.d.ts +7 -0
  189. package/dist/conformance/browser.d.ts.map +1 -0
  190. package/dist/conformance/browser.js +8 -0
  191. package/dist/conformance/browser.js.map +1 -0
  192. package/dist/conformance/can-i-use-tool.d.ts +21 -0
  193. package/dist/conformance/can-i-use-tool.d.ts.map +1 -0
  194. package/dist/conformance/can-i-use-tool.js +40 -0
  195. package/dist/conformance/can-i-use-tool.js.map +1 -0
  196. package/dist/conformance/can-i-use.d.ts +6 -0
  197. package/dist/conformance/can-i-use.d.ts.map +1 -0
  198. package/dist/conformance/can-i-use.js +10 -0
  199. package/dist/conformance/can-i-use.js.map +1 -0
  200. package/dist/conformance/index.d.ts +8 -0
  201. package/dist/conformance/index.d.ts.map +1 -0
  202. package/dist/conformance/index.js +2 -0
  203. package/dist/conformance/index.js.map +1 -0
  204. package/dist/conformance/tools.d.ts +4 -0
  205. package/dist/conformance/tools.d.ts.map +1 -0
  206. package/dist/conformance/tools.js +14 -0
  207. package/dist/conformance/tools.js.map +1 -0
  208. package/dist/credentials/core/memoize-ttl.d.ts +58 -0
  209. package/dist/credentials/core/memoize-ttl.d.ts.map +1 -0
  210. package/dist/credentials/core/memoize-ttl.js +88 -0
  211. package/dist/credentials/core/memoize-ttl.js.map +1 -0
  212. package/dist/credentials/core/types.d.ts +11 -0
  213. package/dist/credentials/core/types.d.ts.map +1 -0
  214. package/dist/credentials/core/types.js +2 -0
  215. package/dist/credentials/core/types.js.map +1 -0
  216. package/dist/credentials/node/from-adc.d.ts +10 -0
  217. package/dist/credentials/node/from-adc.d.ts.map +1 -0
  218. package/dist/credentials/node/from-adc.js +76 -0
  219. package/dist/credentials/node/from-adc.js.map +1 -0
  220. package/dist/credentials/node/from-service-account.d.ts +24 -0
  221. package/dist/credentials/node/from-service-account.d.ts.map +1 -0
  222. package/dist/credentials/node/from-service-account.js +108 -0
  223. package/dist/credentials/node/from-service-account.js.map +1 -0
  224. package/dist/credentials/node/index.d.ts +7 -0
  225. package/dist/credentials/node/index.d.ts.map +1 -0
  226. package/dist/credentials/node/index.js +7 -0
  227. package/dist/credentials/node/index.js.map +1 -0
  228. package/dist/discover/concurrency.d.ts +42 -0
  229. package/dist/discover/concurrency.d.ts.map +1 -0
  230. package/dist/discover/concurrency.js +113 -0
  231. package/dist/discover/concurrency.js.map +1 -0
  232. package/dist/discover/crawler-adapter.d.ts +48 -0
  233. package/dist/discover/crawler-adapter.d.ts.map +1 -0
  234. package/dist/discover/crawler-adapter.js +92 -0
  235. package/dist/discover/crawler-adapter.js.map +1 -0
  236. package/dist/discover/crawler.d.ts +294 -0
  237. package/dist/discover/crawler.d.ts.map +1 -0
  238. package/dist/discover/crawler.js +764 -0
  239. package/dist/discover/crawler.js.map +1 -0
  240. package/dist/discover/credential-free.d.ts +19 -0
  241. package/dist/discover/credential-free.d.ts.map +1 -0
  242. package/dist/discover/credential-free.js +18 -0
  243. package/dist/discover/credential-free.js.map +1 -0
  244. package/dist/discover/findCollectionGroup.d.ts +44 -0
  245. package/dist/discover/findCollectionGroup.d.ts.map +1 -0
  246. package/dist/discover/findCollectionGroup.js +81 -0
  247. package/dist/discover/findCollectionGroup.js.map +1 -0
  248. package/dist/discover/firestore-source.d.ts +60 -0
  249. package/dist/discover/firestore-source.d.ts.map +1 -0
  250. package/dist/discover/firestore-source.js +11 -0
  251. package/dist/discover/firestore-source.js.map +1 -0
  252. package/dist/discover/index.d.ts +3 -0
  253. package/dist/discover/index.d.ts.map +1 -0
  254. package/dist/discover/index.js +5 -0
  255. package/dist/discover/index.js.map +1 -0
  256. package/dist/discover/merge.d.ts +108 -0
  257. package/dist/discover/merge.d.ts.map +1 -0
  258. package/dist/discover/merge.js +394 -0
  259. package/dist/discover/merge.js.map +1 -0
  260. package/dist/discover/session.d.ts +116 -0
  261. package/dist/discover/session.d.ts.map +1 -0
  262. package/dist/discover/session.js +331 -0
  263. package/dist/discover/session.js.map +1 -0
  264. package/dist/discover/tools.d.ts +58 -0
  265. package/dist/discover/tools.d.ts.map +1 -0
  266. package/dist/discover/tools.js +115 -0
  267. package/dist/discover/tools.js.map +1 -0
  268. package/dist/discover/types.d.ts +190 -0
  269. package/dist/discover/types.d.ts.map +1 -0
  270. package/dist/discover/types.js +12 -0
  271. package/dist/discover/types.js.map +1 -0
  272. package/dist/discover/wire.d.ts +70 -0
  273. package/dist/discover/wire.d.ts.map +1 -0
  274. package/dist/discover/wire.js +309 -0
  275. package/dist/discover/wire.js.map +1 -0
  276. package/dist/functions-rtdb/child.d.ts +52 -0
  277. package/dist/functions-rtdb/child.d.ts.map +1 -0
  278. package/dist/functions-rtdb/child.js +283 -0
  279. package/dist/functions-rtdb/child.js.map +1 -0
  280. package/dist/functions-rtdb/delivery.d.ts +4 -0
  281. package/dist/functions-rtdb/delivery.d.ts.map +1 -0
  282. package/dist/functions-rtdb/delivery.js +2 -0
  283. package/dist/functions-rtdb/delivery.js.map +1 -0
  284. package/dist/functions-rtdb/discovery.d.ts +41 -0
  285. package/dist/functions-rtdb/discovery.d.ts.map +1 -0
  286. package/dist/functions-rtdb/discovery.js +86 -0
  287. package/dist/functions-rtdb/discovery.js.map +1 -0
  288. package/dist/functions-rtdb/event.d.ts +20 -0
  289. package/dist/functions-rtdb/event.d.ts.map +1 -0
  290. package/dist/functions-rtdb/event.js +45 -0
  291. package/dist/functions-rtdb/event.js.map +1 -0
  292. package/dist/functions-rtdb/execution.d.ts +20 -0
  293. package/dist/functions-rtdb/execution.d.ts.map +1 -0
  294. package/dist/functions-rtdb/execution.js +70 -0
  295. package/dist/functions-rtdb/execution.js.map +1 -0
  296. package/dist/functions-rtdb/in-memory-delivery.d.ts +9 -0
  297. package/dist/functions-rtdb/in-memory-delivery.d.ts.map +1 -0
  298. package/dist/functions-rtdb/in-memory-delivery.js +36 -0
  299. package/dist/functions-rtdb/in-memory-delivery.js.map +1 -0
  300. package/dist/functions-rtdb/project.d.ts +7 -0
  301. package/dist/functions-rtdb/project.d.ts.map +1 -0
  302. package/dist/functions-rtdb/project.js +54 -0
  303. package/dist/functions-rtdb/project.js.map +1 -0
  304. package/dist/functions-rtdb/projection.d.ts +14 -0
  305. package/dist/functions-rtdb/projection.d.ts.map +1 -0
  306. package/dist/functions-rtdb/projection.js +65 -0
  307. package/dist/functions-rtdb/projection.js.map +1 -0
  308. package/dist/functions-rtdb/reference-pattern.d.ts +5 -0
  309. package/dist/functions-rtdb/reference-pattern.d.ts.map +1 -0
  310. package/dist/functions-rtdb/reference-pattern.js +14 -0
  311. package/dist/functions-rtdb/reference-pattern.js.map +1 -0
  312. package/dist/functions-rtdb/remote-delivery.d.ts +9 -0
  313. package/dist/functions-rtdb/remote-delivery.d.ts.map +1 -0
  314. package/dist/functions-rtdb/remote-delivery.js +11 -0
  315. package/dist/functions-rtdb/remote-delivery.js.map +1 -0
  316. package/dist/pkg-version.d.ts +2 -0
  317. package/dist/pkg-version.d.ts.map +1 -0
  318. package/dist/pkg-version.js +47 -0
  319. package/dist/pkg-version.js.map +1 -0
  320. package/dist/register/esm-exports.d.ts +26 -0
  321. package/dist/register/esm-exports.d.ts.map +1 -0
  322. package/dist/register/esm-exports.js +61 -0
  323. package/dist/register/esm-exports.js.map +1 -0
  324. package/dist/register/hooks.d.ts +13 -0
  325. package/dist/register/hooks.d.ts.map +1 -0
  326. package/dist/register/hooks.js +15 -0
  327. package/dist/register/hooks.js.map +1 -0
  328. package/dist/register/index.d.ts +5 -0
  329. package/dist/register/index.d.ts.map +1 -0
  330. package/dist/register/index.js +124 -0
  331. package/dist/register/index.js.map +1 -0
  332. package/dist/register/mapping.d.ts +19 -0
  333. package/dist/register/mapping.d.ts.map +1 -0
  334. package/dist/register/mapping.js +35 -0
  335. package/dist/register/mapping.js.map +1 -0
  336. package/dist/remote/index.d.ts +232 -0
  337. package/dist/remote/index.d.ts.map +1 -0
  338. package/dist/remote/index.js +720 -0
  339. package/dist/remote/index.js.map +1 -0
  340. package/dist/rtdb/crawl-snapshot.d.ts +17 -0
  341. package/dist/rtdb/crawl-snapshot.d.ts.map +1 -0
  342. package/dist/rtdb/crawl-snapshot.js +72 -0
  343. package/dist/rtdb/crawl-snapshot.js.map +1 -0
  344. package/dist/rtdb/inspection.d.ts +8 -0
  345. package/dist/rtdb/inspection.d.ts.map +1 -0
  346. package/dist/rtdb/inspection.js +111 -0
  347. package/dist/rtdb/inspection.js.map +1 -0
  348. package/dist/rtdb/load-rules-document.d.ts +25 -0
  349. package/dist/rtdb/load-rules-document.d.ts.map +1 -0
  350. package/dist/rtdb/load-rules-document.js +38 -0
  351. package/dist/rtdb/load-rules-document.js.map +1 -0
  352. package/dist/rtdb/rules-generation-tool.d.ts +4 -0
  353. package/dist/rtdb/rules-generation-tool.d.ts.map +1 -0
  354. package/dist/rtdb/rules-generation-tool.js +35 -0
  355. package/dist/rtdb/rules-generation-tool.js.map +1 -0
  356. package/dist/rtdb/rules-json.d.ts +8 -0
  357. package/dist/rtdb/rules-json.d.ts.map +1 -0
  358. package/dist/rtdb/rules-json.js +17 -0
  359. package/dist/rtdb/rules-json.js.map +1 -0
  360. package/dist/serve/bridge-mount.d.ts +36 -0
  361. package/dist/serve/bridge-mount.d.ts.map +1 -0
  362. package/dist/serve/bridge-mount.js +162 -0
  363. package/dist/serve/bridge-mount.js.map +1 -0
  364. package/dist/serve/bundler.d.ts +110 -0
  365. package/dist/serve/bundler.d.ts.map +1 -0
  366. package/dist/serve/bundler.js +432 -0
  367. package/dist/serve/bundler.js.map +1 -0
  368. package/dist/serve/capture-store.d.ts +27 -0
  369. package/dist/serve/capture-store.d.ts.map +1 -0
  370. package/dist/serve/capture-store.js +47 -0
  371. package/dist/serve/capture-store.js.map +1 -0
  372. package/dist/serve/discovery.d.ts +71 -0
  373. package/dist/serve/discovery.d.ts.map +1 -0
  374. package/dist/serve/discovery.js +158 -0
  375. package/dist/serve/discovery.js.map +1 -0
  376. package/dist/serve/docs-ui/_astro/_slug_.DPUwShm2.css +1 -0
  377. package/dist/serve/docs-ui/docs/_rhythm/index.html +99 -0
  378. package/dist/serve/docs-ui/docs/_rhythm.md +97 -0
  379. package/dist/serve/docs-ui/docs/agent/set-up-your-agent/index.html +42 -0
  380. package/dist/serve/docs-ui/docs/agent/set-up-your-agent.md +72 -0
  381. package/dist/serve/docs-ui/docs/agent/watch-and-review/index.html +25 -0
  382. package/dist/serve/docs-ui/docs/agent/watch-and-review.md +38 -0
  383. package/dist/serve/docs-ui/docs/agent/work-with-an-agent/index.html +69 -0
  384. package/dist/serve/docs-ui/docs/agent/work-with-an-agent.md +74 -0
  385. package/dist/serve/docs-ui/docs/ai-compat/index.html +423 -0
  386. package/dist/serve/docs-ui/docs/ai-compat.md +456 -0
  387. package/dist/serve/docs-ui/docs/api-reference/index.html +66 -0
  388. package/dist/serve/docs-ui/docs/api-reference.md +69 -0
  389. package/dist/serve/docs-ui/docs/app-compat/index.html +159 -0
  390. package/dist/serve/docs-ui/docs/app-compat.md +178 -0
  391. package/dist/serve/docs-ui/docs/auth-compat/index.html +644 -0
  392. package/dist/serve/docs-ui/docs/auth-compat.md +701 -0
  393. package/dist/serve/docs-ui/docs/build/ai-logic/index.html +27 -0
  394. package/dist/serve/docs-ui/docs/build/ai-logic.md +39 -0
  395. package/dist/serve/docs-ui/docs/build/authentication/index.html +65 -0
  396. package/dist/serve/docs-ui/docs/build/authentication.md +95 -0
  397. package/dist/serve/docs-ui/docs/build/cloud-firestore/index.html +69 -0
  398. package/dist/serve/docs-ui/docs/build/cloud-firestore.md +93 -0
  399. package/dist/serve/docs-ui/docs/build/cloud-messaging/index.html +27 -0
  400. package/dist/serve/docs-ui/docs/build/cloud-messaging.md +37 -0
  401. package/dist/serve/docs-ui/docs/build/cloud-storage/index.html +65 -0
  402. package/dist/serve/docs-ui/docs/build/cloud-storage.md +86 -0
  403. package/dist/serve/docs-ui/docs/build/realtime-database/index.html +49 -0
  404. package/dist/serve/docs-ui/docs/build/realtime-database.md +67 -0
  405. package/dist/serve/docs-ui/docs/conformance-scores/index.html +49 -0
  406. package/dist/serve/docs-ui/docs/conformance-scores.md +53 -0
  407. package/dist/serve/docs-ui/docs/create-pyric-reference-api/index.html +498 -0
  408. package/dist/serve/docs-ui/docs/create-pyric-reference-api.md +345 -0
  409. package/dist/serve/docs-ui/docs/database-compat/index.html +1037 -0
  410. package/dist/serve/docs-ui/docs/database-compat.md +1099 -0
  411. package/dist/serve/docs-ui/docs/firestore-compat/index.html +823 -0
  412. package/dist/serve/docs-ui/docs/firestore-compat.md +881 -0
  413. package/dist/serve/docs-ui/docs/functions-rtdb-compat/index.html +72 -0
  414. package/dist/serve/docs-ui/docs/functions-rtdb-compat.md +83 -0
  415. package/dist/serve/docs-ui/docs/get-started/how-the-swap-works/index.html +27 -0
  416. package/dist/serve/docs-ui/docs/get-started/how-the-swap-works.md +50 -0
  417. package/dist/serve/docs-ui/docs/get-started/start-building/index.html +31 -0
  418. package/dist/serve/docs-ui/docs/get-started/start-building.md +53 -0
  419. package/dist/serve/docs-ui/docs/index.html +2 -0
  420. package/dist/serve/docs-ui/docs/index.json +11719 -0
  421. package/dist/serve/docs-ui/docs/messaging-compat/index.html +264 -0
  422. package/dist/serve/docs-ui/docs/messaging-compat.md +285 -0
  423. package/dist/serve/docs-ui/docs/observe/see-whats-happening/index.html +73 -0
  424. package/dist/serve/docs-ui/docs/observe/see-whats-happening.md +69 -0
  425. package/dist/serve/docs-ui/docs/observe/shape-your-data/index.html +44 -0
  426. package/dist/serve/docs-ui/docs/observe/shape-your-data.md +74 -0
  427. package/dist/serve/docs-ui/docs/overview/index.html +16 -0
  428. package/dist/serve/docs-ui/docs/overview.md +31 -0
  429. package/dist/serve/docs-ui/docs/pyric-admin-app-reference-api/index.html +185 -0
  430. package/dist/serve/docs-ui/docs/pyric-admin-app-reference-api.md +206 -0
  431. package/dist/serve/docs-ui/docs/pyric-admin-auth-reference-api/index.html +617 -0
  432. package/dist/serve/docs-ui/docs/pyric-admin-auth-reference-api.md +441 -0
  433. package/dist/serve/docs-ui/docs/pyric-admin-database-reference-api/index.html +583 -0
  434. package/dist/serve/docs-ui/docs/pyric-admin-database-reference-api.md +597 -0
  435. package/dist/serve/docs-ui/docs/pyric-admin-firestore-reference-api/index.html +32 -0
  436. package/dist/serve/docs-ui/docs/pyric-admin-firestore-reference-api.md +30 -0
  437. package/dist/serve/docs-ui/docs/pyric-admin-storage-reference-api/index.html +317 -0
  438. package/dist/serve/docs-ui/docs/pyric-admin-storage-reference-api.md +285 -0
  439. package/dist/serve/docs-ui/docs/pyric-ai-reference-api/index.html +5830 -0
  440. package/dist/serve/docs-ui/docs/pyric-ai-reference-api.md +5439 -0
  441. package/dist/serve/docs-ui/docs/pyric-ai-scripting-reference-api/index.html +159 -0
  442. package/dist/serve/docs-ui/docs/pyric-ai-scripting-reference-api.md +122 -0
  443. package/dist/serve/docs-ui/docs/pyric-app-reference-api/index.html +420 -0
  444. package/dist/serve/docs-ui/docs/pyric-app-reference-api.md +326 -0
  445. package/dist/serve/docs-ui/docs/pyric-auth-reference-api/index.html +5452 -0
  446. package/dist/serve/docs-ui/docs/pyric-auth-reference-api.md +5271 -0
  447. package/dist/serve/docs-ui/docs/pyric-cli-assurance-browser-reference-api/index.html +98 -0
  448. package/dist/serve/docs-ui/docs/pyric-cli-assurance-browser-reference-api.md +88 -0
  449. package/dist/serve/docs-ui/docs/pyric-cli-assurance-reference-api/index.html +2263 -0
  450. package/dist/serve/docs-ui/docs/pyric-cli-assurance-reference-api.md +1477 -0
  451. package/dist/serve/docs-ui/docs/pyric-cli-bridge-client-reference-api/index.html +546 -0
  452. package/dist/serve/docs-ui/docs/pyric-cli-bridge-client-reference-api.md +485 -0
  453. package/dist/serve/docs-ui/docs/pyric-cli-bridge-reference-api/index.html +506 -0
  454. package/dist/serve/docs-ui/docs/pyric-cli-bridge-reference-api.md +419 -0
  455. package/dist/serve/docs-ui/docs/pyric-cli-conformance-browser-reference-api/index.html +257 -0
  456. package/dist/serve/docs-ui/docs/pyric-cli-conformance-browser-reference-api.md +197 -0
  457. package/dist/serve/docs-ui/docs/pyric-cli-conformance-reference-api/index.html +307 -0
  458. package/dist/serve/docs-ui/docs/pyric-cli-conformance-reference-api.md +254 -0
  459. package/dist/serve/docs-ui/docs/pyric-cli-credentials-node-reference-api/index.html +67 -0
  460. package/dist/serve/docs-ui/docs/pyric-cli-credentials-node-reference-api.md +59 -0
  461. package/dist/serve/docs-ui/docs/pyric-cli-discover-reference-api/index.html +2355 -0
  462. package/dist/serve/docs-ui/docs/pyric-cli-discover-reference-api.md +2036 -0
  463. package/dist/serve/docs-ui/docs/pyric-cli-register-reference-api/index.html +10 -0
  464. package/dist/serve/docs-ui/docs/pyric-cli-register-reference-api.md +16 -0
  465. package/dist/serve/docs-ui/docs/pyric-cli-remote-reference-api/index.html +1044 -0
  466. package/dist/serve/docs-ui/docs/pyric-cli-remote-reference-api.md +952 -0
  467. package/dist/serve/docs-ui/docs/pyric-cli-serve-worker-reference-api/index.html +5041 -0
  468. package/dist/serve/docs-ui/docs/pyric-cli-serve-worker-reference-api.md +4739 -0
  469. package/dist/serve/docs-ui/docs/pyric-cli-verify-reference-api/index.html +926 -0
  470. package/dist/serve/docs-ui/docs/pyric-cli-verify-reference-api.md +586 -0
  471. package/dist/serve/docs-ui/docs/pyric-cli-vite-reference-api/index.html +102 -0
  472. package/dist/serve/docs-ui/docs/pyric-cli-vite-reference-api.md +76 -0
  473. package/dist/serve/docs-ui/docs/pyric-database-reference-api/index.html +1851 -0
  474. package/dist/serve/docs-ui/docs/pyric-database-reference-api.md +1842 -0
  475. package/dist/serve/docs-ui/docs/pyric-firestore-reference-api/index.html +3623 -0
  476. package/dist/serve/docs-ui/docs/pyric-firestore-reference-api.md +3399 -0
  477. package/dist/serve/docs-ui/docs/pyric-firestore-values-reference-api/index.html +30 -0
  478. package/dist/serve/docs-ui/docs/pyric-firestore-values-reference-api.md +30 -0
  479. package/dist/serve/docs-ui/docs/pyric-messaging-reference-api/index.html +508 -0
  480. package/dist/serve/docs-ui/docs/pyric-messaging-reference-api.md +374 -0
  481. package/dist/serve/docs-ui/docs/pyric-messaging-sw-reference-api/index.html +482 -0
  482. package/dist/serve/docs-ui/docs/pyric-messaging-sw-reference-api.md +348 -0
  483. package/dist/serve/docs-ui/docs/pyric-rules-reference-api/index.html +2629 -0
  484. package/dist/serve/docs-ui/docs/pyric-rules-reference-api.md +2213 -0
  485. package/dist/serve/docs-ui/docs/pyric-sandbox-database-reference-api/index.html +120 -0
  486. package/dist/serve/docs-ui/docs/pyric-sandbox-database-reference-api.md +110 -0
  487. package/dist/serve/docs-ui/docs/pyric-sandbox-firestore-reference-api/index.html +202 -0
  488. package/dist/serve/docs-ui/docs/pyric-sandbox-firestore-reference-api.md +134 -0
  489. package/dist/serve/docs-ui/docs/pyric-sandbox-reference-api/index.html +5019 -0
  490. package/dist/serve/docs-ui/docs/pyric-sandbox-reference-api.md +4060 -0
  491. package/dist/serve/docs-ui/docs/pyric-storage-reference-api/index.html +2120 -0
  492. package/dist/serve/docs-ui/docs/pyric-storage-reference-api.md +1687 -0
  493. package/dist/serve/docs-ui/docs/pyric-ui-agents-reference-api/index.html +638 -0
  494. package/dist/serve/docs-ui/docs/pyric-ui-agents-reference-api.md +430 -0
  495. package/dist/serve/docs-ui/docs/pyric-ui-auth-hooks-reference-api/index.html +813 -0
  496. package/dist/serve/docs-ui/docs/pyric-ui-auth-hooks-reference-api.md +634 -0
  497. package/dist/serve/docs-ui/docs/pyric-ui-auth-reference-api/index.html +1708 -0
  498. package/dist/serve/docs-ui/docs/pyric-ui-auth-reference-api.md +1300 -0
  499. package/dist/serve/docs-ui/docs/pyric-ui-events-hooks-reference-api/index.html +177 -0
  500. package/dist/serve/docs-ui/docs/pyric-ui-events-hooks-reference-api.md +111 -0
  501. package/dist/serve/docs-ui/docs/pyric-ui-events-reference-api/index.html +1542 -0
  502. package/dist/serve/docs-ui/docs/pyric-ui-events-reference-api.md +903 -0
  503. package/dist/serve/docs-ui/docs/pyric-ui-firestore-hooks-reference-api/index.html +1024 -0
  504. package/dist/serve/docs-ui/docs/pyric-ui-firestore-hooks-reference-api.md +640 -0
  505. package/dist/serve/docs-ui/docs/pyric-ui-firestore-reference-api/index.html +2753 -0
  506. package/dist/serve/docs-ui/docs/pyric-ui-firestore-reference-api.md +2171 -0
  507. package/dist/serve/docs-ui/docs/pyric-ui-primitives-reference-api/index.html +1005 -0
  508. package/dist/serve/docs-ui/docs/pyric-ui-primitives-reference-api.md +693 -0
  509. package/dist/serve/docs-ui/docs/pyric-ui-rtdb-reference-api/index.html +1388 -0
  510. package/dist/serve/docs-ui/docs/pyric-ui-rtdb-reference-api.md +1340 -0
  511. package/dist/serve/docs-ui/docs/pyric-ui-rules-hooks-reference-api/index.html +131 -0
  512. package/dist/serve/docs-ui/docs/pyric-ui-rules-hooks-reference-api.md +76 -0
  513. package/dist/serve/docs-ui/docs/pyric-ui-rules-reference-api/index.html +648 -0
  514. package/dist/serve/docs-ui/docs/pyric-ui-rules-reference-api.md +508 -0
  515. package/dist/serve/docs-ui/docs/pyric-ui-storage-hooks-reference-api/index.html +1457 -0
  516. package/dist/serve/docs-ui/docs/pyric-ui-storage-hooks-reference-api.md +1029 -0
  517. package/dist/serve/docs-ui/docs/pyric-ui-storage-reference-api/index.html +2476 -0
  518. package/dist/serve/docs-ui/docs/pyric-ui-storage-reference-api.md +1919 -0
  519. package/dist/serve/docs-ui/docs/pyric-ui-traffic-hooks-reference-api/index.html +1241 -0
  520. package/dist/serve/docs-ui/docs/pyric-ui-traffic-hooks-reference-api.md +817 -0
  521. package/dist/serve/docs-ui/docs/pyric-ui-traffic-reference-api/index.html +2289 -0
  522. package/dist/serve/docs-ui/docs/pyric-ui-traffic-reference-api.md +1489 -0
  523. package/dist/serve/docs-ui/docs/rules-compat/index.html +272 -0
  524. package/dist/serve/docs-ui/docs/rules-compat.md +287 -0
  525. package/dist/serve/docs-ui/docs/secure/audit-your-rules/index.html +34 -0
  526. package/dist/serve/docs-ui/docs/secure/audit-your-rules.md +67 -0
  527. package/dist/serve/docs-ui/docs/secure/firestore-rules-limits/index.html +105 -0
  528. package/dist/serve/docs-ui/docs/secure/firestore-rules-limits.md +152 -0
  529. package/dist/serve/docs-ui/docs/secure/read-a-denial/index.html +40 -0
  530. package/dist/serve/docs-ui/docs/secure/read-a-denial.md +58 -0
  531. package/dist/serve/docs-ui/docs/secure/rtdb-rules-in-typescript/index.html +66 -0
  532. package/dist/serve/docs-ui/docs/secure/rtdb-rules-in-typescript.md +89 -0
  533. package/dist/serve/docs-ui/docs/secure/rules-standard-library/index.html +158 -0
  534. package/dist/serve/docs-ui/docs/secure/rules-standard-library.md +116 -0
  535. package/dist/serve/docs-ui/docs/secure/secure-it-with-rules/index.html +46 -0
  536. package/dist/serve/docs-ui/docs/secure/secure-it-with-rules.md +51 -0
  537. package/dist/serve/docs-ui/docs/secure/simulate-and-lint/index.html +94 -0
  538. package/dist/serve/docs-ui/docs/secure/simulate-and-lint.md +86 -0
  539. package/dist/serve/docs-ui/docs/secure/write-a-rules-test-suite/index.html +81 -0
  540. package/dist/serve/docs-ui/docs/secure/write-a-rules-test-suite.md +105 -0
  541. package/dist/serve/docs-ui/docs/ship/ship-to-production/index.html +36 -0
  542. package/dist/serve/docs-ui/docs/ship/ship-to-production.md +64 -0
  543. package/dist/serve/docs-ui/docs/ship/test-in-node/index.html +74 -0
  544. package/dist/serve/docs-ui/docs/ship/test-in-node.md +94 -0
  545. package/dist/serve/docs-ui/docs/storage-compat/index.html +532 -0
  546. package/dist/serve/docs-ui/docs/storage-compat.md +577 -0
  547. package/dist/serve/docs-ui/docs/trust/how-we-know-it-matches-firebase/index.html +131 -0
  548. package/dist/serve/docs-ui/docs/trust/how-we-know-it-matches-firebase.md +155 -0
  549. package/dist/serve/docs-ui/docs/trust/versioning-and-compatibility/index.html +13 -0
  550. package/dist/serve/docs-ui/docs/trust/versioning-and-compatibility.md +21 -0
  551. package/dist/serve/docs-ui/index.html +1 -0
  552. package/dist/serve/docs-ui/llms.txt +123 -0
  553. package/dist/serve/entries/ai.d.ts +4 -0
  554. package/dist/serve/entries/ai.d.ts.map +1 -0
  555. package/dist/serve/entries/ai.js +184 -0
  556. package/dist/serve/entries/ai.js.map +1 -0
  557. package/dist/serve/entries/app-backend.d.ts +2 -0
  558. package/dist/serve/entries/app-backend.d.ts.map +1 -0
  559. package/dist/serve/entries/app-backend.js +4 -0
  560. package/dist/serve/entries/app-backend.js.map +1 -0
  561. package/dist/serve/entries/app-client.d.ts +5 -0
  562. package/dist/serve/entries/app-client.d.ts.map +1 -0
  563. package/dist/serve/entries/app-client.js +23 -0
  564. package/dist/serve/entries/app-client.js.map +1 -0
  565. package/dist/serve/entries/app-session-store.d.ts +14 -0
  566. package/dist/serve/entries/app-session-store.d.ts.map +1 -0
  567. package/dist/serve/entries/app-session-store.js +37 -0
  568. package/dist/serve/entries/app-session-store.js.map +1 -0
  569. package/dist/serve/entries/app.d.ts +2 -0
  570. package/dist/serve/entries/app.d.ts.map +1 -0
  571. package/dist/serve/entries/app.js +10 -0
  572. package/dist/serve/entries/app.js.map +1 -0
  573. package/dist/serve/entries/auth-helper-core.d.ts +52 -0
  574. package/dist/serve/entries/auth-helper-core.d.ts.map +1 -0
  575. package/dist/serve/entries/auth-helper-core.js +118 -0
  576. package/dist/serve/entries/auth-helper-core.js.map +1 -0
  577. package/dist/serve/entries/auth-helper-dom.d.ts +14 -0
  578. package/dist/serve/entries/auth-helper-dom.d.ts.map +1 -0
  579. package/dist/serve/entries/auth-helper-dom.js +116 -0
  580. package/dist/serve/entries/auth-helper-dom.js.map +1 -0
  581. package/dist/serve/entries/auth-helper-runtime.d.ts +5 -0
  582. package/dist/serve/entries/auth-helper-runtime.d.ts.map +1 -0
  583. package/dist/serve/entries/auth-helper-runtime.js +11 -0
  584. package/dist/serve/entries/auth-helper-runtime.js.map +1 -0
  585. package/dist/serve/entries/auth.d.ts +77 -0
  586. package/dist/serve/entries/auth.d.ts.map +1 -0
  587. package/dist/serve/entries/auth.js +201 -0
  588. package/dist/serve/entries/auth.js.map +1 -0
  589. package/dist/serve/entries/bridge-url.d.ts +25 -0
  590. package/dist/serve/entries/bridge-url.d.ts.map +1 -0
  591. package/dist/serve/entries/bridge-url.js +30 -0
  592. package/dist/serve/entries/bridge-url.js.map +1 -0
  593. package/dist/serve/entries/database.d.ts +46 -0
  594. package/dist/serve/entries/database.d.ts.map +1 -0
  595. package/dist/serve/entries/database.js +80 -0
  596. package/dist/serve/entries/database.js.map +1 -0
  597. package/dist/serve/entries/firestore.d.ts +104 -0
  598. package/dist/serve/entries/firestore.d.ts.map +1 -0
  599. package/dist/serve/entries/firestore.js +202 -0
  600. package/dist/serve/entries/firestore.js.map +1 -0
  601. package/dist/serve/entries/init.d.ts +2 -0
  602. package/dist/serve/entries/init.d.ts.map +1 -0
  603. package/dist/serve/entries/init.js +40 -0
  604. package/dist/serve/entries/init.js.map +1 -0
  605. package/dist/serve/entries/keepalive.d.ts +20 -0
  606. package/dist/serve/entries/keepalive.d.ts.map +1 -0
  607. package/dist/serve/entries/keepalive.js +38 -0
  608. package/dist/serve/entries/keepalive.js.map +1 -0
  609. package/dist/serve/entries/messaging-sw.d.ts +10 -0
  610. package/dist/serve/entries/messaging-sw.d.ts.map +1 -0
  611. package/dist/serve/entries/messaging-sw.js +36 -0
  612. package/dist/serve/entries/messaging-sw.js.map +1 -0
  613. package/dist/serve/entries/messaging.d.ts +11 -0
  614. package/dist/serve/entries/messaging.d.ts.map +1 -0
  615. package/dist/serve/entries/messaging.js +53 -0
  616. package/dist/serve/entries/messaging.js.map +1 -0
  617. package/dist/serve/entries/runtime.d.ts +46 -0
  618. package/dist/serve/entries/runtime.d.ts.map +1 -0
  619. package/dist/serve/entries/runtime.js +435 -0
  620. package/dist/serve/entries/runtime.js.map +1 -0
  621. package/dist/serve/entries/session-store.d.ts +48 -0
  622. package/dist/serve/entries/session-store.d.ts.map +1 -0
  623. package/dist/serve/entries/session-store.js +82 -0
  624. package/dist/serve/entries/session-store.js.map +1 -0
  625. package/dist/serve/entries/storage.d.ts +25 -0
  626. package/dist/serve/entries/storage.d.ts.map +1 -0
  627. package/dist/serve/entries/storage.js +61 -0
  628. package/dist/serve/entries/storage.js.map +1 -0
  629. package/dist/serve/entries/tab-sync-wiring.d.ts +88 -0
  630. package/dist/serve/entries/tab-sync-wiring.d.ts.map +1 -0
  631. package/dist/serve/entries/tab-sync-wiring.js +217 -0
  632. package/dist/serve/entries/tab-sync-wiring.js.map +1 -0
  633. package/dist/serve/entries/worker-runtime.d.ts +10 -0
  634. package/dist/serve/entries/worker-runtime.d.ts.map +1 -0
  635. package/dist/serve/entries/worker-runtime.js +59 -0
  636. package/dist/serve/entries/worker-runtime.js.map +1 -0
  637. package/dist/serve/init-payload.d.ts +21 -0
  638. package/dist/serve/init-payload.d.ts.map +1 -0
  639. package/dist/serve/init-payload.js +2 -0
  640. package/dist/serve/init-payload.js.map +1 -0
  641. package/dist/serve/namespace.d.ts +73 -0
  642. package/dist/serve/namespace.d.ts.map +1 -0
  643. package/dist/serve/namespace.js +470 -0
  644. package/dist/serve/namespace.js.map +1 -0
  645. package/dist/serve/open-browser.d.ts +23 -0
  646. package/dist/serve/open-browser.d.ts.map +1 -0
  647. package/dist/serve/open-browser.js +58 -0
  648. package/dist/serve/open-browser.js.map +1 -0
  649. package/dist/serve/rules.d.ts +77 -0
  650. package/dist/serve/rules.d.ts.map +1 -0
  651. package/dist/serve/rules.js +202 -0
  652. package/dist/serve/rules.js.map +1 -0
  653. package/dist/serve/sandbox-marker.d.ts +9 -0
  654. package/dist/serve/sandbox-marker.d.ts.map +1 -0
  655. package/dist/serve/sandbox-marker.js +31 -0
  656. package/dist/serve/sandbox-marker.js.map +1 -0
  657. package/dist/serve/server.d.ts +135 -0
  658. package/dist/serve/server.d.ts.map +1 -0
  659. package/dist/serve/server.js +328 -0
  660. package/dist/serve/server.js.map +1 -0
  661. package/dist/serve/standalone-assets.d.ts +67 -0
  662. package/dist/serve/standalone-assets.d.ts.map +1 -0
  663. package/dist/serve/standalone-assets.js +134 -0
  664. package/dist/serve/standalone-assets.js.map +1 -0
  665. package/dist/serve/state-store.d.ts +45 -0
  666. package/dist/serve/state-store.d.ts.map +1 -0
  667. package/dist/serve/state-store.js +120 -0
  668. package/dist/serve/state-store.js.map +1 -0
  669. package/dist/serve/studio/disk-project-store.d.ts +9 -0
  670. package/dist/serve/studio/disk-project-store.d.ts.map +1 -0
  671. package/dist/serve/studio/disk-project-store.js +173 -0
  672. package/dist/serve/studio/disk-project-store.js.map +1 -0
  673. package/dist/serve/studio/disk-workspace.d.ts +14 -0
  674. package/dist/serve/studio/disk-workspace.d.ts.map +1 -0
  675. package/dist/serve/studio/disk-workspace.js +152 -0
  676. package/dist/serve/studio/disk-workspace.js.map +1 -0
  677. package/dist/serve/studio/index.d.ts +10 -0
  678. package/dist/serve/studio/index.d.ts.map +1 -0
  679. package/dist/serve/studio/index.js +9 -0
  680. package/dist/serve/studio/index.js.map +1 -0
  681. package/dist/serve/studio/routes.d.ts +40 -0
  682. package/dist/serve/studio/routes.d.ts.map +1 -0
  683. package/dist/serve/studio/routes.js +182 -0
  684. package/dist/serve/studio/routes.js.map +1 -0
  685. package/dist/serve/studio/store-types.d.ts +45 -0
  686. package/dist/serve/studio/store-types.d.ts.map +1 -0
  687. package/dist/serve/studio/store-types.js +11 -0
  688. package/dist/serve/studio/store-types.js.map +1 -0
  689. package/dist/serve/studio-ui/assets/RulesCodeEditor-CXdSLKhO.js +23 -0
  690. package/dist/serve/studio-ui/assets/index-BlSGru_r.css +1 -0
  691. package/dist/serve/studio-ui/assets/index-BvtQIpGn.js +1211 -0
  692. package/dist/serve/studio-ui/assets/seed-3DMedLL3.js +2 -0
  693. package/dist/serve/studio-ui/index.html +32 -0
  694. package/dist/serve/studio-ui/pyric-logo.svg +76 -0
  695. package/dist/serve/vite-plugin.d.ts +57 -0
  696. package/dist/serve/vite-plugin.d.ts.map +1 -0
  697. package/dist/serve/vite-plugin.js +664 -0
  698. package/dist/serve/vite-plugin.js.map +1 -0
  699. package/dist/serve/worker/client/admin-firestore.d.ts +18 -0
  700. package/dist/serve/worker/client/admin-firestore.d.ts.map +1 -0
  701. package/dist/serve/worker/client/admin-firestore.js +26 -0
  702. package/dist/serve/worker/client/admin-firestore.js.map +1 -0
  703. package/dist/serve/worker/client/ai.d.ts +31 -0
  704. package/dist/serve/worker/client/ai.d.ts.map +1 -0
  705. package/dist/serve/worker/client/ai.js +89 -0
  706. package/dist/serve/worker/client/ai.js.map +1 -0
  707. package/dist/serve/worker/client/auth.d.ts +168 -0
  708. package/dist/serve/worker/client/auth.d.ts.map +1 -0
  709. package/dist/serve/worker/client/auth.js +322 -0
  710. package/dist/serve/worker/client/auth.js.map +1 -0
  711. package/dist/serve/worker/client/connection.d.ts +80 -0
  712. package/dist/serve/worker/client/connection.d.ts.map +1 -0
  713. package/dist/serve/worker/client/connection.js +148 -0
  714. package/dist/serve/worker/client/connection.js.map +1 -0
  715. package/dist/serve/worker/client/core.d.ts +109 -0
  716. package/dist/serve/worker/client/core.d.ts.map +1 -0
  717. package/dist/serve/worker/client/core.js +248 -0
  718. package/dist/serve/worker/client/core.js.map +1 -0
  719. package/dist/serve/worker/client/disconnect.d.ts +7 -0
  720. package/dist/serve/worker/client/disconnect.d.ts.map +1 -0
  721. package/dist/serve/worker/client/disconnect.js +26 -0
  722. package/dist/serve/worker/client/disconnect.js.map +1 -0
  723. package/dist/serve/worker/client/firestore-reads.d.ts +49 -0
  724. package/dist/serve/worker/client/firestore-reads.d.ts.map +1 -0
  725. package/dist/serve/worker/client/firestore-reads.js +139 -0
  726. package/dist/serve/worker/client/firestore-reads.js.map +1 -0
  727. package/dist/serve/worker/client/firestore-refs.d.ts +54 -0
  728. package/dist/serve/worker/client/firestore-refs.d.ts.map +1 -0
  729. package/dist/serve/worker/client/firestore-refs.js +167 -0
  730. package/dist/serve/worker/client/firestore-refs.js.map +1 -0
  731. package/dist/serve/worker/client/firestore-writes.d.ts +70 -0
  732. package/dist/serve/worker/client/firestore-writes.d.ts.map +1 -0
  733. package/dist/serve/worker/client/firestore-writes.js +169 -0
  734. package/dist/serve/worker/client/firestore-writes.js.map +1 -0
  735. package/dist/serve/worker/client/handles.d.ts +73 -0
  736. package/dist/serve/worker/client/handles.d.ts.map +1 -0
  737. package/dist/serve/worker/client/handles.js +4 -0
  738. package/dist/serve/worker/client/handles.js.map +1 -0
  739. package/dist/serve/worker/client/messaging.d.ts +16 -0
  740. package/dist/serve/worker/client/messaging.d.ts.map +1 -0
  741. package/dist/serve/worker/client/messaging.js +60 -0
  742. package/dist/serve/worker/client/messaging.js.map +1 -0
  743. package/dist/serve/worker/client/presence.d.ts +43 -0
  744. package/dist/serve/worker/client/presence.d.ts.map +1 -0
  745. package/dist/serve/worker/client/presence.js +132 -0
  746. package/dist/serve/worker/client/presence.js.map +1 -0
  747. package/dist/serve/worker/client/rtdb.d.ts +36 -0
  748. package/dist/serve/worker/client/rtdb.d.ts.map +1 -0
  749. package/dist/serve/worker/client/rtdb.js +241 -0
  750. package/dist/serve/worker/client/rtdb.js.map +1 -0
  751. package/dist/serve/worker/client/rules.d.ts +24 -0
  752. package/dist/serve/worker/client/rules.d.ts.map +1 -0
  753. package/dist/serve/worker/client/rules.js +44 -0
  754. package/dist/serve/worker/client/rules.js.map +1 -0
  755. package/dist/serve/worker/client/service-worker-connection.d.ts +3 -0
  756. package/dist/serve/worker/client/service-worker-connection.d.ts.map +1 -0
  757. package/dist/serve/worker/client/service-worker-connection.js +53 -0
  758. package/dist/serve/worker/client/service-worker-connection.js.map +1 -0
  759. package/dist/serve/worker/client/snapshots.d.ts +32 -0
  760. package/dist/serve/worker/client/snapshots.d.ts.map +1 -0
  761. package/dist/serve/worker/client/snapshots.js +46 -0
  762. package/dist/serve/worker/client/snapshots.js.map +1 -0
  763. package/dist/serve/worker/client/storage.d.ts +64 -0
  764. package/dist/serve/worker/client/storage.d.ts.map +1 -0
  765. package/dist/serve/worker/client/storage.js +125 -0
  766. package/dist/serve/worker/client/storage.js.map +1 -0
  767. package/dist/serve/worker/client/studio.d.ts +32 -0
  768. package/dist/serve/worker/client/studio.d.ts.map +1 -0
  769. package/dist/serve/worker/client/studio.js +61 -0
  770. package/dist/serve/worker/client/studio.js.map +1 -0
  771. package/dist/serve/worker/client.d.ts +43 -0
  772. package/dist/serve/worker/client.d.ts.map +1 -0
  773. package/dist/serve/worker/client.js +44 -0
  774. package/dist/serve/worker/client.js.map +1 -0
  775. package/dist/serve/worker/entry.d.ts +40 -0
  776. package/dist/serve/worker/entry.d.ts.map +1 -0
  777. package/dist/serve/worker/entry.js +144 -0
  778. package/dist/serve/worker/entry.js.map +1 -0
  779. package/dist/serve/worker/host/admin-firestore.d.ts +17 -0
  780. package/dist/serve/worker/host/admin-firestore.d.ts.map +1 -0
  781. package/dist/serve/worker/host/admin-firestore.js +92 -0
  782. package/dist/serve/worker/host/admin-firestore.js.map +1 -0
  783. package/dist/serve/worker/host/connection.d.ts +40 -0
  784. package/dist/serve/worker/host/connection.d.ts.map +1 -0
  785. package/dist/serve/worker/host/connection.js +153 -0
  786. package/dist/serve/worker/host/connection.js.map +1 -0
  787. package/dist/serve/worker/host/core.d.ts +159 -0
  788. package/dist/serve/worker/host/core.d.ts.map +1 -0
  789. package/dist/serve/worker/host/core.js +296 -0
  790. package/dist/serve/worker/host/core.js.map +1 -0
  791. package/dist/serve/worker/host/dispatch.d.ts +34 -0
  792. package/dist/serve/worker/host/dispatch.d.ts.map +1 -0
  793. package/dist/serve/worker/host/dispatch.js +267 -0
  794. package/dist/serve/worker/host/dispatch.js.map +1 -0
  795. package/dist/serve/worker/host/firestore-reads.d.ts +17 -0
  796. package/dist/serve/worker/host/firestore-reads.d.ts.map +1 -0
  797. package/dist/serve/worker/host/firestore-reads.js +108 -0
  798. package/dist/serve/worker/host/firestore-reads.js.map +1 -0
  799. package/dist/serve/worker/host/firestore-writes.d.ts +37 -0
  800. package/dist/serve/worker/host/firestore-writes.d.ts.map +1 -0
  801. package/dist/serve/worker/host/firestore-writes.js +409 -0
  802. package/dist/serve/worker/host/firestore-writes.js.map +1 -0
  803. package/dist/serve/worker/host/presence.d.ts +38 -0
  804. package/dist/serve/worker/host/presence.d.ts.map +1 -0
  805. package/dist/serve/worker/host/presence.js +280 -0
  806. package/dist/serve/worker/host/presence.js.map +1 -0
  807. package/dist/serve/worker/host/rtdb.d.ts +18 -0
  808. package/dist/serve/worker/host/rtdb.d.ts.map +1 -0
  809. package/dist/serve/worker/host/rtdb.js +128 -0
  810. package/dist/serve/worker/host/rtdb.js.map +1 -0
  811. package/dist/serve/worker/host/rules.d.ts +17 -0
  812. package/dist/serve/worker/host/rules.d.ts.map +1 -0
  813. package/dist/serve/worker/host/rules.js +118 -0
  814. package/dist/serve/worker/host/rules.js.map +1 -0
  815. package/dist/serve/worker/host/storage.d.ts +19 -0
  816. package/dist/serve/worker/host/storage.d.ts.map +1 -0
  817. package/dist/serve/worker/host/storage.js +260 -0
  818. package/dist/serve/worker/host/storage.js.map +1 -0
  819. package/dist/serve/worker/host/studio.d.ts +13 -0
  820. package/dist/serve/worker/host/studio.d.ts.map +1 -0
  821. package/dist/serve/worker/host/studio.js +30 -0
  822. package/dist/serve/worker/host/studio.js.map +1 -0
  823. package/dist/serve/worker/host/subscriptions.d.ts +21 -0
  824. package/dist/serve/worker/host/subscriptions.d.ts.map +1 -0
  825. package/dist/serve/worker/host/subscriptions.js +162 -0
  826. package/dist/serve/worker/host/subscriptions.js.map +1 -0
  827. package/dist/serve/worker/host-ai.d.ts +59 -0
  828. package/dist/serve/worker/host-ai.d.ts.map +1 -0
  829. package/dist/serve/worker/host-ai.js +158 -0
  830. package/dist/serve/worker/host-ai.js.map +1 -0
  831. package/dist/serve/worker/host-auth.d.ts +47 -0
  832. package/dist/serve/worker/host-auth.d.ts.map +1 -0
  833. package/dist/serve/worker/host-auth.js +464 -0
  834. package/dist/serve/worker/host-auth.js.map +1 -0
  835. package/dist/serve/worker/host-context.d.ts +220 -0
  836. package/dist/serve/worker/host-context.d.ts.map +1 -0
  837. package/dist/serve/worker/host-context.js +45 -0
  838. package/dist/serve/worker/host-context.js.map +1 -0
  839. package/dist/serve/worker/host-events.d.ts +21 -0
  840. package/dist/serve/worker/host-events.d.ts.map +1 -0
  841. package/dist/serve/worker/host-events.js +87 -0
  842. package/dist/serve/worker/host-events.js.map +1 -0
  843. package/dist/serve/worker/host-messaging.d.ts +60 -0
  844. package/dist/serve/worker/host-messaging.d.ts.map +1 -0
  845. package/dist/serve/worker/host-messaging.js +226 -0
  846. package/dist/serve/worker/host-messaging.js.map +1 -0
  847. package/dist/serve/worker/host.d.ts +36 -0
  848. package/dist/serve/worker/host.d.ts.map +1 -0
  849. package/dist/serve/worker/host.js +39 -0
  850. package/dist/serve/worker/host.js.map +1 -0
  851. package/dist/serve/worker/index.d.ts +22 -0
  852. package/dist/serve/worker/index.d.ts.map +1 -0
  853. package/dist/serve/worker/index.js +61 -0
  854. package/dist/serve/worker/index.js.map +1 -0
  855. package/dist/serve/worker/presence-timing.d.ts +14 -0
  856. package/dist/serve/worker/presence-timing.d.ts.map +1 -0
  857. package/dist/serve/worker/presence-timing.js +14 -0
  858. package/dist/serve/worker/presence-timing.js.map +1 -0
  859. package/dist/serve/worker/protocol.d.ts +1150 -0
  860. package/dist/serve/worker/protocol.d.ts.map +1 -0
  861. package/dist/serve/worker/protocol.js +228 -0
  862. package/dist/serve/worker/protocol.js.map +1 -0
  863. package/dist/serve/worker/serve-init.d.ts +201 -0
  864. package/dist/serve/worker/serve-init.d.ts.map +1 -0
  865. package/dist/serve/worker/serve-init.js +579 -0
  866. package/dist/serve/worker/serve-init.js.map +1 -0
  867. package/dist/serve/worker/service-worker-channel.d.ts +23 -0
  868. package/dist/serve/worker/service-worker-channel.d.ts.map +1 -0
  869. package/dist/serve/worker/service-worker-channel.js +9 -0
  870. package/dist/serve/worker/service-worker-channel.js.map +1 -0
  871. package/dist/serve/worker/service-worker-relay.d.ts +22 -0
  872. package/dist/serve/worker/service-worker-relay.d.ts.map +1 -0
  873. package/dist/serve/worker/service-worker-relay.js +63 -0
  874. package/dist/serve/worker/service-worker-relay.js.map +1 -0
  875. package/dist/serve/writer-lock.d.ts +32 -0
  876. package/dist/serve/writer-lock.d.ts.map +1 -0
  877. package/dist/serve/writer-lock.js +43 -0
  878. package/dist/serve/writer-lock.js.map +1 -0
  879. package/dist/verify/cases.d.ts +37 -0
  880. package/dist/verify/cases.d.ts.map +1 -0
  881. package/dist/verify/cases.js +173 -0
  882. package/dist/verify/cases.js.map +1 -0
  883. package/dist/verify/fixture.d.ts +100 -0
  884. package/dist/verify/fixture.d.ts.map +1 -0
  885. package/dist/verify/fixture.js +156 -0
  886. package/dist/verify/fixture.js.map +1 -0
  887. package/dist/verify/index.d.ts +102 -0
  888. package/dist/verify/index.d.ts.map +1 -0
  889. package/dist/verify/index.js +318 -0
  890. package/dist/verify/index.js.map +1 -0
  891. package/dist/verify/tools.d.ts +7 -0
  892. package/dist/verify/tools.d.ts.map +1 -0
  893. package/dist/verify/tools.js +83 -0
  894. package/dist/verify/tools.js.map +1 -0
  895. package/dist/version/compat-target.d.ts +18 -0
  896. package/dist/version/compat-target.d.ts.map +1 -0
  897. package/dist/version/compat-target.js +18 -0
  898. package/dist/version/compat-target.js.map +1 -0
  899. package/dist/vite.d.ts +12 -0
  900. package/dist/vite.d.ts.map +1 -0
  901. package/dist/vite.js +16 -0
  902. package/dist/vite.js.map +1 -0
  903. package/package.json +144 -0
@@ -0,0 +1,2289 @@
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 · Pyric Studio</title><meta name="description" content="Published declarations for @pyric/ui/traffic."><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/" aria-current="page"> @pyric/ui/traffic </a> </li><li> <a href="/__pyric/ui/docs/pyric-ui-traffic-hooks-reference-api/"> @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/" aria-current="page"> @pyric/ui/traffic </a> </li><li> <a href="/__pyric/ui/docs/pyric-ui-traffic-hooks-reference-api/"> @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</span> </li> </ol> </nav> <header class="api-reference-header"> <p class="api-reference-kicker">API reference</p> <h1><code>@pyric/ui/traffic</code></h1> <p class="api-reference-meta"> 74 published symbols from <code>@pyric/ui</code> </p> <p class="api-reference-source">
2
+ 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>
5
+ <p><a id="metricpoint"></a></p>
6
+ <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>
34
+ <hr>
35
+ <p><a id="metricseries"></a></p>
36
+ <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>
69
+ <hr>
70
+ <p><a id="ruleheatmapentry"></a></p>
71
+ <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>
119
+ <hr>
120
+ <p><a id="ruleheatmapprops"></a></p>
121
+ <h3 id="ruleheatmapprops">RuleHeatmapProps</h3>
122
+ <h4 id="properties-3">Properties</h4>
123
+ <div class="table-scroll">
124
+
125
+
126
+
127
+
128
+
129
+
130
+
131
+
132
+
133
+
134
+
135
+
136
+
137
+
138
+
139
+
140
+
141
+
142
+
143
+
144
+
145
+
146
+
147
+
148
+
149
+
150
+
151
+
152
+
153
+
154
+
155
+
156
+
157
+
158
+ <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="classname"></a> <code>className?</code></td><td align="left"><code>string</code></td><td align="left">-</td></tr><tr><td align="left"><a id="emptystate"></a> <code>emptyState?</code></td><td align="left"><code>ReactNode</code></td><td align="left">-</td></tr><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 from <code>useRuleHeatmap</code>.</td></tr><tr><td align="left"><a id="onselectrule"></a> <code>onSelectRule?</code></td><td align="left">(<code>ruleIndex</code>: <code>number</code>) => <code>void</code></td><td align="left">Fired when a rule row is clicked — wire this to the log filter for the cross-view “click a rule, see its traffic” interaction.</td></tr><tr><td align="left"><a id="selectedruleindex"></a> <code>selectedRuleIndex?</code></td><td align="left"><code>number</code></td><td align="left">Marks one rule row as the active selection.</td></tr></tbody></table></div>
159
+ <hr>
160
+ <p><a id="timewindow"></a></p>
161
+ <h3 id="timewindow">TimeWindow</h3>
162
+ <p>A half-open time window <code>[start, end)</code> in epoch-ms. The timeline
163
+ buckets events whose <code>at</code> falls inside it; events outside are
164
+ dropped from the histogram (but still counted in <code>outOfWindow</code>).</p>
165
+ <h4 id="properties-4">Properties</h4>
166
+ <div class="table-scroll">
167
+
168
+
169
+
170
+
171
+
172
+
173
+
174
+
175
+
176
+
177
+
178
+
179
+
180
+
181
+
182
+
183
+ <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>
184
+ <hr>
185
+ <p><a id="trafficauthstate"></a></p>
186
+ <h3 id="trafficauthstate">TrafficAuthState</h3>
187
+ <h4 id="properties-5">Properties</h4>
188
+ <div class="table-scroll">
189
+
190
+
191
+
192
+
193
+
194
+
195
+
196
+
197
+
198
+
199
+
200
+
201
+
202
+
203
+
204
+
205
+ <table><thead><tr><th align="left">Property</th><th align="left">Type</th></tr></thead><tbody><tr><td align="left"><a id="token"></a> <code>token?</code></td><td align="left"><code>Record</code>&#x3C;<code>string</code>, <code>unknown</code>></td></tr><tr><td align="left"><a id="uid"></a> <code>uid</code></td><td align="left"><code>string</code></td></tr></tbody></table></div>
206
+ <hr>
207
+ <p><a id="trafficbucket"></a></p>
208
+ <h3 id="trafficbucket">TrafficBucket</h3>
209
+ <h4 id="properties-6">Properties</h4>
210
+ <div class="table-scroll">
211
+
212
+
213
+
214
+
215
+
216
+
217
+
218
+
219
+
220
+
221
+
222
+
223
+
224
+
225
+
226
+
227
+
228
+
229
+
230
+
231
+
232
+
233
+
234
+
235
+
236
+
237
+
238
+
239
+
240
+
241
+
242
+
243
+
244
+
245
+
246
+
247
+
248
+
249
+
250
+
251
+
252
+
253
+
254
+
255
+
256
+
257
+
258
+
259
+
260
+ <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>
261
+ <hr>
262
+ <p><a id="trafficcounts"></a></p>
263
+ <h3 id="trafficcounts">TrafficCounts</h3>
264
+ <h4 id="properties-7">Properties</h4>
265
+ <div class="table-scroll">
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
+ <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>
291
+ <hr>
292
+ <p><a id="trafficdetailprops"></a></p>
293
+ <h3 id="trafficdetailprops">TrafficDetailProps</h3>
294
+ <h4 id="properties-8">Properties</h4>
295
+ <div class="table-scroll">
296
+
297
+
298
+
299
+
300
+
301
+
302
+
303
+
304
+
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
+
330
+ <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="classname-1"></a> <code>className?</code></td><td align="left"><code>string</code></td><td align="left">-</td></tr><tr><td align="left"><a id="event"></a> <code>event</code></td><td align="left"><a href="#trafficevent"><code>TrafficEvent</code></a></td><td align="left">-</td></tr><tr><td align="left"><a id="formattime"></a> <code>formatTime?</code></td><td align="left">(<code>at</code>: <code>number</code>) => <code>string</code></td><td align="left">Override the timestamp rendering. Default is <code>HH:MM:SS</code>.</td></tr><tr><td align="left"><a id="onback"></a> <code>onBack?</code></td><td align="left">() => <code>void</code></td><td align="left">Fired by the back affordance. When absent, no back button.</td></tr><tr><td align="left"><a id="renderclassification"></a> <code>renderClassification?</code></td><td align="left">(<code>event</code>: <a href="#trafficevent"><code>TrafficEvent</code></a>) => <code>ReactNode</code></td><td align="left">Render-prop slot below the header — the playground drops its denial overlay (classification + LLM analysis) here. The library doesn’t own that analysis.</td></tr></tbody></table></div>
331
+ <hr>
332
+ <p><a id="trafficevent"></a></p>
333
+ <h3 id="trafficevent">TrafficEvent</h3>
334
+ <h4 id="properties-9">Properties</h4>
335
+ <div class="table-scroll">
336
+
337
+
338
+
339
+
340
+
341
+
342
+
343
+
344
+
345
+
346
+
347
+
348
+
349
+
350
+
351
+
352
+
353
+
354
+
355
+
356
+
357
+
358
+
359
+
360
+
361
+
362
+
363
+
364
+
365
+
366
+
367
+
368
+
369
+
370
+
371
+
372
+
373
+
374
+
375
+
376
+
377
+
378
+
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
+
429
+
430
+
431
+
432
+
433
+
434
+
435
+
436
+
437
+
438
+
439
+
440
+
441
+
442
+
443
+
444
+
445
+
446
+
447
+
448
+
449
+
450
+
451
+
452
+
453
+
454
+
455
+
456
+
457
+
458
+
459
+
460
+
461
+
462
+
463
+
464
+
465
+ <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="at"></a> <code>at</code></td><td align="left"><code>number</code></td><td align="left"><code>Date.now()</code> at op start.</td></tr><tr><td align="left"><a id="auth"></a> <code>auth</code></td><td align="left"><a href="#trafficauthstate"><code>TrafficAuthState</code></a></td><td align="left">-</td></tr><tr><td align="left"><a id="durationms"></a> <code>durationMs?</code></td><td align="left"><code>number</code></td><td align="left">Canonical service-operation duration.</td></tr><tr><td align="left"><a id="evalms"></a> <code>evalMs?</code></td><td align="left"><code>number</code></td><td align="left">Simulator eval duration in ms. De-featured in the UI (local simulator) — present for the detail panel only.</td></tr><tr><td align="left"><a id="groupid"></a> <code>groupId?</code></td><td align="left"><code>string</code></td><td align="left">Shared across ops in one batch or transaction.</td></tr><tr><td align="left"><a id="groupkind"></a> <code>groupKind?</code></td><td align="left">| <code>string</code> &#x26; { } | <code>"transaction"</code> | <code>"batch"</code></td><td align="left">-</td></tr><tr><td align="left"><a id="id"></a> <code>id</code></td><td align="left"><code>string</code></td><td align="left">Unique per emission.</td></tr><tr><td align="left"><a id="kind"></a> <code>kind?</code></td><td align="left"><code>"request"</code> | <code>"operation"</code></td><td align="left">Source event kind. Firestore request events omit this in older adapters.</td></tr><tr><td align="left"><a id="matchedrule"></a> <code>matchedRule?</code></td><td align="left"><a href="#trafficmatchedrule"><code>TrafficMatchedRule</code></a></td><td align="left">Parsed from the matched <code>Rule #N</code> debug line — absent if none.</td></tr><tr><td align="left"><a id="method"></a> <code>method</code></td><td align="left"><a href="#trafficmethod"><code>TrafficMethod</code></a></td><td align="left">-</td></tr><tr><td align="left"><a id="origin"></a> <code>origin</code></td><td align="left"><a href="#trafficorigin"><code>TrafficOrigin</code></a></td><td align="left">-</td></tr><tr><td align="left"><a id="path"></a> <code>path</code></td><td align="left"><code>string</code></td><td align="left">-</td></tr><tr><td align="left"><a id="reasons"></a> <code>reasons</code></td><td align="left"><code>string</code>[]</td><td align="left">Simulator debug messages — <code>Rule #N (op) → ALLOW</code> format.</td></tr><tr><td align="left"><a id="request"></a> <code>request?</code></td><td align="left">{ <code>data?</code>: <code>unknown</code>; <code>query?</code>: <code>unknown</code>; <code>resourceData?</code>: <code>unknown</code>; }</td><td align="left">Proposed write payload — absent on reads + delete.</td></tr><tr><td align="left"><code>request.data?</code></td><td align="left"><code>unknown</code></td><td align="left">-</td></tr><tr><td align="left"><code>request.query?</code></td><td align="left"><code>unknown</code></td><td align="left">-</td></tr><tr><td align="left"><code>request.resourceData?</code></td><td align="left"><code>unknown</code></td><td align="left">-</td></tr><tr><td align="left"><a id="resourceafter"></a> <code>resourceAfter?</code></td><td align="left"><a href="#trafficresourcestate"><code>TrafficResourceState</code></a></td><td align="left">Projected doc state after the write — absent on reads.</td></tr><tr><td align="left"><a id="resourcebefore"></a> <code>resourceBefore?</code></td><td align="left"><a href="#trafficresourcestate"><code>TrafficResourceState</code></a></td><td align="left">Existing doc state before the write (or the read target).</td></tr><tr><td align="left"><a id="result"></a> <code>result</code></td><td align="left"><a href="#trafficresult"><code>TrafficResult</code></a></td><td align="left">-</td></tr><tr><td align="left"><a id="service"></a> <code>service?</code></td><td align="left">| <code>"firestore"</code> | <code>"auth"</code> | <code>"storage"</code> | <code>"rtdb"</code> | <code>string</code> &#x26; { }</td><td align="left">Service that emitted the event. Omitted means Firestore.</td></tr><tr><td align="left"><a id="triggeredby"></a> <code>triggeredBy?</code></td><td align="left">{ <code>method</code>: <code>string</code>; <code>path?</code>: <code>string</code>; }</td><td align="left">For listener re-evals — the originating user op.</td></tr><tr><td align="left"><code>triggeredBy.method</code></td><td align="left"><code>string</code></td><td align="left">-</td></tr><tr><td align="left"><code>triggeredBy.path?</code></td><td align="left"><code>string</code></td><td align="left">-</td></tr></tbody></table></div>
466
+ <hr>
467
+ <p><a id="trafficfilterstate"></a></p>
468
+ <h3 id="trafficfilterstate">TrafficFilterState</h3>
469
+ <h4 id="properties-10">Properties</h4>
470
+ <div class="table-scroll">
471
+
472
+
473
+
474
+
475
+
476
+
477
+
478
+
479
+
480
+
481
+
482
+
483
+
484
+
485
+
486
+
487
+
488
+
489
+
490
+
491
+ <table><thead><tr><th align="left">Property</th><th align="left">Type</th></tr></thead><tbody><tr><td align="left"><a id="origin-1"></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-1"></a> <code>result</code></td><td align="left"><a href="#trafficresultfilter"><code>TrafficResultFilter</code></a></td></tr></tbody></table></div>
492
+ <hr>
493
+ <p><a id="trafficgroup"></a></p>
494
+ <h3 id="trafficgroup">TrafficGroup</h3>
495
+ <h4 id="properties-11">Properties</h4>
496
+ <div class="table-scroll">
497
+
498
+
499
+
500
+
501
+
502
+
503
+
504
+
505
+
506
+
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
+ <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"><a href="#trafficevent"><code>TrafficEvent</code></a>[]</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-1"></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>
537
+ <hr>
538
+ <p><a id="trafficgrouprowprops"></a></p>
539
+ <h3 id="trafficgrouprowprops">TrafficGroupRowProps</h3>
540
+ <h4 id="properties-12">Properties</h4>
541
+ <div class="table-scroll">
542
+
543
+
544
+
545
+
546
+
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
+
577
+
578
+
579
+
580
+
581
+
582
+
583
+
584
+
585
+
586
+ <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="classname-2"></a> <code>className?</code></td><td align="left"><code>string</code></td><td align="left">-</td></tr><tr><td align="left"><a id="defaultexpanded"></a> <code>defaultExpanded?</code></td><td align="left"><code>boolean</code></td><td align="left">Whether the group starts expanded. Default false — grouping exists to collapse volume, so collapsed is the useful default.</td></tr><tr><td align="left"><a id="formattime-1"></a> <code>formatTime?</code></td><td align="left">(<code>at</code>: <code>number</code>) => <code>string</code></td><td align="left">Passed through to each member <code>&#x3C;TrafficRow></code>.</td></tr><tr><td align="left"><a id="group"></a> <code>group</code></td><td align="left"><a href="#trafficgroup"><code>TrafficGroup</code></a></td><td align="left">-</td></tr><tr><td align="left"><a id="onselect"></a> <code>onSelect?</code></td><td align="left">(<code>event</code>: <a href="#trafficevent"><code>TrafficEvent</code></a>) => <code>void</code></td><td align="left">-</td></tr><tr><td align="left"><a id="renderclassification-1"></a> <code>renderClassification?</code></td><td align="left">(<code>event</code>: <a href="#trafficevent"><code>TrafficEvent</code></a>) => <code>ReactNode</code></td><td align="left">Passed through to each member <code>&#x3C;TrafficRow></code>.</td></tr><tr><td align="left"><a id="selectedid"></a> <code>selectedId?</code></td><td align="left"><code>string</code></td><td align="left">-</td></tr></tbody></table></div>
587
+ <hr>
588
+ <p><a id="trafficlinechartprops"></a></p>
589
+ <h3 id="trafficlinechartprops">TrafficLineChartProps</h3>
590
+ <h4 id="properties-13">Properties</h4>
591
+ <div class="table-scroll">
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
+
617
+
618
+
619
+
620
+
621
+
622
+
623
+
624
+
625
+
626
+
627
+
628
+
629
+
630
+
631
+
632
+
633
+
634
+
635
+
636
+
637
+
638
+
639
+
640
+
641
+ <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="classname-3"></a> <code>className?</code></td><td align="left"><code>string</code></td><td align="left">-</td></tr><tr><td align="left"><a id="emptystate-1"></a> <code>emptyState?</code></td><td align="left"><code>ReactNode</code></td><td align="left">-</td></tr><tr><td align="left"><a id="formattime-2"></a> <code>formatTime?</code></td><td align="left">(<code>t</code>: <code>number</code>) => <code>string</code></td><td align="left">-</td></tr><tr><td align="left"><a id="formatvalue"></a> <code>formatValue?</code></td><td align="left">(<code>n</code>: <code>number</code>) => <code>string</code></td><td align="left">-</td></tr><tr><td align="left"><a id="omitzeroseries"></a> <code>omitZeroSeries?</code></td><td align="left"><code>boolean</code></td><td align="left">Omit all-zero series from the plot and tooltip while retaining their explicit total in the accompanying metric strip.</td></tr><tr><td align="left"><a id="points"></a> <code>points</code></td><td align="left">readonly <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">readonly <a href="#metricseries"><code>MetricSeries</code></a>[]</td><td align="left">-</td></tr><tr><td align="left"><a id="visible"></a> <code>visible?</code></td><td align="left"><code>ReadonlySet</code>&#x3C;<code>string</code>></td><td align="left">Series keys currently drawn. Omit to draw every series. Pair with <a href="#trafficmetriccards">TrafficMetricCards</a>’ <code>visible</code>/<code>onToggle</code> so the legend cards and the chart’s lines toggle in lockstep.</td></tr></tbody></table></div>
642
+ <hr>
643
+ <p><a id="trafficlogprops"></a></p>
644
+ <h3 id="trafficlogprops">TrafficLogProps</h3>
645
+ <h4 id="properties-14">Properties</h4>
646
+ <div class="table-scroll">
647
+
648
+
649
+
650
+
651
+
652
+
653
+
654
+
655
+
656
+
657
+
658
+
659
+
660
+
661
+
662
+
663
+
664
+
665
+
666
+
667
+
668
+
669
+
670
+
671
+
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
+
702
+
703
+
704
+
705
+
706
+
707
+
708
+
709
+
710
+
711
+
712
+
713
+
714
+
715
+
716
+ <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="classname-4"></a> <code>className?</code></td><td align="left"><code>string</code></td><td align="left">-</td></tr><tr><td align="left"><a id="emptystate-2"></a> <code>emptyState?</code></td><td align="left"><code>ReactNode</code></td><td align="left">-</td></tr><tr><td align="left"><a id="events-1"></a> <code>events</code></td><td align="left"><a href="#trafficevent"><code>TrafficEvent</code></a>[]</td><td align="left">Events to render, in display order. The hook layer decides the order — <code>&#x3C;TrafficLog></code> renders the array as given.</td></tr><tr><td align="left"><a id="formattime-3"></a> <code>formatTime?</code></td><td align="left">(<code>at</code>: <code>number</code>) => <code>string</code></td><td align="left">Passed through to each <code>&#x3C;TrafficRow></code>.</td></tr><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">Grouped items from <code>useTrafficGroups</code>. When provided, the log renders singles + collapsible group rows and does NOT virtualize — grouping is itself the volume reducer (a 250-event listener storm becomes one group row). <code>events</code> is ignored.</td></tr><tr><td align="left"><a id="onselect-1"></a> <code>onSelect?</code></td><td align="left">(<code>event</code>: <a href="#trafficevent"><code>TrafficEvent</code></a>) => <code>void</code></td><td align="left">-</td></tr><tr><td align="left"><a id="renderclassification-2"></a> <code>renderClassification?</code></td><td align="left">(<code>event</code>: <a href="#trafficevent"><code>TrafficEvent</code></a>) => <code>ReactNode</code></td><td align="left">Passed through to each <code>&#x3C;TrafficRow></code>.</td></tr><tr><td align="left"><a id="renderrow"></a> <code>renderRow?</code></td><td align="left">(<code>event</code>: <a href="#trafficevent"><code>TrafficEvent</code></a>, <code>selected</code>: <code>boolean</code>) => <code>ReactNode</code></td><td align="left">Full escape hatch — render a row yourself instead of the default <code>&#x3C;TrafficRow></code>. Receives the event and its selected state. Applies to the flat (<code>events</code>) path only.</td></tr><tr><td align="left"><a id="rowheight"></a> <code>rowHeight?</code></td><td align="left"><code>number</code> | (<code>index</code>: <code>number</code>) => <code>number</code></td><td align="left">Estimated row height when virtualizing. Default 28.</td></tr><tr><td align="left"><a id="selectedid-1"></a> <code>selectedId?</code></td><td align="left"><code>string</code></td><td align="left">The selected event’s id, marked with <code>data-pyric-selected</code>.</td></tr><tr><td align="left"><a id="virtualizedheight"></a> <code>virtualizedHeight?</code></td><td align="left"><code>string</code> | <code>number</code></td><td align="left">Pixel height the virtualized scroll container fills. Default <code>'60vh'</code>.</td></tr><tr><td align="left"><a id="virtualizethreshold"></a> <code>virtualizeThreshold?</code></td><td align="left"><code>number</code></td><td align="left">Above this row count, the list virtualizes via <code>&#x3C;VirtualList></code>. Default 100 — a <code>load-test</code>-shaped session can emit 100k+ events, so virtualization is load-bearing, not polish.</td></tr></tbody></table></div>
717
+ <hr>
718
+ <p><a id="trafficmatchedrule"></a></p>
719
+ <h3 id="trafficmatchedrule">TrafficMatchedRule</h3>
720
+ <h4 id="properties-15">Properties</h4>
721
+ <div class="table-scroll">
722
+
723
+
724
+
725
+
726
+
727
+
728
+
729
+
730
+
731
+
732
+
733
+
734
+
735
+
736
+
737
+
738
+ <table><thead><tr><th align="left">Property</th><th align="left">Type</th></tr></thead><tbody><tr><td align="left"><a id="operations-1"></a> <code>operations</code></td><td align="left"><code>string</code>[]</td></tr><tr><td align="left"><a id="ruleindex-1"></a> <code>ruleIndex</code></td><td align="left"><code>number</code></td></tr></tbody></table></div>
739
+ <hr>
740
+ <p><a id="trafficmetriccardsprops"></a></p>
741
+ <h3 id="trafficmetriccardsprops">TrafficMetricCardsProps</h3>
742
+ <h4 id="properties-16">Properties</h4>
743
+ <div class="table-scroll">
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
+ <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="classname-5"></a> <code>className?</code></td><td align="left"><code>string</code></td><td align="left">-</td></tr><tr><td align="left"><a id="formatvalue-1"></a> <code>formatValue?</code></td><td align="left">(<code>n</code>: <code>number</code>) => <code>string</code></td><td align="left">-</td></tr><tr><td align="left"><a id="ontoggle"></a> <code>onToggle?</code></td><td align="left">(<code>key</code>: <code>string</code>) => <code>void</code></td><td align="left">-</td></tr><tr><td align="left"><a id="series-1"></a> <code>series</code></td><td align="left">readonly <a href="#metricseries"><code>MetricSeries</code></a>[]</td><td align="left">-</td></tr><tr><td align="left"><a id="visible-1"></a> <code>visible?</code></td><td align="left"><code>ReadonlySet</code>&#x3C;<code>string</code>></td><td align="left">When supplied (with <code>onToggle</code>), each card gets a checkbox and doubles as the chart’s legend — Console reference semantics (“toggle series visibility”). Omit for a read-only totals strip.</td></tr></tbody></table></div>
779
+ <hr>
780
+ <p><a id="trafficmetricsresult"></a></p>
781
+ <h3 id="trafficmetricsresult">TrafficMetricsResult</h3>
782
+ <h4 id="properties-17">Properties</h4>
783
+ <div class="table-scroll">
784
+
785
+
786
+
787
+
788
+
789
+
790
+
791
+
792
+
793
+
794
+
795
+
796
+
797
+
798
+
799
+
800
+
801
+
802
+
803
+
804
+
805
+
806
+
807
+
808
+ <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-1"></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-2"></a> <code>series</code></td><td align="left"><a href="#metricseries"><code>MetricSeries</code></a>[]</td><td align="left">-</td></tr></tbody></table></div>
809
+ <hr>
810
+ <p><a id="trafficresourcestate"></a></p>
811
+ <h3 id="trafficresourcestate">TrafficResourceState</h3>
812
+ <h4 id="properties-18">Properties</h4>
813
+ <div class="table-scroll">
814
+
815
+
816
+
817
+
818
+
819
+
820
+
821
+
822
+
823
+
824
+
825
+
826
+
827
+
828
+
829
+
830
+ <table><thead><tr><th align="left">Property</th><th align="left">Type</th></tr></thead><tbody><tr><td align="left"><a id="data"></a> <code>data</code></td><td align="left"><code>unknown</code></td></tr><tr><td align="left"><a id="exists"></a> <code>exists</code></td><td align="left"><code>boolean</code></td></tr></tbody></table></div>
831
+ <hr>
832
+ <p><a id="trafficrowprops"></a></p>
833
+ <h3 id="trafficrowprops">TrafficRowProps</h3>
834
+ <h4 id="properties-19">Properties</h4>
835
+ <div class="table-scroll">
836
+
837
+
838
+
839
+
840
+
841
+
842
+
843
+
844
+
845
+
846
+
847
+
848
+
849
+
850
+
851
+
852
+
853
+
854
+
855
+
856
+
857
+
858
+
859
+
860
+
861
+
862
+
863
+
864
+
865
+
866
+
867
+
868
+
869
+
870
+
871
+
872
+
873
+
874
+
875
+ <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="classname-6"></a> <code>className?</code></td><td align="left"><code>string</code></td><td align="left">-</td></tr><tr><td align="left"><a id="event-1"></a> <code>event</code></td><td align="left"><a href="#trafficevent"><code>TrafficEvent</code></a></td><td align="left">-</td></tr><tr><td align="left"><a id="formattime-4"></a> <code>formatTime?</code></td><td align="left">(<code>at</code>: <code>number</code>) => <code>string</code></td><td align="left">Override the timestamp rendering. Default is <code>HH:MM:SS</code>.</td></tr><tr><td align="left"><a id="onselect-2"></a> <code>onSelect?</code></td><td align="left">(<code>event</code>: <a href="#trafficevent"><code>TrafficEvent</code></a>) => <code>void</code></td><td align="left">-</td></tr><tr><td align="left"><a id="renderclassification-3"></a> <code>renderClassification?</code></td><td align="left">(<code>event</code>: <a href="#trafficevent"><code>TrafficEvent</code></a>) => <code>ReactNode</code></td><td align="left">Render-prop slot for a consumer-specific classification badge — e.g. the playground’s <code>expected</code>/<code>ambiguous</code>/<code>unexpected</code> verdict, which is app-source analysis the library doesn’t own. Returns <code>null</code> to render nothing.</td></tr><tr><td align="left"><a id="selected"></a> <code>selected?</code></td><td align="left"><code>boolean</code></td><td align="left">Marks the row as the active selection (<code>data-pyric-selected</code>).</td></tr></tbody></table></div>
876
+ <hr>
877
+ <p><a id="trafficsingle"></a></p>
878
+ <h3 id="trafficsingle">TrafficSingle</h3>
879
+ <h4 id="properties-20">Properties</h4>
880
+ <div class="table-scroll">
881
+
882
+
883
+
884
+
885
+
886
+
887
+
888
+
889
+
890
+
891
+
892
+
893
+
894
+
895
+
896
+
897
+ <table><thead><tr><th align="left">Property</th><th align="left">Type</th></tr></thead><tbody><tr><td align="left"><a id="event-2"></a> <code>event</code></td><td align="left"><a href="#trafficevent"><code>TrafficEvent</code></a></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>
898
+ <hr>
899
+ <p><a id="trafficstatbucket"></a></p>
900
+ <h3 id="trafficstatbucket">TrafficStatBucket</h3>
901
+ <h4 id="properties-21">Properties</h4>
902
+ <div class="table-scroll">
903
+
904
+
905
+
906
+
907
+
908
+
909
+
910
+
911
+
912
+
913
+
914
+
915
+
916
+
917
+
918
+
919
+ <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>
920
+ <hr>
921
+ <p><a id="trafficstatsprops"></a></p>
922
+ <h3 id="trafficstatsprops">TrafficStatsProps</h3>
923
+ <h4 id="properties-22">Properties</h4>
924
+ <div class="table-scroll">
925
+
926
+
927
+
928
+
929
+
930
+
931
+
932
+
933
+
934
+
935
+
936
+
937
+
938
+
939
+
940
+
941
+ <table><thead><tr><th align="left">Property</th><th align="left">Type</th></tr></thead><tbody><tr><td align="left"><a id="classname-7"></a> <code>className?</code></td><td align="left"><code>string</code></td></tr><tr><td align="left"><a id="stats"></a> <code>stats</code></td><td align="left"><a href="#trafficstatssummary"><code>TrafficStatsSummary</code></a></td></tr></tbody></table></div>
942
+ <hr>
943
+ <p><a id="trafficstatssummary"></a></p>
944
+ <h3 id="trafficstatssummary">TrafficStatsSummary</h3>
945
+ <h4 id="properties-23">Properties</h4>
946
+ <div class="table-scroll">
947
+
948
+
949
+
950
+
951
+
952
+
953
+
954
+
955
+
956
+
957
+
958
+
959
+
960
+
961
+
962
+
963
+
964
+
965
+
966
+
967
+
968
+
969
+
970
+
971
+
972
+
973
+
974
+
975
+
976
+
977
+
978
+
979
+
980
+
981
+
982
+
983
+
984
+
985
+
986
+
987
+
988
+
989
+
990
+
991
+
992
+
993
+
994
+
995
+
996
+ <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>
997
+ <hr>
998
+ <p><a id="traffictimelineprops"></a></p>
999
+ <h3 id="traffictimelineprops">TrafficTimelineProps</h3>
1000
+ <h4 id="properties-24">Properties</h4>
1001
+ <div class="table-scroll">
1002
+
1003
+
1004
+
1005
+
1006
+
1007
+
1008
+
1009
+
1010
+
1011
+
1012
+
1013
+
1014
+
1015
+
1016
+
1017
+
1018
+
1019
+
1020
+
1021
+
1022
+
1023
+
1024
+
1025
+
1026
+
1027
+
1028
+
1029
+
1030
+
1031
+
1032
+
1033
+
1034
+
1035
+
1036
+
1037
+
1038
+
1039
+
1040
+
1041
+
1042
+
1043
+
1044
+
1045
+
1046
+
1047
+
1048
+
1049
+
1050
+
1051
+
1052
+
1053
+
1054
+
1055
+
1056
+
1057
+
1058
+
1059
+
1060
+
1061
+
1062
+
1063
+
1064
+
1065
+
1066
+
1067
+
1068
+
1069
+
1070
+
1071
+ <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="axis"></a> <code>axis?</code></td><td align="left"><code>ReactNode</code> | (<code>window</code>: <a href="#timewindow"><code>TimeWindow</code></a>) => <code>ReactNode</code></td><td align="left">Axis slot — tick labels below the bars inside <code>[data-pyric-timeline-axis]</code>. The mock puts “14m ago · 7m · now” here. Receives the resolved window so labels can be derived.</td></tr><tr><td align="left"><a id="brush"></a> <code>brush?</code></td><td align="left"><a href="#timewindow"><code>TimeWindow</code></a></td><td align="left">A brushed sub-range (<code>[start, end)</code>) drawn as an overlay over the bars. Position is derived from where it falls inside <code>window</code>, so a partly-out-of-window brush clamps to the chart edges.</td></tr><tr><td align="left"><a id="bucketcount"></a> <code>bucketCount?</code></td><td align="left"><code>number</code></td><td align="left">Number of bars. Default 30. Only used on the <code>events</code> path.</td></tr><tr><td align="left"><a id="buckets"></a> <code>buckets?</code></td><td align="left"><a href="#usetrafficbucketsresult"><code>UseTrafficBucketsResult</code></a></td><td align="left">Pre-bucketed counts — the escape hatch when the caller already ran <a href="#usetrafficbuckets">useTrafficBuckets</a> (or <code>bucketTraffic</code>) upstream, e.g. to share one bucketing pass across the timeline + a stats header. Takes precedence over <code>events</code>.</td></tr><tr><td align="left"><a id="classname-8"></a> <code>className?</code></td><td align="left"><code>string</code></td><td align="left">-</td></tr><tr><td align="left"><a id="emptystate-3"></a> <code>emptyState?</code></td><td align="left"><code>ReactNode</code></td><td align="left">-</td></tr><tr><td align="left"><a id="events-2"></a> <code>events?</code></td><td align="left"><a href="#trafficevent"><code>TrafficEvent</code></a>[]</td><td align="left">Raw traffic events to bucket. Ignored when <code>buckets</code> is supplied (the consumer pre-bucketed). Exactly one of <code>events</code> / <code>buckets</code> should drive the histogram.</td></tr><tr><td align="left"><a id="header"></a> <code>header?</code></td><td align="left"><code>ReactNode</code></td><td align="left">Header slot — title, deny summary, live label. Rendered above the bars inside <code>[data-pyric-timeline-header]</code>. The mock puts “142 requests · 16 denied · live” here.</td></tr><tr><td align="left"><a id="liveat"></a> <code>liveAt?</code></td><td align="left"><code>number</code></td><td align="left">Where the live edge marker sits, in epoch-ms. Defaults to <code>window.end</code> (the right edge = “now”). Omit / pass <code>null</code> to hide the marker entirely (e.g. a frozen, non-live window).</td></tr><tr><td align="left"><a id="onbrush"></a> <code>onBrush?</code></td><td align="left">(<code>window</code>: <a href="#timewindow"><code>TimeWindow</code></a>) => <code>void</code></td><td align="left">Fired when a bar inside the brush region is clicked-through — the component itself is presentation-agnostic about drag, so the primary brush gesture is owned by the consumer. As a built-in affordance, clicking a bucket calls this with a one-bucket-wide window so a bare consumer still gets a working selection.</td></tr><tr><td align="left"><a id="renderbucketsummary"></a> <code>renderBucketSummary?</code></td><td align="left">(<code>bucket</code>: <a href="#trafficbucket"><code>TrafficBucket</code></a>) => <code>ReactNode</code></td><td align="left">Direct annotation shown while a bucket is hovered or keyboard-focused. The timeline owns preview state and positioning; the consumer owns the words and number formatting.</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 the histogram spans.</td></tr></tbody></table></div>
1072
+ <hr>
1073
+ <p><a id="useruleheatmapoptions"></a></p>
1074
+ <h3 id="useruleheatmapoptions">UseRuleHeatmapOptions</h3>
1075
+ <h4 id="properties-25">Properties</h4>
1076
+ <div class="table-scroll">
1077
+
1078
+
1079
+
1080
+
1081
+
1082
+
1083
+
1084
+
1085
+
1086
+
1087
+
1088
+
1089
+ <table><thead><tr><th align="left">Property</th><th align="left">Type</th></tr></thead><tbody><tr><td align="left"><a id="events-3"></a> <code>events</code></td><td align="left"><a href="#trafficevent"><code>TrafficEvent</code></a>[]</td></tr></tbody></table></div>
1090
+ <hr>
1091
+ <p><a id="useruleheatmapresult"></a></p>
1092
+ <h3 id="useruleheatmapresult">UseRuleHeatmapResult</h3>
1093
+ <h4 id="properties-26">Properties</h4>
1094
+ <div class="table-scroll">
1095
+
1096
+
1097
+
1098
+
1099
+
1100
+
1101
+
1102
+
1103
+
1104
+
1105
+
1106
+
1107
+
1108
+
1109
+
1110
+
1111
+
1112
+
1113
+
1114
+ <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-1"></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>
1115
+ <hr>
1116
+ <p><a id="usetrafficbucketsoptions"></a></p>
1117
+ <h3 id="usetrafficbucketsoptions">UseTrafficBucketsOptions</h3>
1118
+ <h4 id="properties-27">Properties</h4>
1119
+ <div class="table-scroll">
1120
+
1121
+
1122
+
1123
+
1124
+
1125
+
1126
+
1127
+
1128
+
1129
+
1130
+
1131
+
1132
+
1133
+
1134
+
1135
+
1136
+
1137
+
1138
+
1139
+
1140
+
1141
+
1142
+
1143
+
1144
+ <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. Default 30.</td></tr><tr><td align="left"><a id="events-4"></a> <code>events</code></td><td align="left"><a href="#trafficevent"><code>TrafficEvent</code></a>[]</td><td align="left">-</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">The time range to bucket over.</td></tr></tbody></table></div>
1145
+ <hr>
1146
+ <p><a id="usetrafficbucketsresult"></a></p>
1147
+ <h3 id="usetrafficbucketsresult">UseTrafficBucketsResult</h3>
1148
+ <h4 id="properties-28">Properties</h4>
1149
+ <div class="table-scroll">
1150
+
1151
+
1152
+
1153
+
1154
+
1155
+
1156
+
1157
+
1158
+
1159
+
1160
+
1161
+
1162
+
1163
+
1164
+
1165
+
1166
+
1167
+
1168
+
1169
+
1170
+
1171
+
1172
+
1173
+
1174
+
1175
+
1176
+
1177
+
1178
+
1179
+
1180
+
1181
+
1182
+
1183
+
1184
+ <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-1"></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>
1185
+ <hr>
1186
+ <p><a id="usetrafficfilteroptions"></a></p>
1187
+ <h3 id="usetrafficfilteroptions">UseTrafficFilterOptions</h3>
1188
+ <h4 id="properties-29">Properties</h4>
1189
+ <div class="table-scroll">
1190
+
1191
+
1192
+
1193
+
1194
+
1195
+
1196
+
1197
+
1198
+
1199
+
1200
+
1201
+
1202
+
1203
+
1204
+
1205
+
1206
+
1207
+
1208
+
1209
+
1210
+
1211
+
1212
+
1213
+
1214
+
1215
+
1216
+
1217
+
1218
+
1219
+ <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-5"></a> <code>events</code></td><td align="left"><a href="#trafficevent"><code>TrafficEvent</code></a>[]</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>
1220
+ <hr>
1221
+ <p><a id="usetrafficfilterresult"></a></p>
1222
+ <h3 id="usetrafficfilterresult">UseTrafficFilterResult</h3>
1223
+ <h4 id="properties-30">Properties</h4>
1224
+ <div class="table-scroll">
1225
+
1226
+
1227
+
1228
+
1229
+
1230
+
1231
+
1232
+
1233
+
1234
+
1235
+
1236
+
1237
+
1238
+
1239
+
1240
+
1241
+
1242
+
1243
+
1244
+
1245
+
1246
+
1247
+
1248
+
1249
+
1250
+
1251
+
1252
+
1253
+
1254
+
1255
+
1256
+
1257
+
1258
+
1259
+ <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"><a href="#trafficevent"><code>TrafficEvent</code></a>[]</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>
1260
+ <hr>
1261
+ <p><a id="usetrafficgroupsoptions"></a></p>
1262
+ <h3 id="usetrafficgroupsoptions">UseTrafficGroupsOptions</h3>
1263
+ <h4 id="properties-31">Properties</h4>
1264
+ <div class="table-scroll">
1265
+
1266
+
1267
+
1268
+
1269
+
1270
+
1271
+
1272
+
1273
+
1274
+
1275
+
1276
+
1277
+
1278
+
1279
+
1280
+
1281
+
1282
+
1283
+
1284
+
1285
+
1286
+
1287
+
1288
+
1289
+ <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-6"></a> <code>events</code></td><td align="left"><a href="#trafficevent"><code>TrafficEvent</code></a>[]</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>
1290
+ <hr>
1291
+ <p><a id="usetrafficgroupsresult"></a></p>
1292
+ <h3 id="usetrafficgroupsresult">UseTrafficGroupsResult</h3>
1293
+ <h4 id="properties-32">Properties</h4>
1294
+ <div class="table-scroll">
1295
+
1296
+
1297
+
1298
+
1299
+
1300
+
1301
+
1302
+
1303
+
1304
+
1305
+
1306
+
1307
+
1308
+
1309
+ <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-1"></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>
1310
+ <hr>
1311
+ <p><a id="usetrafficmetricsoptions"></a></p>
1312
+ <h3 id="usetrafficmetricsoptions">UseTrafficMetricsOptions</h3>
1313
+ <h4 id="properties-33">Properties</h4>
1314
+ <div class="table-scroll">
1315
+
1316
+
1317
+
1318
+
1319
+
1320
+
1321
+
1322
+
1323
+
1324
+
1325
+
1326
+
1327
+
1328
+
1329
+
1330
+
1331
+
1332
+
1333
+
1334
+
1335
+
1336
+
1337
+
1338
+
1339
+
1340
+
1341
+
1342
+
1343
+
1344
+ <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-2"></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-7"></a> <code>events</code></td><td align="left"><a href="#trafficevent"><code>TrafficEvent</code></a>[]</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;<a href="#trafficevent"><code>TrafficEvent</code></a>, <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-2"></a> <code>window</code></td><td align="left"><a href="#timewindow"><code>TimeWindow</code></a></td><td align="left">-</td></tr></tbody></table></div>
1345
+ <hr>
1346
+ <p><a id="usetrafficmonitoroptions"></a></p>
1347
+ <h3 id="usetrafficmonitoroptions">UseTrafficMonitorOptions</h3>
1348
+ <h4 id="properties-34">Properties</h4>
1349
+ <div class="table-scroll">
1350
+
1351
+
1352
+
1353
+
1354
+
1355
+
1356
+
1357
+
1358
+
1359
+
1360
+
1361
+
1362
+
1363
+
1364
+
1365
+
1366
+
1367
+
1368
+
1369
+
1370
+
1371
+
1372
+
1373
+
1374
+
1375
+
1376
+
1377
+
1378
+
1379
+ <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"><a href="#trafficsource"><code>TrafficSource</code></a></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>: <a href="#trafficevent"><code>TrafficEvent</code></a>) => <a href="#trafficevent"><code>TrafficEvent</code></a></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>
1380
+ <hr>
1381
+ <p><a id="usetrafficmonitorresult"></a></p>
1382
+ <h3 id="usetrafficmonitorresult">UseTrafficMonitorResult</h3>
1383
+ <h4 id="properties-35">Properties</h4>
1384
+ <div class="table-scroll">
1385
+
1386
+
1387
+
1388
+
1389
+
1390
+
1391
+
1392
+
1393
+
1394
+
1395
+
1396
+
1397
+
1398
+
1399
+
1400
+
1401
+
1402
+
1403
+
1404
+
1405
+
1406
+
1407
+
1408
+
1409
+
1410
+
1411
+
1412
+
1413
+
1414
+
1415
+
1416
+
1417
+
1418
+
1419
+
1420
+
1421
+
1422
+
1423
+
1424
+ <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-8"></a> <code>events</code></td><td align="left"><a href="#trafficevent"><code>TrafficEvent</code></a>[]</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>
1425
+ <hr>
1426
+ <p><a id="usetrafficstatsoptions"></a></p>
1427
+ <h3 id="usetrafficstatsoptions">UseTrafficStatsOptions</h3>
1428
+ <h4 id="properties-36">Properties</h4>
1429
+ <div class="table-scroll">
1430
+
1431
+
1432
+
1433
+
1434
+
1435
+
1436
+
1437
+
1438
+
1439
+
1440
+
1441
+
1442
+
1443
+
1444
+
1445
+
1446
+
1447
+
1448
+
1449
+ <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-9"></a> <code>events</code></td><td align="left"><a href="#trafficevent"><code>TrafficEvent</code></a>[]</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>
1450
+ <h2 id="type-aliases">Type Aliases</h2>
1451
+ <p><a id="billableserieskey"></a></p>
1452
+ <h3 id="billableserieskey">BillableSeriesKey</h3>
1453
+ <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>
1454
+ <hr>
1455
+ <p><a id="rulesserieskey"></a></p>
1456
+ <h3 id="rulesserieskey">RulesSeriesKey</h3>
1457
+ <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>
1458
+ <hr>
1459
+ <p><a id="trafficgroupkind-1"></a></p>
1460
+ <h3 id="trafficgroupkind">TrafficGroupKind</h3>
1461
+ <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>
1462
+ <hr>
1463
+ <p><a id="trafficlogitem"></a></p>
1464
+ <h3 id="trafficlogitem">TrafficLogItem</h3>
1465
+ <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>
1466
+ <hr>
1467
+ <p><a id="trafficmethod"></a></p>
1468
+ <h3 id="trafficmethod">TrafficMethod</h3>
1469
+ <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"> TrafficMethod</span><span style="color:#56B6C2"> =</span></span>
1470
+ <span class="line"><span style="color:#ABB2BF"> | </span><span style="color:#98C379">"get"</span></span>
1471
+ <span class="line"><span style="color:#ABB2BF"> | </span><span style="color:#98C379">"list"</span></span>
1472
+ <span class="line"><span style="color:#ABB2BF"> | </span><span style="color:#98C379">"create"</span></span>
1473
+ <span class="line"><span style="color:#ABB2BF"> | </span><span style="color:#98C379">"update"</span></span>
1474
+ <span class="line"><span style="color:#ABB2BF"> | </span><span style="color:#98C379">"set"</span></span>
1475
+ <span class="line"><span style="color:#ABB2BF"> | </span><span style="color:#98C379">"delete"</span></span>
1476
+ <span class="line"><span style="color:#ABB2BF"> | </span><span style="color:#98C379">"remove"</span></span>
1477
+ <span class="line"><span style="color:#ABB2BF"> | </span><span style="color:#98C379">"push"</span></span>
1478
+ <span class="line"><span style="color:#ABB2BF"> | </span><span style="color:#98C379">"listen"</span></span>
1479
+ <span class="line"><span style="color:#ABB2BF"> | </span><span style="color:#98C379">"transaction"</span></span>
1480
+ <span class="line"><span style="color:#ABB2BF"> | </span><span style="color:#E5C07B">string</span><span style="color:#ABB2BF"> &#x26; {</span></span>
1481
+ <span class="line"><span style="color:#ABB2BF">};</span></span></code></pre>
1482
+ <p>The traffic domain types. <code>TrafficEvent</code> is structurally identical
1483
+ to <code>pyric/sandbox</code>’s <code>RequestEvent</code> (locked in
1484
+ the design rationale) — but the library defines its
1485
+ own copy so it never imports <code>pyric/sandbox</code>. <code>sandbox.onRequest</code>
1486
+ is assignable as a <code>TrafficSource</code> with zero adapter code; a prod
1487
+ log feed can satisfy the same shape.</p>
1488
+ <hr>
1489
+ <p><a id="trafficorigin"></a></p>
1490
+ <h3 id="trafficorigin">TrafficOrigin</h3>
1491
+ <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"> TrafficOrigin</span><span style="color:#56B6C2"> =</span><span style="color:#98C379"> "user"</span><span style="color:#ABB2BF"> | </span><span style="color:#98C379">"listener"</span><span style="color:#ABB2BF"> | </span><span style="color:#98C379">"transaction"</span><span style="color:#ABB2BF"> | </span><span style="color:#98C379">"batch"</span><span style="color:#ABB2BF"> | </span><span style="color:#98C379">"admin"</span><span style="color:#ABB2BF"> | </span><span style="color:#98C379">"system"</span><span style="color:#ABB2BF">;</span></span></code></pre>
1492
+ <hr>
1493
+ <p><a id="trafficoriginfilter"></a></p>
1494
+ <h3 id="trafficoriginfilter">TrafficOriginFilter</h3>
1495
+ <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>
1496
+ <p><code>user</code> keeps everything that isn’t a listener re-eval (user ops
1497
+ plus their transaction/batch sub-ops); <code>listener</code> keeps only
1498
+ listener re-evals; <code>all</code> keeps everything.</p>
1499
+ <hr>
1500
+ <p><a id="trafficresult"></a></p>
1501
+ <h3 id="trafficresult">TrafficResult</h3>
1502
+ <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"> TrafficResult</span><span style="color:#56B6C2"> =</span><span style="color:#98C379"> "allow"</span><span style="color:#ABB2BF"> | </span><span style="color:#98C379">"deny"</span><span style="color:#ABB2BF"> | </span><span style="color:#98C379">"unsupported"</span><span style="color:#ABB2BF"> | </span><span style="color:#98C379">"error"</span><span style="color:#ABB2BF"> | </span><span style="color:#98C379">"not-applicable"</span><span style="color:#ABB2BF">;</span></span></code></pre>
1503
+ <hr>
1504
+ <p><a id="trafficresultfilter"></a></p>
1505
+ <h3 id="trafficresultfilter">TrafficResultFilter</h3>
1506
+ <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>
1507
+ <hr>
1508
+ <p><a id="trafficsource"></a></p>
1509
+ <h3 id="trafficsource">TrafficSource()</h3>
1510
+ <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"> TrafficSource</span><span style="color:#56B6C2"> =</span><span style="color:#ABB2BF"> (</span><span style="color:#61AFEF">cb</span><span style="color:#ABB2BF">: (</span><span style="color:#E06C75;font-style:italic">event</span><span style="color:#ABB2BF">: </span><span style="color:#E5C07B">TrafficEvent</span><span style="color:#ABB2BF">) </span><span style="color:#C678DD">=></span><span style="color:#E5C07B"> void</span><span style="color:#ABB2BF">) </span><span style="color:#C678DD">=></span><span style="color:#ABB2BF"> () </span><span style="color:#C678DD">=></span><span style="color:#E5C07B"> void</span><span style="color:#ABB2BF">;</span></span></code></pre>
1511
+ <p>A subscription function: register a callback, get back an
1512
+ unsubscribe. <code>pyric/sandbox</code>’s <code>Sandbox.onRequest</code> matches this
1513
+ signature exactly.</p>
1514
+ <h4 id="parameters">Parameters</h4>
1515
+ <div class="table-scroll">
1516
+
1517
+
1518
+
1519
+
1520
+
1521
+
1522
+
1523
+
1524
+
1525
+
1526
+
1527
+
1528
+ <table><thead><tr><th align="left">Parameter</th><th align="left">Type</th></tr></thead><tbody><tr><td align="left"><code>cb</code></td><td align="left">(<code>event</code>: <a href="#trafficevent"><code>TrafficEvent</code></a>) => <code>void</code></td></tr></tbody></table></div>
1529
+ <h4 id="returns">Returns</h4>
1530
+ <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:#ABB2BF">(): </span><span style="color:#E5C07B">void</span><span style="color:#ABB2BF">;</span></span></code></pre>
1531
+ <h5 id="returns-1">Returns</h5>
1532
+ <p><code>void</code></p>
1533
+ <h2 id="variables">Variables</h2>
1534
+ <p><a id="billable_series_defs"></a></p>
1535
+ <h3 id="billable_series_defs">BILLABLE_SERIES_DEFS</h3>
1536
+ <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>
1537
+ <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>
1538
+ <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>
1539
+ <span class="line"><span style="color:#ABB2BF">}>;</span></span></code></pre>
1540
+ <hr>
1541
+ <p><a id="rules_series_defs"></a></p>
1542
+ <h3 id="rules_series_defs">RULES_SERIES_DEFS</h3>
1543
+ <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>
1544
+ <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>
1545
+ <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>
1546
+ <span class="line"><span style="color:#ABB2BF">}>;</span></span></code></pre>
1547
+ <h2 id="functions">Functions</h2>
1548
+ <p><a id="bucketbillablemetrics"></a></p>
1549
+ <h3 id="bucketbillablemetrics">bucketBillableMetrics()</h3>
1550
+ <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>
1551
+ <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>
1552
+ <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>
1553
+ <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>
1554
+ <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>
1555
+ <p>Pure kernel behind <a href="#usebillablemetrics">useBillableMetrics</a> — usable outside React.</p>
1556
+ <h4 id="parameters-1">Parameters</h4>
1557
+ <div class="table-scroll">
1558
+
1559
+
1560
+
1561
+
1562
+
1563
+
1564
+
1565
+
1566
+
1567
+
1568
+
1569
+
1570
+
1571
+
1572
+
1573
+
1574
+
1575
+
1576
+
1577
+
1578
+
1579
+
1580
+
1581
+
1582
+ <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 <a href="#trafficevent"><code>TrafficEvent</code></a>[]</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;<a href="#trafficevent"><code>TrafficEvent</code></a>, <code>"origin"</code>>) => <code>boolean</code></td></tr></tbody></table></div>
1583
+ <h4 id="returns-2">Returns</h4>
1584
+ <p><a href="#trafficmetricsresult"><code>TrafficMetricsResult</code></a></p>
1585
+ <hr>
1586
+ <p><a id="bucketrulesmetrics"></a></p>
1587
+ <h3 id="bucketrulesmetrics">bucketRulesMetrics()</h3>
1588
+ <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>
1589
+ <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>
1590
+ <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>
1591
+ <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>
1592
+ <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>
1593
+ <p>Pure kernel behind <a href="#userulesmetrics">useRulesMetrics</a> — usable outside React.</p>
1594
+ <h4 id="parameters-2">Parameters</h4>
1595
+ <div class="table-scroll">
1596
+
1597
+
1598
+
1599
+
1600
+
1601
+
1602
+
1603
+
1604
+
1605
+
1606
+
1607
+
1608
+
1609
+
1610
+
1611
+
1612
+
1613
+
1614
+
1615
+
1616
+
1617
+
1618
+
1619
+
1620
+ <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 <a href="#trafficevent"><code>TrafficEvent</code></a>[]</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;<a href="#trafficevent"><code>TrafficEvent</code></a>, <code>"origin"</code>>) => <code>boolean</code></td></tr></tbody></table></div>
1621
+ <h4 id="returns-3">Returns</h4>
1622
+ <p><a href="#trafficmetricsresult"><code>TrafficMetricsResult</code></a></p>
1623
+ <hr>
1624
+ <p><a id="buckettraffic"></a></p>
1625
+ <h3 id="buckettraffic">bucketTraffic()</h3>
1626
+ <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>
1627
+ <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>
1628
+ <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>
1629
+ <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>
1630
+ <p>The pure bucketing kernel behind <a href="#usetrafficbuckets">useTrafficBuckets</a> — usable
1631
+ outside React. Returns an empty result for a non-positive
1632
+ <code>bucketCount</code> or a zero/negative-width window.</p>
1633
+ <h4 id="parameters-3">Parameters</h4>
1634
+ <div class="table-scroll">
1635
+
1636
+
1637
+
1638
+
1639
+
1640
+
1641
+
1642
+
1643
+
1644
+
1645
+
1646
+
1647
+
1648
+
1649
+
1650
+
1651
+
1652
+
1653
+
1654
+
1655
+ <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"><a href="#trafficevent"><code>TrafficEvent</code></a>[]</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>
1656
+ <h4 id="returns-4">Returns</h4>
1657
+ <p><a href="#usetrafficbucketsresult"><code>UseTrafficBucketsResult</code></a></p>
1658
+ <hr>
1659
+ <p><a id="classifybillable"></a></p>
1660
+ <h3 id="classifybillable">classifyBillable()</h3>
1661
+ <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>
1662
+ <p>Classify a billable op, or <code>null</code> if it isn’t one / never ran.</p>
1663
+ <h4 id="parameters-4">Parameters</h4>
1664
+ <div class="table-scroll">
1665
+
1666
+
1667
+
1668
+
1669
+
1670
+
1671
+
1672
+
1673
+
1674
+
1675
+
1676
+
1677
+
1678
+
1679
+
1680
+
1681
+ <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;<a href="#trafficevent"><code>TrafficEvent</code></a>, <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;<a href="#trafficevent"><code>TrafficEvent</code></a>, <code>"origin"</code>>) => <code>boolean</code></td></tr></tbody></table></div>
1682
+ <h4 id="returns-5">Returns</h4>
1683
+ <p><a href="#billableserieskey"><code>BillableSeriesKey</code></a></p>
1684
+ <hr>
1685
+ <p><a id="classifyrules"></a></p>
1686
+ <h3 id="classifyrules">classifyRules()</h3>
1687
+ <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>
1688
+ <p>Classify a rules-engine verdict, or <code>null</code> if it isn’t one (bypassed,
1689
+ unsupported, or not-applicable).</p>
1690
+ <h4 id="parameters-5">Parameters</h4>
1691
+ <div class="table-scroll">
1692
+
1693
+
1694
+
1695
+
1696
+
1697
+
1698
+
1699
+
1700
+
1701
+
1702
+
1703
+
1704
+
1705
+
1706
+
1707
+
1708
+ <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;<a href="#trafficevent"><code>TrafficEvent</code></a>, <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;<a href="#trafficevent"><code>TrafficEvent</code></a>, <code>"origin"</code>>) => <code>boolean</code></td></tr></tbody></table></div>
1709
+ <h4 id="returns-6">Returns</h4>
1710
+ <p><a href="#rulesserieskey"><code>RulesSeriesKey</code></a></p>
1711
+ <hr>
1712
+ <p><a id="defaultformattime"></a></p>
1713
+ <h3 id="defaultformattime">defaultFormatTime()</h3>
1714
+ <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"> defaultFormatTime</span><span style="color:#ABB2BF">(</span><span style="color:#E06C75;font-style:italic">at</span><span style="color:#ABB2BF">: </span><span style="color:#E5C07B">number</span><span style="color:#ABB2BF">): </span><span style="color:#E5C07B">string</span><span style="color:#ABB2BF">;</span></span></code></pre>
1715
+ <p>Default <code>HH:MM:SS</code> timestamp formatter. Components accept a
1716
+ <code>formatTime</code> prop to override — this is just the fallback so the
1717
+ library has no hard locale dependency.</p>
1718
+ <h4 id="parameters-6">Parameters</h4>
1719
+ <div class="table-scroll">
1720
+
1721
+
1722
+
1723
+
1724
+
1725
+
1726
+
1727
+
1728
+
1729
+
1730
+
1731
+
1732
+ <table><thead><tr><th align="left">Parameter</th><th align="left">Type</th></tr></thead><tbody><tr><td align="left"><code>at</code></td><td align="left"><code>number</code></td></tr></tbody></table></div>
1733
+ <h4 id="returns-7">Returns</h4>
1734
+ <p><code>string</code></p>
1735
+ <hr>
1736
+ <p><a id="isadminevent"></a></p>
1737
+ <h3 id="isadminevent">isAdminEvent()</h3>
1738
+ <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>
1739
+ <p>Default admin predicate: the one signal the public <code>TrafficEvent</code>
1740
+ type declares. See the module doc for the known Firestore gap.</p>
1741
+ <h4 id="parameters-7">Parameters</h4>
1742
+ <div class="table-scroll">
1743
+
1744
+
1745
+
1746
+
1747
+
1748
+
1749
+
1750
+
1751
+
1752
+
1753
+
1754
+
1755
+ <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;<a href="#trafficevent"><code>TrafficEvent</code></a>, <code>"origin"</code>></td></tr></tbody></table></div>
1756
+ <h4 id="returns-8">Returns</h4>
1757
+ <p><code>boolean</code></p>
1758
+ <hr>
1759
+ <p><a id="reasonverdict"></a></p>
1760
+ <h3 id="reasonverdict">reasonVerdict()</h3>
1761
+ <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"> reasonVerdict</span><span style="color:#ABB2BF">(</span><span style="color:#E06C75;font-style:italic">reason</span><span style="color:#ABB2BF">: </span><span style="color:#E5C07B">string</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 style="color:#98C379">"neutral"</span><span style="color:#ABB2BF">;</span></span></code></pre>
1762
+ <p>Classifies a simulator debug line as a deny / allow / neutral
1763
+ verdict so consumers can tint reason rows via
1764
+ <code>[data-pyric-reason-verdict="…"]</code>.</p>
1765
+ <h4 id="parameters-8">Parameters</h4>
1766
+ <div class="table-scroll">
1767
+
1768
+
1769
+
1770
+
1771
+
1772
+
1773
+
1774
+
1775
+
1776
+
1777
+
1778
+
1779
+ <table><thead><tr><th align="left">Parameter</th><th align="left">Type</th></tr></thead><tbody><tr><td align="left"><code>reason</code></td><td align="left"><code>string</code></td></tr></tbody></table></div>
1780
+ <h4 id="returns-9">Returns</h4>
1781
+ <p><code>"allow"</code> | <code>"deny"</code> | <code>"neutral"</code></p>
1782
+ <hr>
1783
+ <p><a id="ruleheatmap"></a></p>
1784
+ <h3 id="ruleheatmap">RuleHeatmap()</h3>
1785
+ <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"> RuleHeatmap</span><span style="color:#ABB2BF">(</span><span style="color:#E06C75;font-style:italic">__namedParameters</span><span style="color:#ABB2BF">: </span><span style="color:#E5C07B">RuleHeatmapProps</span><span style="color:#ABB2BF">): </span><span style="color:#E5C07B">Element</span><span style="color:#ABB2BF">;</span></span></code></pre>
1786
+ <p>Headless rule heatmap — one row per rule, busiest first. Each row
1787
+ exposes two styling channels:</p>
1788
+ <ul>
1789
+ <li><code>data-pyric-rule-heat</code> — a discrete bucket (<code>none</code>/<code>low</code>/
1790
+ <code>medium</code>/<code>high</code>) by deny ratio, for threshold-based coloring.</li>
1791
+ <li><code>--pyric-deny-ratio</code> — the raw 0–1 ratio as a CSS custom
1792
+ property, for a proportional bar / gradient.</li>
1793
+ </ul>
1794
+ <p>Counts render as separate elements (<code>data-pyric-rule-total</code>,
1795
+ <code>-allows</code>, <code>-denies</code>) so the consumer can show numbers, bars, or
1796
+ both.</p>
1797
+ <p>Styling hooks: <code>[data-pyric-ui="rule-heatmap"]</code>,
1798
+ <code>[data-pyric-rule-row]</code> (with <code>data-pyric-rule-index</code>,
1799
+ <code>data-pyric-rule-heat</code>, <code>data-pyric-selected</code>).</p>
1800
+ <h4 id="parameters-9">Parameters</h4>
1801
+ <div class="table-scroll">
1802
+
1803
+
1804
+
1805
+
1806
+
1807
+
1808
+
1809
+
1810
+
1811
+
1812
+
1813
+
1814
+ <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="#ruleheatmapprops"><code>RuleHeatmapProps</code></a></td></tr></tbody></table></div>
1815
+ <h4 id="returns-10">Returns</h4>
1816
+ <p><code>Element</code></p>
1817
+ <hr>
1818
+ <p><a id="trafficdetail"></a></p>
1819
+ <h3 id="trafficdetail">TrafficDetail()</h3>
1820
+ <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"> TrafficDetail</span><span style="color:#ABB2BF">(</span><span style="color:#E06C75;font-style:italic">__namedParameters</span><span style="color:#ABB2BF">: </span><span style="color:#E5C07B">TrafficDetailProps</span><span style="color:#ABB2BF">): </span><span style="color:#E5C07B">Element</span><span style="color:#ABB2BF">;</span></span></code></pre>
1821
+ <p>Headless drill-in panel for a single traffic event. Renders the
1822
+ header (result + origin + timestamp + method/path + matched rule),
1823
+ a consumer classification slot, then JSON sections for auth,
1824
+ request payload, and resource before/after via <code>&#x3C;JsonView></code>, plus
1825
+ the reasons list, <code>triggeredBy</code>, and <code>groupId</code>.</p>
1826
+ <p><code>evalMs</code> appears here as a minor header field only — it is not a
1827
+ log column (local simulator; latency is de-featured per
1828
+ the design rationale).</p>
1829
+ <p>Styling hooks: <code>[data-pyric-ui="traffic-detail"]</code>,
1830
+ <code>[data-pyric-traffic-section]</code> (with <code>data-pyric-section-label</code>),
1831
+ <code>[data-pyric-traffic-reason]</code> (with <code>data-pyric-reason-verdict</code>).</p>
1832
+ <h4 id="parameters-10">Parameters</h4>
1833
+ <div class="table-scroll">
1834
+
1835
+
1836
+
1837
+
1838
+
1839
+
1840
+
1841
+
1842
+
1843
+
1844
+
1845
+
1846
+ <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="#trafficdetailprops"><code>TrafficDetailProps</code></a></td></tr></tbody></table></div>
1847
+ <h4 id="returns-11">Returns</h4>
1848
+ <p><code>Element</code></p>
1849
+ <hr>
1850
+ <p><a id="trafficgrouprow"></a></p>
1851
+ <h3 id="trafficgrouprow">TrafficGroupRow()</h3>
1852
+ <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"> TrafficGroupRow</span><span style="color:#ABB2BF">(</span><span style="color:#E06C75;font-style:italic">__namedParameters</span><span style="color:#ABB2BF">: </span><span style="color:#E5C07B">TrafficGroupRowProps</span><span style="color:#ABB2BF">): </span><span style="color:#E5C07B">Element</span><span style="color:#ABB2BF">;</span></span></code></pre>
1853
+ <p>A collapsible group row — one header summarizing a batch,
1854
+ transaction, or listener-run, expanding to the member rows. The
1855
+ header carries <code>data-pyric-group-kind</code> and a <code>data-pyric-group-*</code>
1856
+ count/deny rollup; expansion state is <code>data-pyric-expanded</code>.</p>
1857
+ <p>Styling hooks: <code>[data-pyric-traffic-group]</code>,
1858
+ <code>[data-pyric-traffic-group-header]</code> (with <code>data-pyric-group-kind</code>),
1859
+ <code>[data-pyric-traffic-group-members]</code>.</p>
1860
+ <h4 id="parameters-11">Parameters</h4>
1861
+ <div class="table-scroll">
1862
+
1863
+
1864
+
1865
+
1866
+
1867
+
1868
+
1869
+
1870
+
1871
+
1872
+
1873
+
1874
+ <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="#trafficgrouprowprops"><code>TrafficGroupRowProps</code></a></td></tr></tbody></table></div>
1875
+ <h4 id="returns-12">Returns</h4>
1876
+ <p><code>Element</code></p>
1877
+ <hr>
1878
+ <p><a id="trafficlinechart"></a></p>
1879
+ <h3 id="trafficlinechart">TrafficLineChart()</h3>
1880
+ <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"> TrafficLineChart</span><span style="color:#ABB2BF">(</span><span style="color:#E06C75;font-style:italic">__namedParameters</span><span style="color:#ABB2BF">: </span><span style="color:#E5C07B">TrafficLineChartProps</span><span style="color:#ABB2BF">): </span><span style="color:#E5C07B">Element</span><span style="color:#ABB2BF">;</span></span></code></pre>
1881
+ <p>Hand-rolled SVG line chart, no charting dependency — plain lines over
1882
+ a 0..100 viewBox so CSS drives the actual size (intrinsic layout, no
1883
+ fixed pixel chart). Each series draws only when <code>visible</code> includes
1884
+ its key (or <code>visible</code> is omitted). The y-scale is the max value
1885
+ across the currently VISIBLE series only, so toggling a tall series
1886
+ off rescales the rest up — matching the Console reference.</p>
1887
+ <p>Interaction: hovering (or focusing, via the invisible per-bucket hit
1888
+ targets) shows a tooltip with the bucket’s time range and each visible
1889
+ series’ value at that bucket — <code>[data-pyric-chart-tooltip]</code>, positioned
1890
+ via <code>--pyric-hover-x</code>.</p>
1891
+ <p>Styling hooks: <code>[data-pyric-ui="traffic-line-chart"]</code>,
1892
+ <code>[data-pyric-chart-svg]</code>, <code>[data-pyric-chart-line]</code> (with
1893
+ <code>data-pyric-series-key</code>, <code>data-pyric-series-index</code> — the same index a
1894
+ <code>TrafficMetricCards</code> card carries, so line + card colors line up),
1895
+ <code>[data-pyric-chart-hit]</code> (with <code>data-pyric-point-index</code>),
1896
+ <code>[data-pyric-chart-tooltip]</code>, <code>[data-pyric-tooltip-row]</code>.</p>
1897
+ <h4 id="parameters-12">Parameters</h4>
1898
+ <div class="table-scroll">
1899
+
1900
+
1901
+
1902
+
1903
+
1904
+
1905
+
1906
+
1907
+
1908
+
1909
+
1910
+
1911
+ <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="#trafficlinechartprops"><code>TrafficLineChartProps</code></a></td></tr></tbody></table></div>
1912
+ <h4 id="returns-13">Returns</h4>
1913
+ <p><code>Element</code></p>
1914
+ <hr>
1915
+ <p><a id="trafficlog"></a></p>
1916
+ <h3 id="trafficlog">TrafficLog()</h3>
1917
+ <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"> TrafficLog</span><span style="color:#ABB2BF">(</span><span style="color:#E06C75;font-style:italic">__namedParameters</span><span style="color:#ABB2BF">: </span><span style="color:#E5C07B">TrafficLogProps</span><span style="color:#ABB2BF">): </span><span style="color:#E5C07B">Element</span><span style="color:#ABB2BF">;</span></span></code></pre>
1918
+ <p>Headless traffic log — a Chrome DevTools Network-panel-style event
1919
+ stream. Below <code>virtualizeThreshold</code> it renders a plain <code>&#x3C;ul></code>;
1920
+ above it, TanStack-Virtual via <code>&#x3C;VirtualList></code>.</p>
1921
+ <p>Styling hooks: <code>[data-pyric-ui="traffic-log"]</code>,
1922
+ <code>[data-pyric-traffic-entry]</code> (the list item wrapper), plus the
1923
+ <code>&#x3C;TrafficRow></code> hooks.</p>
1924
+ <h4 id="parameters-13">Parameters</h4>
1925
+ <div class="table-scroll">
1926
+
1927
+
1928
+
1929
+
1930
+
1931
+
1932
+
1933
+
1934
+
1935
+
1936
+
1937
+
1938
+ <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="#trafficlogprops"><code>TrafficLogProps</code></a></td></tr></tbody></table></div>
1939
+ <h4 id="returns-14">Returns</h4>
1940
+ <p><code>Element</code></p>
1941
+ <hr>
1942
+ <p><a id="trafficmetriccards"></a></p>
1943
+ <h3 id="trafficmetriccards">TrafficMetricCards()</h3>
1944
+ <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"> TrafficMetricCards</span><span style="color:#ABB2BF">(</span><span style="color:#E06C75;font-style:italic">__namedParameters</span><span style="color:#ABB2BF">: </span><span style="color:#E5C07B">TrafficMetricCardsProps</span><span style="color:#ABB2BF">): </span><span style="color:#E5C07B">Element</span><span style="color:#ABB2BF">;</span></span></code></pre>
1945
+ <p>The period-total strip: one card per series, each showing the series’
1946
+ total for the current window. Doubles as BOTH the chart’s legend row
1947
+ (pass <code>visible</code> + <code>onToggle</code> to get the checkbox-toggle semantics) AND
1948
+ the standalone fallback presentation when a chart isn’t warranted —
1949
+ this component never depends on <a href="#trafficlinechart">TrafficLineChart</a>.</p>
1950
+ <p>Styling hooks: <code>[data-pyric-ui="traffic-metric-cards"]</code>,
1951
+ <code>[data-pyric-metric-card]</code> (with <code>data-pyric-metric-key</code>,
1952
+ <code>data-pyric-series-index</code> — the color channel a chart’s lines also
1953
+ key off of, so a card and its line always match), <code>[data-pyric-metric-hidden]</code>
1954
+ when toggled off.</p>
1955
+ <h4 id="parameters-14">Parameters</h4>
1956
+ <div class="table-scroll">
1957
+
1958
+
1959
+
1960
+
1961
+
1962
+
1963
+
1964
+
1965
+
1966
+
1967
+
1968
+
1969
+ <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="#trafficmetriccardsprops"><code>TrafficMetricCardsProps</code></a></td></tr></tbody></table></div>
1970
+ <h4 id="returns-15">Returns</h4>
1971
+ <p><code>Element</code></p>
1972
+ <hr>
1973
+ <p><a id="trafficrow"></a></p>
1974
+ <h3 id="trafficrow">TrafficRow()</h3>
1975
+ <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"> TrafficRow</span><span style="color:#ABB2BF">(</span><span style="color:#E06C75;font-style:italic">__namedParameters</span><span style="color:#ABB2BF">: </span><span style="color:#E5C07B">TrafficRowProps</span><span style="color:#ABB2BF">): </span><span style="color:#E5C07B">Element</span><span style="color:#ABB2BF">;</span></span></code></pre>
1976
+ <p>One headless traffic row — timestamp, method badge, path, and an
1977
+ optional consumer classification slot. The raw result is exposed as
1978
+ <code>data-pyric-result</code> on the row (for tinting/filtering); rendering a
1979
+ verdict/outcome label is the consumer’s job via
1980
+ <code>renderClassification</code> — the row itself draws no result chip, so a
1981
+ consumer verdict never collides with a built-in one. Latency is
1982
+ intentionally absent: this is a local simulator, so <code>evalMs</code> lives
1983
+ in <code>&#x3C;TrafficDetail></code> only.</p>
1984
+ <p>Styling hooks:</p>
1985
+ <ul>
1986
+ <li><code>[data-pyric-traffic-row]</code> — the row button, with
1987
+ <code>data-pyric-result</code>, <code>data-pyric-origin</code>, <code>data-pyric-method</code></li>
1988
+ <li><code>[data-pyric-traffic-row][data-pyric-selected]</code> — active row</li>
1989
+ <li><code>[data-pyric-traffic-time]</code> / <code>[data-pyric-traffic-path]</code></li>
1990
+ <li><code>[data-pyric-traffic-service]</code> — the service label (firestore / rtdb /
1991
+ storage / auth), rendered even when unknown (empty) so fixed-width
1992
+ styling keeps the columns aligned</li>
1993
+ <li>method renders as <code>&#x3C;Badge></code> (<code>data-pyric-badge-kind</code>)</li>
1994
+ </ul>
1995
+ <h4 id="parameters-15">Parameters</h4>
1996
+ <div class="table-scroll">
1997
+
1998
+
1999
+
2000
+
2001
+
2002
+
2003
+
2004
+
2005
+
2006
+
2007
+
2008
+
2009
+ <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="#trafficrowprops"><code>TrafficRowProps</code></a></td></tr></tbody></table></div>
2010
+ <h4 id="returns-16">Returns</h4>
2011
+ <p><code>Element</code></p>
2012
+ <hr>
2013
+ <p><a id="trafficstats"></a></p>
2014
+ <h3 id="trafficstats">TrafficStats()</h3>
2015
+ <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"> TrafficStats</span><span style="color:#ABB2BF">(</span><span style="color:#E06C75;font-style:italic">__namedParameters</span><span style="color:#ABB2BF">: </span><span style="color:#E5C07B">TrafficStatsProps</span><span style="color:#ABB2BF">): </span><span style="color:#E5C07B">Element</span><span style="color:#ABB2BF">;</span></span></code></pre>
2016
+ <p>Headless aggregation panel. Renders the totals, the deny rate, and
2017
+ count breakdowns by method / origin / path. The deny rate is
2018
+ exposed both as text and as a <code>--pyric-deny-rate</code> CSS custom
2019
+ property on the root for a proportional meter.</p>
2020
+ <p>Styling hooks: <code>[data-pyric-ui="traffic-stats"]</code>,
2021
+ <code>[data-pyric-stat]</code> (with <code>data-pyric-stat-key</code>),
2022
+ <code>[data-pyric-stat-group]</code> (with <code>data-pyric-stat-group-label</code>),
2023
+ <code>[data-pyric-stat-bucket]</code>.</p>
2024
+ <h4 id="parameters-16">Parameters</h4>
2025
+ <div class="table-scroll">
2026
+
2027
+
2028
+
2029
+
2030
+
2031
+
2032
+
2033
+
2034
+
2035
+
2036
+
2037
+
2038
+ <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="#trafficstatsprops"><code>TrafficStatsProps</code></a></td></tr></tbody></table></div>
2039
+ <h4 id="returns-17">Returns</h4>
2040
+ <p><code>Element</code></p>
2041
+ <hr>
2042
+ <p><a id="traffictimeline"></a></p>
2043
+ <h3 id="traffictimeline">TrafficTimeline()</h3>
2044
+ <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"> TrafficTimeline</span><span style="color:#ABB2BF">(</span><span style="color:#E06C75;font-style:italic">__namedParameters</span><span style="color:#ABB2BF">: </span><span style="color:#E5C07B">TrafficTimelineProps</span><span style="color:#ABB2BF">): </span><span style="color:#E5C07B">Element</span><span style="color:#ABB2BF">;</span></span></code></pre>
2045
+ <p>Headless volume-over-time histogram — the time axis for the traffic
2046
+ lens. Buckets events into N bars; each bar stacks denies (dark, at
2047
+ the base) under the allow remainder, matching the Studio mock.</p>
2048
+ <p>Per-bucket styling channels (on <code>[data-pyric-bucket]</code>):</p>
2049
+ <ul>
2050
+ <li><code>data-pyric-bucket-count</code> / <code>-denies</code> — raw integers.</li>
2051
+ <li><code>--pyric-bucket-h</code> — full bar height, 0..1 of the tallest bucket.</li>
2052
+ <li><code>--pyric-bucket-deny-h</code> — deny sub-stack height, same scale.
2053
+ The deny segment (<code>[data-pyric-bucket-deny]</code>) and allow segment
2054
+ (<code>[data-pyric-bucket-allow]</code>) are separate children so the consumer
2055
+ colors them independently.</li>
2056
+ </ul>
2057
+ <p>A <code>[data-pyric-brush]</code> overlay marks a sub-range via
2058
+ <code>--pyric-brush-left</code> / <code>--pyric-brush-right</code> (0..1 fractions). The
2059
+ <code>[data-pyric-live]</code> edge marker sits at <code>--pyric-live-x</code>.</p>
2060
+ <p>Styling hooks: <code>[data-pyric-ui="traffic-timeline"]</code>,
2061
+ <code>[data-pyric-timeline-header]</code>, <code>[data-pyric-timeline-bars]</code>,
2062
+ <code>[data-pyric-bucket]</code> (with <code>data-pyric-bucket-index</code>,
2063
+ <code>data-pyric-has-denies</code>, <code>data-pyric-bucket-selected</code>),
2064
+ <code>[data-pyric-bucket-summary]</code>, <code>[data-pyric-brush]</code>, <code>[data-pyric-live]</code>,
2065
+ <code>[data-pyric-timeline-axis]</code>.</p>
2066
+ <h4 id="parameters-17">Parameters</h4>
2067
+ <div class="table-scroll">
2068
+
2069
+
2070
+
2071
+
2072
+
2073
+
2074
+
2075
+
2076
+
2077
+
2078
+
2079
+
2080
+ <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="#traffictimelineprops"><code>TrafficTimelineProps</code></a></td></tr></tbody></table></div>
2081
+ <h4 id="returns-18">Returns</h4>
2082
+ <p><code>Element</code></p>
2083
+ <hr>
2084
+ <p><a id="usebillablemetrics"></a></p>
2085
+ <h3 id="usebillablemetrics">useBillableMetrics()</h3>
2086
+ <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>
2087
+ <p>Reads / writes / deletes, bucketed over <code>window</code>. See the module doc
2088
+ for the billable mapping + the “read ops, not billable reads” caveat.</p>
2089
+ <h4 id="parameters-18">Parameters</h4>
2090
+ <div class="table-scroll">
2091
+
2092
+
2093
+
2094
+
2095
+
2096
+
2097
+
2098
+
2099
+
2100
+
2101
+
2102
+
2103
+ <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>
2104
+ <h4 id="returns-19">Returns</h4>
2105
+ <p><a href="#trafficmetricsresult"><code>TrafficMetricsResult</code></a></p>
2106
+ <hr>
2107
+ <p><a id="useruleheatmap"></a></p>
2108
+ <h3 id="useruleheatmap">useRuleHeatmap()</h3>
2109
+ <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>
2110
+ <p>Rolls a traffic buffer up by <code>matchedRule.ruleIndex</code>: how often
2111
+ each rule fired, and how that split across allow / deny /
2112
+ unsupported. Pure derivation — feed it the filtered or full
2113
+ event list depending on what the heatmap should reflect.</p>
2114
+ <h4 id="parameters-19">Parameters</h4>
2115
+ <div class="table-scroll">
2116
+
2117
+
2118
+
2119
+
2120
+
2121
+
2122
+
2123
+
2124
+
2125
+
2126
+
2127
+
2128
+ <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>
2129
+ <h4 id="returns-20">Returns</h4>
2130
+ <p><a href="#useruleheatmapresult"><code>UseRuleHeatmapResult</code></a></p>
2131
+ <hr>
2132
+ <p><a id="userulesmetrics"></a></p>
2133
+ <h3 id="userulesmetrics">useRulesMetrics()</h3>
2134
+ <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>
2135
+ <p>Allows / denies / errors, bucketed over <code>window</code>. Excludes
2136
+ rules-bypassed (admin) ops — see the module doc.</p>
2137
+ <h4 id="parameters-20">Parameters</h4>
2138
+ <div class="table-scroll">
2139
+
2140
+
2141
+
2142
+
2143
+
2144
+
2145
+
2146
+
2147
+
2148
+
2149
+
2150
+
2151
+ <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>
2152
+ <h4 id="returns-21">Returns</h4>
2153
+ <p><a href="#trafficmetricsresult"><code>TrafficMetricsResult</code></a></p>
2154
+ <hr>
2155
+ <p><a id="usetrafficbuckets"></a></p>
2156
+ <h3 id="usetrafficbuckets">useTrafficBuckets()</h3>
2157
+ <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>
2158
+ <p>Buckets a traffic buffer into <code>bucketCount</code> equal time slices over
2159
+ <code>window</code>, counting total + denied events per slice. Pure
2160
+ derivation — the histogram component renders the result, this hook
2161
+ (and <code>bucketTraffic</code> under it) owns the math.</p>
2162
+ <p>Each bucket carries a <code>heightRatio</code> and <code>denyHeightRatio</code>
2163
+ (0..1, scaled to the tallest bucket) so the consumer can map them
2164
+ straight onto a bar height without re-finding the max.</p>
2165
+ <h4 id="parameters-21">Parameters</h4>
2166
+ <div class="table-scroll">
2167
+
2168
+
2169
+
2170
+
2171
+
2172
+
2173
+
2174
+
2175
+
2176
+
2177
+
2178
+
2179
+ <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>
2180
+ <h4 id="returns-22">Returns</h4>
2181
+ <p><a href="#usetrafficbucketsresult"><code>UseTrafficBucketsResult</code></a></p>
2182
+ <hr>
2183
+ <p><a id="usetrafficfilter"></a></p>
2184
+ <h3 id="usetrafficfilter">useTrafficFilter()</h3>
2185
+ <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>
2186
+ <p>Derives a filtered view over a traffic buffer along three
2187
+ dimensions: origin, result, and a case-insensitive path substring.
2188
+ Owns the filter state; pure derivation otherwise.</p>
2189
+ <h4 id="parameters-22">Parameters</h4>
2190
+ <div class="table-scroll">
2191
+
2192
+
2193
+
2194
+
2195
+
2196
+
2197
+
2198
+
2199
+
2200
+
2201
+
2202
+
2203
+ <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>
2204
+ <h4 id="returns-23">Returns</h4>
2205
+ <p><a href="#usetrafficfilterresult"><code>UseTrafficFilterResult</code></a></p>
2206
+ <hr>
2207
+ <p><a id="usetrafficgroups"></a></p>
2208
+ <h3 id="usetrafficgroups">useTrafficGroups()</h3>
2209
+ <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>
2210
+ <p>Folds a traffic buffer into a list of singles and collapsible
2211
+ groups. Two grouping modes, both over <em>consecutive</em> events:</p>
2212
+ <ul>
2213
+ <li><code>groupId</code> — batch/transaction sub-ops sharing an id collapse
2214
+ into one <code>batch</code> / <code>transaction</code> group.</li>
2215
+ <li>listener runs — a consecutive run of listener re-evals from the
2216
+ same originating op collapses into one <code>listener-run</code> group.
2217
+ A run of length 1 stays a single (no point collapsing one row).</li>
2218
+ </ul>
2219
+ <p>Pure derivation; the input order is preserved.</p>
2220
+ <h4 id="parameters-23">Parameters</h4>
2221
+ <div class="table-scroll">
2222
+
2223
+
2224
+
2225
+
2226
+
2227
+
2228
+
2229
+
2230
+
2231
+
2232
+
2233
+
2234
+ <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>
2235
+ <h4 id="returns-24">Returns</h4>
2236
+ <p><a href="#usetrafficgroupsresult"><code>UseTrafficGroupsResult</code></a></p>
2237
+ <hr>
2238
+ <p><a id="usetrafficmonitor"></a></p>
2239
+ <h3 id="usetrafficmonitor">useTrafficMonitor()</h3>
2240
+ <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>
2241
+ <p>Buffers a traffic stream into a capped ring buffer with
2242
+ pause/resume/clear. Decoupled from <code>pyric/sandbox</code> — <code>source</code> is
2243
+ just a <code>(cb) => unsubscribe</code> function.</p>
2244
+ <p>Pause is consumer-side: while paused, the subscription stays
2245
+ attached but incoming events are dropped (not queued). This
2246
+ matches the probe decision — a <code>load-test</code>-shaped session can emit
2247
+ 100k+ events, so queueing-while-paused would defeat the point.</p>
2248
+ <h4 id="parameters-24">Parameters</h4>
2249
+ <div class="table-scroll">
2250
+
2251
+
2252
+
2253
+
2254
+
2255
+
2256
+
2257
+
2258
+
2259
+
2260
+
2261
+
2262
+ <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>
2263
+ <h4 id="returns-25">Returns</h4>
2264
+ <p><a href="#usetrafficmonitorresult"><code>UseTrafficMonitorResult</code></a></p>
2265
+ <hr>
2266
+ <p><a id="usetrafficstats"></a></p>
2267
+ <h3 id="usetrafficstats">useTrafficStats()</h3>
2268
+ <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>
2269
+ <p>Aggregations over a traffic buffer: totals, deny rate, and counts
2270
+ broken down by method, origin, and path. Pure derivation — feed it
2271
+ the filtered or full event list depending on what the panel
2272
+ should reflect.</p>
2273
+ <h4 id="parameters-25">Parameters</h4>
2274
+ <div class="table-scroll">
2275
+
2276
+
2277
+
2278
+
2279
+
2280
+
2281
+
2282
+
2283
+
2284
+
2285
+
2286
+
2287
+ <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>
2288
+ <h4 id="returns-26">Returns</h4>
2289
+ <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="ruleheatmapprops"> <a href="#ruleheatmapprops">RuleHeatmapProps</a> </li><li data-api-symbol="timewindow"> <a href="#timewindow">TimeWindow</a> </li><li data-api-symbol="trafficauthstate"> <a href="#trafficauthstate">TrafficAuthState</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="trafficdetailprops"> <a href="#trafficdetailprops">TrafficDetailProps</a> </li><li data-api-symbol="trafficevent"> <a href="#trafficevent">TrafficEvent</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="trafficgrouprowprops"> <a href="#trafficgrouprowprops">TrafficGroupRowProps</a> </li><li data-api-symbol="trafficlinechartprops"> <a href="#trafficlinechartprops">TrafficLineChartProps</a> </li><li data-api-symbol="trafficlogprops"> <a href="#trafficlogprops">TrafficLogProps</a> </li><li data-api-symbol="trafficmatchedrule"> <a href="#trafficmatchedrule">TrafficMatchedRule</a> </li><li data-api-symbol="trafficmetriccardsprops"> <a href="#trafficmetriccardsprops">TrafficMetricCardsProps</a> </li><li data-api-symbol="trafficmetricsresult"> <a href="#trafficmetricsresult">TrafficMetricsResult</a> </li><li data-api-symbol="trafficresourcestate"> <a href="#trafficresourcestate">TrafficResourceState</a> </li><li data-api-symbol="trafficrowprops"> <a href="#trafficrowprops">TrafficRowProps</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="trafficstatsprops"> <a href="#trafficstatsprops">TrafficStatsProps</a> </li><li data-api-symbol="trafficstatssummary"> <a href="#trafficstatssummary">TrafficStatsSummary</a> </li><li data-api-symbol="traffictimelineprops"> <a href="#traffictimelineprops">TrafficTimelineProps</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="trafficmethod"> <a href="#trafficmethod">TrafficMethod</a> </li><li data-api-symbol="trafficorigin"> <a href="#trafficorigin">TrafficOrigin</a> </li><li data-api-symbol="trafficoriginfilter"> <a href="#trafficoriginfilter">TrafficOriginFilter</a> </li><li data-api-symbol="trafficresult"> <a href="#trafficresult">TrafficResult</a> </li><li data-api-symbol="trafficresultfilter"> <a href="#trafficresultfilter">TrafficResultFilter</a> </li><li data-api-symbol="trafficsource()"> <a href="#trafficsource">TrafficSource()</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="defaultformattime()"> <a href="#defaultformattime">defaultFormatTime()</a> </li><li data-api-symbol="isadminevent()"> <a href="#isadminevent">isAdminEvent()</a> </li><li data-api-symbol="reasonverdict()"> <a href="#reasonverdict">reasonVerdict()</a> </li><li data-api-symbol="ruleheatmap()"> <a href="#ruleheatmap">RuleHeatmap()</a> </li><li data-api-symbol="trafficdetail()"> <a href="#trafficdetail">TrafficDetail()</a> </li><li data-api-symbol="trafficgrouprow()"> <a href="#trafficgrouprow">TrafficGroupRow()</a> </li><li data-api-symbol="trafficlinechart()"> <a href="#trafficlinechart">TrafficLineChart()</a> </li><li data-api-symbol="trafficlog()"> <a href="#trafficlog">TrafficLog()</a> </li><li data-api-symbol="trafficmetriccards()"> <a href="#trafficmetriccards">TrafficMetricCards()</a> </li><li data-api-symbol="trafficrow()"> <a href="#trafficrow">TrafficRow()</a> </li><li data-api-symbol="trafficstats()"> <a href="#trafficstats">TrafficStats()</a> </li><li data-api-symbol="traffictimeline()"> <a href="#traffictimeline">TrafficTimeline()</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>