tempest-react-sdk 0.78.0 → 0.79.0

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 (1585) hide show
  1. package/README.md +6 -6
  2. package/bin/lib/openapi/generate.mjs +168 -64
  3. package/bin/lib/openapi/generate.pagination.test.mjs +3 -2
  4. package/bin/lib/openapi/generate.test.mjs +263 -1
  5. package/dist/access/Can.cjs.map +1 -1
  6. package/dist/access/Can.js.map +1 -1
  7. package/dist/access/access-control-context.cjs.map +1 -1
  8. package/dist/access/access-control-context.js.map +1 -1
  9. package/dist/access/create-role-access-control.cjs.map +1 -1
  10. package/dist/access/create-role-access-control.js.map +1 -1
  11. package/dist/access/permissions-from-token.cjs.map +1 -1
  12. package/dist/access/permissions-from-token.js.map +1 -1
  13. package/dist/access/use-can.cjs.map +1 -1
  14. package/dist/access/use-can.js.map +1 -1
  15. package/dist/app/AppProviders.cjs.map +1 -1
  16. package/dist/app/AppProviders.js.map +1 -1
  17. package/dist/audio/audio-bus.cjs.map +1 -1
  18. package/dist/audio/audio-bus.js.map +1 -1
  19. package/dist/audio/audio-output.cjs.map +1 -1
  20. package/dist/audio/audio-output.js.map +1 -1
  21. package/dist/audio/audio-player.cjs.map +1 -1
  22. package/dist/audio/audio-player.js.map +1 -1
  23. package/dist/audio/audio-recorder.cjs.map +1 -1
  24. package/dist/audio/audio-recorder.js.map +1 -1
  25. package/dist/audio/duration.cjs.map +1 -1
  26. package/dist/audio/duration.js.map +1 -1
  27. package/dist/audio/level-meter.cjs.map +1 -1
  28. package/dist/audio/level-meter.js.map +1 -1
  29. package/dist/audio/media-access.cjs.map +1 -1
  30. package/dist/audio/media-access.js.map +1 -1
  31. package/dist/audio/noise-floor.cjs.map +1 -1
  32. package/dist/audio/noise-floor.js.map +1 -1
  33. package/dist/audio/sfx-pool.cjs.map +1 -1
  34. package/dist/audio/sfx-pool.js.map +1 -1
  35. package/dist/audio/use-audio-bus.cjs.map +1 -1
  36. package/dist/audio/use-audio-bus.js.map +1 -1
  37. package/dist/audio/use-audio-recorder.cjs.map +1 -1
  38. package/dist/audio/use-audio-recorder.js.map +1 -1
  39. package/dist/audio/use-audio.cjs.map +1 -1
  40. package/dist/audio/use-audio.js.map +1 -1
  41. package/dist/audio/use-microphone.cjs +1 -1
  42. package/dist/audio/use-microphone.cjs.map +1 -1
  43. package/dist/audio/use-microphone.js +1 -5
  44. package/dist/audio/use-microphone.js.map +1 -1
  45. package/dist/audio/use-sfx-pool.cjs.map +1 -1
  46. package/dist/audio/use-sfx-pool.js.map +1 -1
  47. package/dist/audio/voice-activity.cjs.map +1 -1
  48. package/dist/audio/voice-activity.js.map +1 -1
  49. package/dist/audio/voice-chain-stages.cjs.map +1 -1
  50. package/dist/audio/voice-chain-stages.js.map +1 -1
  51. package/dist/audio/voice-chain.cjs.map +1 -1
  52. package/dist/audio/voice-chain.js.map +1 -1
  53. package/dist/audio/wav.cjs.map +1 -1
  54. package/dist/audio/wav.js.map +1 -1
  55. package/dist/auth/AuthGuard.cjs.map +1 -1
  56. package/dist/auth/AuthGuard.js.map +1 -1
  57. package/dist/auth/create-auth-store.cjs.map +1 -1
  58. package/dist/auth/create-auth-store.js.map +1 -1
  59. package/dist/auth/create-tempest-auth.cjs +1 -1
  60. package/dist/auth/create-tempest-auth.cjs.map +1 -1
  61. package/dist/auth/create-tempest-auth.js +1 -3
  62. package/dist/auth/create-tempest-auth.js.map +1 -1
  63. package/dist/auth/jwt.cjs.map +1 -1
  64. package/dist/auth/jwt.js.map +1 -1
  65. package/dist/auth/lazy-with-retry.cjs.map +1 -1
  66. package/dist/auth/lazy-with-retry.js.map +1 -1
  67. package/dist/auth/passkey.cjs.map +1 -1
  68. package/dist/auth/passkey.js.map +1 -1
  69. package/dist/auth/refresh-queue.cjs.map +1 -1
  70. package/dist/auth/refresh-queue.js.map +1 -1
  71. package/dist/auth/use-passkey.cjs +1 -1
  72. package/dist/auth/use-passkey.cjs.map +1 -1
  73. package/dist/auth/use-passkey.js +1 -1
  74. package/dist/auth/use-passkey.js.map +1 -1
  75. package/dist/br/BrazilMap.cjs.map +1 -1
  76. package/dist/br/BrazilMap.js.map +1 -1
  77. package/dist/br/BrazilMap.module.cjs.map +1 -1
  78. package/dist/br/BrazilMap.module.js.map +1 -1
  79. package/dist/br/BrazilStateCitySelect.cjs.map +1 -1
  80. package/dist/br/BrazilStateCitySelect.js.map +1 -1
  81. package/dist/br/BrazilStateMap.cjs.map +1 -1
  82. package/dist/br/BrazilStateMap.js.map +1 -1
  83. package/dist/br/MapLegend.cjs.map +1 -1
  84. package/dist/br/MapLegend.js.map +1 -1
  85. package/dist/br/MapLegend.module.cjs.map +1 -1
  86. package/dist/br/MapLegend.module.js.map +1 -1
  87. package/dist/br/MapMarkers.cjs.map +1 -1
  88. package/dist/br/MapMarkers.js.map +1 -1
  89. package/dist/br/MapTooltip.cjs.map +1 -1
  90. package/dist/br/MapTooltip.js.map +1 -1
  91. package/dist/br/MunicipalitySearch.cjs +1 -1
  92. package/dist/br/MunicipalitySearch.cjs.map +1 -1
  93. package/dist/br/MunicipalitySearch.js +2 -5
  94. package/dist/br/MunicipalitySearch.js.map +1 -1
  95. package/dist/br/MunicipalitySearch.module.cjs.map +1 -1
  96. package/dist/br/MunicipalitySearch.module.js.map +1 -1
  97. package/dist/br/PixQRCode.cjs.map +1 -1
  98. package/dist/br/PixQRCode.js.map +1 -1
  99. package/dist/br/PixQRCode.module.cjs.map +1 -1
  100. package/dist/br/PixQRCode.module.js.map +1 -1
  101. package/dist/br/boleto.cjs.map +1 -1
  102. package/dist/br/boleto.js.map +1 -1
  103. package/dist/br/br-geo.cjs.map +1 -1
  104. package/dist/br/br-geo.js.map +1 -1
  105. package/dist/br/data/br-centroids.cjs.map +1 -1
  106. package/dist/br/data/br-centroids.js.map +1 -1
  107. package/dist/br/data/br-locations.cjs.map +1 -1
  108. package/dist/br/data/br-locations.js.map +1 -1
  109. package/dist/br/data/br-uf-geo.cjs.map +1 -1
  110. package/dist/br/data/br-uf-geo.js.map +1 -1
  111. package/dist/br/data/mun/AC.cjs.map +1 -1
  112. package/dist/br/data/mun/AC.js.map +1 -1
  113. package/dist/br/data/mun/AL.cjs.map +1 -1
  114. package/dist/br/data/mun/AL.js.map +1 -1
  115. package/dist/br/data/mun/AM.cjs.map +1 -1
  116. package/dist/br/data/mun/AM.js.map +1 -1
  117. package/dist/br/data/mun/AP.cjs.map +1 -1
  118. package/dist/br/data/mun/AP.js.map +1 -1
  119. package/dist/br/data/mun/BA.cjs.map +1 -1
  120. package/dist/br/data/mun/BA.js.map +1 -1
  121. package/dist/br/data/mun/CE.cjs.map +1 -1
  122. package/dist/br/data/mun/CE.js.map +1 -1
  123. package/dist/br/data/mun/DF.cjs.map +1 -1
  124. package/dist/br/data/mun/DF.js.map +1 -1
  125. package/dist/br/data/mun/ES.cjs.map +1 -1
  126. package/dist/br/data/mun/ES.js.map +1 -1
  127. package/dist/br/data/mun/GO.cjs.map +1 -1
  128. package/dist/br/data/mun/GO.js.map +1 -1
  129. package/dist/br/data/mun/MA.cjs.map +1 -1
  130. package/dist/br/data/mun/MA.js.map +1 -1
  131. package/dist/br/data/mun/MG.cjs.map +1 -1
  132. package/dist/br/data/mun/MG.js.map +1 -1
  133. package/dist/br/data/mun/MS.cjs.map +1 -1
  134. package/dist/br/data/mun/MS.js.map +1 -1
  135. package/dist/br/data/mun/MT.cjs.map +1 -1
  136. package/dist/br/data/mun/MT.js.map +1 -1
  137. package/dist/br/data/mun/PA.cjs.map +1 -1
  138. package/dist/br/data/mun/PA.js.map +1 -1
  139. package/dist/br/data/mun/PB.cjs.map +1 -1
  140. package/dist/br/data/mun/PB.js.map +1 -1
  141. package/dist/br/data/mun/PE.cjs.map +1 -1
  142. package/dist/br/data/mun/PE.js.map +1 -1
  143. package/dist/br/data/mun/PI.cjs.map +1 -1
  144. package/dist/br/data/mun/PI.js.map +1 -1
  145. package/dist/br/data/mun/PR.cjs.map +1 -1
  146. package/dist/br/data/mun/PR.js.map +1 -1
  147. package/dist/br/data/mun/RJ.cjs.map +1 -1
  148. package/dist/br/data/mun/RJ.js.map +1 -1
  149. package/dist/br/data/mun/RN.cjs.map +1 -1
  150. package/dist/br/data/mun/RN.js.map +1 -1
  151. package/dist/br/data/mun/RO.cjs.map +1 -1
  152. package/dist/br/data/mun/RO.js.map +1 -1
  153. package/dist/br/data/mun/RR.cjs.map +1 -1
  154. package/dist/br/data/mun/RR.js.map +1 -1
  155. package/dist/br/data/mun/RS.cjs.map +1 -1
  156. package/dist/br/data/mun/RS.js.map +1 -1
  157. package/dist/br/data/mun/SC.cjs.map +1 -1
  158. package/dist/br/data/mun/SC.js.map +1 -1
  159. package/dist/br/data/mun/SE.cjs.map +1 -1
  160. package/dist/br/data/mun/SE.js.map +1 -1
  161. package/dist/br/data/mun/SP.cjs.map +1 -1
  162. package/dist/br/data/mun/SP.js.map +1 -1
  163. package/dist/br/data/mun/TO.cjs.map +1 -1
  164. package/dist/br/data/mun/TO.js.map +1 -1
  165. package/dist/br/geocode.cjs.map +1 -1
  166. package/dist/br/geocode.js.map +1 -1
  167. package/dist/br/holidays.cjs.map +1 -1
  168. package/dist/br/holidays.js.map +1 -1
  169. package/dist/br/locations.cjs.map +1 -1
  170. package/dist/br/locations.js.map +1 -1
  171. package/dist/br/nfe.cjs.map +1 -1
  172. package/dist/br/nfe.js.map +1 -1
  173. package/dist/br/pix.cjs +1 -1
  174. package/dist/br/pix.cjs.map +1 -1
  175. package/dist/br/pix.js +108 -74
  176. package/dist/br/pix.js.map +1 -1
  177. package/dist/br/regions.cjs.map +1 -1
  178. package/dist/br/regions.js.map +1 -1
  179. package/dist/br/scales.cjs.map +1 -1
  180. package/dist/br/scales.js.map +1 -1
  181. package/dist/br/state-geo.cjs.map +1 -1
  182. package/dist/br/state-geo.js.map +1 -1
  183. package/dist/br/svg-utils.cjs.map +1 -1
  184. package/dist/br/svg-utils.js.map +1 -1
  185. package/dist/br/use-map-hover.cjs.map +1 -1
  186. package/dist/br/use-map-hover.js.map +1 -1
  187. package/dist/br/use-map-zoom.cjs.map +1 -1
  188. package/dist/br/use-map-zoom.js.map +1 -1
  189. package/dist/br/whatsapp.cjs.map +1 -1
  190. package/dist/br/whatsapp.js.map +1 -1
  191. package/dist/br.cjs.map +1 -1
  192. package/dist/br.d.ts +6 -2
  193. package/dist/br.js.map +1 -1
  194. package/dist/capture/barcode.cjs.map +1 -1
  195. package/dist/capture/barcode.js.map +1 -1
  196. package/dist/capture/media-recorder.cjs.map +1 -1
  197. package/dist/capture/media-recorder.js.map +1 -1
  198. package/dist/capture/use-barcode-scanner.cjs.map +1 -1
  199. package/dist/capture/use-barcode-scanner.js.map +1 -1
  200. package/dist/capture/use-screen-capture.cjs +1 -1
  201. package/dist/capture/use-screen-capture.cjs.map +1 -1
  202. package/dist/capture/use-screen-capture.js +1 -7
  203. package/dist/capture/use-screen-capture.js.map +1 -1
  204. package/dist/capture/use-speech-recognition.cjs +1 -1
  205. package/dist/capture/use-speech-recognition.cjs.map +1 -1
  206. package/dist/capture/use-speech-recognition.js +35 -36
  207. package/dist/capture/use-speech-recognition.js.map +1 -1
  208. package/dist/capture/use-torch.cjs.map +1 -1
  209. package/dist/capture/use-torch.js.map +1 -1
  210. package/dist/capture/use-video-recorder.cjs.map +1 -1
  211. package/dist/capture/use-video-recorder.js.map +1 -1
  212. package/dist/capture/video-recorder.cjs.map +1 -1
  213. package/dist/capture/video-recorder.js.map +1 -1
  214. package/dist/charts/AreaChart.cjs.map +1 -1
  215. package/dist/charts/AreaChart.js.map +1 -1
  216. package/dist/charts/BarChart.cjs.map +1 -1
  217. package/dist/charts/BarChart.js.map +1 -1
  218. package/dist/charts/LineChart.cjs.map +1 -1
  219. package/dist/charts/LineChart.js.map +1 -1
  220. package/dist/charts/PieChart.cjs.map +1 -1
  221. package/dist/charts/PieChart.js.map +1 -1
  222. package/dist/charts/RadarChart.cjs.map +1 -1
  223. package/dist/charts/RadarChart.js.map +1 -1
  224. package/dist/charts/palette.cjs.map +1 -1
  225. package/dist/charts/palette.js.map +1 -1
  226. package/dist/charts/scales.cjs.map +1 -1
  227. package/dist/charts/scales.js.map +1 -1
  228. package/dist/charts/types.cjs.map +1 -1
  229. package/dist/charts/types.js.map +1 -1
  230. package/dist/charts/use-chart-colors.cjs.map +1 -1
  231. package/dist/charts/use-chart-colors.js.map +1 -1
  232. package/dist/components/AIChat/AIChat.cjs +1 -1
  233. package/dist/components/AIChat/AIChat.cjs.map +1 -1
  234. package/dist/components/AIChat/AIChat.js +1 -5
  235. package/dist/components/AIChat/AIChat.js.map +1 -1
  236. package/dist/components/AIChat/AIChat.module.cjs.map +1 -1
  237. package/dist/components/AIChat/AIChat.module.js.map +1 -1
  238. package/dist/components/AIChat/AIChatComposer.cjs +1 -1
  239. package/dist/components/AIChat/AIChatComposer.cjs.map +1 -1
  240. package/dist/components/AIChat/AIChatComposer.js +1 -7
  241. package/dist/components/AIChat/AIChatComposer.js.map +1 -1
  242. package/dist/components/AIChat/AIChatTurn.cjs.map +1 -1
  243. package/dist/components/AIChat/AIChatTurn.js.map +1 -1
  244. package/dist/components/AIChat/ai-chat-turns.cjs.map +1 -1
  245. package/dist/components/AIChat/ai-chat-turns.js.map +1 -1
  246. package/dist/components/Accordion/Accordion.cjs.map +1 -1
  247. package/dist/components/Accordion/Accordion.js.map +1 -1
  248. package/dist/components/Accordion/Accordion.module.cjs.map +1 -1
  249. package/dist/components/Accordion/Accordion.module.js.map +1 -1
  250. package/dist/components/Alert/Alert.cjs.map +1 -1
  251. package/dist/components/Alert/Alert.js.map +1 -1
  252. package/dist/components/Alert/Alert.module.cjs.map +1 -1
  253. package/dist/components/Alert/Alert.module.js.map +1 -1
  254. package/dist/components/AppBar/AppBar.cjs.map +1 -1
  255. package/dist/components/AppBar/AppBar.js.map +1 -1
  256. package/dist/components/AppBar/AppBar.module.cjs.map +1 -1
  257. package/dist/components/AppBar/AppBar.module.js.map +1 -1
  258. package/dist/components/AppBar/use-sticky-body-warning.cjs +1 -1
  259. package/dist/components/AppBar/use-sticky-body-warning.cjs.map +1 -1
  260. package/dist/components/AppBar/use-sticky-body-warning.js +1 -1
  261. package/dist/components/AppBar/use-sticky-body-warning.js.map +1 -1
  262. package/dist/components/AppShell/AppShell.cjs.map +1 -1
  263. package/dist/components/AppShell/AppShell.js.map +1 -1
  264. package/dist/components/AppShell/AppShell.module.cjs.map +1 -1
  265. package/dist/components/AppShell/AppShell.module.js.map +1 -1
  266. package/dist/components/AspectRatio/AspectRatio.cjs.map +1 -1
  267. package/dist/components/AspectRatio/AspectRatio.js.map +1 -1
  268. package/dist/components/AspectRatio/AspectRatio.module.cjs.map +1 -1
  269. package/dist/components/AspectRatio/AspectRatio.module.js.map +1 -1
  270. package/dist/components/AudioPlayer/AudioPlayer.cjs +1 -1
  271. package/dist/components/AudioPlayer/AudioPlayer.cjs.map +1 -1
  272. package/dist/components/AudioPlayer/AudioPlayer.js +1 -7
  273. package/dist/components/AudioPlayer/AudioPlayer.js.map +1 -1
  274. package/dist/components/AudioPlayer/AudioPlayer.module.cjs.map +1 -1
  275. package/dist/components/AudioPlayer/AudioPlayer.module.js.map +1 -1
  276. package/dist/components/AudioRecorder/AudioRecorder.cjs +1 -1
  277. package/dist/components/AudioRecorder/AudioRecorder.cjs.map +1 -1
  278. package/dist/components/AudioRecorder/AudioRecorder.js +16 -21
  279. package/dist/components/AudioRecorder/AudioRecorder.js.map +1 -1
  280. package/dist/components/AudioRecorder/AudioRecorder.module.cjs.map +1 -1
  281. package/dist/components/AudioRecorder/AudioRecorder.module.js.map +1 -1
  282. package/dist/components/Avatar/Avatar.cjs.map +1 -1
  283. package/dist/components/Avatar/Avatar.js.map +1 -1
  284. package/dist/components/Avatar/Avatar.module.cjs.map +1 -1
  285. package/dist/components/Avatar/Avatar.module.js.map +1 -1
  286. package/dist/components/AvatarGroup/AvatarGroup.cjs.map +1 -1
  287. package/dist/components/AvatarGroup/AvatarGroup.js.map +1 -1
  288. package/dist/components/AvatarGroup/AvatarGroup.module.cjs.map +1 -1
  289. package/dist/components/AvatarGroup/AvatarGroup.module.js.map +1 -1
  290. package/dist/components/Badge/Badge.cjs.map +1 -1
  291. package/dist/components/Badge/Badge.js.map +1 -1
  292. package/dist/components/Badge/Badge.module.cjs.map +1 -1
  293. package/dist/components/Badge/Badge.module.js.map +1 -1
  294. package/dist/components/Banner/Banner.cjs.map +1 -1
  295. package/dist/components/Banner/Banner.js.map +1 -1
  296. package/dist/components/Banner/Banner.module.cjs.map +1 -1
  297. package/dist/components/Banner/Banner.module.js.map +1 -1
  298. package/dist/components/BarList/BarList.cjs.map +1 -1
  299. package/dist/components/BarList/BarList.js.map +1 -1
  300. package/dist/components/BarList/BarList.module.cjs.map +1 -1
  301. package/dist/components/BarList/BarList.module.js.map +1 -1
  302. package/dist/components/BarList/bar-list-model.cjs.map +1 -1
  303. package/dist/components/BarList/bar-list-model.js.map +1 -1
  304. package/dist/components/BarcodeScanner/BarcodeScanner.cjs.map +1 -1
  305. package/dist/components/BarcodeScanner/BarcodeScanner.js.map +1 -1
  306. package/dist/components/BarcodeScanner/BarcodeScanner.module.cjs.map +1 -1
  307. package/dist/components/BarcodeScanner/BarcodeScanner.module.js.map +1 -1
  308. package/dist/components/BottomNavigation/BottomNavigation.cjs.map +1 -1
  309. package/dist/components/BottomNavigation/BottomNavigation.js.map +1 -1
  310. package/dist/components/BottomNavigation/BottomNavigation.module.cjs.map +1 -1
  311. package/dist/components/BottomNavigation/BottomNavigation.module.js.map +1 -1
  312. package/dist/components/BottomSheet/BottomSheet.cjs.map +1 -1
  313. package/dist/components/BottomSheet/BottomSheet.js.map +1 -1
  314. package/dist/components/BottomSheet/BottomSheet.module.cjs.map +1 -1
  315. package/dist/components/BottomSheet/BottomSheet.module.js.map +1 -1
  316. package/dist/components/Breadcrumbs/Breadcrumbs.cjs.map +1 -1
  317. package/dist/components/Breadcrumbs/Breadcrumbs.js.map +1 -1
  318. package/dist/components/Breadcrumbs/Breadcrumbs.module.cjs.map +1 -1
  319. package/dist/components/Breadcrumbs/Breadcrumbs.module.js.map +1 -1
  320. package/dist/components/Button/Button.cjs.map +1 -1
  321. package/dist/components/Button/Button.js.map +1 -1
  322. package/dist/components/Button/Button.module.cjs.map +1 -1
  323. package/dist/components/Button/Button.module.js.map +1 -1
  324. package/dist/components/Button/ButtonContent.cjs.map +1 -1
  325. package/dist/components/Button/ButtonContent.js.map +1 -1
  326. package/dist/components/Button/ButtonSlot.cjs.map +1 -1
  327. package/dist/components/Button/ButtonSlot.js.map +1 -1
  328. package/dist/components/Button/button-class.cjs.map +1 -1
  329. package/dist/components/Button/button-class.js.map +1 -1
  330. package/dist/components/Button/link-rel.cjs.map +1 -1
  331. package/dist/components/Button/link-rel.js.map +1 -1
  332. package/dist/components/Button/slot.cjs.map +1 -1
  333. package/dist/components/Button/slot.js.map +1 -1
  334. package/dist/components/Calendar/Calendar.cjs.map +1 -1
  335. package/dist/components/Calendar/Calendar.js.map +1 -1
  336. package/dist/components/Calendar/Calendar.module.cjs.map +1 -1
  337. package/dist/components/Calendar/Calendar.module.js.map +1 -1
  338. package/dist/components/Card/Card.cjs.map +1 -1
  339. package/dist/components/Card/Card.js.map +1 -1
  340. package/dist/components/Card/Card.module.cjs.map +1 -1
  341. package/dist/components/Card/Card.module.js.map +1 -1
  342. package/dist/components/Carousel/Carousel.cjs.map +1 -1
  343. package/dist/components/Carousel/Carousel.js.map +1 -1
  344. package/dist/components/Carousel/Carousel.module.cjs.map +1 -1
  345. package/dist/components/Carousel/Carousel.module.js.map +1 -1
  346. package/dist/components/Center/Center.cjs.map +1 -1
  347. package/dist/components/Center/Center.js.map +1 -1
  348. package/dist/components/Center/Center.module.cjs.map +1 -1
  349. package/dist/components/Center/Center.module.js.map +1 -1
  350. package/dist/components/Chat/Chat.cjs.map +1 -1
  351. package/dist/components/Chat/Chat.js.map +1 -1
  352. package/dist/components/Chat/Chat.module.cjs.map +1 -1
  353. package/dist/components/Chat/Chat.module.js.map +1 -1
  354. package/dist/components/Chat/ChatActionsMenu.cjs.map +1 -1
  355. package/dist/components/Chat/ChatActionsMenu.js.map +1 -1
  356. package/dist/components/Chat/ChatAttachments.cjs.map +1 -1
  357. package/dist/components/Chat/ChatAttachments.js.map +1 -1
  358. package/dist/components/Chat/ChatBubble.cjs.map +1 -1
  359. package/dist/components/Chat/ChatBubble.js.map +1 -1
  360. package/dist/components/Chat/ChatComposer.cjs.map +1 -1
  361. package/dist/components/Chat/ChatComposer.js.map +1 -1
  362. package/dist/components/Chat/chat-groups.cjs +1 -1
  363. package/dist/components/Chat/chat-groups.cjs.map +1 -1
  364. package/dist/components/Chat/chat-groups.js +2 -6
  365. package/dist/components/Chat/chat-groups.js.map +1 -1
  366. package/dist/components/Chat/chat-receipt.cjs.map +1 -1
  367. package/dist/components/Chat/chat-receipt.js.map +1 -1
  368. package/dist/components/Checkbox/Checkbox.cjs.map +1 -1
  369. package/dist/components/Checkbox/Checkbox.js.map +1 -1
  370. package/dist/components/Checkbox/Checkbox.module.cjs.map +1 -1
  371. package/dist/components/Checkbox/Checkbox.module.js.map +1 -1
  372. package/dist/components/ChipInput/ChipInput.cjs +1 -1
  373. package/dist/components/ChipInput/ChipInput.cjs.map +1 -1
  374. package/dist/components/ChipInput/ChipInput.js +2 -12
  375. package/dist/components/ChipInput/ChipInput.js.map +1 -1
  376. package/dist/components/ChipInput/ChipInput.module.cjs.map +1 -1
  377. package/dist/components/ChipInput/ChipInput.module.js.map +1 -1
  378. package/dist/components/ClickOutside/ClickOutside.cjs.map +1 -1
  379. package/dist/components/ClickOutside/ClickOutside.js.map +1 -1
  380. package/dist/components/CodeBlock/CodeBlock.cjs.map +1 -1
  381. package/dist/components/CodeBlock/CodeBlock.js.map +1 -1
  382. package/dist/components/CodeBlock/CodeBlock.module.cjs.map +1 -1
  383. package/dist/components/CodeBlock/CodeBlock.module.js.map +1 -1
  384. package/dist/components/CodeBlock/tokenize.cjs.map +1 -1
  385. package/dist/components/CodeBlock/tokenize.js.map +1 -1
  386. package/dist/components/Collapsible/Collapsible.cjs.map +1 -1
  387. package/dist/components/Collapsible/Collapsible.js.map +1 -1
  388. package/dist/components/Collapsible/Collapsible.module.cjs.map +1 -1
  389. package/dist/components/Collapsible/Collapsible.module.js.map +1 -1
  390. package/dist/components/Combobox/Combobox.cjs.map +1 -1
  391. package/dist/components/Combobox/Combobox.js.map +1 -1
  392. package/dist/components/Combobox/Combobox.module.cjs.map +1 -1
  393. package/dist/components/Combobox/Combobox.module.js.map +1 -1
  394. package/dist/components/Combobox/use-listbox-dismiss.cjs.map +1 -1
  395. package/dist/components/Combobox/use-listbox-dismiss.js.map +1 -1
  396. package/dist/components/Command/Command.cjs +1 -1
  397. package/dist/components/Command/Command.cjs.map +1 -1
  398. package/dist/components/Command/Command.js +4 -11
  399. package/dist/components/Command/Command.js.map +1 -1
  400. package/dist/components/Command/Command.module.cjs.map +1 -1
  401. package/dist/components/Command/Command.module.js.map +1 -1
  402. package/dist/components/ConditionalWrapper/ConditionalWrapper.cjs.map +1 -1
  403. package/dist/components/ConditionalWrapper/ConditionalWrapper.js.map +1 -1
  404. package/dist/components/ConfirmDialog/ConfirmDialog.cjs.map +1 -1
  405. package/dist/components/ConfirmDialog/ConfirmDialog.js.map +1 -1
  406. package/dist/components/ContextMenu/ContextMenu.cjs +1 -1
  407. package/dist/components/ContextMenu/ContextMenu.cjs.map +1 -1
  408. package/dist/components/ContextMenu/ContextMenu.js +1 -1
  409. package/dist/components/ContextMenu/ContextMenu.js.map +1 -1
  410. package/dist/components/ContextMenu/ContextMenu.module.cjs.map +1 -1
  411. package/dist/components/ContextMenu/ContextMenu.module.js.map +1 -1
  412. package/dist/components/CopyButton/CopyButton.cjs.map +1 -1
  413. package/dist/components/CopyButton/CopyButton.js.map +1 -1
  414. package/dist/components/CopyButton/CopyButton.module.cjs.map +1 -1
  415. package/dist/components/CopyButton/CopyButton.module.js.map +1 -1
  416. package/dist/components/DataList/DataList.cjs.map +1 -1
  417. package/dist/components/DataList/DataList.js.map +1 -1
  418. package/dist/components/DataList/DataList.module.cjs.map +1 -1
  419. package/dist/components/DataList/DataList.module.js.map +1 -1
  420. package/dist/components/DataTable/DataTable.cjs +1 -1
  421. package/dist/components/DataTable/DataTable.cjs.map +1 -1
  422. package/dist/components/DataTable/DataTable.js +6 -14
  423. package/dist/components/DataTable/DataTable.js.map +1 -1
  424. package/dist/components/DataTable/DataTable.module.cjs.map +1 -1
  425. package/dist/components/DataTable/DataTable.module.js.map +1 -1
  426. package/dist/components/DataTable/EditableCell.cjs +1 -1
  427. package/dist/components/DataTable/EditableCell.cjs.map +1 -1
  428. package/dist/components/DataTable/EditableCell.js +1 -9
  429. package/dist/components/DataTable/EditableCell.js.map +1 -1
  430. package/dist/components/DataTable/LoadingRows.cjs.map +1 -1
  431. package/dist/components/DataTable/LoadingRows.js.map +1 -1
  432. package/dist/components/DataTable/edit-labels.cjs.map +1 -1
  433. package/dist/components/DataTable/edit-labels.js.map +1 -1
  434. package/dist/components/DataTable/use-dev-warnings.cjs.map +1 -1
  435. package/dist/components/DataTable/use-dev-warnings.js.map +1 -1
  436. package/dist/components/DatePicker/DatePicker.cjs.map +1 -1
  437. package/dist/components/DatePicker/DatePicker.js.map +1 -1
  438. package/dist/components/DateRangePicker/DateRangePicker.cjs.map +1 -1
  439. package/dist/components/DateRangePicker/DateRangePicker.js.map +1 -1
  440. package/dist/components/DateRangePicker/DateRangePicker.module.cjs.map +1 -1
  441. package/dist/components/DateRangePicker/DateRangePicker.module.js.map +1 -1
  442. package/dist/components/DescriptionList/DescriptionList.cjs.map +1 -1
  443. package/dist/components/DescriptionList/DescriptionList.js.map +1 -1
  444. package/dist/components/DescriptionList/DescriptionList.module.cjs.map +1 -1
  445. package/dist/components/DescriptionList/DescriptionList.module.js.map +1 -1
  446. package/dist/components/Divider/Divider.cjs.map +1 -1
  447. package/dist/components/Divider/Divider.js.map +1 -1
  448. package/dist/components/Divider/Divider.module.cjs.map +1 -1
  449. package/dist/components/Divider/Divider.module.js.map +1 -1
  450. package/dist/components/Drawer/Drawer.cjs.map +1 -1
  451. package/dist/components/Drawer/Drawer.js.map +1 -1
  452. package/dist/components/Drawer/Drawer.module.cjs.map +1 -1
  453. package/dist/components/Drawer/Drawer.module.js.map +1 -1
  454. package/dist/components/DropdownMenu/DropdownMenu.cjs +1 -1
  455. package/dist/components/DropdownMenu/DropdownMenu.cjs.map +1 -1
  456. package/dist/components/DropdownMenu/DropdownMenu.js +2 -14
  457. package/dist/components/DropdownMenu/DropdownMenu.js.map +1 -1
  458. package/dist/components/DropdownMenu/DropdownMenu.module.cjs.map +1 -1
  459. package/dist/components/DropdownMenu/DropdownMenu.module.js.map +1 -1
  460. package/dist/components/Dropzone/Dropzone.cjs.map +1 -1
  461. package/dist/components/Dropzone/Dropzone.js.map +1 -1
  462. package/dist/components/Dropzone/Dropzone.module.cjs.map +1 -1
  463. package/dist/components/Dropzone/Dropzone.module.js.map +1 -1
  464. package/dist/components/EmptyState/EmptyState.cjs.map +1 -1
  465. package/dist/components/EmptyState/EmptyState.js.map +1 -1
  466. package/dist/components/EmptyState/EmptyState.module.cjs.map +1 -1
  467. package/dist/components/EmptyState/EmptyState.module.js.map +1 -1
  468. package/dist/components/ErrorState/ErrorState.cjs.map +1 -1
  469. package/dist/components/ErrorState/ErrorState.js.map +1 -1
  470. package/dist/components/ErrorState/ErrorState.module.cjs.map +1 -1
  471. package/dist/components/ErrorState/ErrorState.module.js.map +1 -1
  472. package/dist/components/ErrorText/ErrorText.cjs.map +1 -1
  473. package/dist/components/ErrorText/ErrorText.js.map +1 -1
  474. package/dist/components/ErrorText/ErrorText.module.cjs.map +1 -1
  475. package/dist/components/ErrorText/ErrorText.module.js.map +1 -1
  476. package/dist/components/FileUpload/FileUpload.cjs +1 -1
  477. package/dist/components/FileUpload/FileUpload.cjs.map +1 -1
  478. package/dist/components/FileUpload/FileUpload.js +7 -17
  479. package/dist/components/FileUpload/FileUpload.js.map +1 -1
  480. package/dist/components/FileUpload/FileUpload.module.cjs.map +1 -1
  481. package/dist/components/FileUpload/FileUpload.module.js.map +1 -1
  482. package/dist/components/FilterBar/FilterBar.cjs.map +1 -1
  483. package/dist/components/FilterBar/FilterBar.js.map +1 -1
  484. package/dist/components/FilterBar/FilterBar.module.cjs.map +1 -1
  485. package/dist/components/FilterBar/FilterBar.module.js.map +1 -1
  486. package/dist/components/FilterBar/filter-apply.cjs.map +1 -1
  487. package/dist/components/FilterBar/filter-apply.js.map +1 -1
  488. package/dist/components/FilterBar/filter-model.cjs.map +1 -1
  489. package/dist/components/FilterBar/filter-model.js.map +1 -1
  490. package/dist/components/FilterBar/filter-query.cjs +1 -1
  491. package/dist/components/FilterBar/filter-query.cjs.map +1 -1
  492. package/dist/components/FilterBar/filter-query.js +2 -5
  493. package/dist/components/FilterBar/filter-query.js.map +1 -1
  494. package/dist/components/FilterPanel/FilterPanel.cjs.map +1 -1
  495. package/dist/components/FilterPanel/FilterPanel.js.map +1 -1
  496. package/dist/components/FilterPanel/FilterPanel.module.cjs.map +1 -1
  497. package/dist/components/FilterPanel/FilterPanel.module.js.map +1 -1
  498. package/dist/components/FloatingActionButton/FloatingActionButton.cjs.map +1 -1
  499. package/dist/components/FloatingActionButton/FloatingActionButton.js.map +1 -1
  500. package/dist/components/FloatingActionButton/FloatingActionButton.module.cjs.map +1 -1
  501. package/dist/components/FloatingActionButton/FloatingActionButton.module.js.map +1 -1
  502. package/dist/components/For/For.cjs.map +1 -1
  503. package/dist/components/For/For.js.map +1 -1
  504. package/dist/components/Form/Form.cjs.map +1 -1
  505. package/dist/components/Form/Form.js.map +1 -1
  506. package/dist/components/Form/Form.module.cjs.map +1 -1
  507. package/dist/components/Form/Form.module.js.map +1 -1
  508. package/dist/components/HoverCard/HoverCard.cjs.map +1 -1
  509. package/dist/components/HoverCard/HoverCard.js.map +1 -1
  510. package/dist/components/HoverCard/HoverCard.module.cjs.map +1 -1
  511. package/dist/components/HoverCard/HoverCard.module.js.map +1 -1
  512. package/dist/components/Image/Image.cjs.map +1 -1
  513. package/dist/components/Image/Image.js.map +1 -1
  514. package/dist/components/Image/Image.module.cjs.map +1 -1
  515. package/dist/components/Image/Image.module.js.map +1 -1
  516. package/dist/components/ImageCropper/ImageCropper.cjs +1 -1
  517. package/dist/components/ImageCropper/ImageCropper.cjs.map +1 -1
  518. package/dist/components/ImageCropper/ImageCropper.js +4 -8
  519. package/dist/components/ImageCropper/ImageCropper.js.map +1 -1
  520. package/dist/components/ImageCropper/ImageCropper.module.cjs.map +1 -1
  521. package/dist/components/ImageCropper/ImageCropper.module.js.map +1 -1
  522. package/dist/components/ImageCropper/crop-geometry.cjs.map +1 -1
  523. package/dist/components/ImageCropper/crop-geometry.js.map +1 -1
  524. package/dist/components/Input/Input.cjs.map +1 -1
  525. package/dist/components/Input/Input.js.map +1 -1
  526. package/dist/components/Input/Input.module.cjs.map +1 -1
  527. package/dist/components/Input/Input.module.js.map +1 -1
  528. package/dist/components/InstallBanner/InstallBanner.cjs.map +1 -1
  529. package/dist/components/InstallBanner/InstallBanner.js.map +1 -1
  530. package/dist/components/InstallBanner/InstallBanner.module.cjs.map +1 -1
  531. package/dist/components/InstallBanner/InstallBanner.module.js.map +1 -1
  532. package/dist/components/InstallButton/InstallButton.cjs.map +1 -1
  533. package/dist/components/InstallButton/InstallButton.js.map +1 -1
  534. package/dist/components/InstallButton/InstallButton.module.cjs.map +1 -1
  535. package/dist/components/InstallButton/InstallButton.module.js.map +1 -1
  536. package/dist/components/InstallButton/install-hints.cjs.map +1 -1
  537. package/dist/components/InstallButton/install-hints.js.map +1 -1
  538. package/dist/components/Kanban/Kanban.cjs.map +1 -1
  539. package/dist/components/Kanban/Kanban.js.map +1 -1
  540. package/dist/components/Kanban/Kanban.module.cjs.map +1 -1
  541. package/dist/components/Kanban/Kanban.module.js.map +1 -1
  542. package/dist/components/Kbd/Kbd.cjs.map +1 -1
  543. package/dist/components/Kbd/Kbd.js.map +1 -1
  544. package/dist/components/Kbd/Kbd.module.cjs.map +1 -1
  545. package/dist/components/Kbd/Kbd.module.js.map +1 -1
  546. package/dist/components/Label/Label.cjs.map +1 -1
  547. package/dist/components/Label/Label.js.map +1 -1
  548. package/dist/components/Label/Label.module.cjs.map +1 -1
  549. package/dist/components/Label/Label.module.js.map +1 -1
  550. package/dist/components/Layout/Layout.cjs.map +1 -1
  551. package/dist/components/Layout/Layout.js.map +1 -1
  552. package/dist/components/Layout/Layout.module.cjs.map +1 -1
  553. package/dist/components/Layout/Layout.module.js.map +1 -1
  554. package/dist/components/Lightbox/Lightbox.cjs +1 -1
  555. package/dist/components/Lightbox/Lightbox.cjs.map +1 -1
  556. package/dist/components/Lightbox/Lightbox.js +1 -1
  557. package/dist/components/Lightbox/Lightbox.js.map +1 -1
  558. package/dist/components/Lightbox/Lightbox.module.cjs.map +1 -1
  559. package/dist/components/Lightbox/Lightbox.module.js.map +1 -1
  560. package/dist/components/ListTile/ListTile.cjs.map +1 -1
  561. package/dist/components/ListTile/ListTile.js.map +1 -1
  562. package/dist/components/ListTile/ListTile.module.cjs.map +1 -1
  563. package/dist/components/ListTile/ListTile.module.js.map +1 -1
  564. package/dist/components/Markdown/Markdown.cjs.map +1 -1
  565. package/dist/components/Markdown/Markdown.js.map +1 -1
  566. package/dist/components/Markdown/Markdown.module.cjs.map +1 -1
  567. package/dist/components/Markdown/Markdown.module.js.map +1 -1
  568. package/dist/components/Markdown/markdown-parse.cjs +2 -2
  569. package/dist/components/Markdown/markdown-parse.cjs.map +1 -1
  570. package/dist/components/Markdown/markdown-parse.js +8 -27
  571. package/dist/components/Markdown/markdown-parse.js.map +1 -1
  572. package/dist/components/Masonry/Masonry.cjs.map +1 -1
  573. package/dist/components/Masonry/Masonry.js.map +1 -1
  574. package/dist/components/Masonry/Masonry.module.cjs.map +1 -1
  575. package/dist/components/Masonry/Masonry.module.js.map +1 -1
  576. package/dist/components/Masonry/masonry-layout.cjs.map +1 -1
  577. package/dist/components/Masonry/masonry-layout.js.map +1 -1
  578. package/dist/components/Menubar/Menubar.cjs.map +1 -1
  579. package/dist/components/Menubar/Menubar.js.map +1 -1
  580. package/dist/components/Menubar/Menubar.module.cjs.map +1 -1
  581. package/dist/components/Menubar/Menubar.module.js.map +1 -1
  582. package/dist/components/Modal/Modal.cjs.map +1 -1
  583. package/dist/components/Modal/Modal.js.map +1 -1
  584. package/dist/components/Modal/Modal.module.cjs.map +1 -1
  585. package/dist/components/Modal/Modal.module.js.map +1 -1
  586. package/dist/components/ModalsManager/ModalsManager.cjs.map +1 -1
  587. package/dist/components/ModalsManager/ModalsManager.js.map +1 -1
  588. package/dist/components/ModalsManager/ModalsManager.module.cjs.map +1 -1
  589. package/dist/components/ModalsManager/ModalsManager.module.js.map +1 -1
  590. package/dist/components/Money/Money.cjs.map +1 -1
  591. package/dist/components/Money/Money.js.map +1 -1
  592. package/dist/components/MultiSelect/MultiSelect.cjs.map +1 -1
  593. package/dist/components/MultiSelect/MultiSelect.js.map +1 -1
  594. package/dist/components/MultiSelect/MultiSelect.module.cjs.map +1 -1
  595. package/dist/components/MultiSelect/MultiSelect.module.js.map +1 -1
  596. package/dist/components/NProgress/NProgress.cjs.map +1 -1
  597. package/dist/components/NProgress/NProgress.js.map +1 -1
  598. package/dist/components/NProgress/NProgress.module.cjs.map +1 -1
  599. package/dist/components/NProgress/NProgress.module.js.map +1 -1
  600. package/dist/components/Navbar/Navbar.cjs.map +1 -1
  601. package/dist/components/Navbar/Navbar.js.map +1 -1
  602. package/dist/components/Navbar/Navbar.module.cjs.map +1 -1
  603. package/dist/components/Navbar/Navbar.module.js.map +1 -1
  604. package/dist/components/NavigationMenu/NavigationMenu.cjs.map +1 -1
  605. package/dist/components/NavigationMenu/NavigationMenu.js.map +1 -1
  606. package/dist/components/NavigationMenu/NavigationMenu.module.cjs.map +1 -1
  607. package/dist/components/NavigationMenu/NavigationMenu.module.js.map +1 -1
  608. package/dist/components/NavigationRail/NavigationRail.cjs.map +1 -1
  609. package/dist/components/NavigationRail/NavigationRail.js.map +1 -1
  610. package/dist/components/NavigationRail/NavigationRail.module.cjs.map +1 -1
  611. package/dist/components/NavigationRail/NavigationRail.module.js.map +1 -1
  612. package/dist/components/NotificationCenter/NotificationCenter.cjs.map +1 -1
  613. package/dist/components/NotificationCenter/NotificationCenter.js.map +1 -1
  614. package/dist/components/NotificationCenter/NotificationCenter.module.cjs.map +1 -1
  615. package/dist/components/NotificationCenter/NotificationCenter.module.js.map +1 -1
  616. package/dist/components/NotificationCenter/use-notification-inbox.cjs.map +1 -1
  617. package/dist/components/NotificationCenter/use-notification-inbox.js.map +1 -1
  618. package/dist/components/OfflineIndicator/OfflineIndicator.cjs.map +1 -1
  619. package/dist/components/OfflineIndicator/OfflineIndicator.js.map +1 -1
  620. package/dist/components/OfflineIndicator/OfflineIndicator.module.cjs.map +1 -1
  621. package/dist/components/OfflineIndicator/OfflineIndicator.module.js.map +1 -1
  622. package/dist/components/Page/Page.cjs.map +1 -1
  623. package/dist/components/Page/Page.js.map +1 -1
  624. package/dist/components/Page/Page.module.cjs.map +1 -1
  625. package/dist/components/Page/Page.module.js.map +1 -1
  626. package/dist/components/Pagination/Pagination.cjs.map +1 -1
  627. package/dist/components/Pagination/Pagination.js.map +1 -1
  628. package/dist/components/Pagination/Pagination.module.cjs.map +1 -1
  629. package/dist/components/Pagination/Pagination.module.js.map +1 -1
  630. package/dist/components/PasswordInput/PasswordInput.cjs.map +1 -1
  631. package/dist/components/PasswordInput/PasswordInput.js.map +1 -1
  632. package/dist/components/PasswordInput/PasswordInput.module.cjs.map +1 -1
  633. package/dist/components/PasswordInput/PasswordInput.module.js.map +1 -1
  634. package/dist/components/PinInput/PinInput.cjs.map +1 -1
  635. package/dist/components/PinInput/PinInput.js.map +1 -1
  636. package/dist/components/PinInput/PinInput.module.cjs.map +1 -1
  637. package/dist/components/PinInput/PinInput.module.js.map +1 -1
  638. package/dist/components/Popover/Popover.cjs.map +1 -1
  639. package/dist/components/Popover/Popover.js.map +1 -1
  640. package/dist/components/Popover/Popover.module.cjs.map +1 -1
  641. package/dist/components/Popover/Popover.module.js.map +1 -1
  642. package/dist/components/Portal/Portal.cjs.map +1 -1
  643. package/dist/components/Portal/Portal.js.map +1 -1
  644. package/dist/components/Portal/anchor-position.cjs.map +1 -1
  645. package/dist/components/Portal/anchor-position.js.map +1 -1
  646. package/dist/components/Portal/escape-layer.cjs.map +1 -1
  647. package/dist/components/Portal/escape-layer.js.map +1 -1
  648. package/dist/components/Portal/portal-host.cjs.map +1 -1
  649. package/dist/components/Portal/portal-host.js.map +1 -1
  650. package/dist/components/Portal/tab-bridge.cjs +1 -1
  651. package/dist/components/Portal/tab-bridge.cjs.map +1 -1
  652. package/dist/components/Portal/tab-bridge.js +1 -5
  653. package/dist/components/Portal/tab-bridge.js.map +1 -1
  654. package/dist/components/Progress/Progress.cjs.map +1 -1
  655. package/dist/components/Progress/Progress.js.map +1 -1
  656. package/dist/components/Progress/Progress.module.cjs.map +1 -1
  657. package/dist/components/Progress/Progress.module.js.map +1 -1
  658. package/dist/components/QRCode/QRCode.cjs.map +1 -1
  659. package/dist/components/QRCode/QRCode.js.map +1 -1
  660. package/dist/components/QRCode/QRCode.module.cjs.map +1 -1
  661. package/dist/components/QRCode/QRCode.module.js.map +1 -1
  662. package/dist/components/QRCode/qr-encode.cjs +1 -1
  663. package/dist/components/QRCode/qr-encode.cjs.map +1 -1
  664. package/dist/components/QRCode/qr-encode.js +7 -13
  665. package/dist/components/QRCode/qr-encode.js.map +1 -1
  666. package/dist/components/QRCode/qr-tables.cjs.map +1 -1
  667. package/dist/components/QRCode/qr-tables.js.map +1 -1
  668. package/dist/components/Radio/Radio.cjs.map +1 -1
  669. package/dist/components/Radio/Radio.js.map +1 -1
  670. package/dist/components/Radio/Radio.module.cjs.map +1 -1
  671. package/dist/components/Radio/Radio.module.js.map +1 -1
  672. package/dist/components/RangeSlider/RangeSlider.cjs.map +1 -1
  673. package/dist/components/RangeSlider/RangeSlider.js.map +1 -1
  674. package/dist/components/RangeSlider/RangeSlider.module.cjs.map +1 -1
  675. package/dist/components/RangeSlider/RangeSlider.module.js.map +1 -1
  676. package/dist/components/RatingStars/RatingStars.cjs.map +1 -1
  677. package/dist/components/RatingStars/RatingStars.js.map +1 -1
  678. package/dist/components/RatingStars/RatingStars.module.cjs.map +1 -1
  679. package/dist/components/RatingStars/RatingStars.module.js.map +1 -1
  680. package/dist/components/RefreshIndicator/RefreshIndicator.cjs +1 -1
  681. package/dist/components/RefreshIndicator/RefreshIndicator.cjs.map +1 -1
  682. package/dist/components/RefreshIndicator/RefreshIndicator.js +10 -18
  683. package/dist/components/RefreshIndicator/RefreshIndicator.js.map +1 -1
  684. package/dist/components/RefreshIndicator/RefreshIndicator.module.cjs.map +1 -1
  685. package/dist/components/RefreshIndicator/RefreshIndicator.module.js.map +1 -1
  686. package/dist/components/RelativeTime/RelativeTime.cjs.map +1 -1
  687. package/dist/components/RelativeTime/RelativeTime.js.map +1 -1
  688. package/dist/components/Resizable/Resizable.cjs +1 -1
  689. package/dist/components/Resizable/Resizable.cjs.map +1 -1
  690. package/dist/components/Resizable/Resizable.js +1 -9
  691. package/dist/components/Resizable/Resizable.js.map +1 -1
  692. package/dist/components/Resizable/Resizable.module.cjs.map +1 -1
  693. package/dist/components/Resizable/Resizable.module.js.map +1 -1
  694. package/dist/components/Responsive/Responsive.cjs.map +1 -1
  695. package/dist/components/Responsive/Responsive.js.map +1 -1
  696. package/dist/components/Reveal/Reveal.cjs.map +1 -1
  697. package/dist/components/Reveal/Reveal.js.map +1 -1
  698. package/dist/components/Reveal/Reveal.module.cjs.map +1 -1
  699. package/dist/components/Reveal/Reveal.module.js.map +1 -1
  700. package/dist/components/Reveal/reveal-threshold.cjs.map +1 -1
  701. package/dist/components/Reveal/reveal-threshold.js.map +1 -1
  702. package/dist/components/SafeArea/SafeArea.cjs.map +1 -1
  703. package/dist/components/SafeArea/SafeArea.js.map +1 -1
  704. package/dist/components/SafeArea/SafeArea.module.cjs.map +1 -1
  705. package/dist/components/SafeArea/SafeArea.module.js.map +1 -1
  706. package/dist/components/Scheduler/Scheduler.cjs.map +1 -1
  707. package/dist/components/Scheduler/Scheduler.js.map +1 -1
  708. package/dist/components/Scheduler/Scheduler.module.cjs.map +1 -1
  709. package/dist/components/Scheduler/Scheduler.module.js.map +1 -1
  710. package/dist/components/Scheduler/scheduler-layout.cjs.map +1 -1
  711. package/dist/components/Scheduler/scheduler-layout.js.map +1 -1
  712. package/dist/components/ScrollArea/ScrollArea.cjs.map +1 -1
  713. package/dist/components/ScrollArea/ScrollArea.js.map +1 -1
  714. package/dist/components/ScrollArea/ScrollArea.module.cjs.map +1 -1
  715. package/dist/components/ScrollArea/ScrollArea.module.js.map +1 -1
  716. package/dist/components/SearchBar/SearchBar.cjs.map +1 -1
  717. package/dist/components/SearchBar/SearchBar.js.map +1 -1
  718. package/dist/components/SearchBar/SearchBar.module.cjs.map +1 -1
  719. package/dist/components/SearchBar/SearchBar.module.js.map +1 -1
  720. package/dist/components/SectionHeader/SectionHeader.cjs.map +1 -1
  721. package/dist/components/SectionHeader/SectionHeader.js.map +1 -1
  722. package/dist/components/SectionHeader/SectionHeader.module.cjs.map +1 -1
  723. package/dist/components/SectionHeader/SectionHeader.module.js.map +1 -1
  724. package/dist/components/SegmentedControl/SegmentedControl.cjs.map +1 -1
  725. package/dist/components/SegmentedControl/SegmentedControl.js.map +1 -1
  726. package/dist/components/SegmentedControl/SegmentedControl.module.cjs.map +1 -1
  727. package/dist/components/SegmentedControl/SegmentedControl.module.js.map +1 -1
  728. package/dist/components/Select/CaretIcon.cjs.map +1 -1
  729. package/dist/components/Select/CaretIcon.js.map +1 -1
  730. package/dist/components/Select/Select.cjs.map +1 -1
  731. package/dist/components/Select/Select.js.map +1 -1
  732. package/dist/components/Select/Select.module.cjs.map +1 -1
  733. package/dist/components/Select/Select.module.js.map +1 -1
  734. package/dist/components/Select/options.cjs.map +1 -1
  735. package/dist/components/Select/options.js.map +1 -1
  736. package/dist/components/Sidebar/Sidebar.cjs +1 -1
  737. package/dist/components/Sidebar/Sidebar.cjs.map +1 -1
  738. package/dist/components/Sidebar/Sidebar.js +13 -23
  739. package/dist/components/Sidebar/Sidebar.js.map +1 -1
  740. package/dist/components/Sidebar/Sidebar.module.cjs.map +1 -1
  741. package/dist/components/Sidebar/Sidebar.module.js.map +1 -1
  742. package/dist/components/Sidebar/SidebarEntry.cjs.map +1 -1
  743. package/dist/components/Sidebar/SidebarEntry.js.map +1 -1
  744. package/dist/components/Sidebar/active-nav-key.cjs.map +1 -1
  745. package/dist/components/Sidebar/active-nav-key.js.map +1 -1
  746. package/dist/components/SignaturePad/SignaturePad.cjs +1 -1
  747. package/dist/components/SignaturePad/SignaturePad.cjs.map +1 -1
  748. package/dist/components/SignaturePad/SignaturePad.js +1 -5
  749. package/dist/components/SignaturePad/SignaturePad.js.map +1 -1
  750. package/dist/components/SignaturePad/SignaturePad.module.cjs.map +1 -1
  751. package/dist/components/SignaturePad/SignaturePad.module.js.map +1 -1
  752. package/dist/components/Skeleton/Skeleton.cjs.map +1 -1
  753. package/dist/components/Skeleton/Skeleton.js.map +1 -1
  754. package/dist/components/Skeleton/Skeleton.module.cjs.map +1 -1
  755. package/dist/components/Skeleton/Skeleton.module.js.map +1 -1
  756. package/dist/components/Slider/Slider.cjs.map +1 -1
  757. package/dist/components/Slider/Slider.js.map +1 -1
  758. package/dist/components/Slider/Slider.module.cjs.map +1 -1
  759. package/dist/components/Slider/Slider.module.js.map +1 -1
  760. package/dist/components/Spacer/Spacer.cjs.map +1 -1
  761. package/dist/components/Spacer/Spacer.js.map +1 -1
  762. package/dist/components/Spacer/Spacer.module.cjs.map +1 -1
  763. package/dist/components/Spacer/Spacer.module.js.map +1 -1
  764. package/dist/components/Sparkline/Sparkline.cjs.map +1 -1
  765. package/dist/components/Sparkline/Sparkline.js.map +1 -1
  766. package/dist/components/Sparkline/Sparkline.module.cjs.map +1 -1
  767. package/dist/components/Sparkline/Sparkline.module.js.map +1 -1
  768. package/dist/components/Sparkline/sparkline-geometry.cjs.map +1 -1
  769. package/dist/components/Sparkline/sparkline-geometry.js.map +1 -1
  770. package/dist/components/Spinner/Spinner.cjs.map +1 -1
  771. package/dist/components/Spinner/Spinner.js.map +1 -1
  772. package/dist/components/Spinner/Spinner.module.cjs.map +1 -1
  773. package/dist/components/Spinner/Spinner.module.js.map +1 -1
  774. package/dist/components/Stat/Stat.cjs.map +1 -1
  775. package/dist/components/Stat/Stat.js.map +1 -1
  776. package/dist/components/Stat/Stat.module.cjs.map +1 -1
  777. package/dist/components/Stat/Stat.module.js.map +1 -1
  778. package/dist/components/Stepper/Stepper.cjs.map +1 -1
  779. package/dist/components/Stepper/Stepper.js.map +1 -1
  780. package/dist/components/Stepper/Stepper.module.cjs.map +1 -1
  781. package/dist/components/Stepper/Stepper.module.js.map +1 -1
  782. package/dist/components/StepperInput/StepperInput.cjs.map +1 -1
  783. package/dist/components/StepperInput/StepperInput.js.map +1 -1
  784. package/dist/components/StepperInput/StepperInput.module.cjs.map +1 -1
  785. package/dist/components/StepperInput/StepperInput.module.js.map +1 -1
  786. package/dist/components/Switch/Switch.cjs.map +1 -1
  787. package/dist/components/Switch/Switch.js.map +1 -1
  788. package/dist/components/Switch/Switch.module.cjs.map +1 -1
  789. package/dist/components/Switch/Switch.module.js.map +1 -1
  790. package/dist/components/SyncStatusBadge/SyncStatusBadge.cjs.map +1 -1
  791. package/dist/components/SyncStatusBadge/SyncStatusBadge.js.map +1 -1
  792. package/dist/components/SyncStatusBadge/SyncStatusBadge.module.cjs.map +1 -1
  793. package/dist/components/SyncStatusBadge/SyncStatusBadge.module.js.map +1 -1
  794. package/dist/components/Table/Table.cjs.map +1 -1
  795. package/dist/components/Table/Table.js.map +1 -1
  796. package/dist/components/Table/Table.module.cjs.map +1 -1
  797. package/dist/components/Table/Table.module.js.map +1 -1
  798. package/dist/components/Tabs/Tabs.cjs.map +1 -1
  799. package/dist/components/Tabs/Tabs.js.map +1 -1
  800. package/dist/components/Tabs/Tabs.module.cjs.map +1 -1
  801. package/dist/components/Tabs/Tabs.module.js.map +1 -1
  802. package/dist/components/Tag/Tag.cjs.map +1 -1
  803. package/dist/components/Tag/Tag.js.map +1 -1
  804. package/dist/components/Tag/Tag.module.cjs.map +1 -1
  805. package/dist/components/Tag/Tag.module.js.map +1 -1
  806. package/dist/components/Textarea/Textarea.cjs.map +1 -1
  807. package/dist/components/Textarea/Textarea.js.map +1 -1
  808. package/dist/components/Textarea/Textarea.module.cjs.map +1 -1
  809. package/dist/components/Textarea/Textarea.module.js.map +1 -1
  810. package/dist/components/TimePicker/TimePicker.cjs.map +1 -1
  811. package/dist/components/TimePicker/TimePicker.js.map +1 -1
  812. package/dist/components/TimePicker/TimePicker.module.cjs.map +1 -1
  813. package/dist/components/TimePicker/TimePicker.module.js.map +1 -1
  814. package/dist/components/Timeline/Timeline.cjs.map +1 -1
  815. package/dist/components/Timeline/Timeline.js.map +1 -1
  816. package/dist/components/Timeline/Timeline.module.cjs.map +1 -1
  817. package/dist/components/Timeline/Timeline.module.js.map +1 -1
  818. package/dist/components/Toast/Toast.module.cjs.map +1 -1
  819. package/dist/components/Toast/Toast.module.js.map +1 -1
  820. package/dist/components/Toast/ToastProvider.cjs.map +1 -1
  821. package/dist/components/Toast/ToastProvider.js.map +1 -1
  822. package/dist/components/Toggle/Toggle.cjs.map +1 -1
  823. package/dist/components/Toggle/Toggle.js.map +1 -1
  824. package/dist/components/Toggle/Toggle.module.cjs.map +1 -1
  825. package/dist/components/Toggle/Toggle.module.js.map +1 -1
  826. package/dist/components/ToggleGroup/ToggleGroup.cjs.map +1 -1
  827. package/dist/components/ToggleGroup/ToggleGroup.js.map +1 -1
  828. package/dist/components/ToggleGroup/ToggleGroup.module.cjs.map +1 -1
  829. package/dist/components/ToggleGroup/ToggleGroup.module.js.map +1 -1
  830. package/dist/components/Tooltip/Tooltip.cjs.map +1 -1
  831. package/dist/components/Tooltip/Tooltip.js.map +1 -1
  832. package/dist/components/Tooltip/Tooltip.module.cjs.map +1 -1
  833. package/dist/components/Tooltip/Tooltip.module.js.map +1 -1
  834. package/dist/components/Tour/Tour.cjs +1 -1
  835. package/dist/components/Tour/Tour.cjs.map +1 -1
  836. package/dist/components/Tour/Tour.js +1 -5
  837. package/dist/components/Tour/Tour.js.map +1 -1
  838. package/dist/components/Tour/Tour.module.cjs.map +1 -1
  839. package/dist/components/Tour/Tour.module.js.map +1 -1
  840. package/dist/components/Tour/tour-position.cjs.map +1 -1
  841. package/dist/components/Tour/tour-position.js.map +1 -1
  842. package/dist/components/Transfer/Transfer.cjs.map +1 -1
  843. package/dist/components/Transfer/Transfer.js.map +1 -1
  844. package/dist/components/Transfer/Transfer.module.cjs.map +1 -1
  845. package/dist/components/Transfer/Transfer.module.js.map +1 -1
  846. package/dist/components/Transfer/transfer-state.cjs.map +1 -1
  847. package/dist/components/Transfer/transfer-state.js.map +1 -1
  848. package/dist/components/TreeView/TreeView.cjs.map +1 -1
  849. package/dist/components/TreeView/TreeView.js.map +1 -1
  850. package/dist/components/TreeView/TreeView.module.cjs.map +1 -1
  851. package/dist/components/TreeView/TreeView.module.js.map +1 -1
  852. package/dist/components/TruncateText/TruncateText.cjs.map +1 -1
  853. package/dist/components/TruncateText/TruncateText.js.map +1 -1
  854. package/dist/components/TruncateText/TruncateText.module.cjs.map +1 -1
  855. package/dist/components/TruncateText/TruncateText.module.js.map +1 -1
  856. package/dist/components/UpdatePrompt/UpdatePrompt.cjs.map +1 -1
  857. package/dist/components/UpdatePrompt/UpdatePrompt.js.map +1 -1
  858. package/dist/components/UpdatePrompt/UpdatePrompt.module.cjs.map +1 -1
  859. package/dist/components/UpdatePrompt/UpdatePrompt.module.js.map +1 -1
  860. package/dist/components/VideoPlayer/VideoPlayer.cjs +1 -1
  861. package/dist/components/VideoPlayer/VideoPlayer.cjs.map +1 -1
  862. package/dist/components/VideoPlayer/VideoPlayer.js +1 -7
  863. package/dist/components/VideoPlayer/VideoPlayer.js.map +1 -1
  864. package/dist/components/VideoPlayer/VideoPlayer.module.cjs.map +1 -1
  865. package/dist/components/VideoPlayer/VideoPlayer.module.js.map +1 -1
  866. package/dist/components/VideoPlayer/playback-rates.cjs.map +1 -1
  867. package/dist/components/VideoPlayer/playback-rates.js.map +1 -1
  868. package/dist/components/VirtualList/VirtualList.cjs.map +1 -1
  869. package/dist/components/VirtualList/VirtualList.js.map +1 -1
  870. package/dist/components/VirtualList/VirtualList.module.cjs.map +1 -1
  871. package/dist/components/VirtualList/VirtualList.module.js.map +1 -1
  872. package/dist/components/VirtualTable/VirtualTable.cjs.map +1 -1
  873. package/dist/components/VirtualTable/VirtualTable.js.map +1 -1
  874. package/dist/components/VirtualTable/VirtualTable.module.cjs.map +1 -1
  875. package/dist/components/VirtualTable/VirtualTable.module.js.map +1 -1
  876. package/dist/components/VisuallyHidden/VisuallyHidden.cjs.map +1 -1
  877. package/dist/components/VisuallyHidden/VisuallyHidden.js.map +1 -1
  878. package/dist/components/VisuallyHidden/VisuallyHidden.module.cjs.map +1 -1
  879. package/dist/components/VisuallyHidden/VisuallyHidden.module.js.map +1 -1
  880. package/dist/components/Wizard/Wizard.cjs +1 -1
  881. package/dist/components/Wizard/Wizard.cjs.map +1 -1
  882. package/dist/components/Wizard/Wizard.js +4 -11
  883. package/dist/components/Wizard/Wizard.js.map +1 -1
  884. package/dist/components/Wizard/Wizard.module.cjs.map +1 -1
  885. package/dist/components/Wizard/Wizard.module.js.map +1 -1
  886. package/dist/data/create-data-provider.cjs.map +1 -1
  887. package/dist/data/create-data-provider.js.map +1 -1
  888. package/dist/data/data-provider-context.cjs.map +1 -1
  889. package/dist/data/data-provider-context.js.map +1 -1
  890. package/dist/data/use-resource.cjs.map +1 -1
  891. package/dist/data/use-resource.js.map +1 -1
  892. package/dist/editor/RichTextEditor.cjs.map +1 -1
  893. package/dist/editor/RichTextEditor.js.map +1 -1
  894. package/dist/editor/RichTextEditor.module.cjs.map +1 -1
  895. package/dist/editor/RichTextEditor.module.js.map +1 -1
  896. package/dist/editor.js +1 -2
  897. package/dist/error-boundary/ErrorBoundary.cjs.map +1 -1
  898. package/dist/error-boundary/ErrorBoundary.js.map +1 -1
  899. package/dist/error-boundary/use-error-handler.cjs.map +1 -1
  900. package/dist/error-boundary/use-error-handler.js.map +1 -1
  901. package/dist/feature-flags/FeatureFlagsProvider.cjs.map +1 -1
  902. package/dist/feature-flags/FeatureFlagsProvider.js.map +1 -1
  903. package/dist/feature-flags/growthbook-adapter.cjs.map +1 -1
  904. package/dist/feature-flags/growthbook-adapter.js.map +1 -1
  905. package/dist/feature-flags/in-memory-adapter.cjs.map +1 -1
  906. package/dist/feature-flags/in-memory-adapter.js.map +1 -1
  907. package/dist/feature-flags/launchdarkly-adapter.cjs.map +1 -1
  908. package/dist/feature-flags/launchdarkly-adapter.js.map +1 -1
  909. package/dist/forms/FormField.cjs.map +1 -1
  910. package/dist/forms/FormField.js.map +1 -1
  911. package/dist/forms/br-validators.cjs.map +1 -1
  912. package/dist/forms/br-validators.js.map +1 -1
  913. package/dist/forms/masked-inputs.cjs.map +1 -1
  914. package/dist/forms/masked-inputs.js.map +1 -1
  915. package/dist/forms/use-viacep.cjs.map +1 -1
  916. package/dist/forms/use-viacep.js.map +1 -1
  917. package/dist/forms/use-zod-form.cjs.map +1 -1
  918. package/dist/forms/use-zod-form.js.map +1 -1
  919. package/dist/forms/validate-form.cjs.map +1 -1
  920. package/dist/forms/validate-form.js.map +1 -1
  921. package/dist/forms/zod-resolver.cjs.map +1 -1
  922. package/dist/forms/zod-resolver.js.map +1 -1
  923. package/dist/geo/TrajectoryMap.cjs.map +1 -1
  924. package/dist/geo/TrajectoryMap.js.map +1 -1
  925. package/dist/geo/TrajectoryMap.module.cjs.map +1 -1
  926. package/dist/geo/TrajectoryMap.module.js.map +1 -1
  927. package/dist/geo/bounds.cjs.map +1 -1
  928. package/dist/geo/bounds.js.map +1 -1
  929. package/dist/geo/create-position-tracker.cjs +1 -1
  930. package/dist/geo/create-position-tracker.cjs.map +1 -1
  931. package/dist/geo/create-position-tracker.js +1 -7
  932. package/dist/geo/create-position-tracker.js.map +1 -1
  933. package/dist/geo/distance.cjs.map +1 -1
  934. package/dist/geo/distance.js.map +1 -1
  935. package/dist/geo/estimate.cjs.map +1 -1
  936. package/dist/geo/estimate.js.map +1 -1
  937. package/dist/geo/leaflet-map.cjs.map +1 -1
  938. package/dist/geo/leaflet-map.js.map +1 -1
  939. package/dist/geo/projection.cjs.map +1 -1
  940. package/dist/geo/projection.js.map +1 -1
  941. package/dist/geo/routing.cjs.map +1 -1
  942. package/dist/geo/routing.js.map +1 -1
  943. package/dist/geo/types.cjs.map +1 -1
  944. package/dist/geo/types.js.map +1 -1
  945. package/dist/geo/use-position-tracker.cjs.map +1 -1
  946. package/dist/geo/use-position-tracker.js.map +1 -1
  947. package/dist/hooks/pwa-env.cjs.map +1 -1
  948. package/dist/hooks/pwa-env.js.map +1 -1
  949. package/dist/hooks/tab-sequence.cjs.map +1 -1
  950. package/dist/hooks/tab-sequence.js.map +1 -1
  951. package/dist/hooks/use-announce.cjs +1 -1
  952. package/dist/hooks/use-announce.cjs.map +1 -1
  953. package/dist/hooks/use-announce.js +2 -2
  954. package/dist/hooks/use-announce.js.map +1 -1
  955. package/dist/hooks/use-async.cjs.map +1 -1
  956. package/dist/hooks/use-async.js.map +1 -1
  957. package/dist/hooks/use-before-install-prompt.cjs.map +1 -1
  958. package/dist/hooks/use-before-install-prompt.js.map +1 -1
  959. package/dist/hooks/use-breakpoint.cjs.map +1 -1
  960. package/dist/hooks/use-breakpoint.js.map +1 -1
  961. package/dist/hooks/use-click-outside.cjs.map +1 -1
  962. package/dist/hooks/use-click-outside.js.map +1 -1
  963. package/dist/hooks/use-client-filter.cjs.map +1 -1
  964. package/dist/hooks/use-client-filter.js.map +1 -1
  965. package/dist/hooks/use-clipboard.cjs.map +1 -1
  966. package/dist/hooks/use-clipboard.js.map +1 -1
  967. package/dist/hooks/use-countdown.cjs.map +1 -1
  968. package/dist/hooks/use-countdown.js.map +1 -1
  969. package/dist/hooks/use-counter.cjs.map +1 -1
  970. package/dist/hooks/use-counter.js.map +1 -1
  971. package/dist/hooks/use-debounce.cjs.map +1 -1
  972. package/dist/hooks/use-debounce.js.map +1 -1
  973. package/dist/hooks/use-deep-memo.cjs.map +1 -1
  974. package/dist/hooks/use-deep-memo.js.map +1 -1
  975. package/dist/hooks/use-disclosure.cjs.map +1 -1
  976. package/dist/hooks/use-disclosure.js.map +1 -1
  977. package/dist/hooks/use-document-title.cjs.map +1 -1
  978. package/dist/hooks/use-document-title.js.map +1 -1
  979. package/dist/hooks/use-document-visibility.cjs.map +1 -1
  980. package/dist/hooks/use-document-visibility.js.map +1 -1
  981. package/dist/hooks/use-draft-filters.cjs.map +1 -1
  982. package/dist/hooks/use-draft-filters.js.map +1 -1
  983. package/dist/hooks/use-event-listener.cjs.map +1 -1
  984. package/dist/hooks/use-event-listener.js.map +1 -1
  985. package/dist/hooks/use-favicon.cjs.map +1 -1
  986. package/dist/hooks/use-favicon.js.map +1 -1
  987. package/dist/hooks/use-focus-trap.cjs.map +1 -1
  988. package/dist/hooks/use-focus-trap.js.map +1 -1
  989. package/dist/hooks/use-fullscreen-element.cjs.map +1 -1
  990. package/dist/hooks/use-fullscreen-element.js.map +1 -1
  991. package/dist/hooks/use-fullscreen.cjs +1 -1
  992. package/dist/hooks/use-fullscreen.cjs.map +1 -1
  993. package/dist/hooks/use-fullscreen.js +7 -23
  994. package/dist/hooks/use-fullscreen.js.map +1 -1
  995. package/dist/hooks/use-geolocation.cjs.map +1 -1
  996. package/dist/hooks/use-geolocation.js.map +1 -1
  997. package/dist/hooks/use-hover.cjs.map +1 -1
  998. package/dist/hooks/use-hover.js.map +1 -1
  999. package/dist/hooks/use-idle.cjs.map +1 -1
  1000. package/dist/hooks/use-idle.js.map +1 -1
  1001. package/dist/hooks/use-install-prompt.cjs +1 -1
  1002. package/dist/hooks/use-install-prompt.cjs.map +1 -1
  1003. package/dist/hooks/use-install-prompt.js +1 -1
  1004. package/dist/hooks/use-install-prompt.js.map +1 -1
  1005. package/dist/hooks/use-intersection-observer.cjs.map +1 -1
  1006. package/dist/hooks/use-intersection-observer.js.map +1 -1
  1007. package/dist/hooks/use-interval.cjs.map +1 -1
  1008. package/dist/hooks/use-interval.js.map +1 -1
  1009. package/dist/hooks/use-is-first-render.cjs.map +1 -1
  1010. package/dist/hooks/use-is-first-render.js.map +1 -1
  1011. package/dist/hooks/use-keyboard-shortcut.cjs.map +1 -1
  1012. package/dist/hooks/use-keyboard-shortcut.js.map +1 -1
  1013. package/dist/hooks/use-latest-ref.cjs.map +1 -1
  1014. package/dist/hooks/use-latest-ref.js.map +1 -1
  1015. package/dist/hooks/use-list-state.cjs.map +1 -1
  1016. package/dist/hooks/use-list-state.js.map +1 -1
  1017. package/dist/hooks/use-local-storage.cjs +1 -1
  1018. package/dist/hooks/use-local-storage.cjs.map +1 -1
  1019. package/dist/hooks/use-local-storage.js +2 -5
  1020. package/dist/hooks/use-local-storage.js.map +1 -1
  1021. package/dist/hooks/use-long-press-handlers.cjs.map +1 -1
  1022. package/dist/hooks/use-long-press-handlers.js.map +1 -1
  1023. package/dist/hooks/use-long-press.cjs.map +1 -1
  1024. package/dist/hooks/use-long-press.js.map +1 -1
  1025. package/dist/hooks/use-map.cjs.map +1 -1
  1026. package/dist/hooks/use-map.js.map +1 -1
  1027. package/dist/hooks/use-media-devices.cjs.map +1 -1
  1028. package/dist/hooks/use-media-devices.js.map +1 -1
  1029. package/dist/hooks/use-media-permission.cjs +1 -1
  1030. package/dist/hooks/use-media-permission.cjs.map +1 -1
  1031. package/dist/hooks/use-media-permission.js +2 -5
  1032. package/dist/hooks/use-media-permission.js.map +1 -1
  1033. package/dist/hooks/use-media-query.cjs.map +1 -1
  1034. package/dist/hooks/use-media-query.js.map +1 -1
  1035. package/dist/hooks/use-object-url.cjs.map +1 -1
  1036. package/dist/hooks/use-object-url.js.map +1 -1
  1037. package/dist/hooks/use-online.cjs.map +1 -1
  1038. package/dist/hooks/use-online.js.map +1 -1
  1039. package/dist/hooks/use-pagination.cjs.map +1 -1
  1040. package/dist/hooks/use-pagination.js.map +1 -1
  1041. package/dist/hooks/use-previous.cjs.map +1 -1
  1042. package/dist/hooks/use-previous.js.map +1 -1
  1043. package/dist/hooks/use-push-to-talk.cjs.map +1 -1
  1044. package/dist/hooks/use-push-to-talk.js.map +1 -1
  1045. package/dist/hooks/use-queue.cjs.map +1 -1
  1046. package/dist/hooks/use-queue.js.map +1 -1
  1047. package/dist/hooks/use-resize-observer.cjs.map +1 -1
  1048. package/dist/hooks/use-resize-observer.js.map +1 -1
  1049. package/dist/hooks/use-scroll-lock.cjs.map +1 -1
  1050. package/dist/hooks/use-scroll-lock.js.map +1 -1
  1051. package/dist/hooks/use-scroll-overflow.cjs.map +1 -1
  1052. package/dist/hooks/use-scroll-overflow.js.map +1 -1
  1053. package/dist/hooks/use-service-worker-update.cjs.map +1 -1
  1054. package/dist/hooks/use-service-worker-update.js.map +1 -1
  1055. package/dist/hooks/use-set.cjs.map +1 -1
  1056. package/dist/hooks/use-set.js.map +1 -1
  1057. package/dist/hooks/use-sortable.cjs.map +1 -1
  1058. package/dist/hooks/use-sortable.js.map +1 -1
  1059. package/dist/hooks/use-stable-callback.cjs.map +1 -1
  1060. package/dist/hooks/use-stable-callback.js.map +1 -1
  1061. package/dist/hooks/use-storage-estimate.cjs.map +1 -1
  1062. package/dist/hooks/use-storage-estimate.js.map +1 -1
  1063. package/dist/hooks/use-throttle.cjs.map +1 -1
  1064. package/dist/hooks/use-throttle.js.map +1 -1
  1065. package/dist/hooks/use-timeout.cjs.map +1 -1
  1066. package/dist/hooks/use-timeout.js.map +1 -1
  1067. package/dist/hooks/use-toggle.cjs.map +1 -1
  1068. package/dist/hooks/use-toggle.js.map +1 -1
  1069. package/dist/hooks/use-typewriter.cjs.map +1 -1
  1070. package/dist/hooks/use-typewriter.js.map +1 -1
  1071. package/dist/hooks/use-window-size.cjs.map +1 -1
  1072. package/dist/hooks/use-window-size.js.map +1 -1
  1073. package/dist/http/api-client.cjs.map +1 -1
  1074. package/dist/http/api-client.js.map +1 -1
  1075. package/dist/http/build-url.cjs.map +1 -1
  1076. package/dist/http/build-url.js.map +1 -1
  1077. package/dist/http/credential-scope.cjs.map +1 -1
  1078. package/dist/http/credential-scope.js.map +1 -1
  1079. package/dist/http/csrf.cjs.map +1 -1
  1080. package/dist/http/csrf.js.map +1 -1
  1081. package/dist/http/decode-response.cjs.map +1 -1
  1082. package/dist/http/decode-response.js.map +1 -1
  1083. package/dist/http/describe-api-error.cjs.map +1 -1
  1084. package/dist/http/describe-api-error.js.map +1 -1
  1085. package/dist/http/errors.cjs.map +1 -1
  1086. package/dist/http/errors.js.map +1 -1
  1087. package/dist/http/idempotency.cjs.map +1 -1
  1088. package/dist/http/idempotency.js.map +1 -1
  1089. package/dist/http/parse-response.cjs.map +1 -1
  1090. package/dist/http/parse-response.js.map +1 -1
  1091. package/dist/http/resumable-upload.cjs.map +1 -1
  1092. package/dist/http/resumable-upload.js.map +1 -1
  1093. package/dist/http/retry.cjs.map +1 -1
  1094. package/dist/http/retry.js.map +1 -1
  1095. package/dist/http/timeout.cjs.map +1 -1
  1096. package/dist/http/timeout.js.map +1 -1
  1097. package/dist/http/upload-with-progress.cjs +1 -1
  1098. package/dist/http/upload-with-progress.cjs.map +1 -1
  1099. package/dist/http/upload-with-progress.js +2 -7
  1100. package/dist/http/upload-with-progress.js.map +1 -1
  1101. package/dist/http/use-describe-api-error.cjs.map +1 -1
  1102. package/dist/http/use-describe-api-error.js.map +1 -1
  1103. package/dist/http/use-poll.cjs +1 -1
  1104. package/dist/http/use-poll.cjs.map +1 -1
  1105. package/dist/http/use-poll.js +2 -5
  1106. package/dist/http/use-poll.js.map +1 -1
  1107. package/dist/i18n/I18nProvider.cjs.map +1 -1
  1108. package/dist/i18n/I18nProvider.js.map +1 -1
  1109. package/dist/i18n/create-i18n.cjs.map +1 -1
  1110. package/dist/i18n/create-i18n.js.map +1 -1
  1111. package/dist/icons/Icon.cjs.map +1 -1
  1112. package/dist/icons/Icon.js.map +1 -1
  1113. package/dist/icons/IconPicker.cjs.map +1 -1
  1114. package/dist/icons/IconPicker.js.map +1 -1
  1115. package/dist/icons/IconPicker.module.cjs.map +1 -1
  1116. package/dist/icons/IconPicker.module.js.map +1 -1
  1117. package/dist/icons/IconProvider.cjs.map +1 -1
  1118. package/dist/icons/IconProvider.js.map +1 -1
  1119. package/dist/icons/alias.cjs.map +1 -1
  1120. package/dist/icons/alias.js.map +1 -1
  1121. package/dist/icons/generated/aliases.cjs.map +1 -1
  1122. package/dist/icons/generated/aliases.js.map +1 -1
  1123. package/dist/icons/generated/icon-names.cjs.map +1 -1
  1124. package/dist/icons/generated/icon-names.js.map +1 -1
  1125. package/dist/icons/generated/loaders.cjs.map +1 -1
  1126. package/dist/icons/generated/loaders.js.map +1 -1
  1127. package/dist/icons/generated/shard-00.cjs.map +1 -1
  1128. package/dist/icons/generated/shard-00.js.map +1 -1
  1129. package/dist/icons/generated/shard-01.cjs.map +1 -1
  1130. package/dist/icons/generated/shard-01.js.map +1 -1
  1131. package/dist/icons/generated/shard-02.cjs.map +1 -1
  1132. package/dist/icons/generated/shard-02.js.map +1 -1
  1133. package/dist/icons/generated/shard-03.cjs.map +1 -1
  1134. package/dist/icons/generated/shard-03.js.map +1 -1
  1135. package/dist/icons/generated/shard-04.cjs.map +1 -1
  1136. package/dist/icons/generated/shard-04.js.map +1 -1
  1137. package/dist/icons/generated/shard-05.cjs.map +1 -1
  1138. package/dist/icons/generated/shard-05.js.map +1 -1
  1139. package/dist/icons/generated/shard-06.cjs.map +1 -1
  1140. package/dist/icons/generated/shard-06.js.map +1 -1
  1141. package/dist/icons/generated/shard-07.cjs.map +1 -1
  1142. package/dist/icons/generated/shard-07.js.map +1 -1
  1143. package/dist/icons/generated/shard-08.cjs.map +1 -1
  1144. package/dist/icons/generated/shard-08.js.map +1 -1
  1145. package/dist/icons/generated/shard-09.cjs.map +1 -1
  1146. package/dist/icons/generated/shard-09.js.map +1 -1
  1147. package/dist/icons/generated/shard-10.cjs.map +1 -1
  1148. package/dist/icons/generated/shard-10.js.map +1 -1
  1149. package/dist/icons/generated/shard-11.cjs.map +1 -1
  1150. package/dist/icons/generated/shard-11.js.map +1 -1
  1151. package/dist/icons/generated/shard-12.cjs.map +1 -1
  1152. package/dist/icons/generated/shard-12.js.map +1 -1
  1153. package/dist/icons/generated/shard-13.cjs.map +1 -1
  1154. package/dist/icons/generated/shard-13.js.map +1 -1
  1155. package/dist/icons/generated/shard-14.cjs.map +1 -1
  1156. package/dist/icons/generated/shard-14.js.map +1 -1
  1157. package/dist/icons/generated/shard-15.cjs.map +1 -1
  1158. package/dist/icons/generated/shard-15.js.map +1 -1
  1159. package/dist/icons/generated/shard-16.cjs.map +1 -1
  1160. package/dist/icons/generated/shard-16.js.map +1 -1
  1161. package/dist/icons/generated/shard-17.cjs.map +1 -1
  1162. package/dist/icons/generated/shard-17.js.map +1 -1
  1163. package/dist/icons/generated/shard-18.cjs.map +1 -1
  1164. package/dist/icons/generated/shard-18.js.map +1 -1
  1165. package/dist/icons/generated/shard-19.cjs.map +1 -1
  1166. package/dist/icons/generated/shard-19.js.map +1 -1
  1167. package/dist/icons/generated/shard-20.cjs.map +1 -1
  1168. package/dist/icons/generated/shard-20.js.map +1 -1
  1169. package/dist/icons/generated/shard-21.cjs.map +1 -1
  1170. package/dist/icons/generated/shard-21.js.map +1 -1
  1171. package/dist/icons/generated/shard-22.cjs.map +1 -1
  1172. package/dist/icons/generated/shard-22.js.map +1 -1
  1173. package/dist/icons/generated/shard-23.cjs.map +1 -1
  1174. package/dist/icons/generated/shard-23.js.map +1 -1
  1175. package/dist/icons/generated/shard-24.cjs.map +1 -1
  1176. package/dist/icons/generated/shard-24.js.map +1 -1
  1177. package/dist/icons/generated/shard-25.cjs.map +1 -1
  1178. package/dist/icons/generated/shard-25.js.map +1 -1
  1179. package/dist/icons/generated/shard-26.cjs.map +1 -1
  1180. package/dist/icons/generated/shard-26.js.map +1 -1
  1181. package/dist/icons/generated/shard-27.cjs.map +1 -1
  1182. package/dist/icons/generated/shard-27.js.map +1 -1
  1183. package/dist/icons/generated/shard-28.cjs.map +1 -1
  1184. package/dist/icons/generated/shard-28.js.map +1 -1
  1185. package/dist/icons/generated/shard-29.cjs.map +1 -1
  1186. package/dist/icons/generated/shard-29.js.map +1 -1
  1187. package/dist/icons/generated/shard-30.cjs.map +1 -1
  1188. package/dist/icons/generated/shard-30.js.map +1 -1
  1189. package/dist/icons/generated/shard-31.cjs.map +1 -1
  1190. package/dist/icons/generated/shard-31.js.map +1 -1
  1191. package/dist/icons/generated/shard-32.cjs.map +1 -1
  1192. package/dist/icons/generated/shard-32.js.map +1 -1
  1193. package/dist/icons/generated/shard-33.cjs.map +1 -1
  1194. package/dist/icons/generated/shard-33.js.map +1 -1
  1195. package/dist/icons/generated/shard-34.cjs.map +1 -1
  1196. package/dist/icons/generated/shard-34.js.map +1 -1
  1197. package/dist/icons/generated/shard-35.cjs.map +1 -1
  1198. package/dist/icons/generated/shard-35.js.map +1 -1
  1199. package/dist/icons/generated/shard-36.cjs.map +1 -1
  1200. package/dist/icons/generated/shard-36.js.map +1 -1
  1201. package/dist/icons/generated/shard-37.cjs.map +1 -1
  1202. package/dist/icons/generated/shard-37.js.map +1 -1
  1203. package/dist/icons/generated/shard-38.cjs.map +1 -1
  1204. package/dist/icons/generated/shard-38.js.map +1 -1
  1205. package/dist/icons/generated/shard-39.cjs.map +1 -1
  1206. package/dist/icons/generated/shard-39.js.map +1 -1
  1207. package/dist/icons/generated/shard-40.cjs.map +1 -1
  1208. package/dist/icons/generated/shard-40.js.map +1 -1
  1209. package/dist/icons/generated/shard-41.cjs.map +1 -1
  1210. package/dist/icons/generated/shard-41.js.map +1 -1
  1211. package/dist/icons/generated/shard-42.cjs.map +1 -1
  1212. package/dist/icons/generated/shard-42.js.map +1 -1
  1213. package/dist/icons/generated/shard-43.cjs.map +1 -1
  1214. package/dist/icons/generated/shard-43.js.map +1 -1
  1215. package/dist/icons/generated/shard-44.cjs.map +1 -1
  1216. package/dist/icons/generated/shard-44.js.map +1 -1
  1217. package/dist/icons/generated/shard-45.cjs.map +1 -1
  1218. package/dist/icons/generated/shard-45.js.map +1 -1
  1219. package/dist/icons/icon-context.cjs.map +1 -1
  1220. package/dist/icons/icon-context.js.map +1 -1
  1221. package/dist/icons/is-icon-name.cjs.map +1 -1
  1222. package/dist/icons/is-icon-name.js.map +1 -1
  1223. package/dist/icons/material-symbols.cjs.map +1 -1
  1224. package/dist/icons/material-symbols.js.map +1 -1
  1225. package/dist/icons/normalize-icon-name.cjs.map +1 -1
  1226. package/dist/icons/normalize-icon-name.js.map +1 -1
  1227. package/dist/icons/shard-cache.cjs +1 -1
  1228. package/dist/icons/shard-cache.cjs.map +1 -1
  1229. package/dist/icons/shard-cache.js +2 -5
  1230. package/dist/icons/shard-cache.js.map +1 -1
  1231. package/dist/icons/use-icon.cjs.map +1 -1
  1232. package/dist/icons/use-icon.js.map +1 -1
  1233. package/dist/icons/validate-icon-name.cjs.map +1 -1
  1234. package/dist/icons/validate-icon-name.js.map +1 -1
  1235. package/dist/icons-virtual.cjs.map +1 -1
  1236. package/dist/icons-virtual.js.map +1 -1
  1237. package/dist/imaging/canvas.cjs.map +1 -1
  1238. package/dist/imaging/canvas.js.map +1 -1
  1239. package/dist/imaging/compress.cjs.map +1 -1
  1240. package/dist/imaging/compress.js.map +1 -1
  1241. package/dist/imaging/decode.cjs.map +1 -1
  1242. package/dist/imaging/decode.js.map +1 -1
  1243. package/dist/imaging/encode.cjs.map +1 -1
  1244. package/dist/imaging/encode.js.map +1 -1
  1245. package/dist/imaging/exceptions.cjs.map +1 -1
  1246. package/dist/imaging/exceptions.js.map +1 -1
  1247. package/dist/imaging/frame.cjs.map +1 -1
  1248. package/dist/imaging/frame.js.map +1 -1
  1249. package/dist/imaging/thumbnails.cjs.map +1 -1
  1250. package/dist/imaging/thumbnails.js.map +1 -1
  1251. package/dist/imaging/transform.cjs.map +1 -1
  1252. package/dist/imaging/transform.js.map +1 -1
  1253. package/dist/imaging/use-image-processing.cjs.map +1 -1
  1254. package/dist/imaging/use-image-processing.js.map +1 -1
  1255. package/dist/logger/logger.cjs.map +1 -1
  1256. package/dist/logger/logger.js.map +1 -1
  1257. package/dist/neural.cjs.map +1 -1
  1258. package/dist/neural.js.map +1 -1
  1259. package/dist/oauth/GoogleSignIn.cjs +1 -1
  1260. package/dist/oauth/GoogleSignIn.cjs.map +1 -1
  1261. package/dist/oauth/GoogleSignIn.js +6 -9
  1262. package/dist/oauth/GoogleSignIn.js.map +1 -1
  1263. package/dist/oauth/callback.cjs.map +1 -1
  1264. package/dist/oauth/callback.js.map +1 -1
  1265. package/dist/oauth/use-oauth-callback.cjs.map +1 -1
  1266. package/dist/oauth/use-oauth-callback.js.map +1 -1
  1267. package/dist/offline/conflict.cjs.map +1 -1
  1268. package/dist/offline/conflict.js.map +1 -1
  1269. package/dist/offline/create-offline-database.cjs.map +1 -1
  1270. package/dist/offline/create-offline-database.js.map +1 -1
  1271. package/dist/offline/create-offline-store.cjs +1 -1
  1272. package/dist/offline/create-offline-store.cjs.map +1 -1
  1273. package/dist/offline/create-offline-store.js +1 -5
  1274. package/dist/offline/create-offline-store.js.map +1 -1
  1275. package/dist/offline/create-offline-sync.cjs +1 -1
  1276. package/dist/offline/create-offline-sync.cjs.map +1 -1
  1277. package/dist/offline/create-offline-sync.js +9 -14
  1278. package/dist/offline/create-offline-sync.js.map +1 -1
  1279. package/dist/offline/use-offline-sync.cjs.map +1 -1
  1280. package/dist/offline/use-offline-sync.js.map +1 -1
  1281. package/dist/perf/cache-size.cjs.map +1 -1
  1282. package/dist/perf/cache-size.js.map +1 -1
  1283. package/dist/perf/device.cjs.map +1 -1
  1284. package/dist/perf/device.js.map +1 -1
  1285. package/dist/perf/format.cjs.map +1 -1
  1286. package/dist/perf/format.js.map +1 -1
  1287. package/dist/perf/profiler.cjs.map +1 -1
  1288. package/dist/perf/profiler.js.map +1 -1
  1289. package/dist/push/use-push-subscription.cjs.map +1 -1
  1290. package/dist/push/use-push-subscription.js.map +1 -1
  1291. package/dist/push/utils.cjs.map +1 -1
  1292. package/dist/push/utils.js.map +1 -1
  1293. package/dist/push/web-push-client.cjs.map +1 -1
  1294. package/dist/push/web-push-client.js.map +1 -1
  1295. package/dist/query/QueryProvider.cjs.map +1 -1
  1296. package/dist/query/QueryProvider.js.map +1 -1
  1297. package/dist/query/constants.cjs.map +1 -1
  1298. package/dist/query/constants.js.map +1 -1
  1299. package/dist/query/create-query-keys.cjs.map +1 -1
  1300. package/dist/query/create-query-keys.js.map +1 -1
  1301. package/dist/query/foreign-client-warning.cjs.map +1 -1
  1302. package/dist/query/foreign-client-warning.js.map +1 -1
  1303. package/dist/query/offline-persistence.cjs +1 -1
  1304. package/dist/query/offline-persistence.cjs.map +1 -1
  1305. package/dist/query/offline-persistence.js +2 -10
  1306. package/dist/query/offline-persistence.js.map +1 -1
  1307. package/dist/query/optimistic.cjs.map +1 -1
  1308. package/dist/query/optimistic.js.map +1 -1
  1309. package/dist/query/pagination.cjs.map +1 -1
  1310. package/dist/query/pagination.js.map +1 -1
  1311. package/dist/query/retry-policy.cjs.map +1 -1
  1312. package/dist/query/retry-policy.js.map +1 -1
  1313. package/dist/query/use-cursor-query.cjs.map +1 -1
  1314. package/dist/query/use-cursor-query.js.map +1 -1
  1315. package/dist/query/use-offline-mutation.cjs.map +1 -1
  1316. package/dist/query/use-offline-mutation.js.map +1 -1
  1317. package/dist/query/use-paginated-query.cjs.map +1 -1
  1318. package/dist/query/use-paginated-query.js.map +1 -1
  1319. package/dist/router/AppRouter.cjs.map +1 -1
  1320. package/dist/router/AppRouter.js.map +1 -1
  1321. package/dist/router/RouteGuard.cjs.map +1 -1
  1322. package/dist/router/RouteGuard.js.map +1 -1
  1323. package/dist/router/index.js +2 -2
  1324. package/dist/share/share-or-download.cjs.map +1 -1
  1325. package/dist/share/share-or-download.js.map +1 -1
  1326. package/dist/share/share.cjs.map +1 -1
  1327. package/dist/share/share.js.map +1 -1
  1328. package/dist/sse/create-event-stream.cjs.map +1 -1
  1329. package/dist/sse/create-event-stream.js.map +1 -1
  1330. package/dist/sse/use-event-stream.cjs.map +1 -1
  1331. package/dist/sse/use-event-stream.js.map +1 -1
  1332. package/dist/store/create-selectors.cjs.map +1 -1
  1333. package/dist/store/create-selectors.js.map +1 -1
  1334. package/dist/store/create-store.cjs.map +1 -1
  1335. package/dist/store/create-store.js.map +1 -1
  1336. package/dist/sw/background-sync.cjs.map +1 -1
  1337. package/dist/sw/background-sync.js.map +1 -1
  1338. package/dist/sw/cache-inspect.cjs.map +1 -1
  1339. package/dist/sw/cache-inspect.js.map +1 -1
  1340. package/dist/sw/cache.cjs +1 -1
  1341. package/dist/sw/cache.cjs.map +1 -1
  1342. package/dist/sw/cache.js +2 -6
  1343. package/dist/sw/cache.js.map +1 -1
  1344. package/dist/sw/create-push-handler.cjs.map +1 -1
  1345. package/dist/sw/create-push-handler.js.map +1 -1
  1346. package/dist/sw/credential-headers.cjs.map +1 -1
  1347. package/dist/sw/credential-headers.js.map +1 -1
  1348. package/dist/sw/periodic-sync.cjs.map +1 -1
  1349. package/dist/sw/periodic-sync.js.map +1 -1
  1350. package/dist/sw/register-service-worker.cjs.map +1 -1
  1351. package/dist/sw/register-service-worker.js.map +1 -1
  1352. package/dist/sw/session-data.cjs.map +1 -1
  1353. package/dist/sw/session-data.js.map +1 -1
  1354. package/dist/tabular/assets.cjs.map +1 -1
  1355. package/dist/tabular/assets.js.map +1 -1
  1356. package/dist/tabular/cache.cjs.map +1 -1
  1357. package/dist/tabular/cache.js.map +1 -1
  1358. package/dist/tabular/compact.cjs.map +1 -1
  1359. package/dist/tabular/compact.js.map +1 -1
  1360. package/dist/tabular/exceptions.cjs.map +1 -1
  1361. package/dist/tabular/exceptions.js.map +1 -1
  1362. package/dist/tabular/manifest.cjs.map +1 -1
  1363. package/dist/tabular/manifest.js.map +1 -1
  1364. package/dist/tabular/predictor.cjs.map +1 -1
  1365. package/dist/tabular/predictor.js.map +1 -1
  1366. package/dist/tabular/use-tabular-predictor.cjs.map +1 -1
  1367. package/dist/tabular/use-tabular-predictor.js.map +1 -1
  1368. package/dist/telemetry/TelemetryProvider.cjs.map +1 -1
  1369. package/dist/telemetry/TelemetryProvider.js.map +1 -1
  1370. package/dist/telemetry/app-error-adapter.cjs.map +1 -1
  1371. package/dist/telemetry/app-error-adapter.js.map +1 -1
  1372. package/dist/telemetry/app-error-queue.cjs.map +1 -1
  1373. package/dist/telemetry/app-error-queue.js.map +1 -1
  1374. package/dist/telemetry/app-error-reporter.cjs.map +1 -1
  1375. package/dist/telemetry/app-error-reporter.js.map +1 -1
  1376. package/dist/telemetry/app-error-schema.cjs.map +1 -1
  1377. package/dist/telemetry/app-error-schema.js.map +1 -1
  1378. package/dist/telemetry/app-error-transport.cjs.map +1 -1
  1379. package/dist/telemetry/app-error-transport.js.map +1 -1
  1380. package/dist/telemetry/console-adapter.cjs.map +1 -1
  1381. package/dist/telemetry/console-adapter.js.map +1 -1
  1382. package/dist/telemetry/describe-app-error.cjs.map +1 -1
  1383. package/dist/telemetry/describe-app-error.js.map +1 -1
  1384. package/dist/telemetry/posthog-adapter.cjs +1 -1
  1385. package/dist/telemetry/posthog-adapter.cjs.map +1 -1
  1386. package/dist/telemetry/posthog-adapter.js +1 -5
  1387. package/dist/telemetry/posthog-adapter.js.map +1 -1
  1388. package/dist/telemetry/sentry-adapter.cjs.map +1 -1
  1389. package/dist/telemetry/sentry-adapter.js.map +1 -1
  1390. package/dist/tempest-react-sdk.cjs +1 -1
  1391. package/dist/tempest-react-sdk.d.ts +234 -3
  1392. package/dist/tempest-react-sdk.js +85 -85
  1393. package/dist/testing/create-mock-handlers.cjs.map +1 -1
  1394. package/dist/testing/create-mock-handlers.js.map +1 -1
  1395. package/dist/testing.js +1 -2
  1396. package/dist/theme/ThemeProvider.cjs.map +1 -1
  1397. package/dist/theme/ThemeProvider.js.map +1 -1
  1398. package/dist/theme/apply-theme.cjs.map +1 -1
  1399. package/dist/theme/apply-theme.js.map +1 -1
  1400. package/dist/theme/color.cjs.map +1 -1
  1401. package/dist/theme/color.js.map +1 -1
  1402. package/dist/theme/create-theme.cjs.map +1 -1
  1403. package/dist/theme/create-theme.js.map +1 -1
  1404. package/dist/theme/data-viz-ramps.cjs.map +1 -1
  1405. package/dist/theme/data-viz-ramps.js.map +1 -1
  1406. package/dist/theme/initial-theme.cjs.map +1 -1
  1407. package/dist/theme/initial-theme.js.map +1 -1
  1408. package/dist/theme/inverse-render.cjs.map +1 -1
  1409. package/dist/theme/inverse-render.js.map +1 -1
  1410. package/dist/theme/inverse-restore.cjs.map +1 -1
  1411. package/dist/theme/inverse-restore.js.map +1 -1
  1412. package/dist/theme/inverse-surface.cjs.map +1 -1
  1413. package/dist/theme/inverse-surface.js.map +1 -1
  1414. package/dist/theme/status-tokens.cjs.map +1 -1
  1415. package/dist/theme/status-tokens.js.map +1 -1
  1416. package/dist/theme/theme-presets.cjs.map +1 -1
  1417. package/dist/theme/theme-presets.js.map +1 -1
  1418. package/dist/utils/absent.cjs.map +1 -1
  1419. package/dist/utils/absent.js.map +1 -1
  1420. package/dist/utils/arrays.cjs.map +1 -1
  1421. package/dist/utils/arrays.js.map +1 -1
  1422. package/dist/utils/base64.cjs.map +1 -1
  1423. package/dist/utils/base64.js.map +1 -1
  1424. package/dist/utils/cn.cjs.map +1 -1
  1425. package/dist/utils/cn.js.map +1 -1
  1426. package/dist/utils/compare-values.cjs.map +1 -1
  1427. package/dist/utils/compare-values.js.map +1 -1
  1428. package/dist/utils/compressed-storage.cjs.map +1 -1
  1429. package/dist/utils/compressed-storage.js.map +1 -1
  1430. package/dist/utils/csv.cjs.map +1 -1
  1431. package/dist/utils/csv.js.map +1 -1
  1432. package/dist/utils/dev-mode.cjs.map +1 -1
  1433. package/dist/utils/dev-mode.js.map +1 -1
  1434. package/dist/utils/duplicate-instance.cjs.map +1 -1
  1435. package/dist/utils/duplicate-instance.js.map +1 -1
  1436. package/dist/utils/format.cjs.map +1 -1
  1437. package/dist/utils/format.js.map +1 -1
  1438. package/dist/utils/functions.cjs +1 -1
  1439. package/dist/utils/functions.cjs.map +1 -1
  1440. package/dist/utils/functions.js +1 -1
  1441. package/dist/utils/functions.js.map +1 -1
  1442. package/dist/utils/guards.cjs.map +1 -1
  1443. package/dist/utils/guards.js.map +1 -1
  1444. package/dist/utils/ids.cjs.map +1 -1
  1445. package/dist/utils/ids.js.map +1 -1
  1446. package/dist/utils/intl-cache.cjs.map +1 -1
  1447. package/dist/utils/intl-cache.js.map +1 -1
  1448. package/dist/utils/json-frame.cjs.map +1 -1
  1449. package/dist/utils/json-frame.js.map +1 -1
  1450. package/dist/utils/numbers.cjs.map +1 -1
  1451. package/dist/utils/numbers.js.map +1 -1
  1452. package/dist/utils/objects.cjs.map +1 -1
  1453. package/dist/utils/objects.js.map +1 -1
  1454. package/dist/utils/owner-fingerprint.cjs.map +1 -1
  1455. package/dist/utils/owner-fingerprint.js.map +1 -1
  1456. package/dist/utils/promises.cjs.map +1 -1
  1457. package/dist/utils/promises.js.map +1 -1
  1458. package/dist/utils/relative-time.cjs.map +1 -1
  1459. package/dist/utils/relative-time.js.map +1 -1
  1460. package/dist/utils/safe-url.cjs.map +1 -1
  1461. package/dist/utils/safe-url.js.map +1 -1
  1462. package/dist/utils/schema-like.cjs.map +1 -1
  1463. package/dist/utils/schema-like.js.map +1 -1
  1464. package/dist/utils/storage.cjs +1 -1
  1465. package/dist/utils/storage.cjs.map +1 -1
  1466. package/dist/utils/storage.js +2 -2
  1467. package/dist/utils/storage.js.map +1 -1
  1468. package/dist/utils/strings.cjs.map +1 -1
  1469. package/dist/utils/strings.js.map +1 -1
  1470. package/dist/utils/xlsx.cjs.map +1 -1
  1471. package/dist/utils/xlsx.js.map +1 -1
  1472. package/dist/vision/core/canvas.cjs.map +1 -1
  1473. package/dist/vision/core/canvas.js.map +1 -1
  1474. package/dist/vision/core/dtypes.cjs.map +1 -1
  1475. package/dist/vision/core/dtypes.js.map +1 -1
  1476. package/dist/vision/core/exceptions.cjs.map +1 -1
  1477. package/dist/vision/core/exceptions.js.map +1 -1
  1478. package/dist/vision/core/graph.cjs.map +1 -1
  1479. package/dist/vision/core/graph.js.map +1 -1
  1480. package/dist/vision/core/metadata.cjs +1 -1
  1481. package/dist/vision/core/metadata.cjs.map +1 -1
  1482. package/dist/vision/core/metadata.js +9 -26
  1483. package/dist/vision/core/metadata.js.map +1 -1
  1484. package/dist/vision/core/providers.cjs.map +1 -1
  1485. package/dist/vision/core/providers.js.map +1 -1
  1486. package/dist/vision/core/session.cjs.map +1 -1
  1487. package/dist/vision/core/session.js.map +1 -1
  1488. package/dist/vision/core/timing.cjs.map +1 -1
  1489. package/dist/vision/core/timing.js.map +1 -1
  1490. package/dist/vision/fusion.cjs.map +1 -1
  1491. package/dist/vision/fusion.js.map +1 -1
  1492. package/dist/vision/index.cjs.map +1 -1
  1493. package/dist/vision/index.js.map +1 -1
  1494. package/dist/vision/io/image.cjs.map +1 -1
  1495. package/dist/vision/io/image.js.map +1 -1
  1496. package/dist/vision/labels.cjs.map +1 -1
  1497. package/dist/vision/labels.js.map +1 -1
  1498. package/dist/vision/luminance.cjs.map +1 -1
  1499. package/dist/vision/luminance.js.map +1 -1
  1500. package/dist/vision/normalization.cjs.map +1 -1
  1501. package/dist/vision/normalization.js.map +1 -1
  1502. package/dist/vision/postprocess/classification.cjs.map +1 -1
  1503. package/dist/vision/postprocess/classification.js.map +1 -1
  1504. package/dist/vision/postprocess/detection.cjs.map +1 -1
  1505. package/dist/vision/postprocess/detection.js.map +1 -1
  1506. package/dist/vision/postprocess/segmentation.cjs.map +1 -1
  1507. package/dist/vision/postprocess/segmentation.js.map +1 -1
  1508. package/dist/vision/preprocess/image.cjs.map +1 -1
  1509. package/dist/vision/preprocess/image.js.map +1 -1
  1510. package/dist/vision/preprocess/pipeline.cjs.map +1 -1
  1511. package/dist/vision/preprocess/pipeline.js.map +1 -1
  1512. package/dist/vision/results.cjs.map +1 -1
  1513. package/dist/vision/results.js.map +1 -1
  1514. package/dist/vision/tasks/base.cjs.map +1 -1
  1515. package/dist/vision/tasks/base.js.map +1 -1
  1516. package/dist/vision/tasks/classifier.cjs.map +1 -1
  1517. package/dist/vision/tasks/classifier.js.map +1 -1
  1518. package/dist/vision/tasks/detectClassify.cjs.map +1 -1
  1519. package/dist/vision/tasks/detectClassify.js.map +1 -1
  1520. package/dist/vision/tasks/detector.cjs.map +1 -1
  1521. package/dist/vision/tasks/detector.js.map +1 -1
  1522. package/dist/vision/tasks/segmenter.cjs.map +1 -1
  1523. package/dist/vision/tasks/segmenter.js.map +1 -1
  1524. package/dist/vision/types.cjs.map +1 -1
  1525. package/dist/vision/types.js.map +1 -1
  1526. package/dist/vision/use-camera-stream.cjs +1 -1
  1527. package/dist/vision/use-camera-stream.cjs.map +1 -1
  1528. package/dist/vision/use-camera-stream.js +3 -9
  1529. package/dist/vision/use-camera-stream.js.map +1 -1
  1530. package/dist/vision/use-live-luminance.cjs +1 -1
  1531. package/dist/vision/use-live-luminance.cjs.map +1 -1
  1532. package/dist/vision/use-live-luminance.js +1 -5
  1533. package/dist/vision/use-live-luminance.js.map +1 -1
  1534. package/dist/vite/base-url.cjs.map +1 -1
  1535. package/dist/vite/base-url.js.map +1 -1
  1536. package/dist/vite/create-vite-config.cjs.map +1 -1
  1537. package/dist/vite/create-vite-config.js.map +1 -1
  1538. package/dist/vite/narrow-tokens.cjs.map +1 -1
  1539. package/dist/vite/narrow-tokens.js.map +1 -1
  1540. package/dist/vite/tempest-csp.cjs +1 -1
  1541. package/dist/vite/tempest-csp.cjs.map +1 -1
  1542. package/dist/vite/tempest-csp.js +2 -10
  1543. package/dist/vite/tempest-csp.js.map +1 -1
  1544. package/dist/vite/tempest-icons.cjs.map +1 -1
  1545. package/dist/vite/tempest-icons.js.map +1 -1
  1546. package/dist/vite/tempest-pwa-dev-sw.cjs +1 -1
  1547. package/dist/vite/tempest-pwa-dev-sw.cjs.map +1 -1
  1548. package/dist/vite/tempest-pwa-dev-sw.js +9 -16
  1549. package/dist/vite/tempest-pwa-dev-sw.js.map +1 -1
  1550. package/dist/vite/tempest-pwa-icons.cjs.map +1 -1
  1551. package/dist/vite/tempest-pwa-icons.js.map +1 -1
  1552. package/dist/vite/tempest-pwa-manifest.cjs.map +1 -1
  1553. package/dist/vite/tempest-pwa-manifest.js.map +1 -1
  1554. package/dist/vite/tempest-styles.cjs.map +1 -1
  1555. package/dist/vite/tempest-styles.js.map +1 -1
  1556. package/dist/vite/tempest-vitest.cjs.map +1 -1
  1557. package/dist/vite/tempest-vitest.js.map +1 -1
  1558. package/dist/webrtc/link-stats.cjs.map +1 -1
  1559. package/dist/webrtc/link-stats.js.map +1 -1
  1560. package/dist/webrtc/mesh-quality.cjs.map +1 -1
  1561. package/dist/webrtc/mesh-quality.js.map +1 -1
  1562. package/dist/webrtc/opus-sdp.cjs.map +1 -1
  1563. package/dist/webrtc/opus-sdp.js.map +1 -1
  1564. package/dist/webrtc/peer-link.cjs +1 -1
  1565. package/dist/webrtc/peer-link.cjs.map +1 -1
  1566. package/dist/webrtc/peer-link.js +2 -5
  1567. package/dist/webrtc/peer-link.js.map +1 -1
  1568. package/dist/webrtc/peer-mesh.cjs +1 -1
  1569. package/dist/webrtc/peer-mesh.cjs.map +1 -1
  1570. package/dist/webrtc/peer-mesh.js +8 -24
  1571. package/dist/webrtc/peer-mesh.js.map +1 -1
  1572. package/dist/webrtc/sender-bitrate.cjs.map +1 -1
  1573. package/dist/webrtc/sender-bitrate.js.map +1 -1
  1574. package/dist/webrtc/use-link-stats.cjs.map +1 -1
  1575. package/dist/webrtc/use-link-stats.js.map +1 -1
  1576. package/dist/ws/create-web-socket.cjs +1 -1
  1577. package/dist/ws/create-web-socket.cjs.map +1 -1
  1578. package/dist/ws/create-web-socket.js +4 -22
  1579. package/dist/ws/create-web-socket.js.map +1 -1
  1580. package/dist/ws/resilience.cjs.map +1 -1
  1581. package/dist/ws/resilience.js.map +1 -1
  1582. package/dist/ws/use-web-socket.cjs.map +1 -1
  1583. package/dist/ws/use-web-socket.js.map +1 -1
  1584. package/package.json +9 -6
  1585. package/template/package.json +1 -1
@@ -1 +1 @@
1
- {"version":3,"file":"predictor.cjs","names":[],"sources":["../../src/tabular/predictor.ts"],"sourcesContent":["/**\n * Running a scikit-learn model in the browser, offline.\n *\n * The model file is produced by `tempest-fastapi-sdk`'s\n * `export_sklearn_to_onnx`. This is everything between that file and an\n * answer — the same glue the Python `OnnxPredictor` provides on a device,\n * with the browser's own traps handled:\n *\n * - **int64 labels arrive as `bigint`.** ONNX Runtime Web surfaces the\n * label tensor as a `BigInt64Array`, so a caller comparing `label === 1`\n * silently gets `false` and `JSON.stringify` throws. Labels are converted.\n * - **`ai.onnx.ml` needs the right build.** Measured: importing\n * `onnxruntime-web/webgpu` loads a WebAssembly binary without those\n * operators, and session creation fails with `No Op registered for\n * TreeEnsembleClassifier`. That failure is translated into an error that\n * names the import.\n * - **Which output is which.** A classifier returns `label` and\n * `probabilities`; a regressor returns a single `variable`. Indexing by\n * position works until the day you deploy the other kind.\n */\n\nimport type * as ort from \"onnxruntime-web\";\n\nimport { configuredOrtAssetPath } from \"./assets\";\nimport {\n FeatureShapeError,\n InferenceError,\n ModelLoadError,\n UnsupportedGraphError,\n} from \"./exceptions\";\nimport type {\n FeatureRow,\n PredictedLabel,\n TabularModelSource,\n TabularPrediction,\n TabularPredictorInfo,\n TabularPredictorOptions,\n} from \"./types\";\n\n/**\n * Import ONNX Runtime Web, only when a model is actually being loaded.\n *\n * Static import would make every consumer of this subpath install the peer,\n * including apps that only ever touch `CompactPredictor` — whose whole\n * point is not needing a runtime. Found by installing the published\n * package into an empty project, which is the only place the difference\n * shows.\n *\n * @returns The runtime module.\n * @throws {@link ModelLoadError} when the peer is not installed, naming it.\n */\nasync function loadRuntime(): Promise<typeof ort> {\n try {\n return (await import(\"onnxruntime-web\")) as typeof ort;\n } catch (error) {\n throw new ModelLoadError(\n \"The ONNX route needs the optional peer dependency: \" +\n \"npm install onnxruntime-web. For a model with no runtime at \" +\n \"all, export it with edge_pipeline(compact=True) and load it \" +\n \"through CompactPredictor.\",\n { cause: error },\n );\n }\n}\n\n/**\n * Execution providers used when the caller does not choose.\n *\n * WebAssembly only, and deliberately: scikit-learn graphs are `ai.onnx.ml`\n * operators, which the WebGPU backend does not implement. There is no\n * speed left on the table here — a 10-tree forest predicts a row in about\n * 0.05 ms in Chromium.\n */\nexport const DEFAULT_TABULAR_PROVIDERS: readonly string[] = [\"wasm\"];\n\n/** Output names that indicate predicted classes rather than scores. */\nconst LABEL_HINTS = [\"label\", \"class\", \"variable\", \"output\"] as const;\n\n/** Output names that indicate class scores. */\nconst PROBABILITY_HINTS = [\"probabilit\", \"score\"] as const;\n\n/** Largest plausible feature count; anything above is a dynamic-dim sentinel. */\nconst MAX_DECLARED_FEATURES = 1_000_000;\n\n/**\n * Pick the first output whose name contains one of `hints`.\n *\n * @param names Graph output names.\n * @param hints Lowercase substrings to look for.\n * @returns The matching name, or `null`.\n */\nfunction matchOutput(names: readonly string[], hints: readonly string[]): string | null {\n for (const hint of hints) {\n const found = names.find((name) => name.toLowerCase().includes(hint));\n if (found !== undefined) return found;\n }\n return null;\n}\n\n/**\n * Read the declared feature count from the input metadata.\n *\n * A dynamic batch dimension is reported as a symbolic string or as an\n * out-of-range number (`4294967295` — an unsigned `-1`), so only a sane\n * positive integer in the second position is trusted.\n *\n * @param session The loaded session.\n * @returns The feature count, or `null` when the graph does not declare one.\n */\nfunction declaredFeatures(session: ort.InferenceSession): number | null {\n const metadata = session.inputMetadata?.[0];\n if (metadata === undefined || metadata.isTensor !== true) return null;\n const dimension = metadata.shape[1];\n if (typeof dimension !== \"number\") return null;\n if (!Number.isInteger(dimension) || dimension <= 0) return null;\n return dimension > MAX_DECLARED_FEATURES ? null : dimension;\n}\n\n/**\n * Convert one raw label value into a JS-friendly label.\n *\n * @param value A tensor element: `bigint` for int64, `number` for float,\n * `string` for a string-labelled classifier.\n * @returns The label as a number or string.\n */\nfunction toLabel(value: unknown): PredictedLabel {\n if (typeof value === \"bigint\") return Number(value);\n if (typeof value === \"number\") return value;\n return String(value);\n}\n\n/**\n * Translate a session-creation failure into an error naming its cause.\n *\n * @param error Whatever ONNX Runtime threw.\n * @returns The error to surface.\n */\nfunction asLoadError(error: unknown): Error {\n const message = error instanceof Error ? error.message : String(error);\n if (message.includes(\"No Op registered\")) {\n return new UnsupportedGraphError(\n \"This runtime build has no kernels for the model's operators. \" +\n \"scikit-learn exports use the ai.onnx.ml domain, which is missing \" +\n 'from the WebGPU build: import \"onnxruntime-web\", not ' +\n '\"onnxruntime-web/webgpu\". Original error: ' +\n message,\n { cause: error },\n );\n }\n return new ModelLoadError(`Failed to load the model: ${message}`, { cause: error });\n}\n\n/**\n * Translate a run failure into an error naming its cause.\n *\n * Measured: an export made with skl2onnx's default (ZipMap enabled) has a\n * probability output that is a sequence of maps, and ONNX Runtime Web\n * refuses to read non-tensor values — `Reading data from non-tensor typed\n * value is not supported`. That message describes the runtime's limitation,\n * not the fix, so it is replaced by one that names the export flag.\n *\n * @param error Whatever ONNX Runtime threw.\n * @returns The error to surface.\n */\nfunction asRunError(error: unknown): Error {\n const message = error instanceof Error ? error.message : String(error);\n if (\n message.includes(\"non-tensor typed value\") ||\n message.includes(\"Can't access output tensor data\")\n ) {\n return new InferenceError(\n \"The model has a non-tensor output, which ONNX Runtime Web cannot \" +\n \"read. A scikit-learn export made with ZipMap enabled returns a \" +\n \"sequence of maps per row — re-export with export_sklearn_to_onnx, \" +\n `which disables it. Original error: ${message}`,\n { cause: error },\n );\n }\n return new InferenceError(`Inference failed: ${message}`, { cause: error });\n}\n\n/**\n * A loaded tabular model, ready to answer.\n *\n * @example\n * ```ts\n * const predictor = await TabularPredictor.create(\"/models/classifier.onnx\");\n * const { labels, probabilities } = await predictor.predict([[5.1, 3.5, 1.4, 0.2]]);\n * ```\n */\nexport class TabularPredictor {\n private constructor(\n private readonly runtime: typeof ort,\n private readonly session: ort.InferenceSession,\n /** What is loaded and how it is configured. */\n public readonly info: TabularPredictorInfo,\n ) {}\n\n /**\n * Load a model and describe its graph.\n *\n * @param source A URL string, or the model bytes (which is what an\n * offline app passes, having read them from the cache).\n * @param options Providers, warm-up and pass-through session options.\n * @throws {@link UnsupportedGraphError} when the runtime build lacks the\n * `ai.onnx.ml` operators — the WebGPU entry point does.\n * @throws {@link ModelLoadError} for any other load failure.\n */\n static async create(\n source: TabularModelSource,\n options: TabularPredictorOptions = {},\n ): Promise<TabularPredictor> {\n const providers = options.providers ?? DEFAULT_TABULAR_PROVIDERS;\n const runtime = await loadRuntime();\n const assets = configuredOrtAssetPath();\n if (assets !== undefined) runtime.env.wasm.wasmPaths = assets;\n\n let session: ort.InferenceSession;\n try {\n session = await runtime.InferenceSession.create(source as never, {\n ...(options.sessionOptions ?? {}),\n executionProviders:\n providers as ort.InferenceSession.SessionOptions[\"executionProviders\"],\n });\n } catch (error) {\n throw asLoadError(error);\n }\n\n const outputNames = [...session.outputNames];\n const probabilityOutput = matchOutput(outputNames, PROBABILITY_HINTS);\n const labelOutput =\n outputNames.find((name) => name !== probabilityOutput && isLabelName(name)) ??\n outputNames.find((name) => name !== probabilityOutput) ??\n (outputNames[0] as string);\n\n const predictor = new TabularPredictor(runtime, session, {\n inputName: session.inputNames[0] as string,\n numFeatures: declaredFeatures(session),\n outputNames,\n labelOutput,\n probabilityOutput,\n isClassifier: probabilityOutput !== null,\n providers,\n });\n\n if (options.warmup !== false) await predictor.warmUp();\n return predictor;\n }\n\n /**\n * Run one throwaway inference so the first real call is not the slow one.\n *\n * Skipped when the graph does not declare a feature count, since there\n * is no shape to synthesise.\n *\n * @tempest-limits empty-catch — a warm-up that cannot run is not a reason to\n * refuse to serve. The synthetic all-zero row can be rejected by a graph that\n * expects a different dtype or a categorical encoding, and that says nothing\n * about the real rows the caller will send; the only cost of the failure is\n * that the first real inference pays the lazy-init it would have paid anyway.\n */\n async warmUp(): Promise<void> {\n const features = this.info.numFeatures;\n if (features === null) return;\n try {\n await this.predict([new Array<number>(features).fill(0)]);\n } catch {\n /* empty */\n }\n }\n\n /**\n * Predict for a batch of rows.\n *\n * @param rows One array of feature values per row, in training column\n * order. A single row is still wrapped: `[[...]]`.\n * @returns Labels, class scores when the model produces them, and the\n * call's duration.\n * @throws {@link FeatureShapeError} when the batch is empty, ragged, or\n * the wrong width — checked here so the failure names the mismatch\n * instead of surfacing as an opaque runtime error.\n * @throws {@link InferenceError} when the session runs but its outputs\n * cannot be read.\n */\n async predict(rows: readonly FeatureRow[]): Promise<TabularPrediction> {\n if (!Array.isArray(rows) || rows.length === 0) {\n throw new FeatureShapeError(\n \"predict() needs at least one row, shaped [[f1, f2, ...]].\",\n );\n }\n const width = rows[0]?.length ?? 0;\n if (width === 0) {\n throw new FeatureShapeError(\"The first row has no feature values.\");\n }\n const ragged = rows.findIndex((row) => row.length !== width);\n if (ragged !== -1) {\n throw new FeatureShapeError(\n `All rows must have the same width; row ${ragged} has ` +\n `${rows[ragged]?.length} values, expected ${width}.`,\n );\n }\n const expected = this.info.numFeatures;\n if (expected !== null && width !== expected) {\n throw new FeatureShapeError(\n `The model expects ${expected} features per row, got ${width}.`,\n );\n }\n\n const flat = new Float32Array(rows.length * width);\n for (let index = 0; index < rows.length; index += 1) {\n flat.set(rows[index] as number[], index * width);\n }\n const tensor = new this.runtime.Tensor(\"float32\", flat, [rows.length, width]);\n\n const started = performance.now();\n let outputs: ort.InferenceSession.OnnxValueMapType;\n try {\n outputs = await this.session.run({ [this.info.inputName]: tensor });\n } catch (error) {\n throw asRunError(error);\n }\n const ms = performance.now() - started;\n\n const labelTensor = outputs[this.info.labelOutput];\n if (labelTensor?.data === undefined) {\n throw new InferenceError(\n `The model produced no readable \"${this.info.labelOutput}\" output.`,\n );\n }\n\n const labels: PredictedLabel[] = Array.from(\n labelTensor.data as ArrayLike<unknown>,\n toLabel,\n );\n\n const probabilities: number[][] = [];\n if (this.info.probabilityOutput !== null) {\n const scores = outputs[this.info.probabilityOutput];\n if (scores?.data !== undefined) {\n const values = Array.from(scores.data as ArrayLike<number>, Number);\n const classes = values.length / rows.length;\n for (let index = 0; index < rows.length; index += 1) {\n probabilities.push(values.slice(index * classes, (index + 1) * classes));\n }\n }\n }\n\n return { labels, probabilities, numRows: rows.length, ms };\n }\n\n /**\n * Release the session's memory.\n *\n * Worth calling on a route that swaps models: the WebAssembly heap does\n * not shrink on garbage collection alone.\n */\n async dispose(): Promise<void> {\n await this.session.release?.();\n }\n}\n\n/**\n * Whether an output name looks like a label rather than a score.\n *\n * @param name The graph output name.\n * @returns `true` when the name matches a known label convention.\n */\nfunction isLabelName(name: string): boolean {\n const lowered = name.toLowerCase();\n return LABEL_HINTS.some((hint) => lowered.includes(hint));\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"predictor.cjs","names":["ModelLoadError","UnsupportedGraphError","InferenceError","configuredOrtAssetPath","FeatureShapeError","require_assets","require_exceptions","loadRuntime","error","DEFAULT_TABULAR_PROVIDERS","LABEL_HINTS","PROBABILITY_HINTS","MAX_DECLARED_FEATURES","matchOutput","hint","hints","found","names","name","declaredFeatures","metadata","session","dimension","toLabel","value","asLoadError","message","asRunError","TabularPredictor","runtime","info","providers","options","assets","source","outputNames","probabilityOutput","labelOutput","isLabelName","predictor","features","rows","width","ragged","row","expected","flat","index","tensor","started","outputs","ms","labelTensor","labels","probabilities","scores","values","classes","lowered"],"sources":["../../src/tabular/predictor.ts"],"sourcesContent":["/**\n * Running a scikit-learn model in the browser, offline.\n *\n * The model file is produced by `tempest-fastapi-sdk`'s\n * `export_sklearn_to_onnx`. This is everything between that file and an\n * answer — the same glue the Python `OnnxPredictor` provides on a device,\n * with the browser's own traps handled:\n *\n * - **int64 labels arrive as `bigint`.** ONNX Runtime Web surfaces the\n * label tensor as a `BigInt64Array`, so a caller comparing `label === 1`\n * silently gets `false` and `JSON.stringify` throws. Labels are converted.\n * - **`ai.onnx.ml` needs the right build.** Measured: importing\n * `onnxruntime-web/webgpu` loads a WebAssembly binary without those\n * operators, and session creation fails with `No Op registered for\n * TreeEnsembleClassifier`. That failure is translated into an error that\n * names the import.\n * - **Which output is which.** A classifier returns `label` and\n * `probabilities`; a regressor returns a single `variable`. Indexing by\n * position works until the day you deploy the other kind.\n */\n\nimport type * as ort from \"onnxruntime-web\";\n\nimport { configuredOrtAssetPath } from \"./assets\";\nimport {\n FeatureShapeError,\n InferenceError,\n ModelLoadError,\n UnsupportedGraphError,\n} from \"./exceptions\";\nimport type {\n FeatureRow,\n PredictedLabel,\n TabularModelSource,\n TabularPrediction,\n TabularPredictorInfo,\n TabularPredictorOptions,\n} from \"./types\";\n\n/**\n * Import ONNX Runtime Web, only when a model is actually being loaded.\n *\n * Static import would make every consumer of this subpath install the peer,\n * including apps that only ever touch `CompactPredictor` — whose whole\n * point is not needing a runtime. Found by installing the published\n * package into an empty project, which is the only place the difference\n * shows.\n *\n * @returns The runtime module.\n * @throws {@link ModelLoadError} when the peer is not installed, naming it.\n */\nasync function loadRuntime(): Promise<typeof ort> {\n try {\n return (await import(\"onnxruntime-web\")) as typeof ort;\n } catch (error) {\n throw new ModelLoadError(\n \"The ONNX route needs the optional peer dependency: \" +\n \"npm install onnxruntime-web. For a model with no runtime at \" +\n \"all, export it with edge_pipeline(compact=True) and load it \" +\n \"through CompactPredictor.\",\n { cause: error },\n );\n }\n}\n\n/**\n * Execution providers used when the caller does not choose.\n *\n * WebAssembly only, and deliberately: scikit-learn graphs are `ai.onnx.ml`\n * operators, which the WebGPU backend does not implement. There is no\n * speed left on the table here — a 10-tree forest predicts a row in about\n * 0.05 ms in Chromium.\n */\nexport const DEFAULT_TABULAR_PROVIDERS: readonly string[] = [\"wasm\"];\n\n/** Output names that indicate predicted classes rather than scores. */\nconst LABEL_HINTS = [\"label\", \"class\", \"variable\", \"output\"] as const;\n\n/** Output names that indicate class scores. */\nconst PROBABILITY_HINTS = [\"probabilit\", \"score\"] as const;\n\n/** Largest plausible feature count; anything above is a dynamic-dim sentinel. */\nconst MAX_DECLARED_FEATURES = 1_000_000;\n\n/**\n * Pick the first output whose name contains one of `hints`.\n *\n * @param names Graph output names.\n * @param hints Lowercase substrings to look for.\n * @returns The matching name, or `null`.\n */\nfunction matchOutput(names: readonly string[], hints: readonly string[]): string | null {\n for (const hint of hints) {\n const found = names.find((name) => name.toLowerCase().includes(hint));\n if (found !== undefined) return found;\n }\n return null;\n}\n\n/**\n * Read the declared feature count from the input metadata.\n *\n * A dynamic batch dimension is reported as a symbolic string or as an\n * out-of-range number (`4294967295` — an unsigned `-1`), so only a sane\n * positive integer in the second position is trusted.\n *\n * @param session The loaded session.\n * @returns The feature count, or `null` when the graph does not declare one.\n */\nfunction declaredFeatures(session: ort.InferenceSession): number | null {\n const metadata = session.inputMetadata?.[0];\n if (metadata === undefined || metadata.isTensor !== true) return null;\n const dimension = metadata.shape[1];\n if (typeof dimension !== \"number\") return null;\n if (!Number.isInteger(dimension) || dimension <= 0) return null;\n return dimension > MAX_DECLARED_FEATURES ? null : dimension;\n}\n\n/**\n * Convert one raw label value into a JS-friendly label.\n *\n * @param value A tensor element: `bigint` for int64, `number` for float,\n * `string` for a string-labelled classifier.\n * @returns The label as a number or string.\n */\nfunction toLabel(value: unknown): PredictedLabel {\n if (typeof value === \"bigint\") return Number(value);\n if (typeof value === \"number\") return value;\n return String(value);\n}\n\n/**\n * Translate a session-creation failure into an error naming its cause.\n *\n * @param error Whatever ONNX Runtime threw.\n * @returns The error to surface.\n */\nfunction asLoadError(error: unknown): Error {\n const message = error instanceof Error ? error.message : String(error);\n if (message.includes(\"No Op registered\")) {\n return new UnsupportedGraphError(\n \"This runtime build has no kernels for the model's operators. \" +\n \"scikit-learn exports use the ai.onnx.ml domain, which is missing \" +\n 'from the WebGPU build: import \"onnxruntime-web\", not ' +\n '\"onnxruntime-web/webgpu\". Original error: ' +\n message,\n { cause: error },\n );\n }\n return new ModelLoadError(`Failed to load the model: ${message}`, { cause: error });\n}\n\n/**\n * Translate a run failure into an error naming its cause.\n *\n * Measured: an export made with skl2onnx's default (ZipMap enabled) has a\n * probability output that is a sequence of maps, and ONNX Runtime Web\n * refuses to read non-tensor values — `Reading data from non-tensor typed\n * value is not supported`. That message describes the runtime's limitation,\n * not the fix, so it is replaced by one that names the export flag.\n *\n * @param error Whatever ONNX Runtime threw.\n * @returns The error to surface.\n */\nfunction asRunError(error: unknown): Error {\n const message = error instanceof Error ? error.message : String(error);\n if (\n message.includes(\"non-tensor typed value\") ||\n message.includes(\"Can't access output tensor data\")\n ) {\n return new InferenceError(\n \"The model has a non-tensor output, which ONNX Runtime Web cannot \" +\n \"read. A scikit-learn export made with ZipMap enabled returns a \" +\n \"sequence of maps per row — re-export with export_sklearn_to_onnx, \" +\n `which disables it. Original error: ${message}`,\n { cause: error },\n );\n }\n return new InferenceError(`Inference failed: ${message}`, { cause: error });\n}\n\n/**\n * A loaded tabular model, ready to answer.\n *\n * @example\n * ```ts\n * const predictor = await TabularPredictor.create(\"/models/classifier.onnx\");\n * const { labels, probabilities } = await predictor.predict([[5.1, 3.5, 1.4, 0.2]]);\n * ```\n */\nexport class TabularPredictor {\n private constructor(\n private readonly runtime: typeof ort,\n private readonly session: ort.InferenceSession,\n /** What is loaded and how it is configured. */\n public readonly info: TabularPredictorInfo,\n ) {}\n\n /**\n * Load a model and describe its graph.\n *\n * @param source A URL string, or the model bytes (which is what an\n * offline app passes, having read them from the cache).\n * @param options Providers, warm-up and pass-through session options.\n * @throws {@link UnsupportedGraphError} when the runtime build lacks the\n * `ai.onnx.ml` operators — the WebGPU entry point does.\n * @throws {@link ModelLoadError} for any other load failure.\n */\n static async create(\n source: TabularModelSource,\n options: TabularPredictorOptions = {},\n ): Promise<TabularPredictor> {\n const providers = options.providers ?? DEFAULT_TABULAR_PROVIDERS;\n const runtime = await loadRuntime();\n const assets = configuredOrtAssetPath();\n if (assets !== undefined) runtime.env.wasm.wasmPaths = assets;\n\n let session: ort.InferenceSession;\n try {\n session = await runtime.InferenceSession.create(source as never, {\n ...(options.sessionOptions ?? {}),\n executionProviders:\n providers as ort.InferenceSession.SessionOptions[\"executionProviders\"],\n });\n } catch (error) {\n throw asLoadError(error);\n }\n\n const outputNames = [...session.outputNames];\n const probabilityOutput = matchOutput(outputNames, PROBABILITY_HINTS);\n const labelOutput =\n outputNames.find((name) => name !== probabilityOutput && isLabelName(name)) ??\n outputNames.find((name) => name !== probabilityOutput) ??\n (outputNames[0] as string);\n\n const predictor = new TabularPredictor(runtime, session, {\n inputName: session.inputNames[0] as string,\n numFeatures: declaredFeatures(session),\n outputNames,\n labelOutput,\n probabilityOutput,\n isClassifier: probabilityOutput !== null,\n providers,\n });\n\n if (options.warmup !== false) await predictor.warmUp();\n return predictor;\n }\n\n /**\n * Run one throwaway inference so the first real call is not the slow one.\n *\n * Skipped when the graph does not declare a feature count, since there\n * is no shape to synthesise.\n *\n * @tempest-limits empty-catch — a warm-up that cannot run is not a reason to\n * refuse to serve. The synthetic all-zero row can be rejected by a graph that\n * expects a different dtype or a categorical encoding, and that says nothing\n * about the real rows the caller will send; the only cost of the failure is\n * that the first real inference pays the lazy-init it would have paid anyway.\n */\n async warmUp(): Promise<void> {\n const features = this.info.numFeatures;\n if (features === null) return;\n try {\n await this.predict([new Array<number>(features).fill(0)]);\n } catch {\n /* empty */\n }\n }\n\n /**\n * Predict for a batch of rows.\n *\n * @param rows One array of feature values per row, in training column\n * order. A single row is still wrapped: `[[...]]`.\n * @returns Labels, class scores when the model produces them, and the\n * call's duration.\n * @throws {@link FeatureShapeError} when the batch is empty, ragged, or\n * the wrong width — checked here so the failure names the mismatch\n * instead of surfacing as an opaque runtime error.\n * @throws {@link InferenceError} when the session runs but its outputs\n * cannot be read.\n */\n async predict(rows: readonly FeatureRow[]): Promise<TabularPrediction> {\n if (!Array.isArray(rows) || rows.length === 0) {\n throw new FeatureShapeError(\n \"predict() needs at least one row, shaped [[f1, f2, ...]].\",\n );\n }\n const width = rows[0]?.length ?? 0;\n if (width === 0) {\n throw new FeatureShapeError(\"The first row has no feature values.\");\n }\n const ragged = rows.findIndex((row) => row.length !== width);\n if (ragged !== -1) {\n throw new FeatureShapeError(\n `All rows must have the same width; row ${ragged} has ` +\n `${rows[ragged]?.length} values, expected ${width}.`,\n );\n }\n const expected = this.info.numFeatures;\n if (expected !== null && width !== expected) {\n throw new FeatureShapeError(\n `The model expects ${expected} features per row, got ${width}.`,\n );\n }\n\n const flat = new Float32Array(rows.length * width);\n for (let index = 0; index < rows.length; index += 1) {\n flat.set(rows[index] as number[], index * width);\n }\n const tensor = new this.runtime.Tensor(\"float32\", flat, [rows.length, width]);\n\n const started = performance.now();\n let outputs: ort.InferenceSession.OnnxValueMapType;\n try {\n outputs = await this.session.run({ [this.info.inputName]: tensor });\n } catch (error) {\n throw asRunError(error);\n }\n const ms = performance.now() - started;\n\n const labelTensor = outputs[this.info.labelOutput];\n if (labelTensor?.data === undefined) {\n throw new InferenceError(\n `The model produced no readable \"${this.info.labelOutput}\" output.`,\n );\n }\n\n const labels: PredictedLabel[] = Array.from(\n labelTensor.data as ArrayLike<unknown>,\n toLabel,\n );\n\n const probabilities: number[][] = [];\n if (this.info.probabilityOutput !== null) {\n const scores = outputs[this.info.probabilityOutput];\n if (scores?.data !== undefined) {\n const values = Array.from(scores.data as ArrayLike<number>, Number);\n const classes = values.length / rows.length;\n for (let index = 0; index < rows.length; index += 1) {\n probabilities.push(values.slice(index * classes, (index + 1) * classes));\n }\n }\n }\n\n return { labels, probabilities, numRows: rows.length, ms };\n }\n\n /**\n * Release the session's memory.\n *\n * Worth calling on a route that swaps models: the WebAssembly heap does\n * not shrink on garbage collection alone.\n */\n async dispose(): Promise<void> {\n await this.session.release?.();\n }\n}\n\n/**\n * Whether an output name looks like a label rather than a score.\n *\n * @param name The graph output name.\n * @returns `true` when the name matches a known label convention.\n */\nfunction isLabelName(name: string): boolean {\n const lowered = name.toLowerCase();\n return LABEL_HINTS.some((hint) => lowered.includes(hint));\n}\n"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"predictor.js","names":[],"sources":["../../src/tabular/predictor.ts"],"sourcesContent":["/**\n * Running a scikit-learn model in the browser, offline.\n *\n * The model file is produced by `tempest-fastapi-sdk`'s\n * `export_sklearn_to_onnx`. This is everything between that file and an\n * answer — the same glue the Python `OnnxPredictor` provides on a device,\n * with the browser's own traps handled:\n *\n * - **int64 labels arrive as `bigint`.** ONNX Runtime Web surfaces the\n * label tensor as a `BigInt64Array`, so a caller comparing `label === 1`\n * silently gets `false` and `JSON.stringify` throws. Labels are converted.\n * - **`ai.onnx.ml` needs the right build.** Measured: importing\n * `onnxruntime-web/webgpu` loads a WebAssembly binary without those\n * operators, and session creation fails with `No Op registered for\n * TreeEnsembleClassifier`. That failure is translated into an error that\n * names the import.\n * - **Which output is which.** A classifier returns `label` and\n * `probabilities`; a regressor returns a single `variable`. Indexing by\n * position works until the day you deploy the other kind.\n */\n\nimport type * as ort from \"onnxruntime-web\";\n\nimport { configuredOrtAssetPath } from \"./assets\";\nimport {\n FeatureShapeError,\n InferenceError,\n ModelLoadError,\n UnsupportedGraphError,\n} from \"./exceptions\";\nimport type {\n FeatureRow,\n PredictedLabel,\n TabularModelSource,\n TabularPrediction,\n TabularPredictorInfo,\n TabularPredictorOptions,\n} from \"./types\";\n\n/**\n * Import ONNX Runtime Web, only when a model is actually being loaded.\n *\n * Static import would make every consumer of this subpath install the peer,\n * including apps that only ever touch `CompactPredictor` — whose whole\n * point is not needing a runtime. Found by installing the published\n * package into an empty project, which is the only place the difference\n * shows.\n *\n * @returns The runtime module.\n * @throws {@link ModelLoadError} when the peer is not installed, naming it.\n */\nasync function loadRuntime(): Promise<typeof ort> {\n try {\n return (await import(\"onnxruntime-web\")) as typeof ort;\n } catch (error) {\n throw new ModelLoadError(\n \"The ONNX route needs the optional peer dependency: \" +\n \"npm install onnxruntime-web. For a model with no runtime at \" +\n \"all, export it with edge_pipeline(compact=True) and load it \" +\n \"through CompactPredictor.\",\n { cause: error },\n );\n }\n}\n\n/**\n * Execution providers used when the caller does not choose.\n *\n * WebAssembly only, and deliberately: scikit-learn graphs are `ai.onnx.ml`\n * operators, which the WebGPU backend does not implement. There is no\n * speed left on the table here — a 10-tree forest predicts a row in about\n * 0.05 ms in Chromium.\n */\nexport const DEFAULT_TABULAR_PROVIDERS: readonly string[] = [\"wasm\"];\n\n/** Output names that indicate predicted classes rather than scores. */\nconst LABEL_HINTS = [\"label\", \"class\", \"variable\", \"output\"] as const;\n\n/** Output names that indicate class scores. */\nconst PROBABILITY_HINTS = [\"probabilit\", \"score\"] as const;\n\n/** Largest plausible feature count; anything above is a dynamic-dim sentinel. */\nconst MAX_DECLARED_FEATURES = 1_000_000;\n\n/**\n * Pick the first output whose name contains one of `hints`.\n *\n * @param names Graph output names.\n * @param hints Lowercase substrings to look for.\n * @returns The matching name, or `null`.\n */\nfunction matchOutput(names: readonly string[], hints: readonly string[]): string | null {\n for (const hint of hints) {\n const found = names.find((name) => name.toLowerCase().includes(hint));\n if (found !== undefined) return found;\n }\n return null;\n}\n\n/**\n * Read the declared feature count from the input metadata.\n *\n * A dynamic batch dimension is reported as a symbolic string or as an\n * out-of-range number (`4294967295` — an unsigned `-1`), so only a sane\n * positive integer in the second position is trusted.\n *\n * @param session The loaded session.\n * @returns The feature count, or `null` when the graph does not declare one.\n */\nfunction declaredFeatures(session: ort.InferenceSession): number | null {\n const metadata = session.inputMetadata?.[0];\n if (metadata === undefined || metadata.isTensor !== true) return null;\n const dimension = metadata.shape[1];\n if (typeof dimension !== \"number\") return null;\n if (!Number.isInteger(dimension) || dimension <= 0) return null;\n return dimension > MAX_DECLARED_FEATURES ? null : dimension;\n}\n\n/**\n * Convert one raw label value into a JS-friendly label.\n *\n * @param value A tensor element: `bigint` for int64, `number` for float,\n * `string` for a string-labelled classifier.\n * @returns The label as a number or string.\n */\nfunction toLabel(value: unknown): PredictedLabel {\n if (typeof value === \"bigint\") return Number(value);\n if (typeof value === \"number\") return value;\n return String(value);\n}\n\n/**\n * Translate a session-creation failure into an error naming its cause.\n *\n * @param error Whatever ONNX Runtime threw.\n * @returns The error to surface.\n */\nfunction asLoadError(error: unknown): Error {\n const message = error instanceof Error ? error.message : String(error);\n if (message.includes(\"No Op registered\")) {\n return new UnsupportedGraphError(\n \"This runtime build has no kernels for the model's operators. \" +\n \"scikit-learn exports use the ai.onnx.ml domain, which is missing \" +\n 'from the WebGPU build: import \"onnxruntime-web\", not ' +\n '\"onnxruntime-web/webgpu\". Original error: ' +\n message,\n { cause: error },\n );\n }\n return new ModelLoadError(`Failed to load the model: ${message}`, { cause: error });\n}\n\n/**\n * Translate a run failure into an error naming its cause.\n *\n * Measured: an export made with skl2onnx's default (ZipMap enabled) has a\n * probability output that is a sequence of maps, and ONNX Runtime Web\n * refuses to read non-tensor values — `Reading data from non-tensor typed\n * value is not supported`. That message describes the runtime's limitation,\n * not the fix, so it is replaced by one that names the export flag.\n *\n * @param error Whatever ONNX Runtime threw.\n * @returns The error to surface.\n */\nfunction asRunError(error: unknown): Error {\n const message = error instanceof Error ? error.message : String(error);\n if (\n message.includes(\"non-tensor typed value\") ||\n message.includes(\"Can't access output tensor data\")\n ) {\n return new InferenceError(\n \"The model has a non-tensor output, which ONNX Runtime Web cannot \" +\n \"read. A scikit-learn export made with ZipMap enabled returns a \" +\n \"sequence of maps per row — re-export with export_sklearn_to_onnx, \" +\n `which disables it. Original error: ${message}`,\n { cause: error },\n );\n }\n return new InferenceError(`Inference failed: ${message}`, { cause: error });\n}\n\n/**\n * A loaded tabular model, ready to answer.\n *\n * @example\n * ```ts\n * const predictor = await TabularPredictor.create(\"/models/classifier.onnx\");\n * const { labels, probabilities } = await predictor.predict([[5.1, 3.5, 1.4, 0.2]]);\n * ```\n */\nexport class TabularPredictor {\n private constructor(\n private readonly runtime: typeof ort,\n private readonly session: ort.InferenceSession,\n /** What is loaded and how it is configured. */\n public readonly info: TabularPredictorInfo,\n ) {}\n\n /**\n * Load a model and describe its graph.\n *\n * @param source A URL string, or the model bytes (which is what an\n * offline app passes, having read them from the cache).\n * @param options Providers, warm-up and pass-through session options.\n * @throws {@link UnsupportedGraphError} when the runtime build lacks the\n * `ai.onnx.ml` operators — the WebGPU entry point does.\n * @throws {@link ModelLoadError} for any other load failure.\n */\n static async create(\n source: TabularModelSource,\n options: TabularPredictorOptions = {},\n ): Promise<TabularPredictor> {\n const providers = options.providers ?? DEFAULT_TABULAR_PROVIDERS;\n const runtime = await loadRuntime();\n const assets = configuredOrtAssetPath();\n if (assets !== undefined) runtime.env.wasm.wasmPaths = assets;\n\n let session: ort.InferenceSession;\n try {\n session = await runtime.InferenceSession.create(source as never, {\n ...(options.sessionOptions ?? {}),\n executionProviders:\n providers as ort.InferenceSession.SessionOptions[\"executionProviders\"],\n });\n } catch (error) {\n throw asLoadError(error);\n }\n\n const outputNames = [...session.outputNames];\n const probabilityOutput = matchOutput(outputNames, PROBABILITY_HINTS);\n const labelOutput =\n outputNames.find((name) => name !== probabilityOutput && isLabelName(name)) ??\n outputNames.find((name) => name !== probabilityOutput) ??\n (outputNames[0] as string);\n\n const predictor = new TabularPredictor(runtime, session, {\n inputName: session.inputNames[0] as string,\n numFeatures: declaredFeatures(session),\n outputNames,\n labelOutput,\n probabilityOutput,\n isClassifier: probabilityOutput !== null,\n providers,\n });\n\n if (options.warmup !== false) await predictor.warmUp();\n return predictor;\n }\n\n /**\n * Run one throwaway inference so the first real call is not the slow one.\n *\n * Skipped when the graph does not declare a feature count, since there\n * is no shape to synthesise.\n *\n * @tempest-limits empty-catch — a warm-up that cannot run is not a reason to\n * refuse to serve. The synthetic all-zero row can be rejected by a graph that\n * expects a different dtype or a categorical encoding, and that says nothing\n * about the real rows the caller will send; the only cost of the failure is\n * that the first real inference pays the lazy-init it would have paid anyway.\n */\n async warmUp(): Promise<void> {\n const features = this.info.numFeatures;\n if (features === null) return;\n try {\n await this.predict([new Array<number>(features).fill(0)]);\n } catch {\n /* empty */\n }\n }\n\n /**\n * Predict for a batch of rows.\n *\n * @param rows One array of feature values per row, in training column\n * order. A single row is still wrapped: `[[...]]`.\n * @returns Labels, class scores when the model produces them, and the\n * call's duration.\n * @throws {@link FeatureShapeError} when the batch is empty, ragged, or\n * the wrong width — checked here so the failure names the mismatch\n * instead of surfacing as an opaque runtime error.\n * @throws {@link InferenceError} when the session runs but its outputs\n * cannot be read.\n */\n async predict(rows: readonly FeatureRow[]): Promise<TabularPrediction> {\n if (!Array.isArray(rows) || rows.length === 0) {\n throw new FeatureShapeError(\n \"predict() needs at least one row, shaped [[f1, f2, ...]].\",\n );\n }\n const width = rows[0]?.length ?? 0;\n if (width === 0) {\n throw new FeatureShapeError(\"The first row has no feature values.\");\n }\n const ragged = rows.findIndex((row) => row.length !== width);\n if (ragged !== -1) {\n throw new FeatureShapeError(\n `All rows must have the same width; row ${ragged} has ` +\n `${rows[ragged]?.length} values, expected ${width}.`,\n );\n }\n const expected = this.info.numFeatures;\n if (expected !== null && width !== expected) {\n throw new FeatureShapeError(\n `The model expects ${expected} features per row, got ${width}.`,\n );\n }\n\n const flat = new Float32Array(rows.length * width);\n for (let index = 0; index < rows.length; index += 1) {\n flat.set(rows[index] as number[], index * width);\n }\n const tensor = new this.runtime.Tensor(\"float32\", flat, [rows.length, width]);\n\n const started = performance.now();\n let outputs: ort.InferenceSession.OnnxValueMapType;\n try {\n outputs = await this.session.run({ [this.info.inputName]: tensor });\n } catch (error) {\n throw asRunError(error);\n }\n const ms = performance.now() - started;\n\n const labelTensor = outputs[this.info.labelOutput];\n if (labelTensor?.data === undefined) {\n throw new InferenceError(\n `The model produced no readable \"${this.info.labelOutput}\" output.`,\n );\n }\n\n const labels: PredictedLabel[] = Array.from(\n labelTensor.data as ArrayLike<unknown>,\n toLabel,\n );\n\n const probabilities: number[][] = [];\n if (this.info.probabilityOutput !== null) {\n const scores = outputs[this.info.probabilityOutput];\n if (scores?.data !== undefined) {\n const values = Array.from(scores.data as ArrayLike<number>, Number);\n const classes = values.length / rows.length;\n for (let index = 0; index < rows.length; index += 1) {\n probabilities.push(values.slice(index * classes, (index + 1) * classes));\n }\n }\n }\n\n return { labels, probabilities, numRows: rows.length, ms };\n }\n\n /**\n * Release the session's memory.\n *\n * Worth calling on a route that swaps models: the WebAssembly heap does\n * not shrink on garbage collection alone.\n */\n async dispose(): Promise<void> {\n await this.session.release?.();\n }\n}\n\n/**\n * Whether an output name looks like a label rather than a score.\n *\n * @param name The graph output name.\n * @returns `true` when the name matches a known label convention.\n */\nfunction isLabelName(name: string): boolean {\n const lowered = name.toLowerCase();\n return LABEL_HINTS.some((hint) => lowered.includes(hint));\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"predictor.js","names":["loadRuntime","error","ModelLoadError","DEFAULT_TABULAR_PROVIDERS","LABEL_HINTS","PROBABILITY_HINTS","MAX_DECLARED_FEATURES","matchOutput","hint","hints","found","names","name","declaredFeatures","metadata","session","dimension","toLabel","value","asLoadError","message","UnsupportedGraphError","asRunError","InferenceError","TabularPredictor","runtime","info","providers","options","assets","configuredOrtAssetPath","source","outputNames","probabilityOutput","labelOutput","isLabelName","predictor","features","rows","FeatureShapeError","width","ragged","row","expected","flat","index","tensor","started","outputs","ms","labelTensor","labels","probabilities","scores","values","classes","lowered"],"sources":["../../src/tabular/predictor.ts"],"sourcesContent":["/**\n * Running a scikit-learn model in the browser, offline.\n *\n * The model file is produced by `tempest-fastapi-sdk`'s\n * `export_sklearn_to_onnx`. This is everything between that file and an\n * answer — the same glue the Python `OnnxPredictor` provides on a device,\n * with the browser's own traps handled:\n *\n * - **int64 labels arrive as `bigint`.** ONNX Runtime Web surfaces the\n * label tensor as a `BigInt64Array`, so a caller comparing `label === 1`\n * silently gets `false` and `JSON.stringify` throws. Labels are converted.\n * - **`ai.onnx.ml` needs the right build.** Measured: importing\n * `onnxruntime-web/webgpu` loads a WebAssembly binary without those\n * operators, and session creation fails with `No Op registered for\n * TreeEnsembleClassifier`. That failure is translated into an error that\n * names the import.\n * - **Which output is which.** A classifier returns `label` and\n * `probabilities`; a regressor returns a single `variable`. Indexing by\n * position works until the day you deploy the other kind.\n */\n\nimport type * as ort from \"onnxruntime-web\";\n\nimport { configuredOrtAssetPath } from \"./assets\";\nimport {\n FeatureShapeError,\n InferenceError,\n ModelLoadError,\n UnsupportedGraphError,\n} from \"./exceptions\";\nimport type {\n FeatureRow,\n PredictedLabel,\n TabularModelSource,\n TabularPrediction,\n TabularPredictorInfo,\n TabularPredictorOptions,\n} from \"./types\";\n\n/**\n * Import ONNX Runtime Web, only when a model is actually being loaded.\n *\n * Static import would make every consumer of this subpath install the peer,\n * including apps that only ever touch `CompactPredictor` — whose whole\n * point is not needing a runtime. Found by installing the published\n * package into an empty project, which is the only place the difference\n * shows.\n *\n * @returns The runtime module.\n * @throws {@link ModelLoadError} when the peer is not installed, naming it.\n */\nasync function loadRuntime(): Promise<typeof ort> {\n try {\n return (await import(\"onnxruntime-web\")) as typeof ort;\n } catch (error) {\n throw new ModelLoadError(\n \"The ONNX route needs the optional peer dependency: \" +\n \"npm install onnxruntime-web. For a model with no runtime at \" +\n \"all, export it with edge_pipeline(compact=True) and load it \" +\n \"through CompactPredictor.\",\n { cause: error },\n );\n }\n}\n\n/**\n * Execution providers used when the caller does not choose.\n *\n * WebAssembly only, and deliberately: scikit-learn graphs are `ai.onnx.ml`\n * operators, which the WebGPU backend does not implement. There is no\n * speed left on the table here — a 10-tree forest predicts a row in about\n * 0.05 ms in Chromium.\n */\nexport const DEFAULT_TABULAR_PROVIDERS: readonly string[] = [\"wasm\"];\n\n/** Output names that indicate predicted classes rather than scores. */\nconst LABEL_HINTS = [\"label\", \"class\", \"variable\", \"output\"] as const;\n\n/** Output names that indicate class scores. */\nconst PROBABILITY_HINTS = [\"probabilit\", \"score\"] as const;\n\n/** Largest plausible feature count; anything above is a dynamic-dim sentinel. */\nconst MAX_DECLARED_FEATURES = 1_000_000;\n\n/**\n * Pick the first output whose name contains one of `hints`.\n *\n * @param names Graph output names.\n * @param hints Lowercase substrings to look for.\n * @returns The matching name, or `null`.\n */\nfunction matchOutput(names: readonly string[], hints: readonly string[]): string | null {\n for (const hint of hints) {\n const found = names.find((name) => name.toLowerCase().includes(hint));\n if (found !== undefined) return found;\n }\n return null;\n}\n\n/**\n * Read the declared feature count from the input metadata.\n *\n * A dynamic batch dimension is reported as a symbolic string or as an\n * out-of-range number (`4294967295` — an unsigned `-1`), so only a sane\n * positive integer in the second position is trusted.\n *\n * @param session The loaded session.\n * @returns The feature count, or `null` when the graph does not declare one.\n */\nfunction declaredFeatures(session: ort.InferenceSession): number | null {\n const metadata = session.inputMetadata?.[0];\n if (metadata === undefined || metadata.isTensor !== true) return null;\n const dimension = metadata.shape[1];\n if (typeof dimension !== \"number\") return null;\n if (!Number.isInteger(dimension) || dimension <= 0) return null;\n return dimension > MAX_DECLARED_FEATURES ? null : dimension;\n}\n\n/**\n * Convert one raw label value into a JS-friendly label.\n *\n * @param value A tensor element: `bigint` for int64, `number` for float,\n * `string` for a string-labelled classifier.\n * @returns The label as a number or string.\n */\nfunction toLabel(value: unknown): PredictedLabel {\n if (typeof value === \"bigint\") return Number(value);\n if (typeof value === \"number\") return value;\n return String(value);\n}\n\n/**\n * Translate a session-creation failure into an error naming its cause.\n *\n * @param error Whatever ONNX Runtime threw.\n * @returns The error to surface.\n */\nfunction asLoadError(error: unknown): Error {\n const message = error instanceof Error ? error.message : String(error);\n if (message.includes(\"No Op registered\")) {\n return new UnsupportedGraphError(\n \"This runtime build has no kernels for the model's operators. \" +\n \"scikit-learn exports use the ai.onnx.ml domain, which is missing \" +\n 'from the WebGPU build: import \"onnxruntime-web\", not ' +\n '\"onnxruntime-web/webgpu\". Original error: ' +\n message,\n { cause: error },\n );\n }\n return new ModelLoadError(`Failed to load the model: ${message}`, { cause: error });\n}\n\n/**\n * Translate a run failure into an error naming its cause.\n *\n * Measured: an export made with skl2onnx's default (ZipMap enabled) has a\n * probability output that is a sequence of maps, and ONNX Runtime Web\n * refuses to read non-tensor values — `Reading data from non-tensor typed\n * value is not supported`. That message describes the runtime's limitation,\n * not the fix, so it is replaced by one that names the export flag.\n *\n * @param error Whatever ONNX Runtime threw.\n * @returns The error to surface.\n */\nfunction asRunError(error: unknown): Error {\n const message = error instanceof Error ? error.message : String(error);\n if (\n message.includes(\"non-tensor typed value\") ||\n message.includes(\"Can't access output tensor data\")\n ) {\n return new InferenceError(\n \"The model has a non-tensor output, which ONNX Runtime Web cannot \" +\n \"read. A scikit-learn export made with ZipMap enabled returns a \" +\n \"sequence of maps per row — re-export with export_sklearn_to_onnx, \" +\n `which disables it. Original error: ${message}`,\n { cause: error },\n );\n }\n return new InferenceError(`Inference failed: ${message}`, { cause: error });\n}\n\n/**\n * A loaded tabular model, ready to answer.\n *\n * @example\n * ```ts\n * const predictor = await TabularPredictor.create(\"/models/classifier.onnx\");\n * const { labels, probabilities } = await predictor.predict([[5.1, 3.5, 1.4, 0.2]]);\n * ```\n */\nexport class TabularPredictor {\n private constructor(\n private readonly runtime: typeof ort,\n private readonly session: ort.InferenceSession,\n /** What is loaded and how it is configured. */\n public readonly info: TabularPredictorInfo,\n ) {}\n\n /**\n * Load a model and describe its graph.\n *\n * @param source A URL string, or the model bytes (which is what an\n * offline app passes, having read them from the cache).\n * @param options Providers, warm-up and pass-through session options.\n * @throws {@link UnsupportedGraphError} when the runtime build lacks the\n * `ai.onnx.ml` operators — the WebGPU entry point does.\n * @throws {@link ModelLoadError} for any other load failure.\n */\n static async create(\n source: TabularModelSource,\n options: TabularPredictorOptions = {},\n ): Promise<TabularPredictor> {\n const providers = options.providers ?? DEFAULT_TABULAR_PROVIDERS;\n const runtime = await loadRuntime();\n const assets = configuredOrtAssetPath();\n if (assets !== undefined) runtime.env.wasm.wasmPaths = assets;\n\n let session: ort.InferenceSession;\n try {\n session = await runtime.InferenceSession.create(source as never, {\n ...(options.sessionOptions ?? {}),\n executionProviders:\n providers as ort.InferenceSession.SessionOptions[\"executionProviders\"],\n });\n } catch (error) {\n throw asLoadError(error);\n }\n\n const outputNames = [...session.outputNames];\n const probabilityOutput = matchOutput(outputNames, PROBABILITY_HINTS);\n const labelOutput =\n outputNames.find((name) => name !== probabilityOutput && isLabelName(name)) ??\n outputNames.find((name) => name !== probabilityOutput) ??\n (outputNames[0] as string);\n\n const predictor = new TabularPredictor(runtime, session, {\n inputName: session.inputNames[0] as string,\n numFeatures: declaredFeatures(session),\n outputNames,\n labelOutput,\n probabilityOutput,\n isClassifier: probabilityOutput !== null,\n providers,\n });\n\n if (options.warmup !== false) await predictor.warmUp();\n return predictor;\n }\n\n /**\n * Run one throwaway inference so the first real call is not the slow one.\n *\n * Skipped when the graph does not declare a feature count, since there\n * is no shape to synthesise.\n *\n * @tempest-limits empty-catch — a warm-up that cannot run is not a reason to\n * refuse to serve. The synthetic all-zero row can be rejected by a graph that\n * expects a different dtype or a categorical encoding, and that says nothing\n * about the real rows the caller will send; the only cost of the failure is\n * that the first real inference pays the lazy-init it would have paid anyway.\n */\n async warmUp(): Promise<void> {\n const features = this.info.numFeatures;\n if (features === null) return;\n try {\n await this.predict([new Array<number>(features).fill(0)]);\n } catch {\n /* empty */\n }\n }\n\n /**\n * Predict for a batch of rows.\n *\n * @param rows One array of feature values per row, in training column\n * order. A single row is still wrapped: `[[...]]`.\n * @returns Labels, class scores when the model produces them, and the\n * call's duration.\n * @throws {@link FeatureShapeError} when the batch is empty, ragged, or\n * the wrong width — checked here so the failure names the mismatch\n * instead of surfacing as an opaque runtime error.\n * @throws {@link InferenceError} when the session runs but its outputs\n * cannot be read.\n */\n async predict(rows: readonly FeatureRow[]): Promise<TabularPrediction> {\n if (!Array.isArray(rows) || rows.length === 0) {\n throw new FeatureShapeError(\n \"predict() needs at least one row, shaped [[f1, f2, ...]].\",\n );\n }\n const width = rows[0]?.length ?? 0;\n if (width === 0) {\n throw new FeatureShapeError(\"The first row has no feature values.\");\n }\n const ragged = rows.findIndex((row) => row.length !== width);\n if (ragged !== -1) {\n throw new FeatureShapeError(\n `All rows must have the same width; row ${ragged} has ` +\n `${rows[ragged]?.length} values, expected ${width}.`,\n );\n }\n const expected = this.info.numFeatures;\n if (expected !== null && width !== expected) {\n throw new FeatureShapeError(\n `The model expects ${expected} features per row, got ${width}.`,\n );\n }\n\n const flat = new Float32Array(rows.length * width);\n for (let index = 0; index < rows.length; index += 1) {\n flat.set(rows[index] as number[], index * width);\n }\n const tensor = new this.runtime.Tensor(\"float32\", flat, [rows.length, width]);\n\n const started = performance.now();\n let outputs: ort.InferenceSession.OnnxValueMapType;\n try {\n outputs = await this.session.run({ [this.info.inputName]: tensor });\n } catch (error) {\n throw asRunError(error);\n }\n const ms = performance.now() - started;\n\n const labelTensor = outputs[this.info.labelOutput];\n if (labelTensor?.data === undefined) {\n throw new InferenceError(\n `The model produced no readable \"${this.info.labelOutput}\" output.`,\n );\n }\n\n const labels: PredictedLabel[] = Array.from(\n labelTensor.data as ArrayLike<unknown>,\n toLabel,\n );\n\n const probabilities: number[][] = [];\n if (this.info.probabilityOutput !== null) {\n const scores = outputs[this.info.probabilityOutput];\n if (scores?.data !== undefined) {\n const values = Array.from(scores.data as ArrayLike<number>, Number);\n const classes = values.length / rows.length;\n for (let index = 0; index < rows.length; index += 1) {\n probabilities.push(values.slice(index * classes, (index + 1) * classes));\n }\n }\n }\n\n return { labels, probabilities, numRows: rows.length, ms };\n }\n\n /**\n * Release the session's memory.\n *\n * Worth calling on a route that swaps models: the WebAssembly heap does\n * not shrink on garbage collection alone.\n */\n async dispose(): Promise<void> {\n await this.session.release?.();\n }\n}\n\n/**\n * Whether an output name looks like a label rather than a score.\n *\n * @param name The graph output name.\n * @returns `true` when the name matches a known label convention.\n */\nfunction isLabelName(name: string): boolean {\n const lowered = name.toLowerCase();\n return LABEL_HINTS.some((hint) => lowered.includes(hint));\n}\n"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"use-tabular-predictor.cjs","names":[],"sources":["../../src/tabular/use-tabular-predictor.ts"],"sourcesContent":["/**\n * React binding for {@link TabularPredictor}.\n *\n * Loading a model is async, cancellable, and has to be undone on unmount —\n * three things every component that touches inference gets wrong the same\n * way. The hook owns that lifecycle so a component only deals with\n * `status` and `predict`.\n */\n\nimport { useCallback, useEffect, useState } from \"react\";\nimport { useLatestRef } from \"@/hooks/use-latest-ref\";\n\nimport { fetchModelBytes, type ModelCacheOptions } from \"./cache\";\nimport { TabularPredictor } from \"./predictor\";\nimport type {\n FeatureRow,\n TabularModelSource,\n TabularPrediction,\n TabularPredictorOptions,\n} from \"./types\";\n\n/** Lifecycle of the model behind the hook. */\nexport type TabularPredictorStatus = \"idle\" | \"loading\" | \"ready\" | \"error\";\n\n/** Options for {@link useTabularPredictor}. */\nexport interface UseTabularPredictorOptions extends TabularPredictorOptions {\n /**\n * Cache the model bytes on the device, so later loads work offline.\n *\n * On by default when the source is a URL: an app that runs inference in\n * the browser almost always wants it to keep working without a network,\n * and the failure mode of not caching only shows up in a tunnel.\n */\n readonly cache?: boolean | ModelCacheOptions;\n}\n\n/** What {@link useTabularPredictor} returns. */\nexport interface UseTabularPredictorResult {\n /** The loaded predictor, or `null` while loading or on error. */\n readonly predictor: TabularPredictor | null;\n /** Where the load is. */\n readonly status: TabularPredictorStatus;\n /** Why the load failed. */\n readonly error: Error | null;\n /** Whether the model is loaded and can answer. */\n readonly isReady: boolean;\n /**\n * Predict for a batch of rows.\n *\n * @throws When called before the model is ready — awaiting `isReady`\n * is the caller's job, and a silent empty result would hide the bug.\n */\n readonly predict: (rows: readonly FeatureRow[]) => Promise<TabularPrediction>;\n /** Load the model again, e.g. after a failure or a new version. */\n readonly reload: () => void;\n}\n\n/**\n * Load a tabular model and keep it for the component's lifetime.\n *\n * @example\n * ```tsx\n * function RiskWidget() {\n * const { predict, isReady } = useTabularPredictor(\"/models/risk-v3.onnx\");\n * const [score, setScore] = useState<number | null>(null);\n *\n * async function onSubmit(features: number[]) {\n * const { probabilities } = await predict([features]);\n * setScore(probabilities[0]?.[1] ?? null);\n * }\n *\n * return <button disabled={!isReady} onClick={() => onSubmit([1, 2, 3, 4])}>Score</button>;\n * }\n * ```\n *\n * @param source Model URL, or the bytes when the app already has them.\n * Pass `null` to hold off loading (a gate, a lazy tab).\n * @param options Predictor options plus caching.\n * @returns The predictor, its status, and a `predict` bound to it.\n */\nexport function useTabularPredictor(\n source: TabularModelSource | null,\n options: UseTabularPredictorOptions = {},\n): UseTabularPredictorResult {\n const [predictor, setPredictor] = useState<TabularPredictor | null>(null);\n const [status, setStatus] = useState<TabularPredictorStatus>(\"idle\");\n const [error, setError] = useState<Error | null>(null);\n const [attempt, setAttempt] = useState(0);\n\n const optionsRef = useLatestRef(options);\n\n useEffect(() => {\n if (source === null) {\n setStatus(\"idle\");\n return;\n }\n\n let cancelled = false;\n let loaded: TabularPredictor | null = null;\n\n setStatus(\"loading\");\n setError(null);\n\n void (async () => {\n try {\n const current = optionsRef.current;\n const cache = current.cache ?? true;\n const bytes =\n typeof source === \"string\" && cache !== false\n ? await fetchModelBytes(source, typeof cache === \"object\" ? cache : {})\n : source;\n const created = await TabularPredictor.create(bytes, {\n providers: current.providers,\n warmup: current.warmup,\n sessionOptions: current.sessionOptions,\n });\n loaded = created;\n if (cancelled) {\n await created.dispose();\n return;\n }\n setPredictor(created);\n setStatus(\"ready\");\n } catch (caught) {\n if (cancelled) return;\n setPredictor(null);\n setError(caught instanceof Error ? caught : new Error(String(caught)));\n setStatus(\"error\");\n }\n })();\n\n return () => {\n cancelled = true;\n setPredictor(null);\n void loaded?.dispose();\n };\n }, [source, attempt, optionsRef]);\n\n const predict = useCallback(\n async (rows: readonly FeatureRow[]): Promise<TabularPrediction> => {\n if (predictor === null) {\n throw new Error(\n \"predict() was called before the model finished loading. \" +\n \"Gate on `isReady`.\",\n );\n }\n return await predictor.predict(rows);\n },\n [predictor],\n );\n\n const reload = useCallback(() => setAttempt((value) => value + 1), []);\n\n return {\n predictor,\n status,\n error,\n isReady: status === \"ready\" && predictor !== null,\n predict,\n reload,\n };\n}\n"],"mappings":"4HAgFA,SAAgB,EACZ,EACA,EAAsC,CAAC,EACd,CACzB,GAAM,CAAC,EAAW,IAAA,EAAgB,EAAA,SAAA,CAAkC,IAAI,EAClE,CAAC,EAAQ,IAAA,EAAa,EAAA,SAAA,CAAiC,MAAM,EAC7D,CAAC,EAAO,IAAA,EAAY,EAAA,SAAA,CAAuB,IAAI,EAC/C,CAAC,EAAS,IAAA,EAAc,EAAA,SAAA,CAAS,CAAC,EAElC,EAAa,EAAA,aAAa,CAAO,GAEvC,EAAA,EAAA,UAAA,KAAgB,CACZ,GAAI,IAAW,KAAM,CACjB,EAAU,MAAM,EAChB,MACJ,CAEA,IAAI,EAAY,GACZ,EAAkC,KAiCtC,OA/BA,EAAU,SAAS,EACnB,EAAS,IAAI,GAEP,SAAY,CACd,GAAI,CACA,IAAM,EAAU,EAAW,QACrB,EAAQ,EAAQ,OAAS,GACzB,EACF,OAAO,GAAW,UAAY,IAAU,GAClC,MAAM,EAAA,gBAAgB,EAAQ,OAAO,GAAU,SAAW,EAAQ,CAAC,CAAC,EACpE,EACJ,EAAU,MAAM,EAAA,iBAAiB,OAAO,EAAO,CACjD,UAAW,EAAQ,UACnB,OAAQ,EAAQ,OAChB,eAAgB,EAAQ,cAC5B,CAAC,EAED,GADA,EAAS,EACL,EAAW,CACX,MAAM,EAAQ,QAAQ,EACtB,MACJ,CACA,EAAa,CAAO,EACpB,EAAU,OAAO,CACrB,OAAS,EAAQ,CACb,GAAI,EAAW,OACf,EAAa,IAAI,EACjB,EAAS,aAAkB,MAAQ,EAAa,MAAM,OAAO,CAAM,CAAC,CAAC,EACrE,EAAU,OAAO,CACrB,CACJ,EAAA,CAAG,MAEU,CACT,EAAY,GACZ,EAAa,IAAI,EACjB,GAAa,QAAQ,CACzB,CACJ,EAAG,CAAC,EAAQ,EAAS,CAAU,CAAC,EAEhC,IAAM,GAAA,EAAU,EAAA,YAAA,CACZ,KAAO,IAA4D,CAC/D,GAAI,IAAc,KACd,MAAU,MACN,4EAEJ,EAEJ,OAAO,MAAM,EAAU,QAAQ,CAAI,CACvC,EACA,CAAC,CAAS,CACd,EAEM,GAAA,EAAS,EAAA,YAAA,KAAkB,EAAY,GAAU,EAAQ,CAAC,EAAG,CAAC,CAAC,EAErE,MAAO,CACH,YACA,SACA,QACA,QAAS,IAAW,SAAW,IAAc,KAC7C,UACA,QACJ,CACJ"}
1
+ {"version":3,"file":"use-tabular-predictor.cjs","names":["useState","useLatestRef","fetchModelBytes","TabularPredictor","useCallback","require_use_latest_ref","require_cache","require_predictor","react","useTabularPredictor","predictor","setPredictor","status","setStatus","error","setError","attempt","setAttempt","optionsRef","options","source","cancelled","loaded","current","cache","bytes","created","caught","predict","rows","reload","value"],"sources":["../../src/tabular/use-tabular-predictor.ts"],"sourcesContent":["/**\n * React binding for {@link TabularPredictor}.\n *\n * Loading a model is async, cancellable, and has to be undone on unmount —\n * three things every component that touches inference gets wrong the same\n * way. The hook owns that lifecycle so a component only deals with\n * `status` and `predict`.\n */\n\nimport { useCallback, useEffect, useState } from \"react\";\nimport { useLatestRef } from \"@/hooks/use-latest-ref\";\n\nimport { fetchModelBytes, type ModelCacheOptions } from \"./cache\";\nimport { TabularPredictor } from \"./predictor\";\nimport type {\n FeatureRow,\n TabularModelSource,\n TabularPrediction,\n TabularPredictorOptions,\n} from \"./types\";\n\n/** Lifecycle of the model behind the hook. */\nexport type TabularPredictorStatus = \"idle\" | \"loading\" | \"ready\" | \"error\";\n\n/** Options for {@link useTabularPredictor}. */\nexport interface UseTabularPredictorOptions extends TabularPredictorOptions {\n /**\n * Cache the model bytes on the device, so later loads work offline.\n *\n * On by default when the source is a URL: an app that runs inference in\n * the browser almost always wants it to keep working without a network,\n * and the failure mode of not caching only shows up in a tunnel.\n */\n readonly cache?: boolean | ModelCacheOptions;\n}\n\n/** What {@link useTabularPredictor} returns. */\nexport interface UseTabularPredictorResult {\n /** The loaded predictor, or `null` while loading or on error. */\n readonly predictor: TabularPredictor | null;\n /** Where the load is. */\n readonly status: TabularPredictorStatus;\n /** Why the load failed. */\n readonly error: Error | null;\n /** Whether the model is loaded and can answer. */\n readonly isReady: boolean;\n /**\n * Predict for a batch of rows.\n *\n * @throws When called before the model is ready — awaiting `isReady`\n * is the caller's job, and a silent empty result would hide the bug.\n */\n readonly predict: (rows: readonly FeatureRow[]) => Promise<TabularPrediction>;\n /** Load the model again, e.g. after a failure or a new version. */\n readonly reload: () => void;\n}\n\n/**\n * Load a tabular model and keep it for the component's lifetime.\n *\n * @example\n * ```tsx\n * function RiskWidget() {\n * const { predict, isReady } = useTabularPredictor(\"/models/risk-v3.onnx\");\n * const [score, setScore] = useState<number | null>(null);\n *\n * async function onSubmit(features: number[]) {\n * const { probabilities } = await predict([features]);\n * setScore(probabilities[0]?.[1] ?? null);\n * }\n *\n * return <button disabled={!isReady} onClick={() => onSubmit([1, 2, 3, 4])}>Score</button>;\n * }\n * ```\n *\n * @param source Model URL, or the bytes when the app already has them.\n * Pass `null` to hold off loading (a gate, a lazy tab).\n * @param options Predictor options plus caching.\n * @returns The predictor, its status, and a `predict` bound to it.\n */\nexport function useTabularPredictor(\n source: TabularModelSource | null,\n options: UseTabularPredictorOptions = {},\n): UseTabularPredictorResult {\n const [predictor, setPredictor] = useState<TabularPredictor | null>(null);\n const [status, setStatus] = useState<TabularPredictorStatus>(\"idle\");\n const [error, setError] = useState<Error | null>(null);\n const [attempt, setAttempt] = useState(0);\n\n const optionsRef = useLatestRef(options);\n\n useEffect(() => {\n if (source === null) {\n setStatus(\"idle\");\n return;\n }\n\n let cancelled = false;\n let loaded: TabularPredictor | null = null;\n\n setStatus(\"loading\");\n setError(null);\n\n void (async () => {\n try {\n const current = optionsRef.current;\n const cache = current.cache ?? true;\n const bytes =\n typeof source === \"string\" && cache !== false\n ? await fetchModelBytes(source, typeof cache === \"object\" ? cache : {})\n : source;\n const created = await TabularPredictor.create(bytes, {\n providers: current.providers,\n warmup: current.warmup,\n sessionOptions: current.sessionOptions,\n });\n loaded = created;\n if (cancelled) {\n await created.dispose();\n return;\n }\n setPredictor(created);\n setStatus(\"ready\");\n } catch (caught) {\n if (cancelled) return;\n setPredictor(null);\n setError(caught instanceof Error ? caught : new Error(String(caught)));\n setStatus(\"error\");\n }\n })();\n\n return () => {\n cancelled = true;\n setPredictor(null);\n void loaded?.dispose();\n };\n }, [source, attempt, optionsRef]);\n\n const predict = useCallback(\n async (rows: readonly FeatureRow[]): Promise<TabularPrediction> => {\n if (predictor === null) {\n throw new Error(\n \"predict() was called before the model finished loading. \" +\n \"Gate on `isReady`.\",\n );\n }\n return await predictor.predict(rows);\n },\n [predictor],\n );\n\n const reload = useCallback(() => setAttempt((value) => value + 1), []);\n\n return {\n predictor,\n status,\n error,\n isReady: status === \"ready\" && predictor !== null,\n predict,\n reload,\n };\n}\n"],"mappings":"A,4HAgFA,SAAgBS,EACZ,EACA,EAAsC,CAAC,EACd,CACzB,GAAM,CAACC,EAAWC,IAAA,EAAgBX,EAAAA,SAAAA,CAAkC,IAAI,EAClE,CAACY,EAAQC,IAAA,EAAab,EAAAA,SAAAA,CAAiC,MAAM,EAC7D,CAACc,EAAOC,IAAA,EAAYf,EAAAA,SAAAA,CAAuB,IAAI,EAC/C,CAACgB,EAASC,IAAA,EAAcjB,EAAAA,SAAAA,CAAS,CAAC,EAElCkB,EAAajB,EAAAA,aAAakB,CAAO,GAEvC,EAAAX,EAAA,UAAA,KAAgB,CACZ,GAAIY,IAAW,KAAM,CACjBP,EAAU,MAAM,EAChB,MACJ,CAEA,IAAIQ,EAAY,GACZC,EAAkC,KAiCtC,OA/BAT,EAAU,SAAS,EACnBE,EAAS,IAAI,GAEP,SAAY,CACd,GAAI,CACA,IAAMQ,EAAUL,EAAW,QACrBM,EAAQD,EAAQ,OAAS,GACzBE,EACF,OAAOL,GAAW,UAAYI,IAAU,GAClC,MAAMtB,EAAAA,gBAAgBkB,EAAQ,OAAOI,GAAU,SAAWA,EAAQ,CAAC,CAAC,EACpEJ,EACJM,EAAU,MAAMvB,EAAAA,iBAAiB,OAAOsB,EAAO,CACjD,UAAWF,EAAQ,UACnB,OAAQA,EAAQ,OAChB,eAAgBA,EAAQ,cAC5B,CAAC,EAED,GADA,EAASG,EACLL,EAAW,CACX,MAAMK,EAAQ,QAAQ,EACtB,MACJ,CACAf,EAAae,CAAO,EACpBb,EAAU,OAAO,CACrB,OAASc,EAAQ,CACb,GAAIN,EAAW,OACfV,EAAa,IAAI,EACjBI,EAASY,aAAkB,MAAQA,EAAa,MAAM,OAAOA,CAAM,CAAC,CAAC,EACrEd,EAAU,OAAO,CACrB,CACJ,EAAA,CAAG,MAEU,CACT,EAAY,GACZF,EAAa,IAAI,EACjBW,GAAa,QAAQ,CACzB,CACJ,EAAG,CAACF,EAAQJ,EAASE,CAAU,CAAC,EAEhC,IAAMU,GAAA,EAAUxB,EAAAA,YAAAA,CACZ,KAAO,IAA4D,CAC/D,GAAIM,IAAc,KACd,MAAU,MACN,4EAEJ,EAEJ,OAAO,MAAMA,EAAU,QAAQmB,CAAI,CACvC,EACA,CAACnB,CAAS,CACd,EAEMoB,GAAA,EAAS1B,EAAAA,YAAAA,KAAkBa,EAAY,GAAUc,EAAQ,CAAC,EAAG,CAAC,CAAC,EAErE,MAAO,CACH,YACA,SACA,QACA,QAASnB,IAAW,SAAWF,IAAc,KAC7C,UACA,QACJ,CACJ,C"}
@@ -1 +1 @@
1
- {"version":3,"file":"use-tabular-predictor.js","names":[],"sources":["../../src/tabular/use-tabular-predictor.ts"],"sourcesContent":["/**\n * React binding for {@link TabularPredictor}.\n *\n * Loading a model is async, cancellable, and has to be undone on unmount —\n * three things every component that touches inference gets wrong the same\n * way. The hook owns that lifecycle so a component only deals with\n * `status` and `predict`.\n */\n\nimport { useCallback, useEffect, useState } from \"react\";\nimport { useLatestRef } from \"@/hooks/use-latest-ref\";\n\nimport { fetchModelBytes, type ModelCacheOptions } from \"./cache\";\nimport { TabularPredictor } from \"./predictor\";\nimport type {\n FeatureRow,\n TabularModelSource,\n TabularPrediction,\n TabularPredictorOptions,\n} from \"./types\";\n\n/** Lifecycle of the model behind the hook. */\nexport type TabularPredictorStatus = \"idle\" | \"loading\" | \"ready\" | \"error\";\n\n/** Options for {@link useTabularPredictor}. */\nexport interface UseTabularPredictorOptions extends TabularPredictorOptions {\n /**\n * Cache the model bytes on the device, so later loads work offline.\n *\n * On by default when the source is a URL: an app that runs inference in\n * the browser almost always wants it to keep working without a network,\n * and the failure mode of not caching only shows up in a tunnel.\n */\n readonly cache?: boolean | ModelCacheOptions;\n}\n\n/** What {@link useTabularPredictor} returns. */\nexport interface UseTabularPredictorResult {\n /** The loaded predictor, or `null` while loading or on error. */\n readonly predictor: TabularPredictor | null;\n /** Where the load is. */\n readonly status: TabularPredictorStatus;\n /** Why the load failed. */\n readonly error: Error | null;\n /** Whether the model is loaded and can answer. */\n readonly isReady: boolean;\n /**\n * Predict for a batch of rows.\n *\n * @throws When called before the model is ready — awaiting `isReady`\n * is the caller's job, and a silent empty result would hide the bug.\n */\n readonly predict: (rows: readonly FeatureRow[]) => Promise<TabularPrediction>;\n /** Load the model again, e.g. after a failure or a new version. */\n readonly reload: () => void;\n}\n\n/**\n * Load a tabular model and keep it for the component's lifetime.\n *\n * @example\n * ```tsx\n * function RiskWidget() {\n * const { predict, isReady } = useTabularPredictor(\"/models/risk-v3.onnx\");\n * const [score, setScore] = useState<number | null>(null);\n *\n * async function onSubmit(features: number[]) {\n * const { probabilities } = await predict([features]);\n * setScore(probabilities[0]?.[1] ?? null);\n * }\n *\n * return <button disabled={!isReady} onClick={() => onSubmit([1, 2, 3, 4])}>Score</button>;\n * }\n * ```\n *\n * @param source Model URL, or the bytes when the app already has them.\n * Pass `null` to hold off loading (a gate, a lazy tab).\n * @param options Predictor options plus caching.\n * @returns The predictor, its status, and a `predict` bound to it.\n */\nexport function useTabularPredictor(\n source: TabularModelSource | null,\n options: UseTabularPredictorOptions = {},\n): UseTabularPredictorResult {\n const [predictor, setPredictor] = useState<TabularPredictor | null>(null);\n const [status, setStatus] = useState<TabularPredictorStatus>(\"idle\");\n const [error, setError] = useState<Error | null>(null);\n const [attempt, setAttempt] = useState(0);\n\n const optionsRef = useLatestRef(options);\n\n useEffect(() => {\n if (source === null) {\n setStatus(\"idle\");\n return;\n }\n\n let cancelled = false;\n let loaded: TabularPredictor | null = null;\n\n setStatus(\"loading\");\n setError(null);\n\n void (async () => {\n try {\n const current = optionsRef.current;\n const cache = current.cache ?? true;\n const bytes =\n typeof source === \"string\" && cache !== false\n ? await fetchModelBytes(source, typeof cache === \"object\" ? cache : {})\n : source;\n const created = await TabularPredictor.create(bytes, {\n providers: current.providers,\n warmup: current.warmup,\n sessionOptions: current.sessionOptions,\n });\n loaded = created;\n if (cancelled) {\n await created.dispose();\n return;\n }\n setPredictor(created);\n setStatus(\"ready\");\n } catch (caught) {\n if (cancelled) return;\n setPredictor(null);\n setError(caught instanceof Error ? caught : new Error(String(caught)));\n setStatus(\"error\");\n }\n })();\n\n return () => {\n cancelled = true;\n setPredictor(null);\n void loaded?.dispose();\n };\n }, [source, attempt, optionsRef]);\n\n const predict = useCallback(\n async (rows: readonly FeatureRow[]): Promise<TabularPrediction> => {\n if (predictor === null) {\n throw new Error(\n \"predict() was called before the model finished loading. \" +\n \"Gate on `isReady`.\",\n );\n }\n return await predictor.predict(rows);\n },\n [predictor],\n );\n\n const reload = useCallback(() => setAttempt((value) => value + 1), []);\n\n return {\n predictor,\n status,\n error,\n isReady: status === \"ready\" && predictor !== null,\n predict,\n reload,\n };\n}\n"],"mappings":";;;;;AAgFA,SAAgB,EACZ,GACA,IAAsC,CAAC,GACd;CACzB,IAAM,CAAC,GAAW,KAAgB,EAAkC,IAAI,GAClE,CAAC,GAAQ,KAAa,EAAiC,MAAM,GAC7D,CAAC,GAAO,KAAY,EAAuB,IAAI,GAC/C,CAAC,GAAS,KAAc,EAAS,CAAC,GAElC,IAAa,EAAa,CAAO;CAEvC,QAAgB;EACZ,IAAI,MAAW,MAAM;GACjB,EAAU,MAAM;GAChB;EACJ;EAEA,IAAI,IAAY,IACZ,IAAkC;EAiCtC,OA/BA,EAAU,SAAS,GACnB,EAAS,IAAI,IAEP,YAAY;GACd,IAAI;IACA,IAAM,IAAU,EAAW,SACrB,IAAQ,EAAQ,SAAS,IACzB,IACF,OAAO,KAAW,YAAY,MAAU,KAClC,MAAM,EAAgB,GAAQ,OAAO,KAAU,WAAW,IAAQ,CAAC,CAAC,IACpE,GACJ,IAAU,MAAM,EAAiB,OAAO,GAAO;KACjD,WAAW,EAAQ;KACnB,QAAQ,EAAQ;KAChB,gBAAgB,EAAQ;IAC5B,CAAC;IAED,IADA,IAAS,GACL,GAAW;KACX,MAAM,EAAQ,QAAQ;KACtB;IACJ;IAEA,AADA,EAAa,CAAO,GACpB,EAAU,OAAO;GACrB,SAAS,GAAQ;IACb,IAAI,GAAW;IAGf,AAFA,EAAa,IAAI,GACjB,EAAS,aAAkB,QAAQ,IAAa,MAAM,OAAO,CAAM,CAAC,CAAC,GACrE,EAAU,OAAO;GACrB;EACJ,EAAA,CAAG,SAEU;GAGT,AAFA,IAAY,IACZ,EAAa,IAAI,GACjB,GAAa,QAAQ;EACzB;CACJ,GAAG;EAAC;EAAQ;EAAS;CAAU,CAAC;CAEhC,IAAM,IAAU,EACZ,OAAO,MAA4D;EAC/D,IAAI,MAAc,MACd,MAAU,MACN,4EAEJ;EAEJ,OAAO,MAAM,EAAU,QAAQ,CAAI;CACvC,GACA,CAAC,CAAS,CACd,GAEM,IAAS,QAAkB,GAAY,MAAU,IAAQ,CAAC,GAAG,CAAC,CAAC;CAErE,OAAO;EACH;EACA;EACA;EACA,SAAS,MAAW,WAAW,MAAc;EAC7C;EACA;CACJ;AACJ"}
1
+ {"version":3,"file":"use-tabular-predictor.js","names":["useTabularPredictor","predictor","setPredictor","useState","status","setStatus","error","setError","attempt","setAttempt","optionsRef","useLatestRef","options","source","cancelled","loaded","current","cache","bytes","fetchModelBytes","created","TabularPredictor","caught","predict","useCallback","rows","reload","value"],"sources":["../../src/tabular/use-tabular-predictor.ts"],"sourcesContent":["/**\n * React binding for {@link TabularPredictor}.\n *\n * Loading a model is async, cancellable, and has to be undone on unmount —\n * three things every component that touches inference gets wrong the same\n * way. The hook owns that lifecycle so a component only deals with\n * `status` and `predict`.\n */\n\nimport { useCallback, useEffect, useState } from \"react\";\nimport { useLatestRef } from \"@/hooks/use-latest-ref\";\n\nimport { fetchModelBytes, type ModelCacheOptions } from \"./cache\";\nimport { TabularPredictor } from \"./predictor\";\nimport type {\n FeatureRow,\n TabularModelSource,\n TabularPrediction,\n TabularPredictorOptions,\n} from \"./types\";\n\n/** Lifecycle of the model behind the hook. */\nexport type TabularPredictorStatus = \"idle\" | \"loading\" | \"ready\" | \"error\";\n\n/** Options for {@link useTabularPredictor}. */\nexport interface UseTabularPredictorOptions extends TabularPredictorOptions {\n /**\n * Cache the model bytes on the device, so later loads work offline.\n *\n * On by default when the source is a URL: an app that runs inference in\n * the browser almost always wants it to keep working without a network,\n * and the failure mode of not caching only shows up in a tunnel.\n */\n readonly cache?: boolean | ModelCacheOptions;\n}\n\n/** What {@link useTabularPredictor} returns. */\nexport interface UseTabularPredictorResult {\n /** The loaded predictor, or `null` while loading or on error. */\n readonly predictor: TabularPredictor | null;\n /** Where the load is. */\n readonly status: TabularPredictorStatus;\n /** Why the load failed. */\n readonly error: Error | null;\n /** Whether the model is loaded and can answer. */\n readonly isReady: boolean;\n /**\n * Predict for a batch of rows.\n *\n * @throws When called before the model is ready — awaiting `isReady`\n * is the caller's job, and a silent empty result would hide the bug.\n */\n readonly predict: (rows: readonly FeatureRow[]) => Promise<TabularPrediction>;\n /** Load the model again, e.g. after a failure or a new version. */\n readonly reload: () => void;\n}\n\n/**\n * Load a tabular model and keep it for the component's lifetime.\n *\n * @example\n * ```tsx\n * function RiskWidget() {\n * const { predict, isReady } = useTabularPredictor(\"/models/risk-v3.onnx\");\n * const [score, setScore] = useState<number | null>(null);\n *\n * async function onSubmit(features: number[]) {\n * const { probabilities } = await predict([features]);\n * setScore(probabilities[0]?.[1] ?? null);\n * }\n *\n * return <button disabled={!isReady} onClick={() => onSubmit([1, 2, 3, 4])}>Score</button>;\n * }\n * ```\n *\n * @param source Model URL, or the bytes when the app already has them.\n * Pass `null` to hold off loading (a gate, a lazy tab).\n * @param options Predictor options plus caching.\n * @returns The predictor, its status, and a `predict` bound to it.\n */\nexport function useTabularPredictor(\n source: TabularModelSource | null,\n options: UseTabularPredictorOptions = {},\n): UseTabularPredictorResult {\n const [predictor, setPredictor] = useState<TabularPredictor | null>(null);\n const [status, setStatus] = useState<TabularPredictorStatus>(\"idle\");\n const [error, setError] = useState<Error | null>(null);\n const [attempt, setAttempt] = useState(0);\n\n const optionsRef = useLatestRef(options);\n\n useEffect(() => {\n if (source === null) {\n setStatus(\"idle\");\n return;\n }\n\n let cancelled = false;\n let loaded: TabularPredictor | null = null;\n\n setStatus(\"loading\");\n setError(null);\n\n void (async () => {\n try {\n const current = optionsRef.current;\n const cache = current.cache ?? true;\n const bytes =\n typeof source === \"string\" && cache !== false\n ? await fetchModelBytes(source, typeof cache === \"object\" ? cache : {})\n : source;\n const created = await TabularPredictor.create(bytes, {\n providers: current.providers,\n warmup: current.warmup,\n sessionOptions: current.sessionOptions,\n });\n loaded = created;\n if (cancelled) {\n await created.dispose();\n return;\n }\n setPredictor(created);\n setStatus(\"ready\");\n } catch (caught) {\n if (cancelled) return;\n setPredictor(null);\n setError(caught instanceof Error ? caught : new Error(String(caught)));\n setStatus(\"error\");\n }\n })();\n\n return () => {\n cancelled = true;\n setPredictor(null);\n void loaded?.dispose();\n };\n }, [source, attempt, optionsRef]);\n\n const predict = useCallback(\n async (rows: readonly FeatureRow[]): Promise<TabularPrediction> => {\n if (predictor === null) {\n throw new Error(\n \"predict() was called before the model finished loading. \" +\n \"Gate on `isReady`.\",\n );\n }\n return await predictor.predict(rows);\n },\n [predictor],\n );\n\n const reload = useCallback(() => setAttempt((value) => value + 1), []);\n\n return {\n predictor,\n status,\n error,\n isReady: status === \"ready\" && predictor !== null,\n predict,\n reload,\n };\n}\n"],"mappings":";;;;;AAgFA,SAAgBA,EACZ,GACA,IAAsC,CAAC,GACd;CACzB,IAAM,CAACC,GAAWC,KAAgBC,EAAkC,IAAI,GAClE,CAACC,GAAQC,KAAaF,EAAiC,MAAM,GAC7D,CAACG,GAAOC,KAAYJ,EAAuB,IAAI,GAC/C,CAACK,GAASC,KAAcN,EAAS,CAAC,GAElCO,IAAaC,EAAaC,CAAO;CAEvC,QAAgB;EACZ,IAAIC,MAAW,MAAM;GACjB,EAAU,MAAM;GAChB;EACJ;EAEA,IAAIC,IAAY,IACZC,IAAkC;EAiCtC,OA/BAV,EAAU,SAAS,GACnBE,EAAS,IAAI,IAEP,YAAY;GACd,IAAI;IACA,IAAMS,IAAUN,EAAW,SACrBO,IAAQD,EAAQ,SAAS,IACzBE,IACF,OAAOL,KAAW,YAAYI,MAAU,KAClC,MAAME,EAAgBN,GAAQ,OAAOI,KAAU,WAAWA,IAAQ,CAAC,CAAC,IACpEJ,GACJO,IAAU,MAAMC,EAAiB,OAAOH,GAAO;KACjD,WAAWF,EAAQ;KACnB,QAAQA,EAAQ;KAChB,gBAAgBA,EAAQ;IAC5B,CAAC;IAED,IADA,IAASI,GACLN,GAAW;KACX,MAAMM,EAAQ,QAAQ;KACtB;IACJ;IAEA,AADAlB,EAAakB,CAAO,GACpBf,EAAU,OAAO;GACrB,SAASiB,GAAQ;IACb,IAAIR,GAAW;IAGf,AAFAZ,EAAa,IAAI,GACjBK,EAASe,aAAkB,QAAQA,IAAa,MAAM,OAAOA,CAAM,CAAC,CAAC,GACrEjB,EAAU,OAAO;GACrB;EACJ,EAAA,CAAG,SAEU;GAGT,AAFA,IAAY,IACZH,EAAa,IAAI,GACjBa,GAAa,QAAQ;EACzB;CACJ,GAAG;EAACF;EAAQL;EAASE;CAAU,CAAC;CAEhC,IAAMa,IAAUC,EACZ,OAAO,MAA4D;EAC/D,IAAIvB,MAAc,MACd,MAAU,MACN,4EAEJ;EAEJ,OAAO,MAAMA,EAAU,QAAQwB,CAAI;CACvC,GACA,CAACxB,CAAS,CACd,GAEMyB,IAASF,QAAkBf,GAAY,MAAUkB,IAAQ,CAAC,GAAG,CAAC,CAAC;CAErE,OAAO;EACH;EACA;EACA;EACA,SAASvB,MAAW,WAAWH,MAAc;EAC7C;EACA;CACJ;AACJ"}
@@ -1 +1 @@
1
- {"version":3,"file":"TelemetryProvider.cjs","names":[],"sources":["../../src/telemetry/TelemetryProvider.tsx"],"sourcesContent":["import { createContext, useContext, useEffect, useMemo } from \"react\";\nimport type { ReactNode } from \"react\";\nimport type { TelemetryAdapter } from \"./types\";\n\nconst TelemetryContext = createContext<TelemetryAdapter | null>(null);\n\nexport interface TelemetryProviderProps {\n adapter: TelemetryAdapter;\n children: ReactNode;\n}\n\n/**\n * Inject a telemetry adapter into the tree. Apps can swap implementations\n * (Sentry, Datadog, PostHog, console) without touching call sites.\n */\nexport function TelemetryProvider({ adapter, children }: TelemetryProviderProps) {\n useEffect(() => {\n void adapter.init?.();\n return () => {\n void adapter.flush?.();\n };\n }, [adapter]);\n const value = useMemo(() => adapter, [adapter]);\n return <TelemetryContext.Provider value={value}>{children}</TelemetryContext.Provider>;\n}\n\n/**\n * Access the active telemetry adapter. Returns `null` when no provider is\n * mounted (calls are silently dropped — useful for unit tests).\n */\nexport function useTelemetry(): TelemetryAdapter | null {\n return useContext(TelemetryContext);\n}\n"],"mappings":"sDAIA,IAAM,GAAA,EAAmB,EAAA,cAAA,CAAuC,IAAI,EAWpE,SAAgB,EAAkB,CAAE,UAAS,YAAoC,EAC7E,EAAA,EAAA,UAAA,MACI,EAAa,OAAO,MACP,CACT,EAAa,QAAQ,CACzB,GACD,CAAC,CAAO,CAAC,EACZ,IAAM,GAAA,EAAQ,EAAA,QAAA,KAAc,EAAS,CAAC,CAAO,CAAC,EAC9C,OAAO,EAAA,EAAA,IAAA,CAAC,EAAiB,SAAlB,CAAkC,QAAQ,UAAoC,CAAA,CACzF,CAMA,SAAgB,GAAwC,CACpD,OAAA,EAAO,EAAA,WAAA,CAAW,CAAgB,CACtC"}
1
+ {"version":3,"file":"TelemetryProvider.cjs","names":["createContext","useMemo","useContext","react","react_jsx_runtime","TelemetryContext","TelemetryProvider","adapter","value","useTelemetry"],"sources":["../../src/telemetry/TelemetryProvider.tsx"],"sourcesContent":["import { createContext, useContext, useEffect, useMemo } from \"react\";\nimport type { ReactNode } from \"react\";\nimport type { TelemetryAdapter } from \"./types\";\n\nconst TelemetryContext = createContext<TelemetryAdapter | null>(null);\n\nexport interface TelemetryProviderProps {\n adapter: TelemetryAdapter;\n children: ReactNode;\n}\n\n/**\n * Inject a telemetry adapter into the tree. Apps can swap implementations\n * (Sentry, Datadog, PostHog, console) without touching call sites.\n */\nexport function TelemetryProvider({ adapter, children }: TelemetryProviderProps) {\n useEffect(() => {\n void adapter.init?.();\n return () => {\n void adapter.flush?.();\n };\n }, [adapter]);\n const value = useMemo(() => adapter, [adapter]);\n return <TelemetryContext.Provider value={value}>{children}</TelemetryContext.Provider>;\n}\n\n/**\n * Access the active telemetry adapter. Returns `null` when no provider is\n * mounted (calls are silently dropped — useful for unit tests).\n */\nexport function useTelemetry(): TelemetryAdapter | null {\n return useContext(TelemetryContext);\n}\n"],"mappings":"A,sDAIA,IAAMK,GAAA,EAAmBL,EAAAA,cAAAA,CAAuC,IAAI,EAWpE,SAAgBM,EAAkB,CAAE,UAAS,YAAoC,EAC7E,EAAAH,EAAA,UAAA,MACII,EAAa,OAAO,MACP,CACTA,EAAa,QAAQ,CACzB,GACD,CAACA,CAAO,CAAC,EACZ,IAAMC,GAAA,EAAQP,EAAAA,QAAAA,KAAcM,EAAS,CAACA,CAAO,CAAC,EAC9C,OAAO,EAAAH,EAAA,IAAA,CAACC,EAAiB,SAAlB,CAAkC,QAAQ,UAAoC,CAAA,CACzF,CAMA,SAAgBI,GAAwC,CACpD,OAAA,EAAOP,EAAAA,WAAAA,CAAWG,CAAgB,CACtC,C"}
@@ -1 +1 @@
1
- {"version":3,"file":"TelemetryProvider.js","names":[],"sources":["../../src/telemetry/TelemetryProvider.tsx"],"sourcesContent":["import { createContext, useContext, useEffect, useMemo } from \"react\";\nimport type { ReactNode } from \"react\";\nimport type { TelemetryAdapter } from \"./types\";\n\nconst TelemetryContext = createContext<TelemetryAdapter | null>(null);\n\nexport interface TelemetryProviderProps {\n adapter: TelemetryAdapter;\n children: ReactNode;\n}\n\n/**\n * Inject a telemetry adapter into the tree. Apps can swap implementations\n * (Sentry, Datadog, PostHog, console) without touching call sites.\n */\nexport function TelemetryProvider({ adapter, children }: TelemetryProviderProps) {\n useEffect(() => {\n void adapter.init?.();\n return () => {\n void adapter.flush?.();\n };\n }, [adapter]);\n const value = useMemo(() => adapter, [adapter]);\n return <TelemetryContext.Provider value={value}>{children}</TelemetryContext.Provider>;\n}\n\n/**\n * Access the active telemetry adapter. Returns `null` when no provider is\n * mounted (calls are silently dropped — useful for unit tests).\n */\nexport function useTelemetry(): TelemetryAdapter | null {\n return useContext(TelemetryContext);\n}\n"],"mappings":";;;AAIA,IAAM,IAAmB,EAAuC,IAAI;AAWpE,SAAgB,EAAkB,EAAE,YAAS,eAAoC;CAC7E,SACI,EAAa,OAAO,SACP;EACT,EAAa,QAAQ;CACzB,IACD,CAAC,CAAO,CAAC;CACZ,IAAM,IAAQ,QAAc,GAAS,CAAC,CAAO,CAAC;CAC9C,OAAO,kBAAC,EAAiB,UAAlB;EAAkC;EAAQ;CAAoC,CAAA;AACzF;AAMA,SAAgB,IAAwC;CACpD,OAAO,EAAW,CAAgB;AACtC"}
1
+ {"version":3,"file":"TelemetryProvider.js","names":["TelemetryContext","createContext","TelemetryProvider","adapter","value","useMemo","useTelemetry","useContext"],"sources":["../../src/telemetry/TelemetryProvider.tsx"],"sourcesContent":["import { createContext, useContext, useEffect, useMemo } from \"react\";\nimport type { ReactNode } from \"react\";\nimport type { TelemetryAdapter } from \"./types\";\n\nconst TelemetryContext = createContext<TelemetryAdapter | null>(null);\n\nexport interface TelemetryProviderProps {\n adapter: TelemetryAdapter;\n children: ReactNode;\n}\n\n/**\n * Inject a telemetry adapter into the tree. Apps can swap implementations\n * (Sentry, Datadog, PostHog, console) without touching call sites.\n */\nexport function TelemetryProvider({ adapter, children }: TelemetryProviderProps) {\n useEffect(() => {\n void adapter.init?.();\n return () => {\n void adapter.flush?.();\n };\n }, [adapter]);\n const value = useMemo(() => adapter, [adapter]);\n return <TelemetryContext.Provider value={value}>{children}</TelemetryContext.Provider>;\n}\n\n/**\n * Access the active telemetry adapter. Returns `null` when no provider is\n * mounted (calls are silently dropped — useful for unit tests).\n */\nexport function useTelemetry(): TelemetryAdapter | null {\n return useContext(TelemetryContext);\n}\n"],"mappings":";;;AAIA,IAAMA,IAAmBC,EAAuC,IAAI;AAWpE,SAAgBC,EAAkB,EAAE,YAAS,eAAoC;CAC7E,SACIC,EAAa,OAAO,SACP;EACT,EAAa,QAAQ;CACzB,IACD,CAACA,CAAO,CAAC;CACZ,IAAMC,IAAQC,QAAcF,GAAS,CAACA,CAAO,CAAC;CAC9C,OAAO,kBAACH,EAAiB,UAAlB;EAAkC;EAAQ;CAAoC,CAAA;AACzF;AAMA,SAAgBM,IAAwC;CACpD,OAAOC,EAAWP,CAAgB;AACtC"}
@@ -1 +1 @@
1
- {"version":3,"file":"app-error-adapter.cjs","names":[],"sources":["../../src/telemetry/app-error-adapter.ts"],"sourcesContent":["import type { AppErrorReporter } from \"./app-error-reporter\";\nimport type { TelemetryAdapter } from \"./types\";\n\n/** Options for {@link createAppErrorTelemetryAdapter}. */\nexport interface CreateAppErrorTelemetryAdapterOptions {\n /** The reporter built by `createAppErrorReporter`. */\n reporter: AppErrorReporter;\n}\n\n/**\n * Build a {@link TelemetryAdapter} that sends exceptions to a Tempest backend's\n * `/api/app-errors`, so `useTelemetry().captureException` and an\n * `ErrorBoundary` wired to it reach the same table.\n *\n * Only exceptions travel. `identify` is a no-op because the backend takes the\n * user from the bearer token, never from the client; `track` is a no-op because\n * the route stores errors, not product events — pair this adapter with an\n * analytics one if you need both.\n *\n * Mapping:\n * - `captureException(err, ctx)` → `reporter.report(err, ctx)`\n * - `flush()` → `reporter.flush()`\n *\n * @example\n * import {\n * createAppErrorReporter,\n * createAppErrorTelemetryAdapter,\n * TelemetryProvider,\n * } from \"tempest-react-sdk\";\n *\n * const reporter = createAppErrorReporter({ endpoint: \"/api/app-errors\" });\n * const adapter = createAppErrorTelemetryAdapter({ reporter });\n *\n * <TelemetryProvider adapter={adapter}><App /></TelemetryProvider>;\n *\n * @param options - The reporter to forward to.\n * @returns The adapter.\n */\nexport function createAppErrorTelemetryAdapter(\n options: CreateAppErrorTelemetryAdapterOptions,\n): TelemetryAdapter {\n const { reporter } = options;\n return {\n identify() {},\n track() {},\n captureException(error, context) {\n reporter.report(error, context);\n },\n async flush() {\n await reporter.flush();\n },\n };\n}\n"],"mappings":"AAsCA,SAAgB,EACZ,EACgB,CAChB,GAAM,CAAE,YAAa,EACrB,MAAO,CACH,UAAW,CAAC,EACZ,OAAQ,CAAC,EACT,iBAAiB,EAAO,EAAS,CAC7B,EAAS,OAAO,EAAO,CAAO,CAClC,EACA,MAAM,OAAQ,CACV,MAAM,EAAS,MAAM,CACzB,CACJ,CACJ"}
1
+ {"version":3,"file":"app-error-adapter.cjs","names":["createAppErrorTelemetryAdapter","options","reporter","error","context"],"sources":["../../src/telemetry/app-error-adapter.ts"],"sourcesContent":["import type { AppErrorReporter } from \"./app-error-reporter\";\nimport type { TelemetryAdapter } from \"./types\";\n\n/** Options for {@link createAppErrorTelemetryAdapter}. */\nexport interface CreateAppErrorTelemetryAdapterOptions {\n /** The reporter built by `createAppErrorReporter`. */\n reporter: AppErrorReporter;\n}\n\n/**\n * Build a {@link TelemetryAdapter} that sends exceptions to a Tempest backend's\n * `/api/app-errors`, so `useTelemetry().captureException` and an\n * `ErrorBoundary` wired to it reach the same table.\n *\n * Only exceptions travel. `identify` is a no-op because the backend takes the\n * user from the bearer token, never from the client; `track` is a no-op because\n * the route stores errors, not product events — pair this adapter with an\n * analytics one if you need both.\n *\n * Mapping:\n * - `captureException(err, ctx)` → `reporter.report(err, ctx)`\n * - `flush()` → `reporter.flush()`\n *\n * @example\n * import {\n * createAppErrorReporter,\n * createAppErrorTelemetryAdapter,\n * TelemetryProvider,\n * } from \"tempest-react-sdk\";\n *\n * const reporter = createAppErrorReporter({ endpoint: \"/api/app-errors\" });\n * const adapter = createAppErrorTelemetryAdapter({ reporter });\n *\n * <TelemetryProvider adapter={adapter}><App /></TelemetryProvider>;\n *\n * @param options - The reporter to forward to.\n * @returns The adapter.\n */\nexport function createAppErrorTelemetryAdapter(\n options: CreateAppErrorTelemetryAdapterOptions,\n): TelemetryAdapter {\n const { reporter } = options;\n return {\n identify() {},\n track() {},\n captureException(error, context) {\n reporter.report(error, context);\n },\n async flush() {\n await reporter.flush();\n },\n };\n}\n"],"mappings":"AAsCA,SAAgBA,EACZ,EACgB,CAChB,GAAM,CAAE,YAAaC,EACrB,MAAO,CACH,UAAW,CAAC,EACZ,OAAQ,CAAC,EACT,iBAAiB,EAAO,EAAS,CAC7BC,EAAS,OAAOC,EAAOC,CAAO,CAClC,EACA,MAAM,OAAQ,CACV,MAAMF,EAAS,MAAM,CACzB,CACJ,CACJ,C"}
@@ -1 +1 @@
1
- {"version":3,"file":"app-error-adapter.js","names":[],"sources":["../../src/telemetry/app-error-adapter.ts"],"sourcesContent":["import type { AppErrorReporter } from \"./app-error-reporter\";\nimport type { TelemetryAdapter } from \"./types\";\n\n/** Options for {@link createAppErrorTelemetryAdapter}. */\nexport interface CreateAppErrorTelemetryAdapterOptions {\n /** The reporter built by `createAppErrorReporter`. */\n reporter: AppErrorReporter;\n}\n\n/**\n * Build a {@link TelemetryAdapter} that sends exceptions to a Tempest backend's\n * `/api/app-errors`, so `useTelemetry().captureException` and an\n * `ErrorBoundary` wired to it reach the same table.\n *\n * Only exceptions travel. `identify` is a no-op because the backend takes the\n * user from the bearer token, never from the client; `track` is a no-op because\n * the route stores errors, not product events — pair this adapter with an\n * analytics one if you need both.\n *\n * Mapping:\n * - `captureException(err, ctx)` → `reporter.report(err, ctx)`\n * - `flush()` → `reporter.flush()`\n *\n * @example\n * import {\n * createAppErrorReporter,\n * createAppErrorTelemetryAdapter,\n * TelemetryProvider,\n * } from \"tempest-react-sdk\";\n *\n * const reporter = createAppErrorReporter({ endpoint: \"/api/app-errors\" });\n * const adapter = createAppErrorTelemetryAdapter({ reporter });\n *\n * <TelemetryProvider adapter={adapter}><App /></TelemetryProvider>;\n *\n * @param options - The reporter to forward to.\n * @returns The adapter.\n */\nexport function createAppErrorTelemetryAdapter(\n options: CreateAppErrorTelemetryAdapterOptions,\n): TelemetryAdapter {\n const { reporter } = options;\n return {\n identify() {},\n track() {},\n captureException(error, context) {\n reporter.report(error, context);\n },\n async flush() {\n await reporter.flush();\n },\n };\n}\n"],"mappings":";AAsCA,SAAgB,EACZ,GACgB;CAChB,IAAM,EAAE,gBAAa;CACrB,OAAO;EACH,WAAW,CAAC;EACZ,QAAQ,CAAC;EACT,iBAAiB,GAAO,GAAS;GAC7B,EAAS,OAAO,GAAO,CAAO;EAClC;EACA,MAAM,QAAQ;GACV,MAAM,EAAS,MAAM;EACzB;CACJ;AACJ"}
1
+ {"version":3,"file":"app-error-adapter.js","names":["createAppErrorTelemetryAdapter","options","error","context","reporter"],"sources":["../../src/telemetry/app-error-adapter.ts"],"sourcesContent":["import type { AppErrorReporter } from \"./app-error-reporter\";\nimport type { TelemetryAdapter } from \"./types\";\n\n/** Options for {@link createAppErrorTelemetryAdapter}. */\nexport interface CreateAppErrorTelemetryAdapterOptions {\n /** The reporter built by `createAppErrorReporter`. */\n reporter: AppErrorReporter;\n}\n\n/**\n * Build a {@link TelemetryAdapter} that sends exceptions to a Tempest backend's\n * `/api/app-errors`, so `useTelemetry().captureException` and an\n * `ErrorBoundary` wired to it reach the same table.\n *\n * Only exceptions travel. `identify` is a no-op because the backend takes the\n * user from the bearer token, never from the client; `track` is a no-op because\n * the route stores errors, not product events — pair this adapter with an\n * analytics one if you need both.\n *\n * Mapping:\n * - `captureException(err, ctx)` → `reporter.report(err, ctx)`\n * - `flush()` → `reporter.flush()`\n *\n * @example\n * import {\n * createAppErrorReporter,\n * createAppErrorTelemetryAdapter,\n * TelemetryProvider,\n * } from \"tempest-react-sdk\";\n *\n * const reporter = createAppErrorReporter({ endpoint: \"/api/app-errors\" });\n * const adapter = createAppErrorTelemetryAdapter({ reporter });\n *\n * <TelemetryProvider adapter={adapter}><App /></TelemetryProvider>;\n *\n * @param options - The reporter to forward to.\n * @returns The adapter.\n */\nexport function createAppErrorTelemetryAdapter(\n options: CreateAppErrorTelemetryAdapterOptions,\n): TelemetryAdapter {\n const { reporter } = options;\n return {\n identify() {},\n track() {},\n captureException(error, context) {\n reporter.report(error, context);\n },\n async flush() {\n await reporter.flush();\n },\n };\n}\n"],"mappings":";AAsCA,SAAgBA,EACZ,GACgB;CAChB,IAAM,EAAE,gBAAaC;CACrB,OAAO;EACH,WAAW,CAAC;EACZ,QAAQ,CAAC;EACT,iBAAiB,GAAO,GAAS;GAC7B,EAAS,OAAOC,GAAOC,CAAO;EAClC;EACA,MAAM,QAAQ;GACV,MAAMC,EAAS,MAAM;EACzB;CACJ;AACJ"}
@@ -1 +1 @@
1
- {"version":3,"file":"app-error-queue.cjs","names":[],"sources":["../../src/telemetry/app-error-queue.ts"],"sourcesContent":["import type { AppErrorReportSchema } from \"./app-error-schema\";\n\n/**\n * The `localStorage` subset the queue needs, so a test or a non-browser host\n * can hand in its own.\n */\nexport interface AppErrorQueueStorage {\n getItem: (key: string) => string | null;\n setItem: (key: string, value: string) => void;\n removeItem: (key: string) => void;\n}\n\n/** One queued report and how many identical ones were folded into it. */\nexport interface AppErrorQueueEntry {\n report: AppErrorReportSchema;\n /** How many times this exact report was raised while it waited. */\n count: number;\n /**\n * The token in force when the report was raised, as a one-way fingerprint\n * (`\"t:<hex>\"`) — never the token itself. `null` means there was none;\n * the field is missing on entries persisted before it existed (≤ 0.76.0).\n *\n * The bearer is resolved when the queue drains, not when the error happens,\n * so this is what keeps a report user A raised offline from leaving with\n * user B's token: the bearer only goes out when it is the very token whose\n * fingerprint is stored here.\n */\n session?: string | null;\n /**\n * Who `getPrincipal` said was signed in when the report was raised, as a\n * one-way fingerprint (`\"p:<hex>\"`). Only set when the reporter has a\n * `getPrincipal`; `null` means it named nobody. It never grants the bearer\n * — `session` does — it only decides whether `foreignReports: \"drop\"`\n * discards the entry.\n */\n owner?: string | null;\n}\n\n/** Who a report is stamped with when it is raised. */\nexport interface AppErrorStamp {\n /** Token fingerprint, or `null`. */\n session: string | null;\n /** Principal fingerprint; absent without `getPrincipal`. */\n owner?: string | null;\n}\n\n/** The persisted queue the reporter drains. */\nexport interface AppErrorQueue {\n /** Every waiting entry, oldest first. */\n entries: () => AppErrorQueueEntry[];\n /**\n * Add a report, folding it into an identical waiting one with the same stamp.\n *\n * @param report - The fitted report.\n * @param stamp - Who was signed in when it was raised.\n * @returns How many entries the size ceiling evicted (0 or 1).\n */\n push: (report: AppErrorReportSchema, stamp: AppErrorStamp) => number;\n /** Whether `entry` is still waiting — `false` once sent, dropped or cleared. */\n has: (entry: AppErrorQueueEntry) => boolean;\n /**\n * Drop `entry` — the one just sent, or refused for good.\n *\n * Matched by content and owner, not by position: a report raised while the\n * send was in flight may have evicted the head, and dropping \"the first\n * entry\" would then throw away a report nobody sent.\n */\n remove: (entry: AppErrorQueueEntry) => void;\n /** Drop everything. */\n clear: () => void;\n}\n\n/**\n * Whether two reports describe the same failure on the same build.\n *\n * @param a - A waiting report.\n * @param b - The incoming report.\n * @returns `true` when `code`, `message` and `app_version` all match.\n */\nfunction sameReport(a: AppErrorReportSchema, b: AppErrorReportSchema): boolean {\n return a.code === b.code && a.message === b.message && a.app_version === b.app_version;\n}\n\n/**\n * Whether a waiting entry holds this report with this stamp.\n *\n * The stamp is part of the identity on purpose: folding B's report into A's\n * waiting one would send B's occurrences under A's name, which is the\n * misattribution the stamp exists to prevent.\n *\n * @param entry - A waiting entry.\n * @param other - The report and stamp to match; a missing field matches only a\n * missing field, so legacy entries keep to themselves.\n * @returns `true` when report, session and owner all match.\n */\nfunction holds(\n entry: AppErrorQueueEntry,\n other: Pick<AppErrorQueueEntry, \"report\" | \"session\" | \"owner\">,\n): boolean {\n return (\n sameReport(entry.report, other.report) &&\n entry.session === other.session &&\n entry.owner === other.owner\n );\n}\n\n/**\n * Read the queue back, treating anything unreadable as empty.\n *\n * @param storage - Where the queue lives.\n * @param key - Its storage key.\n * @returns The waiting entries.\n */\nfunction load(storage: AppErrorQueueStorage | null, key: string): AppErrorQueueEntry[] {\n if (!storage) return [];\n try {\n const raw = storage.getItem(key);\n const parsed: unknown = raw ? JSON.parse(raw) : [];\n return Array.isArray(parsed) ? (parsed as AppErrorQueueEntry[]) : [];\n } catch {\n return [];\n }\n}\n\n/**\n * Build the persisted queue of error reports waiting to be sent.\n *\n * Two rules bound it, because it fills exactly when the device is offline and\n * something is failing repeatedly:\n *\n * - **Identical reports from the same owner fold.** A failure in a loop raises the same report a\n * hundred times; it is stored once with a `count`, instead of pushing every\n * other failure out of the queue.\n * - **A ceiling evicts the oldest.** The newest report is the one closest to\n * what the user is looking at.\n *\n * Every write is best-effort: with storage unavailable or full, the queue keeps\n * working in memory for the session.\n *\n * @param storage - Backing store, or `null` to keep the queue in memory only.\n * @param key - Storage key.\n * @param maxEntries - Ceiling on distinct waiting reports.\n * @returns The queue.\n *\n * @tempest-limits empty-catch — `setItem` throws on quota exhaustion and in\n * Safari private mode; the in-memory copy is the fallback, and a reporter has no\n * one to tell.\n */\nexport function createAppErrorQueue(\n storage: AppErrorQueueStorage | null,\n key: string,\n maxEntries: number,\n): AppErrorQueue {\n let memory: AppErrorQueueEntry[] = load(storage, key);\n const save = (): void => {\n if (!storage) return;\n try {\n if (memory.length === 0) storage.removeItem(key);\n else storage.setItem(key, JSON.stringify(memory));\n } catch {\n return;\n }\n };\n return {\n entries: () => [...memory],\n push(report, stamp) {\n const incoming: AppErrorQueueEntry = { report, count: 1, ...stamp };\n const existing = memory.find((entry) => holds(entry, incoming));\n let evicted = 0;\n if (existing) {\n existing.count += 1;\n } else {\n memory.push(incoming);\n if (memory.length > maxEntries) {\n memory = memory.slice(memory.length - maxEntries);\n evicted = 1;\n }\n }\n save();\n return evicted;\n },\n has: (target) => memory.some((entry) => holds(entry, target)),\n remove(target) {\n memory = memory.filter((entry) => !holds(entry, target));\n save();\n },\n clear() {\n memory = [];\n save();\n },\n };\n}\n"],"mappings":"AA+EA,SAAS,EAAW,EAAyB,EAAkC,CAC3E,OAAO,EAAE,OAAS,EAAE,MAAQ,EAAE,UAAY,EAAE,SAAW,EAAE,cAAgB,EAAE,WAC/E,CAcA,SAAS,EACL,EACA,EACO,CACP,OACI,EAAW,EAAM,OAAQ,EAAM,MAAM,GACrC,EAAM,UAAY,EAAM,SACxB,EAAM,QAAU,EAAM,KAE9B,CASA,SAAS,EAAK,EAAsC,EAAmC,CACnF,GAAI,CAAC,EAAS,MAAO,CAAC,EACtB,GAAI,CACA,IAAM,EAAM,EAAQ,QAAQ,CAAG,EACzB,EAAkB,EAAM,KAAK,MAAM,CAAG,EAAI,CAAC,EACjD,OAAO,MAAM,QAAQ,CAAM,EAAK,EAAkC,CAAC,CACvE,MAAQ,CACJ,MAAO,CAAC,CACZ,CACJ,CA0BA,SAAgB,EACZ,EACA,EACA,EACa,CACb,IAAI,EAA+B,EAAK,EAAS,CAAG,EAC9C,MAAmB,CAChB,KACL,GAAI,CACI,EAAO,SAAW,EAAG,EAAQ,WAAW,CAAG,EAC1C,EAAQ,QAAQ,EAAK,KAAK,UAAU,CAAM,CAAC,CACpD,MAAQ,CACJ,MACJ,CACJ,EACA,MAAO,CACH,YAAe,CAAC,GAAG,CAAM,EACzB,KAAK,EAAQ,EAAO,CAChB,IAAM,EAA+B,CAAE,SAAQ,MAAO,EAAG,GAAG,CAAM,EAC5D,EAAW,EAAO,KAAM,GAAU,EAAM,EAAO,CAAQ,CAAC,EAC1D,EAAU,EAWd,OAVI,EACA,EAAS,OAAS,GAElB,EAAO,KAAK,CAAQ,EAChB,EAAO,OAAS,IAChB,EAAS,EAAO,MAAM,EAAO,OAAS,CAAU,EAChD,EAAU,IAGlB,EAAK,EACE,CACX,EACA,IAAM,GAAW,EAAO,KAAM,GAAU,EAAM,EAAO,CAAM,CAAC,EAC5D,OAAO,EAAQ,CACX,EAAS,EAAO,OAAQ,GAAU,CAAC,EAAM,EAAO,CAAM,CAAC,EACvD,EAAK,CACT,EACA,OAAQ,CACJ,EAAS,CAAC,EACV,EAAK,CACT,CACJ,CACJ"}
1
+ {"version":3,"file":"app-error-queue.cjs","names":["sameReport","a","b","holds","entry","other","load","storage","raw","key","parsed","createAppErrorQueue","memory","save","incoming","stamp","existing","evicted","maxEntries","target"],"sources":["../../src/telemetry/app-error-queue.ts"],"sourcesContent":["import type { AppErrorReportSchema } from \"./app-error-schema\";\n\n/**\n * The `localStorage` subset the queue needs, so a test or a non-browser host\n * can hand in its own.\n */\nexport interface AppErrorQueueStorage {\n getItem: (key: string) => string | null;\n setItem: (key: string, value: string) => void;\n removeItem: (key: string) => void;\n}\n\n/** One queued report and how many identical ones were folded into it. */\nexport interface AppErrorQueueEntry {\n report: AppErrorReportSchema;\n /** How many times this exact report was raised while it waited. */\n count: number;\n /**\n * The token in force when the report was raised, as a one-way fingerprint\n * (`\"t:<hex>\"`) — never the token itself. `null` means there was none;\n * the field is missing on entries persisted before it existed (≤ 0.76.0).\n *\n * The bearer is resolved when the queue drains, not when the error happens,\n * so this is what keeps a report user A raised offline from leaving with\n * user B's token: the bearer only goes out when it is the very token whose\n * fingerprint is stored here.\n */\n session?: string | null;\n /**\n * Who `getPrincipal` said was signed in when the report was raised, as a\n * one-way fingerprint (`\"p:<hex>\"`). Only set when the reporter has a\n * `getPrincipal`; `null` means it named nobody. It never grants the bearer\n * — `session` does — it only decides whether `foreignReports: \"drop\"`\n * discards the entry.\n */\n owner?: string | null;\n}\n\n/** Who a report is stamped with when it is raised. */\nexport interface AppErrorStamp {\n /** Token fingerprint, or `null`. */\n session: string | null;\n /** Principal fingerprint; absent without `getPrincipal`. */\n owner?: string | null;\n}\n\n/** The persisted queue the reporter drains. */\nexport interface AppErrorQueue {\n /** Every waiting entry, oldest first. */\n entries: () => AppErrorQueueEntry[];\n /**\n * Add a report, folding it into an identical waiting one with the same stamp.\n *\n * @param report - The fitted report.\n * @param stamp - Who was signed in when it was raised.\n * @returns How many entries the size ceiling evicted (0 or 1).\n */\n push: (report: AppErrorReportSchema, stamp: AppErrorStamp) => number;\n /** Whether `entry` is still waiting — `false` once sent, dropped or cleared. */\n has: (entry: AppErrorQueueEntry) => boolean;\n /**\n * Drop `entry` — the one just sent, or refused for good.\n *\n * Matched by content and owner, not by position: a report raised while the\n * send was in flight may have evicted the head, and dropping \"the first\n * entry\" would then throw away a report nobody sent.\n */\n remove: (entry: AppErrorQueueEntry) => void;\n /** Drop everything. */\n clear: () => void;\n}\n\n/**\n * Whether two reports describe the same failure on the same build.\n *\n * @param a - A waiting report.\n * @param b - The incoming report.\n * @returns `true` when `code`, `message` and `app_version` all match.\n */\nfunction sameReport(a: AppErrorReportSchema, b: AppErrorReportSchema): boolean {\n return a.code === b.code && a.message === b.message && a.app_version === b.app_version;\n}\n\n/**\n * Whether a waiting entry holds this report with this stamp.\n *\n * The stamp is part of the identity on purpose: folding B's report into A's\n * waiting one would send B's occurrences under A's name, which is the\n * misattribution the stamp exists to prevent.\n *\n * @param entry - A waiting entry.\n * @param other - The report and stamp to match; a missing field matches only a\n * missing field, so legacy entries keep to themselves.\n * @returns `true` when report, session and owner all match.\n */\nfunction holds(\n entry: AppErrorQueueEntry,\n other: Pick<AppErrorQueueEntry, \"report\" | \"session\" | \"owner\">,\n): boolean {\n return (\n sameReport(entry.report, other.report) &&\n entry.session === other.session &&\n entry.owner === other.owner\n );\n}\n\n/**\n * Read the queue back, treating anything unreadable as empty.\n *\n * @param storage - Where the queue lives.\n * @param key - Its storage key.\n * @returns The waiting entries.\n */\nfunction load(storage: AppErrorQueueStorage | null, key: string): AppErrorQueueEntry[] {\n if (!storage) return [];\n try {\n const raw = storage.getItem(key);\n const parsed: unknown = raw ? JSON.parse(raw) : [];\n return Array.isArray(parsed) ? (parsed as AppErrorQueueEntry[]) : [];\n } catch {\n return [];\n }\n}\n\n/**\n * Build the persisted queue of error reports waiting to be sent.\n *\n * Two rules bound it, because it fills exactly when the device is offline and\n * something is failing repeatedly:\n *\n * - **Identical reports from the same owner fold.** A failure in a loop raises the same report a\n * hundred times; it is stored once with a `count`, instead of pushing every\n * other failure out of the queue.\n * - **A ceiling evicts the oldest.** The newest report is the one closest to\n * what the user is looking at.\n *\n * Every write is best-effort: with storage unavailable or full, the queue keeps\n * working in memory for the session.\n *\n * @param storage - Backing store, or `null` to keep the queue in memory only.\n * @param key - Storage key.\n * @param maxEntries - Ceiling on distinct waiting reports.\n * @returns The queue.\n *\n * @tempest-limits empty-catch — `setItem` throws on quota exhaustion and in\n * Safari private mode; the in-memory copy is the fallback, and a reporter has no\n * one to tell.\n */\nexport function createAppErrorQueue(\n storage: AppErrorQueueStorage | null,\n key: string,\n maxEntries: number,\n): AppErrorQueue {\n let memory: AppErrorQueueEntry[] = load(storage, key);\n const save = (): void => {\n if (!storage) return;\n try {\n if (memory.length === 0) storage.removeItem(key);\n else storage.setItem(key, JSON.stringify(memory));\n } catch {\n return;\n }\n };\n return {\n entries: () => [...memory],\n push(report, stamp) {\n const incoming: AppErrorQueueEntry = { report, count: 1, ...stamp };\n const existing = memory.find((entry) => holds(entry, incoming));\n let evicted = 0;\n if (existing) {\n existing.count += 1;\n } else {\n memory.push(incoming);\n if (memory.length > maxEntries) {\n memory = memory.slice(memory.length - maxEntries);\n evicted = 1;\n }\n }\n save();\n return evicted;\n },\n has: (target) => memory.some((entry) => holds(entry, target)),\n remove(target) {\n memory = memory.filter((entry) => !holds(entry, target));\n save();\n },\n clear() {\n memory = [];\n save();\n },\n };\n}\n"],"mappings":"AA+EA,SAASA,EAAW,EAAyB,EAAkC,CAC3E,OAAOC,EAAE,OAASC,EAAE,MAAQD,EAAE,UAAYC,EAAE,SAAWD,EAAE,cAAgBC,EAAE,WAC/E,CAcA,SAASC,EACL,EACA,EACO,CACP,OACIH,EAAWI,EAAM,OAAQC,EAAM,MAAM,GACrCD,EAAM,UAAYC,EAAM,SACxBD,EAAM,QAAUC,EAAM,KAE9B,CASA,SAASC,EAAK,EAAsC,EAAmC,CACnF,GAAI,CAACC,EAAS,MAAO,CAAC,EACtB,GAAI,CACA,IAAMC,EAAMD,EAAQ,QAAQE,CAAG,EACzBC,EAAkBF,EAAM,KAAK,MAAMA,CAAG,EAAI,CAAC,EACjD,OAAO,MAAM,QAAQE,CAAM,EAAKA,EAAkC,CAAC,CACvE,MAAQ,CACJ,MAAO,CAAC,CACZ,CACJ,CA0BA,SAAgBC,EACZ,EACA,EACA,EACa,CACb,IAAIC,EAA+BN,EAAKC,EAASE,CAAG,EAC9CI,MAAmB,CACrB,GAAKN,EACL,GAAI,CACIK,EAAO,SAAW,EAAGL,EAAQ,WAAWE,CAAG,EAC1CF,EAAQ,QAAQE,EAAK,KAAK,UAAUG,CAAM,CAAC,CACpD,MAAQ,CACJ,MACJ,CACJ,EACA,MAAO,CACH,YAAe,CAAC,GAAGA,CAAM,EACzB,KAAK,EAAQ,EAAO,CAChB,IAAME,EAA+B,CAAE,SAAQ,MAAO,EAAG,GAAGC,CAAM,EAC5DC,EAAWJ,EAAO,KAAM,GAAUT,EAAMC,EAAOU,CAAQ,CAAC,EAC1DG,EAAU,EAWd,OAVID,EACA,EAAS,OAAS,GAElBJ,EAAO,KAAKE,CAAQ,EAChBF,EAAO,OAASM,IAChB,EAASN,EAAO,MAAMA,EAAO,OAASM,CAAU,EAChD,EAAU,IAGlBL,EAAK,EACEI,CACX,EACA,IAAM,GAAWL,EAAO,KAAM,GAAUT,EAAMC,EAAOe,CAAM,CAAC,EAC5D,OAAO,EAAQ,CACX,EAASP,EAAO,OAAQ,GAAU,CAACT,EAAMC,EAAOe,CAAM,CAAC,EACvDN,EAAK,CACT,EACA,OAAQ,CACJ,EAAS,CAAC,EACVA,EAAK,CACT,CACJ,CACJ,C"}
@@ -1 +1 @@
1
- {"version":3,"file":"app-error-queue.js","names":[],"sources":["../../src/telemetry/app-error-queue.ts"],"sourcesContent":["import type { AppErrorReportSchema } from \"./app-error-schema\";\n\n/**\n * The `localStorage` subset the queue needs, so a test or a non-browser host\n * can hand in its own.\n */\nexport interface AppErrorQueueStorage {\n getItem: (key: string) => string | null;\n setItem: (key: string, value: string) => void;\n removeItem: (key: string) => void;\n}\n\n/** One queued report and how many identical ones were folded into it. */\nexport interface AppErrorQueueEntry {\n report: AppErrorReportSchema;\n /** How many times this exact report was raised while it waited. */\n count: number;\n /**\n * The token in force when the report was raised, as a one-way fingerprint\n * (`\"t:<hex>\"`) — never the token itself. `null` means there was none;\n * the field is missing on entries persisted before it existed (≤ 0.76.0).\n *\n * The bearer is resolved when the queue drains, not when the error happens,\n * so this is what keeps a report user A raised offline from leaving with\n * user B's token: the bearer only goes out when it is the very token whose\n * fingerprint is stored here.\n */\n session?: string | null;\n /**\n * Who `getPrincipal` said was signed in when the report was raised, as a\n * one-way fingerprint (`\"p:<hex>\"`). Only set when the reporter has a\n * `getPrincipal`; `null` means it named nobody. It never grants the bearer\n * — `session` does — it only decides whether `foreignReports: \"drop\"`\n * discards the entry.\n */\n owner?: string | null;\n}\n\n/** Who a report is stamped with when it is raised. */\nexport interface AppErrorStamp {\n /** Token fingerprint, or `null`. */\n session: string | null;\n /** Principal fingerprint; absent without `getPrincipal`. */\n owner?: string | null;\n}\n\n/** The persisted queue the reporter drains. */\nexport interface AppErrorQueue {\n /** Every waiting entry, oldest first. */\n entries: () => AppErrorQueueEntry[];\n /**\n * Add a report, folding it into an identical waiting one with the same stamp.\n *\n * @param report - The fitted report.\n * @param stamp - Who was signed in when it was raised.\n * @returns How many entries the size ceiling evicted (0 or 1).\n */\n push: (report: AppErrorReportSchema, stamp: AppErrorStamp) => number;\n /** Whether `entry` is still waiting — `false` once sent, dropped or cleared. */\n has: (entry: AppErrorQueueEntry) => boolean;\n /**\n * Drop `entry` — the one just sent, or refused for good.\n *\n * Matched by content and owner, not by position: a report raised while the\n * send was in flight may have evicted the head, and dropping \"the first\n * entry\" would then throw away a report nobody sent.\n */\n remove: (entry: AppErrorQueueEntry) => void;\n /** Drop everything. */\n clear: () => void;\n}\n\n/**\n * Whether two reports describe the same failure on the same build.\n *\n * @param a - A waiting report.\n * @param b - The incoming report.\n * @returns `true` when `code`, `message` and `app_version` all match.\n */\nfunction sameReport(a: AppErrorReportSchema, b: AppErrorReportSchema): boolean {\n return a.code === b.code && a.message === b.message && a.app_version === b.app_version;\n}\n\n/**\n * Whether a waiting entry holds this report with this stamp.\n *\n * The stamp is part of the identity on purpose: folding B's report into A's\n * waiting one would send B's occurrences under A's name, which is the\n * misattribution the stamp exists to prevent.\n *\n * @param entry - A waiting entry.\n * @param other - The report and stamp to match; a missing field matches only a\n * missing field, so legacy entries keep to themselves.\n * @returns `true` when report, session and owner all match.\n */\nfunction holds(\n entry: AppErrorQueueEntry,\n other: Pick<AppErrorQueueEntry, \"report\" | \"session\" | \"owner\">,\n): boolean {\n return (\n sameReport(entry.report, other.report) &&\n entry.session === other.session &&\n entry.owner === other.owner\n );\n}\n\n/**\n * Read the queue back, treating anything unreadable as empty.\n *\n * @param storage - Where the queue lives.\n * @param key - Its storage key.\n * @returns The waiting entries.\n */\nfunction load(storage: AppErrorQueueStorage | null, key: string): AppErrorQueueEntry[] {\n if (!storage) return [];\n try {\n const raw = storage.getItem(key);\n const parsed: unknown = raw ? JSON.parse(raw) : [];\n return Array.isArray(parsed) ? (parsed as AppErrorQueueEntry[]) : [];\n } catch {\n return [];\n }\n}\n\n/**\n * Build the persisted queue of error reports waiting to be sent.\n *\n * Two rules bound it, because it fills exactly when the device is offline and\n * something is failing repeatedly:\n *\n * - **Identical reports from the same owner fold.** A failure in a loop raises the same report a\n * hundred times; it is stored once with a `count`, instead of pushing every\n * other failure out of the queue.\n * - **A ceiling evicts the oldest.** The newest report is the one closest to\n * what the user is looking at.\n *\n * Every write is best-effort: with storage unavailable or full, the queue keeps\n * working in memory for the session.\n *\n * @param storage - Backing store, or `null` to keep the queue in memory only.\n * @param key - Storage key.\n * @param maxEntries - Ceiling on distinct waiting reports.\n * @returns The queue.\n *\n * @tempest-limits empty-catch — `setItem` throws on quota exhaustion and in\n * Safari private mode; the in-memory copy is the fallback, and a reporter has no\n * one to tell.\n */\nexport function createAppErrorQueue(\n storage: AppErrorQueueStorage | null,\n key: string,\n maxEntries: number,\n): AppErrorQueue {\n let memory: AppErrorQueueEntry[] = load(storage, key);\n const save = (): void => {\n if (!storage) return;\n try {\n if (memory.length === 0) storage.removeItem(key);\n else storage.setItem(key, JSON.stringify(memory));\n } catch {\n return;\n }\n };\n return {\n entries: () => [...memory],\n push(report, stamp) {\n const incoming: AppErrorQueueEntry = { report, count: 1, ...stamp };\n const existing = memory.find((entry) => holds(entry, incoming));\n let evicted = 0;\n if (existing) {\n existing.count += 1;\n } else {\n memory.push(incoming);\n if (memory.length > maxEntries) {\n memory = memory.slice(memory.length - maxEntries);\n evicted = 1;\n }\n }\n save();\n return evicted;\n },\n has: (target) => memory.some((entry) => holds(entry, target)),\n remove(target) {\n memory = memory.filter((entry) => !holds(entry, target));\n save();\n },\n clear() {\n memory = [];\n save();\n },\n };\n}\n"],"mappings":";AA+EA,SAAS,EAAW,GAAyB,GAAkC;CAC3E,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,YAAY,EAAE,WAAW,EAAE,gBAAgB,EAAE;AAC/E;AAcA,SAAS,EACL,GACA,GACO;CACP,OACI,EAAW,EAAM,QAAQ,EAAM,MAAM,KACrC,EAAM,YAAY,EAAM,WACxB,EAAM,UAAU,EAAM;AAE9B;AASA,SAAS,EAAK,GAAsC,GAAmC;CACnF,IAAI,CAAC,GAAS,OAAO,CAAC;CACtB,IAAI;EACA,IAAM,IAAM,EAAQ,QAAQ,CAAG,GACzB,IAAkB,IAAM,KAAK,MAAM,CAAG,IAAI,CAAC;EACjD,OAAO,MAAM,QAAQ,CAAM,IAAK,IAAkC,CAAC;CACvE,QAAQ;EACJ,OAAO,CAAC;CACZ;AACJ;AA0BA,SAAgB,EACZ,GACA,GACA,GACa;CACb,IAAI,IAA+B,EAAK,GAAS,CAAG,GAC9C,UAAmB;EAChB,OACL,IAAI;GACA,AAAI,EAAO,WAAW,IAAG,EAAQ,WAAW,CAAG,IAC1C,EAAQ,QAAQ,GAAK,KAAK,UAAU,CAAM,CAAC;EACpD,QAAQ;GACJ;EACJ;CACJ;CACA,OAAO;EACH,eAAe,CAAC,GAAG,CAAM;EACzB,KAAK,GAAQ,GAAO;GAChB,IAAM,IAA+B;IAAE;IAAQ,OAAO;IAAG,GAAG;GAAM,GAC5D,IAAW,EAAO,MAAM,MAAU,EAAM,GAAO,CAAQ,CAAC,GAC1D,IAAU;GAWd,OAVI,IACA,EAAS,SAAS,KAElB,EAAO,KAAK,CAAQ,GAChB,EAAO,SAAS,MAChB,IAAS,EAAO,MAAM,EAAO,SAAS,CAAU,GAChD,IAAU,KAGlB,EAAK,GACE;EACX;EACA,MAAM,MAAW,EAAO,MAAM,MAAU,EAAM,GAAO,CAAM,CAAC;EAC5D,OAAO,GAAQ;GAEX,AADA,IAAS,EAAO,QAAQ,MAAU,CAAC,EAAM,GAAO,CAAM,CAAC,GACvD,EAAK;EACT;EACA,QAAQ;GAEJ,AADA,IAAS,CAAC,GACV,EAAK;EACT;CACJ;AACJ"}
1
+ {"version":3,"file":"app-error-queue.js","names":["sameReport","a","b","holds","entry","other","load","storage","raw","key","parsed","createAppErrorQueue","memory","save","incoming","stamp","existing","evicted","maxEntries","target"],"sources":["../../src/telemetry/app-error-queue.ts"],"sourcesContent":["import type { AppErrorReportSchema } from \"./app-error-schema\";\n\n/**\n * The `localStorage` subset the queue needs, so a test or a non-browser host\n * can hand in its own.\n */\nexport interface AppErrorQueueStorage {\n getItem: (key: string) => string | null;\n setItem: (key: string, value: string) => void;\n removeItem: (key: string) => void;\n}\n\n/** One queued report and how many identical ones were folded into it. */\nexport interface AppErrorQueueEntry {\n report: AppErrorReportSchema;\n /** How many times this exact report was raised while it waited. */\n count: number;\n /**\n * The token in force when the report was raised, as a one-way fingerprint\n * (`\"t:<hex>\"`) — never the token itself. `null` means there was none;\n * the field is missing on entries persisted before it existed (≤ 0.76.0).\n *\n * The bearer is resolved when the queue drains, not when the error happens,\n * so this is what keeps a report user A raised offline from leaving with\n * user B's token: the bearer only goes out when it is the very token whose\n * fingerprint is stored here.\n */\n session?: string | null;\n /**\n * Who `getPrincipal` said was signed in when the report was raised, as a\n * one-way fingerprint (`\"p:<hex>\"`). Only set when the reporter has a\n * `getPrincipal`; `null` means it named nobody. It never grants the bearer\n * — `session` does — it only decides whether `foreignReports: \"drop\"`\n * discards the entry.\n */\n owner?: string | null;\n}\n\n/** Who a report is stamped with when it is raised. */\nexport interface AppErrorStamp {\n /** Token fingerprint, or `null`. */\n session: string | null;\n /** Principal fingerprint; absent without `getPrincipal`. */\n owner?: string | null;\n}\n\n/** The persisted queue the reporter drains. */\nexport interface AppErrorQueue {\n /** Every waiting entry, oldest first. */\n entries: () => AppErrorQueueEntry[];\n /**\n * Add a report, folding it into an identical waiting one with the same stamp.\n *\n * @param report - The fitted report.\n * @param stamp - Who was signed in when it was raised.\n * @returns How many entries the size ceiling evicted (0 or 1).\n */\n push: (report: AppErrorReportSchema, stamp: AppErrorStamp) => number;\n /** Whether `entry` is still waiting — `false` once sent, dropped or cleared. */\n has: (entry: AppErrorQueueEntry) => boolean;\n /**\n * Drop `entry` — the one just sent, or refused for good.\n *\n * Matched by content and owner, not by position: a report raised while the\n * send was in flight may have evicted the head, and dropping \"the first\n * entry\" would then throw away a report nobody sent.\n */\n remove: (entry: AppErrorQueueEntry) => void;\n /** Drop everything. */\n clear: () => void;\n}\n\n/**\n * Whether two reports describe the same failure on the same build.\n *\n * @param a - A waiting report.\n * @param b - The incoming report.\n * @returns `true` when `code`, `message` and `app_version` all match.\n */\nfunction sameReport(a: AppErrorReportSchema, b: AppErrorReportSchema): boolean {\n return a.code === b.code && a.message === b.message && a.app_version === b.app_version;\n}\n\n/**\n * Whether a waiting entry holds this report with this stamp.\n *\n * The stamp is part of the identity on purpose: folding B's report into A's\n * waiting one would send B's occurrences under A's name, which is the\n * misattribution the stamp exists to prevent.\n *\n * @param entry - A waiting entry.\n * @param other - The report and stamp to match; a missing field matches only a\n * missing field, so legacy entries keep to themselves.\n * @returns `true` when report, session and owner all match.\n */\nfunction holds(\n entry: AppErrorQueueEntry,\n other: Pick<AppErrorQueueEntry, \"report\" | \"session\" | \"owner\">,\n): boolean {\n return (\n sameReport(entry.report, other.report) &&\n entry.session === other.session &&\n entry.owner === other.owner\n );\n}\n\n/**\n * Read the queue back, treating anything unreadable as empty.\n *\n * @param storage - Where the queue lives.\n * @param key - Its storage key.\n * @returns The waiting entries.\n */\nfunction load(storage: AppErrorQueueStorage | null, key: string): AppErrorQueueEntry[] {\n if (!storage) return [];\n try {\n const raw = storage.getItem(key);\n const parsed: unknown = raw ? JSON.parse(raw) : [];\n return Array.isArray(parsed) ? (parsed as AppErrorQueueEntry[]) : [];\n } catch {\n return [];\n }\n}\n\n/**\n * Build the persisted queue of error reports waiting to be sent.\n *\n * Two rules bound it, because it fills exactly when the device is offline and\n * something is failing repeatedly:\n *\n * - **Identical reports from the same owner fold.** A failure in a loop raises the same report a\n * hundred times; it is stored once with a `count`, instead of pushing every\n * other failure out of the queue.\n * - **A ceiling evicts the oldest.** The newest report is the one closest to\n * what the user is looking at.\n *\n * Every write is best-effort: with storage unavailable or full, the queue keeps\n * working in memory for the session.\n *\n * @param storage - Backing store, or `null` to keep the queue in memory only.\n * @param key - Storage key.\n * @param maxEntries - Ceiling on distinct waiting reports.\n * @returns The queue.\n *\n * @tempest-limits empty-catch — `setItem` throws on quota exhaustion and in\n * Safari private mode; the in-memory copy is the fallback, and a reporter has no\n * one to tell.\n */\nexport function createAppErrorQueue(\n storage: AppErrorQueueStorage | null,\n key: string,\n maxEntries: number,\n): AppErrorQueue {\n let memory: AppErrorQueueEntry[] = load(storage, key);\n const save = (): void => {\n if (!storage) return;\n try {\n if (memory.length === 0) storage.removeItem(key);\n else storage.setItem(key, JSON.stringify(memory));\n } catch {\n return;\n }\n };\n return {\n entries: () => [...memory],\n push(report, stamp) {\n const incoming: AppErrorQueueEntry = { report, count: 1, ...stamp };\n const existing = memory.find((entry) => holds(entry, incoming));\n let evicted = 0;\n if (existing) {\n existing.count += 1;\n } else {\n memory.push(incoming);\n if (memory.length > maxEntries) {\n memory = memory.slice(memory.length - maxEntries);\n evicted = 1;\n }\n }\n save();\n return evicted;\n },\n has: (target) => memory.some((entry) => holds(entry, target)),\n remove(target) {\n memory = memory.filter((entry) => !holds(entry, target));\n save();\n },\n clear() {\n memory = [];\n save();\n },\n };\n}\n"],"mappings":";AA+EA,SAASA,EAAW,GAAyB,GAAkC;CAC3E,OAAOC,EAAE,SAASC,EAAE,QAAQD,EAAE,YAAYC,EAAE,WAAWD,EAAE,gBAAgBC,EAAE;AAC/E;AAcA,SAASC,EACL,GACA,GACO;CACP,OACIH,EAAWI,EAAM,QAAQC,EAAM,MAAM,KACrCD,EAAM,YAAYC,EAAM,WACxBD,EAAM,UAAUC,EAAM;AAE9B;AASA,SAASC,EAAK,GAAsC,GAAmC;CACnF,IAAI,CAACC,GAAS,OAAO,CAAC;CACtB,IAAI;EACA,IAAMC,IAAMD,EAAQ,QAAQE,CAAG,GACzBC,IAAkBF,IAAM,KAAK,MAAMA,CAAG,IAAI,CAAC;EACjD,OAAO,MAAM,QAAQE,CAAM,IAAKA,IAAkC,CAAC;CACvE,QAAQ;EACJ,OAAO,CAAC;CACZ;AACJ;AA0BA,SAAgBC,EACZ,GACA,GACA,GACa;CACb,IAAIC,IAA+BN,EAAKC,GAASE,CAAG,GAC9CI,UAAmB;EACrB,IAAKN,GACL,IAAI;GACA,AAAIK,EAAO,WAAW,IAAGL,EAAQ,WAAWE,CAAG,IAC1CF,EAAQ,QAAQE,GAAK,KAAK,UAAUG,CAAM,CAAC;EACpD,QAAQ;GACJ;EACJ;CACJ;CACA,OAAO;EACH,eAAe,CAAC,GAAGA,CAAM;EACzB,KAAK,GAAQ,GAAO;GAChB,IAAME,IAA+B;IAAE;IAAQ,OAAO;IAAG,GAAGC;GAAM,GAC5DC,IAAWJ,EAAO,MAAM,MAAUT,EAAMC,GAAOU,CAAQ,CAAC,GAC1DG,IAAU;GAWd,OAVID,IACA,EAAS,SAAS,KAElBJ,EAAO,KAAKE,CAAQ,GAChBF,EAAO,SAASM,MAChB,IAASN,EAAO,MAAMA,EAAO,SAASM,CAAU,GAChD,IAAU,KAGlBL,EAAK,GACEI;EACX;EACA,MAAM,MAAWL,EAAO,MAAM,MAAUT,EAAMC,GAAOe,CAAM,CAAC;EAC5D,OAAO,GAAQ;GAEX,AADA,IAASP,EAAO,QAAQ,MAAU,CAACT,EAAMC,GAAOe,CAAM,CAAC,GACvDN,EAAK;EACT;EACA,QAAQ;GAEJ,AADA,IAAS,CAAC,GACVA,EAAK;EACT;CACJ;AACJ"}
@@ -1 +1 @@
1
- {"version":3,"file":"app-error-reporter.cjs","names":[],"sources":["../../src/telemetry/app-error-reporter.ts"],"sourcesContent":["import { ownerFingerprint } from \"@/utils/owner-fingerprint\";\nimport { createAppErrorQueue } from \"./app-error-queue\";\nimport type { AppErrorQueueEntry, AppErrorQueueStorage, AppErrorStamp } from \"./app-error-queue\";\nimport { fitAppErrorReport } from \"./app-error-schema\";\nimport type { AppErrorDeviceSchema } from \"./app-error-schema\";\nimport { readToken, sendOne } from \"./app-error-transport\";\nimport { describeAppError } from \"./describe-app-error\";\nimport { isDevBuild } from \"../utils/dev-mode\";\n\n/** Options for {@link createAppErrorReporter}. */\nexport interface CreateAppErrorReporterOptions {\n /** Full URL of the backend route, e.g. `${API_URL}/api/app-errors`. */\n endpoint: string;\n /**\n * Current access token, if any. Optional on purpose: the route is public,\n * and an error raised before login — or with a stale session — still has\n * to get through. A token that throws or resolves empty sends anonymously.\n */\n getToken?: () => string | null | undefined | Promise<string | null | undefined>;\n /**\n * Who is signed in right now — a stable, non-secret id such as the user id.\n * Read **when the error is reported**, and stored in the queue only as a\n * one-way fingerprint (`entry.owner`). A non-string (an `async` getter\n * from untyped JS, an object) or a getter that throws reads as nobody.\n *\n * It never grants the bearer. The bearer goes out only when the token at\n * send time is the very token that was in force at report time (its\n * fingerprint is `entry.session`): the principal and the token come from\n * two sources, and a principal store that lags behind a login would\n * otherwise send A's report with B's token. The principal only tells\n * {@link CreateAppErrorReporterOptions.foreignReports} `\"drop\"` whose\n * report is whose.\n */\n getPrincipal?: () => string | number | null | undefined;\n /**\n * What to do with a queued report that cannot go out with the current\n * bearer — raised under another token, or queued before 0.77.0. Default\n * `\"anonymous\"`.\n *\n * - `\"anonymous\"` — send it without `Authorization`. The route is public,\n * so the error still reaches the backend; it is only not attributed to\n * anybody. This includes the user's own reports raised before a token\n * refresh: attribution is lost, never misplaced.\n * - `\"drop\"` — discard every report not proven to be the current\n * principal's: another principal, nobody, or unknown (no principal at\n * report time, a legacy entry, or nobody signed in now). For apps where\n * a previous user's error text must not leave the device after they\n * signed out. **Needs `getPrincipal`**: without it the only identity is\n * the token fingerprint, and a refresh changes it, so a mismatch is no\n * proof the report is someone else's — the reporter then sends\n * anonymously instead of destroying the user's own reports.\n *\n * Never is a report sent with a bearer other than the one it was raised\n * under: that would credit the previous user's error to whoever signed in\n * next.\n */\n foreignReports?: \"anonymous\" | \"drop\";\n /**\n * Device facts, read **when the error is reported**, not when it is sent —\n * a report queued offline on `1.4.0` must not go out labelled `1.5.0`.\n */\n device?: () => AppErrorDeviceSchema;\n /** Where the queue persists. Defaults to `localStorage`; `null` keeps it in memory. */\n storage?: AppErrorQueueStorage | null;\n /** Storage key. Default `\"tempest:app-errors\"`. */\n storageKey?: string;\n /** Ceiling on distinct waiting reports; the oldest is evicted. Default `50`. */\n maxEntries?: number;\n /** `fetch` to send with. Defaults to the global one. */\n fetch?: typeof fetch;\n /** Send on every report and when the browser goes `online`. Default `true`. */\n autoFlush?: boolean;\n}\n\n/** What one {@link AppErrorReporter.flush} did. */\nexport interface AppErrorFlushResult {\n /** Reports the backend accepted. */\n sent: number;\n /** Reports the backend refused for good (a 4xx other than 408/429) and were dropped. */\n dropped: number;\n /** Reports still waiting. */\n pending: number;\n /** Milliseconds the backend asked to wait (429 `Retry-After`), or `null`. */\n retryAfterMs: number | null;\n}\n\n/** The reporter {@link createAppErrorReporter} returns. */\nexport interface AppErrorReporter {\n /** Queue an error with optional context, and try to send it. Never throws. */\n report: (error: unknown, context?: Record<string, unknown>) => void;\n /** Drain the queue now. Concurrent calls share one run. */\n flush: () => Promise<AppErrorFlushResult>;\n /**\n * The waiting entries, oldest first. With an async `getToken` and no\n * `getPrincipal`, a report joins them once its token resolves — `flush()`\n * waits for that, `pending()` does not.\n */\n pending: () => AppErrorQueueEntry[];\n /**\n * Drop every waiting report. Call it on logout when reports raised in that\n * session should not outlive it; even without it, a report never leaves\n * with the next user's bearer.\n *\n * It also stops a flush in flight before its next send (the one already on\n * the wire cannot be recalled), and discards reports still waiting for an\n * async `getToken` to stamp them — both would otherwise refill the queue or\n * keep sending what the logout meant to forget.\n */\n clear: () => void;\n /** Remove the `online` listener and the retry timer. */\n dispose: () => void;\n}\n\n/** Set once the warning has printed, so every reporter built after it stays quiet. */\nlet warnedDropWithoutPrincipal = false;\n\n/**\n * Reset the warn-once latch. Test-only: the latch is module state, so a suite\n * asserting the warning more than once would otherwise see it only the first time.\n */\nexport function resetDropWithoutPrincipalWarning(): void {\n warnedDropWithoutPrincipal = false;\n}\n\n/**\n * Warn once, in development, that `foreignReports: \"drop\"` was asked for\n * without the `getPrincipal` it needs.\n *\n * Without a principal the only identity is the token fingerprint, which a\n * refresh changes, so the reporter cannot tell a foreign report from the\n * user's own and sends them anonymously instead of dropping them. The option\n * type-checks either way, so nothing else would tell the app its privacy\n * choice is not in force.\n *\n * @param options - The reporter's options.\n */\nfunction warnOnDropWithoutPrincipal(options: CreateAppErrorReporterOptions): void {\n if (warnedDropWithoutPrincipal || options.foreignReports !== \"drop\") return;\n if (options.getPrincipal !== undefined || !isDevBuild()) return;\n warnedDropWithoutPrincipal = true;\n console.warn(\n '[tempest-react-sdk] createAppErrorReporter({ foreignReports: \"drop\" }) needs ' +\n \"`getPrincipal`: without it the reporter cannot prove a queued report belongs \" +\n \"to someone else, so it drops nothing and those reports go out anonymously. \" +\n 'Pass `getPrincipal` to make \"drop\" take effect.',\n );\n}\n\n/**\n * Pick the default store, guarding hosts where touching `localStorage` throws.\n *\n * @returns `localStorage`, or `null` when there is none.\n */\nfunction defaultStorage(): AppErrorQueueStorage | null {\n try {\n return typeof localStorage === \"undefined\" ? null : localStorage;\n } catch {\n return null;\n }\n}\n\n/**\n * Read the device facts, reporting without them when the getter throws.\n *\n * @param device - The caller's getter.\n * @returns The facts, or an empty object.\n */\nfunction readDevice(device: CreateAppErrorReporterOptions[\"device\"]): AppErrorDeviceSchema {\n try {\n return device?.() ?? {};\n } catch {\n return {};\n }\n}\n\n/**\n * Fingerprint whoever `getPrincipal` says is signed in.\n *\n * @param getPrincipal - The app's principal getter.\n * @returns The owner, or `null` when nobody is signed in or the getter throws.\n */\nfunction principalOwner(getPrincipal: () => unknown): string | null {\n try {\n return ownerFingerprint(\"p\", getPrincipal());\n } catch {\n return null;\n }\n}\n\n/**\n * Stamp a report being raised now with its session and, when given, principal.\n *\n * @param getPrincipal - The app's principal getter, read synchronously.\n * @param token - The token read now, or a promise of it.\n * @returns The stamp, or a promise of it when the token is still arriving.\n */\nfunction stampNow(\n getPrincipal: CreateAppErrorReporterOptions[\"getPrincipal\"],\n token: string | null | Promise<string | null>,\n): AppErrorStamp | Promise<AppErrorStamp> {\n const owner = getPrincipal ? { owner: principalOwner(getPrincipal) } : {};\n if (typeof token === \"string\" || token === null) {\n return { session: ownerFingerprint(\"t\", token), ...owner };\n }\n return token.then((value) => ({ session: ownerFingerprint(\"t\", value), ...owner }));\n}\n\n/**\n * Report client errors to a Tempest backend's `POST /api/app-errors`, surviving\n * the offline stretches where field errors actually happen.\n *\n * The client half of `tempest-fastapi-sdk`'s `app_errors` module. An error is\n * described ({@link describeAppError}), stamped with the device facts of that\n * moment, fitted to the backend's column limits and queued in `localStorage`\n * before anything goes over the network — so a report raised with no signal is\n * sent when the browser comes back `online`, not lost.\n *\n * What each answer does to the queue:\n *\n * - **2xx** — removed.\n * - **429** — kept; sending pauses for `Retry-After`, then resumes on its own.\n * - **5xx, 408, network failure** — kept; the next report, `online` event or\n * `flush()` retries.\n * - **any other 4xx** — dropped: the backend will refuse that body forever, and\n * keeping it would block every report queued behind it.\n *\n * Each report is stamped with a one-way fingerprint of the token in force when\n * it was raised, and goes out with a bearer only when the token at send time is\n * that same one — never with the token of whoever signed in next. The queue\n * never stores a token. `clear()` also stops a flush in flight and discards\n * reports still waiting for an async token.\n *\n * @example\n * import { createAppErrorReporter } from \"tempest-react-sdk\";\n *\n * const reporter = createAppErrorReporter({\n * endpoint: `${import.meta.env.VITE_API_URL}/api/app-errors`,\n * getToken: () => sessionStorage.getItem(\"access_token\"),\n * device: () => ({ platform: \"web\", app_version: \"1.4.0\" }),\n * });\n *\n * reporter.report(new Error(\"crop failed\"), { step: \"crop\", size: 0 });\n *\n * @param options - Endpoint, token and device getters, storage and limits.\n * @returns The reporter.\n */\nexport function createAppErrorReporter(options: CreateAppErrorReporterOptions): AppErrorReporter {\n const { endpoint, getToken, getPrincipal, device, autoFlush = true } = options;\n warnOnDropWithoutPrincipal(options);\n const strict = getPrincipal !== undefined && options.foreignReports === \"drop\";\n const queue = createAppErrorQueue(\n options.storage === undefined ? defaultStorage() : options.storage,\n options.storageKey ?? \"tempest:app-errors\",\n options.maxEntries ?? 50,\n );\n let running: Promise<AppErrorFlushResult> | null = null;\n let pausedUntil = 0;\n let timer: ReturnType<typeof setTimeout> | null = null;\n const stamping = new Set<Promise<void>>();\n let generation = 0;\n\n const drain = async (): Promise<AppErrorFlushResult> => {\n const send = options.fetch ?? globalThis.fetch.bind(globalThis);\n await Promise.all(stamping);\n const token = await readToken(getToken);\n const session = ownerFingerprint(\"t\", token);\n const current = getPrincipal ? principalOwner(getPrincipal) : null;\n const started = generation;\n const result: AppErrorFlushResult = { sent: 0, dropped: 0, pending: 0, retryAfterMs: null };\n for (const entry of queue.entries()) {\n if (!queue.has(entry)) continue;\n if (strict && (entry.owner == null || entry.owner !== current)) {\n queue.remove(entry);\n result.dropped += 1;\n continue;\n }\n const bearer = entry.session != null && entry.session === session ? token : null;\n const outcome = await sendOne(send, endpoint, bearer, entry);\n if (generation !== started) break;\n if (outcome.kind === \"stop\") break;\n if (outcome.kind === \"wait\") {\n result.retryAfterMs = outcome.ms;\n pausedUntil = Date.now() + outcome.ms;\n timer ??= setTimeout(() => {\n timer = null;\n void flush();\n }, outcome.ms);\n break;\n }\n queue.remove(entry);\n result[outcome.kind === \"sent\" ? \"sent\" : \"dropped\"] += 1;\n }\n result.pending = queue.entries().length;\n return result;\n };\n\n const flush = (): Promise<AppErrorFlushResult> => {\n running ??= drain().finally(() => {\n running = null;\n });\n return running;\n };\n\n const shouldSend = (): boolean =>\n autoFlush &&\n Date.now() >= pausedUntil &&\n (typeof navigator === \"undefined\" || navigator.onLine !== false);\n\n const onOnline = (): void => {\n if (shouldSend()) void flush();\n };\n if (autoFlush && typeof window !== \"undefined\") window.addEventListener(\"online\", onOnline);\n\n return {\n report(error, context) {\n const description = describeAppError(error, context);\n const report = fitAppErrorReport({ ...readDevice(device), ...description });\n const stamp = stampNow(getPrincipal, readToken(getToken));\n if (!(stamp instanceof Promise)) {\n queue.push(report, stamp);\n if (shouldSend()) void flush();\n return;\n }\n const raisedIn = generation;\n const stamped = stamp.then((value) => {\n stamping.delete(stamped);\n if (generation !== raisedIn) return;\n queue.push(report, value);\n if (shouldSend()) void flush();\n });\n stamping.add(stamped);\n },\n flush,\n pending: () => queue.entries(),\n clear() {\n generation += 1;\n queue.clear();\n },\n dispose() {\n if (typeof window !== \"undefined\") window.removeEventListener(\"online\", onOnline);\n if (timer) clearTimeout(timer);\n timer = null;\n },\n };\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"app-error-reporter.cjs","names":["isDevBuild","ownerFingerprint","createAppErrorQueue","readToken","sendOne","describeAppError","fitAppErrorReport","require_dev_mode","require_owner_fingerprint","require_app_error_queue","require_app_error_schema","require_app_error_transport","require_describe_app_error","warnedDropWithoutPrincipal","warnOnDropWithoutPrincipal","options","defaultStorage","readDevice","device","principalOwner","getPrincipal","stampNow","owner","token","value","createAppErrorReporter","strict","queue","running","pausedUntil","timer","stamping","generation","drain","send","getToken","session","current","started","result","entry","bearer","outcome","endpoint","flush","shouldSend","autoFlush","onOnline","description","error","context","report","stamp","raisedIn","stamped"],"sources":["../../src/telemetry/app-error-reporter.ts"],"sourcesContent":["import { ownerFingerprint } from \"@/utils/owner-fingerprint\";\nimport { createAppErrorQueue } from \"./app-error-queue\";\nimport type { AppErrorQueueEntry, AppErrorQueueStorage, AppErrorStamp } from \"./app-error-queue\";\nimport { fitAppErrorReport } from \"./app-error-schema\";\nimport type { AppErrorDeviceSchema } from \"./app-error-schema\";\nimport { readToken, sendOne } from \"./app-error-transport\";\nimport { describeAppError } from \"./describe-app-error\";\nimport { isDevBuild } from \"../utils/dev-mode\";\n\n/** Options for {@link createAppErrorReporter}. */\nexport interface CreateAppErrorReporterOptions {\n /** Full URL of the backend route, e.g. `${API_URL}/api/app-errors`. */\n endpoint: string;\n /**\n * Current access token, if any. Optional on purpose: the route is public,\n * and an error raised before login — or with a stale session — still has\n * to get through. A token that throws or resolves empty sends anonymously.\n */\n getToken?: () => string | null | undefined | Promise<string | null | undefined>;\n /**\n * Who is signed in right now — a stable, non-secret id such as the user id.\n * Read **when the error is reported**, and stored in the queue only as a\n * one-way fingerprint (`entry.owner`). A non-string (an `async` getter\n * from untyped JS, an object) or a getter that throws reads as nobody.\n *\n * It never grants the bearer. The bearer goes out only when the token at\n * send time is the very token that was in force at report time (its\n * fingerprint is `entry.session`): the principal and the token come from\n * two sources, and a principal store that lags behind a login would\n * otherwise send A's report with B's token. The principal only tells\n * {@link CreateAppErrorReporterOptions.foreignReports} `\"drop\"` whose\n * report is whose.\n */\n getPrincipal?: () => string | number | null | undefined;\n /**\n * What to do with a queued report that cannot go out with the current\n * bearer — raised under another token, or queued before 0.77.0. Default\n * `\"anonymous\"`.\n *\n * - `\"anonymous\"` — send it without `Authorization`. The route is public,\n * so the error still reaches the backend; it is only not attributed to\n * anybody. This includes the user's own reports raised before a token\n * refresh: attribution is lost, never misplaced.\n * - `\"drop\"` — discard every report not proven to be the current\n * principal's: another principal, nobody, or unknown (no principal at\n * report time, a legacy entry, or nobody signed in now). For apps where\n * a previous user's error text must not leave the device after they\n * signed out. **Needs `getPrincipal`**: without it the only identity is\n * the token fingerprint, and a refresh changes it, so a mismatch is no\n * proof the report is someone else's — the reporter then sends\n * anonymously instead of destroying the user's own reports.\n *\n * Never is a report sent with a bearer other than the one it was raised\n * under: that would credit the previous user's error to whoever signed in\n * next.\n */\n foreignReports?: \"anonymous\" | \"drop\";\n /**\n * Device facts, read **when the error is reported**, not when it is sent —\n * a report queued offline on `1.4.0` must not go out labelled `1.5.0`.\n */\n device?: () => AppErrorDeviceSchema;\n /** Where the queue persists. Defaults to `localStorage`; `null` keeps it in memory. */\n storage?: AppErrorQueueStorage | null;\n /** Storage key. Default `\"tempest:app-errors\"`. */\n storageKey?: string;\n /** Ceiling on distinct waiting reports; the oldest is evicted. Default `50`. */\n maxEntries?: number;\n /** `fetch` to send with. Defaults to the global one. */\n fetch?: typeof fetch;\n /** Send on every report and when the browser goes `online`. Default `true`. */\n autoFlush?: boolean;\n}\n\n/** What one {@link AppErrorReporter.flush} did. */\nexport interface AppErrorFlushResult {\n /** Reports the backend accepted. */\n sent: number;\n /** Reports the backend refused for good (a 4xx other than 408/429) and were dropped. */\n dropped: number;\n /** Reports still waiting. */\n pending: number;\n /** Milliseconds the backend asked to wait (429 `Retry-After`), or `null`. */\n retryAfterMs: number | null;\n}\n\n/** The reporter {@link createAppErrorReporter} returns. */\nexport interface AppErrorReporter {\n /** Queue an error with optional context, and try to send it. Never throws. */\n report: (error: unknown, context?: Record<string, unknown>) => void;\n /** Drain the queue now. Concurrent calls share one run. */\n flush: () => Promise<AppErrorFlushResult>;\n /**\n * The waiting entries, oldest first. With an async `getToken` and no\n * `getPrincipal`, a report joins them once its token resolves — `flush()`\n * waits for that, `pending()` does not.\n */\n pending: () => AppErrorQueueEntry[];\n /**\n * Drop every waiting report. Call it on logout when reports raised in that\n * session should not outlive it; even without it, a report never leaves\n * with the next user's bearer.\n *\n * It also stops a flush in flight before its next send (the one already on\n * the wire cannot be recalled), and discards reports still waiting for an\n * async `getToken` to stamp them — both would otherwise refill the queue or\n * keep sending what the logout meant to forget.\n */\n clear: () => void;\n /** Remove the `online` listener and the retry timer. */\n dispose: () => void;\n}\n\n/** Set once the warning has printed, so every reporter built after it stays quiet. */\nlet warnedDropWithoutPrincipal = false;\n\n/**\n * Reset the warn-once latch. Test-only: the latch is module state, so a suite\n * asserting the warning more than once would otherwise see it only the first time.\n */\nexport function resetDropWithoutPrincipalWarning(): void {\n warnedDropWithoutPrincipal = false;\n}\n\n/**\n * Warn once, in development, that `foreignReports: \"drop\"` was asked for\n * without the `getPrincipal` it needs.\n *\n * Without a principal the only identity is the token fingerprint, which a\n * refresh changes, so the reporter cannot tell a foreign report from the\n * user's own and sends them anonymously instead of dropping them. The option\n * type-checks either way, so nothing else would tell the app its privacy\n * choice is not in force.\n *\n * @param options - The reporter's options.\n */\nfunction warnOnDropWithoutPrincipal(options: CreateAppErrorReporterOptions): void {\n if (warnedDropWithoutPrincipal || options.foreignReports !== \"drop\") return;\n if (options.getPrincipal !== undefined || !isDevBuild()) return;\n warnedDropWithoutPrincipal = true;\n console.warn(\n '[tempest-react-sdk] createAppErrorReporter({ foreignReports: \"drop\" }) needs ' +\n \"`getPrincipal`: without it the reporter cannot prove a queued report belongs \" +\n \"to someone else, so it drops nothing and those reports go out anonymously. \" +\n 'Pass `getPrincipal` to make \"drop\" take effect.',\n );\n}\n\n/**\n * Pick the default store, guarding hosts where touching `localStorage` throws.\n *\n * @returns `localStorage`, or `null` when there is none.\n */\nfunction defaultStorage(): AppErrorQueueStorage | null {\n try {\n return typeof localStorage === \"undefined\" ? null : localStorage;\n } catch {\n return null;\n }\n}\n\n/**\n * Read the device facts, reporting without them when the getter throws.\n *\n * @param device - The caller's getter.\n * @returns The facts, or an empty object.\n */\nfunction readDevice(device: CreateAppErrorReporterOptions[\"device\"]): AppErrorDeviceSchema {\n try {\n return device?.() ?? {};\n } catch {\n return {};\n }\n}\n\n/**\n * Fingerprint whoever `getPrincipal` says is signed in.\n *\n * @param getPrincipal - The app's principal getter.\n * @returns The owner, or `null` when nobody is signed in or the getter throws.\n */\nfunction principalOwner(getPrincipal: () => unknown): string | null {\n try {\n return ownerFingerprint(\"p\", getPrincipal());\n } catch {\n return null;\n }\n}\n\n/**\n * Stamp a report being raised now with its session and, when given, principal.\n *\n * @param getPrincipal - The app's principal getter, read synchronously.\n * @param token - The token read now, or a promise of it.\n * @returns The stamp, or a promise of it when the token is still arriving.\n */\nfunction stampNow(\n getPrincipal: CreateAppErrorReporterOptions[\"getPrincipal\"],\n token: string | null | Promise<string | null>,\n): AppErrorStamp | Promise<AppErrorStamp> {\n const owner = getPrincipal ? { owner: principalOwner(getPrincipal) } : {};\n if (typeof token === \"string\" || token === null) {\n return { session: ownerFingerprint(\"t\", token), ...owner };\n }\n return token.then((value) => ({ session: ownerFingerprint(\"t\", value), ...owner }));\n}\n\n/**\n * Report client errors to a Tempest backend's `POST /api/app-errors`, surviving\n * the offline stretches where field errors actually happen.\n *\n * The client half of `tempest-fastapi-sdk`'s `app_errors` module. An error is\n * described ({@link describeAppError}), stamped with the device facts of that\n * moment, fitted to the backend's column limits and queued in `localStorage`\n * before anything goes over the network — so a report raised with no signal is\n * sent when the browser comes back `online`, not lost.\n *\n * What each answer does to the queue:\n *\n * - **2xx** — removed.\n * - **429** — kept; sending pauses for `Retry-After`, then resumes on its own.\n * - **5xx, 408, network failure** — kept; the next report, `online` event or\n * `flush()` retries.\n * - **any other 4xx** — dropped: the backend will refuse that body forever, and\n * keeping it would block every report queued behind it.\n *\n * Each report is stamped with a one-way fingerprint of the token in force when\n * it was raised, and goes out with a bearer only when the token at send time is\n * that same one — never with the token of whoever signed in next. The queue\n * never stores a token. `clear()` also stops a flush in flight and discards\n * reports still waiting for an async token.\n *\n * @example\n * import { createAppErrorReporter } from \"tempest-react-sdk\";\n *\n * const reporter = createAppErrorReporter({\n * endpoint: `${import.meta.env.VITE_API_URL}/api/app-errors`,\n * getToken: () => sessionStorage.getItem(\"access_token\"),\n * device: () => ({ platform: \"web\", app_version: \"1.4.0\" }),\n * });\n *\n * reporter.report(new Error(\"crop failed\"), { step: \"crop\", size: 0 });\n *\n * @param options - Endpoint, token and device getters, storage and limits.\n * @returns The reporter.\n */\nexport function createAppErrorReporter(options: CreateAppErrorReporterOptions): AppErrorReporter {\n const { endpoint, getToken, getPrincipal, device, autoFlush = true } = options;\n warnOnDropWithoutPrincipal(options);\n const strict = getPrincipal !== undefined && options.foreignReports === \"drop\";\n const queue = createAppErrorQueue(\n options.storage === undefined ? defaultStorage() : options.storage,\n options.storageKey ?? \"tempest:app-errors\",\n options.maxEntries ?? 50,\n );\n let running: Promise<AppErrorFlushResult> | null = null;\n let pausedUntil = 0;\n let timer: ReturnType<typeof setTimeout> | null = null;\n const stamping = new Set<Promise<void>>();\n let generation = 0;\n\n const drain = async (): Promise<AppErrorFlushResult> => {\n const send = options.fetch ?? globalThis.fetch.bind(globalThis);\n await Promise.all(stamping);\n const token = await readToken(getToken);\n const session = ownerFingerprint(\"t\", token);\n const current = getPrincipal ? principalOwner(getPrincipal) : null;\n const started = generation;\n const result: AppErrorFlushResult = { sent: 0, dropped: 0, pending: 0, retryAfterMs: null };\n for (const entry of queue.entries()) {\n if (!queue.has(entry)) continue;\n if (strict && (entry.owner == null || entry.owner !== current)) {\n queue.remove(entry);\n result.dropped += 1;\n continue;\n }\n const bearer = entry.session != null && entry.session === session ? token : null;\n const outcome = await sendOne(send, endpoint, bearer, entry);\n if (generation !== started) break;\n if (outcome.kind === \"stop\") break;\n if (outcome.kind === \"wait\") {\n result.retryAfterMs = outcome.ms;\n pausedUntil = Date.now() + outcome.ms;\n timer ??= setTimeout(() => {\n timer = null;\n void flush();\n }, outcome.ms);\n break;\n }\n queue.remove(entry);\n result[outcome.kind === \"sent\" ? \"sent\" : \"dropped\"] += 1;\n }\n result.pending = queue.entries().length;\n return result;\n };\n\n const flush = (): Promise<AppErrorFlushResult> => {\n running ??= drain().finally(() => {\n running = null;\n });\n return running;\n };\n\n const shouldSend = (): boolean =>\n autoFlush &&\n Date.now() >= pausedUntil &&\n (typeof navigator === \"undefined\" || navigator.onLine !== false);\n\n const onOnline = (): void => {\n if (shouldSend()) void flush();\n };\n if (autoFlush && typeof window !== \"undefined\") window.addEventListener(\"online\", onOnline);\n\n return {\n report(error, context) {\n const description = describeAppError(error, context);\n const report = fitAppErrorReport({ ...readDevice(device), ...description });\n const stamp = stampNow(getPrincipal, readToken(getToken));\n if (!(stamp instanceof Promise)) {\n queue.push(report, stamp);\n if (shouldSend()) void flush();\n return;\n }\n const raisedIn = generation;\n const stamped = stamp.then((value) => {\n stamping.delete(stamped);\n if (generation !== raisedIn) return;\n queue.push(report, value);\n if (shouldSend()) void flush();\n });\n stamping.add(stamped);\n },\n flush,\n pending: () => queue.entries(),\n clear() {\n generation += 1;\n queue.clear();\n },\n dispose() {\n if (typeof window !== \"undefined\") window.removeEventListener(\"online\", onOnline);\n if (timer) clearTimeout(timer);\n timer = null;\n },\n };\n}\n"],"mappings":"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"}