@wildo-ai/saas-frontend-lib 1.1.5 → 1.1.6

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 (777) hide show
  1. package/dist/esm/components/actions/action-bar.d.ts +15 -0
  2. package/dist/esm/components/actions/action-bar.d.ts.map +1 -1
  3. package/dist/esm/components/actions/action-bar.js +15 -0
  4. package/dist/esm/components/actions/action-bar.js.map +1 -1
  5. package/dist/esm/components/ai-elements/decision/approval.d.ts +97 -7
  6. package/dist/esm/components/ai-elements/decision/approval.d.ts.map +1 -1
  7. package/dist/esm/components/ai-elements/decision/approval.js.map +1 -1
  8. package/dist/esm/components/app/AppLayout_AuthenticatedRoute.d.ts.map +1 -1
  9. package/dist/esm/components/app/AppLayout_AuthenticatedRoute.js +8 -3
  10. package/dist/esm/components/app/AppLayout_AuthenticatedRoute.js.map +1 -1
  11. package/dist/esm/components/auth/Auth_EnrollmentRequired.d.ts.map +1 -1
  12. package/dist/esm/components/auth/Auth_EnrollmentRequired.js +5 -1
  13. package/dist/esm/components/auth/Auth_EnrollmentRequired.js.map +1 -1
  14. package/dist/esm/components/auth/Auth_Main.d.ts.map +1 -1
  15. package/dist/esm/components/auth/Auth_Main.js +1 -4
  16. package/dist/esm/components/auth/Auth_Main.js.map +1 -1
  17. package/dist/esm/components/auth/Auth_Register.d.ts.map +1 -1
  18. package/dist/esm/components/auth/Auth_Register.js +1 -3
  19. package/dist/esm/components/auth/Auth_Register.js.map +1 -1
  20. package/dist/esm/components/auth/StepUpAuthDialog.d.ts +7 -0
  21. package/dist/esm/components/auth/StepUpAuthDialog.d.ts.map +1 -1
  22. package/dist/esm/components/auth/StepUpAuthDialog.js +13 -7
  23. package/dist/esm/components/auth/StepUpAuthDialog.js.map +1 -1
  24. package/dist/esm/components/auth/admin-config/AppPage_SecuritySettings.d.ts.map +1 -1
  25. package/dist/esm/components/auth/admin-config/AppPage_SecuritySettings.js +32 -33
  26. package/dist/esm/components/auth/admin-config/AppPage_SecuritySettings.js.map +1 -1
  27. package/dist/esm/components/auth/admin-config/AppPage_SecuritySettings.labels.d.ts.map +1 -1
  28. package/dist/esm/components/auth/admin-config/AppPage_SecuritySettings.labels.js +18 -20
  29. package/dist/esm/components/auth/admin-config/AppPage_SecuritySettings.labels.js.map +1 -1
  30. package/dist/esm/components/auth/methods/ExternalOAuth2AuthMethod.d.ts.map +1 -1
  31. package/dist/esm/components/auth/methods/ExternalOAuth2AuthMethod.js +2 -3
  32. package/dist/esm/components/auth/methods/ExternalOAuth2AuthMethod.js.map +1 -1
  33. package/dist/esm/components/auth/utils/oauth-provider-display-label.frontend.utils.d.ts +13 -16
  34. package/dist/esm/components/auth/utils/oauth-provider-display-label.frontend.utils.d.ts.map +1 -1
  35. package/dist/esm/components/auth/utils/oauth-provider-display-label.frontend.utils.js +18 -15
  36. package/dist/esm/components/auth/utils/oauth-provider-display-label.frontend.utils.js.map +1 -1
  37. package/dist/esm/components/billing/billing-invoice-history.js +2 -2
  38. package/dist/esm/components/billing/billing-invoice-history.js.map +1 -1
  39. package/dist/esm/components/billing/billing-portal-link.js +2 -2
  40. package/dist/esm/components/billing/billing-portal-link.js.map +1 -1
  41. package/dist/esm/components/billing/billing-pricing-table.d.ts +33 -1
  42. package/dist/esm/components/billing/billing-pricing-table.d.ts.map +1 -1
  43. package/dist/esm/components/billing/billing-pricing-table.js +34 -5
  44. package/dist/esm/components/billing/billing-pricing-table.js.map +1 -1
  45. package/dist/esm/components/billing/billing-subscription-status.js +2 -2
  46. package/dist/esm/components/billing/billing-subscription-status.js.map +1 -1
  47. package/dist/esm/components/billing/billing-usage-dashboard.d.ts +2 -0
  48. package/dist/esm/components/billing/billing-usage-dashboard.d.ts.map +1 -1
  49. package/dist/esm/components/billing/billing-usage-dashboard.js +1 -0
  50. package/dist/esm/components/billing/billing-usage-dashboard.js.map +1 -1
  51. package/dist/esm/components/data-display/DisplayField.d.ts.map +1 -1
  52. package/dist/esm/components/data-display/DisplayField.js +15 -1
  53. package/dist/esm/components/data-display/DisplayField.js.map +1 -1
  54. package/dist/esm/components/data-display/DisplayFieldArray.d.ts.map +1 -1
  55. package/dist/esm/components/data-display/DisplayFieldArray.js +11 -0
  56. package/dist/esm/components/data-display/DisplayFieldArray.js.map +1 -1
  57. package/dist/esm/components/data-display/DisplayFieldEditable.d.ts.map +1 -1
  58. package/dist/esm/components/data-display/DisplayFieldEditable.js +2 -2
  59. package/dist/esm/components/data-display/DisplayFieldEditable.js.map +1 -1
  60. package/dist/esm/components/data-display/DisplayFieldEditableArray.d.ts +12 -2
  61. package/dist/esm/components/data-display/DisplayFieldEditableArray.d.ts.map +1 -1
  62. package/dist/esm/components/data-display/DisplayFieldEditableArray.js +3 -2
  63. package/dist/esm/components/data-display/DisplayFieldEditableArray.js.map +1 -1
  64. package/dist/esm/components/data-display/DisplayFieldReadOnly.d.ts.map +1 -1
  65. package/dist/esm/components/data-display/DisplayFieldReadOnly.js +2 -2
  66. package/dist/esm/components/data-display/DisplayFieldReadOnly.js.map +1 -1
  67. package/dist/esm/components/data-display/DisplayFieldReadOnlyArraySection.d.ts.map +1 -1
  68. package/dist/esm/components/data-display/DisplayFieldReadOnlyArraySection.js +8 -2
  69. package/dist/esm/components/data-display/DisplayFieldReadOnlyArraySection.js.map +1 -1
  70. package/dist/esm/components/data-display/DisplayValueDispatcher.d.ts.map +1 -1
  71. package/dist/esm/components/data-display/DisplayValueDispatcher.js +18 -4
  72. package/dist/esm/components/data-display/DisplayValueDispatcher.js.map +1 -1
  73. package/dist/esm/components/data-display/ResourceAutomaticDisplayer.d.ts.map +1 -1
  74. package/dist/esm/components/data-display/ResourceAutomaticDisplayer.js +61 -3
  75. package/dist/esm/components/data-display/ResourceAutomaticDisplayer.js.map +1 -1
  76. package/dist/esm/components/data-display/ResourceSummaryDisplayer.d.ts +7 -5
  77. package/dist/esm/components/data-display/ResourceSummaryDisplayer.d.ts.map +1 -1
  78. package/dist/esm/components/data-display/ResourceSummaryDisplayer.js.map +1 -1
  79. package/dist/esm/components/data-display/chromes/DisplayFieldChrome.d.ts +11 -1
  80. package/dist/esm/components/data-display/chromes/DisplayFieldChrome.d.ts.map +1 -1
  81. package/dist/esm/components/data-display/chromes/DisplayFieldChrome.js +36 -11
  82. package/dist/esm/components/data-display/chromes/DisplayFieldChrome.js.map +1 -1
  83. package/dist/esm/components/data-display/display-field-resolved-props.d.ts +6 -0
  84. package/dist/esm/components/data-display/display-field-resolved-props.d.ts.map +1 -1
  85. package/dist/esm/components/data-display/display-field-resolved-props.js.map +1 -1
  86. package/dist/esm/components/data-display/external-data-provenance/DisplayFieldProvenanceNote.d.ts +23 -0
  87. package/dist/esm/components/data-display/external-data-provenance/DisplayFieldProvenanceNote.d.ts.map +1 -0
  88. package/dist/esm/components/data-display/external-data-provenance/DisplayFieldProvenanceNote.js +35 -0
  89. package/dist/esm/components/data-display/external-data-provenance/DisplayFieldProvenanceNote.js.map +1 -0
  90. package/dist/esm/components/data-display/external-data-provenance/external-data-provenance.frontend.d.ts +47 -0
  91. package/dist/esm/components/data-display/external-data-provenance/external-data-provenance.frontend.d.ts.map +1 -0
  92. package/dist/esm/components/data-display/external-data-provenance/external-data-provenance.frontend.js +124 -0
  93. package/dist/esm/components/data-display/external-data-provenance/external-data-provenance.frontend.js.map +1 -0
  94. package/dist/esm/components/data-display/external-data-provenance/useExternalDataFieldProvenance.d.ts +8 -0
  95. package/dist/esm/components/data-display/external-data-provenance/useExternalDataFieldProvenance.d.ts.map +1 -0
  96. package/dist/esm/components/data-display/external-data-provenance/useExternalDataFieldProvenance.js +46 -0
  97. package/dist/esm/components/data-display/external-data-provenance/useExternalDataFieldProvenance.js.map +1 -0
  98. package/dist/esm/components/feedback/resource-empty-state.d.ts +21 -8
  99. package/dist/esm/components/feedback/resource-empty-state.d.ts.map +1 -1
  100. package/dist/esm/components/feedback/resource-empty-state.js +56 -26
  101. package/dist/esm/components/feedback/resource-empty-state.js.map +1 -1
  102. package/dist/esm/components/flows-actors/approval.d.ts +29 -7
  103. package/dist/esm/components/flows-actors/approval.d.ts.map +1 -1
  104. package/dist/esm/components/flows-actors/approval.js +231 -101
  105. package/dist/esm/components/flows-actors/approval.js.map +1 -1
  106. package/dist/esm/components/flows-actors/approval.labels.d.ts.map +1 -1
  107. package/dist/esm/components/flows-actors/approval.labels.js +57 -0
  108. package/dist/esm/components/flows-actors/approval.labels.js.map +1 -1
  109. package/dist/esm/components/flows-actors/system-catalog.d.ts.map +1 -1
  110. package/dist/esm/components/flows-actors/system-catalog.js +4 -4
  111. package/dist/esm/components/flows-actors/system-catalog.js.map +1 -1
  112. package/dist/esm/components/flows-actors/system-catalog.labels.d.ts.map +1 -1
  113. package/dist/esm/components/flows-actors/system-catalog.labels.js +0 -5
  114. package/dist/esm/components/flows-actors/system-catalog.labels.js.map +1 -1
  115. package/dist/esm/components/form/Form.d.ts +2 -2
  116. package/dist/esm/components/form/Form.js +2 -2
  117. package/dist/esm/components/form/Form.js.map +1 -1
  118. package/dist/esm/components/form/automated/AutomatedArrayField.d.ts +28 -3
  119. package/dist/esm/components/form/automated/AutomatedArrayField.d.ts.map +1 -1
  120. package/dist/esm/components/form/automated/AutomatedArrayField.js +43 -14
  121. package/dist/esm/components/form/automated/AutomatedArrayField.js.map +1 -1
  122. package/dist/esm/components/form/automated/FormField.d.ts +3 -0
  123. package/dist/esm/components/form/automated/FormField.d.ts.map +1 -1
  124. package/dist/esm/components/form/automated/FormField.js +60 -21
  125. package/dist/esm/components/form/automated/FormField.js.map +1 -1
  126. package/dist/esm/components/form/automated/FormFieldArray.d.ts +6 -3
  127. package/dist/esm/components/form/automated/FormFieldArray.d.ts.map +1 -1
  128. package/dist/esm/components/form/automated/FormFieldArray.js +3 -2
  129. package/dist/esm/components/form/automated/FormFieldArray.js.map +1 -1
  130. package/dist/esm/components/form/automated/ResourceAutomatedForm.d.ts +5 -4
  131. package/dist/esm/components/form/automated/ResourceAutomatedForm.d.ts.map +1 -1
  132. package/dist/esm/components/form/automated/ResourceAutomatedForm.js +148 -55
  133. package/dist/esm/components/form/automated/ResourceAutomatedForm.js.map +1 -1
  134. package/dist/esm/components/form/automated/ResourceFormActionsContext.d.ts +30 -0
  135. package/dist/esm/components/form/automated/ResourceFormActionsContext.d.ts.map +1 -1
  136. package/dist/esm/components/form/automated/ResourceFormActionsContext.js +30 -1
  137. package/dist/esm/components/form/automated/ResourceFormActionsContext.js.map +1 -1
  138. package/dist/esm/components/form/automated/TemplatePlacedFieldsContext.d.ts +79 -0
  139. package/dist/esm/components/form/automated/TemplatePlacedFieldsContext.d.ts.map +1 -0
  140. package/dist/esm/components/form/automated/TemplatePlacedFieldsContext.js +203 -0
  141. package/dist/esm/components/form/automated/TemplatePlacedFieldsContext.js.map +1 -0
  142. package/dist/esm/components/form/automated/automated-form-submit.utils.d.ts +12 -0
  143. package/dist/esm/components/form/automated/automated-form-submit.utils.d.ts.map +1 -1
  144. package/dist/esm/components/form/automated/automated-form-submit.utils.js +11 -0
  145. package/dist/esm/components/form/automated/automated-form-submit.utils.js.map +1 -1
  146. package/dist/esm/components/form/chromes/FormFieldChrome.d.ts.map +1 -1
  147. package/dist/esm/components/form/chromes/FormFieldChrome.js +2 -2
  148. package/dist/esm/components/form/chromes/FormFieldChrome.js.map +1 -1
  149. package/dist/esm/components/form/combobox.d.ts +7 -0
  150. package/dist/esm/components/form/combobox.d.ts.map +1 -1
  151. package/dist/esm/components/form/combobox.js.map +1 -1
  152. package/dist/esm/components/form/controls/form-field-checkbox-group.d.ts.map +1 -1
  153. package/dist/esm/components/form/controls/form-field-checkbox-group.js +13 -0
  154. package/dist/esm/components/form/controls/form-field-checkbox-group.js.map +1 -1
  155. package/dist/esm/components/form/fields/form-field-address.d.ts +58 -0
  156. package/dist/esm/components/form/fields/form-field-address.d.ts.map +1 -1
  157. package/dist/esm/components/form/fields/form-field-address.js +34 -6
  158. package/dist/esm/components/form/fields/form-field-address.js.map +1 -1
  159. package/dist/esm/components/form/fields/form-field-address.labels.d.ts.map +1 -1
  160. package/dist/esm/components/form/fields/form-field-address.labels.js +60 -1
  161. package/dist/esm/components/form/fields/form-field-address.labels.js.map +1 -1
  162. package/dist/esm/components/form/fields/form-field-file.d.ts +0 -12
  163. package/dist/esm/components/form/fields/form-field-file.d.ts.map +1 -1
  164. package/dist/esm/components/form/fields/form-field-file.js +34 -13
  165. package/dist/esm/components/form/fields/form-field-file.js.map +1 -1
  166. package/dist/esm/components/form/fields/form-field-file.labels.d.ts.map +1 -1
  167. package/dist/esm/components/form/fields/form-field-file.labels.js +46 -0
  168. package/dist/esm/components/form/fields/form-field-file.labels.js.map +1 -1
  169. package/dist/esm/components/form/fields/form-field-string-organization-role.d.ts +73 -0
  170. package/dist/esm/components/form/fields/form-field-string-organization-role.d.ts.map +1 -0
  171. package/dist/esm/components/form/fields/form-field-string-organization-role.js +64 -0
  172. package/dist/esm/components/form/fields/form-field-string-organization-role.js.map +1 -0
  173. package/dist/esm/components/form/fields/form-field-string.d.ts.map +1 -1
  174. package/dist/esm/components/form/fields/form-field-string.js +8 -1
  175. package/dist/esm/components/form/fields/form-field-string.js.map +1 -1
  176. package/dist/esm/components/form/fields/form-field-string.labels.d.ts.map +1 -1
  177. package/dist/esm/components/form/fields/form-field-string.labels.js +4 -0
  178. package/dist/esm/components/form/fields/form-field-string.labels.js.map +1 -1
  179. package/dist/esm/components/form/validation-errors/FormErrorSummary.js +1 -1
  180. package/dist/esm/components/form/validation-errors/FormErrorSummary.js.map +1 -1
  181. package/dist/esm/components/form/validation-errors/resolver-error-nesting.d.ts +31 -0
  182. package/dist/esm/components/form/validation-errors/resolver-error-nesting.d.ts.map +1 -0
  183. package/dist/esm/components/form/validation-errors/resolver-error-nesting.js +81 -0
  184. package/dist/esm/components/form/validation-errors/resolver-error-nesting.js.map +1 -0
  185. package/dist/esm/components/form/validation-errors/resource-error-notification-context.utils.d.ts +14 -1
  186. package/dist/esm/components/form/validation-errors/resource-error-notification-context.utils.d.ts.map +1 -1
  187. package/dist/esm/components/form/validation-errors/resource-error-notification-context.utils.js +14 -0
  188. package/dist/esm/components/form/validation-errors/resource-error-notification-context.utils.js.map +1 -1
  189. package/dist/esm/components/form/validation-errors/zod-issue-resolver.d.ts +22 -0
  190. package/dist/esm/components/form/validation-errors/zod-issue-resolver.d.ts.map +1 -1
  191. package/dist/esm/components/form/validation-errors/zod-issue-resolver.js +1 -22
  192. package/dist/esm/components/form/validation-errors/zod-issue-resolver.js.map +1 -1
  193. package/dist/esm/components/layout/resizable.d.ts +11 -0
  194. package/dist/esm/components/layout/resizable.d.ts.map +1 -1
  195. package/dist/esm/components/layout/resizable.js.map +1 -1
  196. package/dist/esm/components/navigation/app-level/ApplicationLevel_NavigationBack.d.ts +11 -1
  197. package/dist/esm/components/navigation/app-level/ApplicationLevel_NavigationBack.d.ts.map +1 -1
  198. package/dist/esm/components/navigation/app-level/ApplicationLevel_NavigationBack.js +15 -3
  199. package/dist/esm/components/navigation/app-level/ApplicationLevel_NavigationBack.js.map +1 -1
  200. package/dist/esm/components/navigation/app-level/ApplicationLevel_StatusBar.d.ts +2 -2
  201. package/dist/esm/components/navigation/app-level/ApplicationLevel_StatusBar.d.ts.map +1 -1
  202. package/dist/esm/components/navigation/app-level/ApplicationLevel_StatusBar.js.map +1 -1
  203. package/dist/esm/components/navigation/app-level/HostedComponentInteractionsProvider.d.ts +2 -2
  204. package/dist/esm/components/navigation/app-level/HostedComponentInteractionsProvider.js +2 -2
  205. package/dist/esm/components/navigation/app-level/HostedComponentInteractionsProvider.js.map +1 -1
  206. package/dist/esm/components/navigation/app-level/SidebarResourceBrowser.js +18 -20
  207. package/dist/esm/components/navigation/app-level/SidebarResourceBrowser.js.map +1 -1
  208. package/dist/esm/components/navigation/app-level/useCommandMenuBehavior.d.ts.map +1 -1
  209. package/dist/esm/components/navigation/app-level/useCommandMenuBehavior.js +7 -1
  210. package/dist/esm/components/navigation/app-level/useCommandMenuBehavior.js.map +1 -1
  211. package/dist/esm/components/navigation/app-level/useMenuBarBehavior.d.ts.map +1 -1
  212. package/dist/esm/components/navigation/app-level/useMenuBarBehavior.js +4 -1
  213. package/dist/esm/components/navigation/app-level/useMenuBarBehavior.js.map +1 -1
  214. package/dist/esm/components/navigation/app-level/useMenuUserOrgBehavior.d.ts.map +1 -1
  215. package/dist/esm/components/navigation/app-level/useMenuUserOrgBehavior.js +18 -2
  216. package/dist/esm/components/navigation/app-level/useMenuUserOrgBehavior.js.map +1 -1
  217. package/dist/esm/components/navigation/app-level/useSidebarBehavior.d.ts.map +1 -1
  218. package/dist/esm/components/navigation/app-level/useSidebarBehavior.js +82 -10
  219. package/dist/esm/components/navigation/app-level/useSidebarBehavior.js.map +1 -1
  220. package/dist/esm/components/navigation/app-level/useStatusBarBehavior.d.ts +2 -2
  221. package/dist/esm/components/navigation/app-level/useStatusBarBehavior.d.ts.map +1 -1
  222. package/dist/esm/components/navigation/app-level/useStatusBarBehavior.js.map +1 -1
  223. package/dist/esm/components/resources/ResourceCollectionQuickFilterTabs.d.ts.map +1 -1
  224. package/dist/esm/components/resources/ResourceCollectionQuickFilterTabs.js +8 -1
  225. package/dist/esm/components/resources/ResourceCollectionQuickFilterTabs.js.map +1 -1
  226. package/dist/esm/components/resources/ResourceCollectionToolbar.d.ts +8 -2
  227. package/dist/esm/components/resources/ResourceCollectionToolbar.d.ts.map +1 -1
  228. package/dist/esm/components/resources/ResourceCollectionToolbar.js +6 -2
  229. package/dist/esm/components/resources/ResourceCollectionToolbar.js.map +1 -1
  230. package/dist/esm/components/resources/ResourceLayout_Breadcrumb.d.ts.map +1 -1
  231. package/dist/esm/components/resources/ResourceLayout_Breadcrumb.js +31 -16
  232. package/dist/esm/components/resources/ResourceLayout_Breadcrumb.js.map +1 -1
  233. package/dist/esm/components/resources/ResourceLayout_ContainerDialogs.d.ts.map +1 -1
  234. package/dist/esm/components/resources/ResourceLayout_ContainerDialogs.js +23 -8
  235. package/dist/esm/components/resources/ResourceLayout_ContainerDialogs.js.map +1 -1
  236. package/dist/esm/components/resources/ResourceLayout_ContainerNested.js +2 -2
  237. package/dist/esm/components/resources/ResourceLayout_ContainerNested.js.map +1 -1
  238. package/dist/esm/components/resources/ResourceLayout_Header.d.ts +13 -0
  239. package/dist/esm/components/resources/ResourceLayout_Header.d.ts.map +1 -1
  240. package/dist/esm/components/resources/ResourceLayout_Header.js +55 -28
  241. package/dist/esm/components/resources/ResourceLayout_Header.js.map +1 -1
  242. package/dist/esm/components/resources/ResourceLayout_List.d.ts.map +1 -1
  243. package/dist/esm/components/resources/ResourceLayout_List.js +41 -20
  244. package/dist/esm/components/resources/ResourceLayout_List.js.map +1 -1
  245. package/dist/esm/components/resources/ResourceLayout_List.labels.d.ts.map +1 -1
  246. package/dist/esm/components/resources/ResourceLayout_List.labels.js +1 -2
  247. package/dist/esm/components/resources/ResourceLayout_List.labels.js.map +1 -1
  248. package/dist/esm/components/resources/ResourceLayout_Read.d.ts +9 -4
  249. package/dist/esm/components/resources/ResourceLayout_Read.d.ts.map +1 -1
  250. package/dist/esm/components/resources/ResourceLayout_Read.js +30 -11
  251. package/dist/esm/components/resources/ResourceLayout_Read.js.map +1 -1
  252. package/dist/esm/components/resources/ResourceLayout_ReadSummary.d.ts.map +1 -1
  253. package/dist/esm/components/resources/ResourceLayout_ReadSummary.js +4 -2
  254. package/dist/esm/components/resources/ResourceLayout_ReadSummary.js.map +1 -1
  255. package/dist/esm/components/resources/ResourceLayout_ReadSummary_TableRow.d.ts.map +1 -1
  256. package/dist/esm/components/resources/ResourceLayout_ReadSummary_TableRow.js +6 -2
  257. package/dist/esm/components/resources/ResourceLayout_ReadSummary_TableRow.js.map +1 -1
  258. package/dist/esm/components/resources/ResourceLayout_Search.d.ts.map +1 -1
  259. package/dist/esm/components/resources/ResourceLayout_Search.js +30 -14
  260. package/dist/esm/components/resources/ResourceLayout_Search.js.map +1 -1
  261. package/dist/esm/components/resources/ResourceLayout_SemanticOperationFallback.d.ts.map +1 -1
  262. package/dist/esm/components/resources/ResourceLayout_SemanticOperationFallback.js +14 -198
  263. package/dist/esm/components/resources/ResourceLayout_SemanticOperationFallback.js.map +1 -1
  264. package/dist/esm/components/resources/ResourceLayout_Update.d.ts +2 -2
  265. package/dist/esm/components/resources/ResourceLayout_Update.js +2 -2
  266. package/dist/esm/components/resources/ResourceLayout_Update.js.map +1 -1
  267. package/dist/esm/components/resources/ResourceListItemRenderer.d.ts.map +1 -1
  268. package/dist/esm/components/resources/ResourceListItemRenderer.js +69 -39
  269. package/dist/esm/components/resources/ResourceListItemRenderer.js.map +1 -1
  270. package/dist/esm/components/resources/ResourceOperationActionDropdown.d.ts +32 -0
  271. package/dist/esm/components/resources/ResourceOperationActionDropdown.d.ts.map +1 -0
  272. package/dist/esm/components/resources/ResourceOperationActionDropdown.js +130 -0
  273. package/dist/esm/components/resources/ResourceOperationActionDropdown.js.map +1 -0
  274. package/dist/esm/components/resources/collection-create-placement.utils.d.ts +32 -0
  275. package/dist/esm/components/resources/collection-create-placement.utils.d.ts.map +1 -0
  276. package/dist/esm/components/resources/collection-create-placement.utils.js +37 -0
  277. package/dist/esm/components/resources/collection-create-placement.utils.js.map +1 -0
  278. package/dist/esm/components/resources/embeds/RelatedResourcePreview.d.ts.map +1 -1
  279. package/dist/esm/components/resources/embeds/RelatedResourcePreview.js +5 -1
  280. package/dist/esm/components/resources/embeds/RelatedResourcePreview.js.map +1 -1
  281. package/dist/esm/components/resources/embeds/RelatedResourceSections.d.ts +8 -1
  282. package/dist/esm/components/resources/embeds/RelatedResourceSections.d.ts.map +1 -1
  283. package/dist/esm/components/resources/embeds/RelatedResourceSections.js +49 -2
  284. package/dist/esm/components/resources/embeds/RelatedResourceSections.js.map +1 -1
  285. package/dist/esm/components/resources/embeds/ResourceEmbeds.d.ts +22 -0
  286. package/dist/esm/components/resources/embeds/ResourceEmbeds.d.ts.map +1 -1
  287. package/dist/esm/components/resources/embeds/ResourceEmbeds.js +85 -2
  288. package/dist/esm/components/resources/embeds/ResourceEmbeds.js.map +1 -1
  289. package/dist/esm/components/resources/resourceLayout.utils.d.ts +14 -0
  290. package/dist/esm/components/resources/resourceLayout.utils.d.ts.map +1 -1
  291. package/dist/esm/components/resources/resourceLayout.utils.js +22 -0
  292. package/dist/esm/components/resources/resourceLayout.utils.js.map +1 -1
  293. package/dist/esm/components/resources/skeleton/ArrayField.d.ts.map +1 -1
  294. package/dist/esm/components/resources/skeleton/ArrayField.js +3 -0
  295. package/dist/esm/components/resources/skeleton/ArrayField.js.map +1 -1
  296. package/dist/esm/components/resources/skeleton/FormLayout.d.ts.map +1 -1
  297. package/dist/esm/components/resources/skeleton/FormLayout.js +33 -1
  298. package/dist/esm/components/resources/skeleton/FormLayout.js.map +1 -1
  299. package/dist/esm/components/resources/skeleton/ObjectScope.d.ts.map +1 -1
  300. package/dist/esm/components/resources/skeleton/ObjectScope.js +3 -0
  301. package/dist/esm/components/resources/skeleton/ObjectScope.js.map +1 -1
  302. package/dist/esm/components/resources/skeleton/Section.d.ts +12 -0
  303. package/dist/esm/components/resources/skeleton/Section.d.ts.map +1 -1
  304. package/dist/esm/components/resources/skeleton/Section.js +28 -2
  305. package/dist/esm/components/resources/skeleton/Section.js.map +1 -1
  306. package/dist/esm/components/resources/skeleton/SectionFieldsContext.d.ts +70 -0
  307. package/dist/esm/components/resources/skeleton/SectionFieldsContext.d.ts.map +1 -1
  308. package/dist/esm/components/resources/skeleton/SectionFieldsContext.js +157 -1
  309. package/dist/esm/components/resources/skeleton/SectionFieldsContext.js.map +1 -1
  310. package/dist/esm/components/resources/skeleton/WizardLayout.d.ts +6 -0
  311. package/dist/esm/components/resources/skeleton/WizardLayout.d.ts.map +1 -1
  312. package/dist/esm/components/resources/skeleton/WizardLayout.js +13 -2
  313. package/dist/esm/components/resources/skeleton/WizardLayout.js.map +1 -1
  314. package/dist/esm/components/resources/skeleton/WizardStep.d.ts.map +1 -1
  315. package/dist/esm/components/resources/skeleton/WizardStep.js +2 -1
  316. package/dist/esm/components/resources/skeleton/WizardStep.js.map +1 -1
  317. package/dist/esm/components/resources-fields/_presets/resource-reference/ResourceFieldDisplayPreset_ResourceReference_Default.d.ts.map +1 -1
  318. package/dist/esm/components/resources-fields/_presets/resource-reference/ResourceFieldDisplayPreset_ResourceReference_Default.js +61 -15
  319. package/dist/esm/components/resources-fields/_presets/resource-reference/ResourceFieldDisplayPreset_ResourceReference_Default.js.map +1 -1
  320. package/dist/esm/components/resources-fields/resource-reference/resource-reference.shared.utils.d.ts +24 -2
  321. package/dist/esm/components/resources-fields/resource-reference/resource-reference.shared.utils.d.ts.map +1 -1
  322. package/dist/esm/components/resources-fields/resource-reference/resource-reference.shared.utils.js +69 -1
  323. package/dist/esm/components/resources-fields/resource-reference/resource-reference.shared.utils.js.map +1 -1
  324. package/dist/esm/components/resources-fields/resource-reference/useResourceSearch.d.ts.map +1 -1
  325. package/dist/esm/components/resources-fields/resource-reference/useResourceSearch.js +18 -19
  326. package/dist/esm/components/resources-fields/resource-reference/useResourceSearch.js.map +1 -1
  327. package/dist/esm/components/sections/ContentSectionContainer.d.ts.map +1 -1
  328. package/dist/esm/components/sections/ContentSectionContainer.js +5 -4
  329. package/dist/esm/components/sections/ContentSectionContainer.js.map +1 -1
  330. package/dist/esm/components/sections/stepper.d.ts +5 -0
  331. package/dist/esm/components/sections/stepper.d.ts.map +1 -1
  332. package/dist/esm/components/sections/stepper.js.map +1 -1
  333. package/dist/esm/components/sections/surface.d.ts.map +1 -1
  334. package/dist/esm/components/sections/surface.js +12 -3
  335. package/dist/esm/components/sections/surface.js.map +1 -1
  336. package/dist/esm/components/settings/AppPage_AgentWorkOverrideRateSettings.d.ts +43 -0
  337. package/dist/esm/components/settings/AppPage_AgentWorkOverrideRateSettings.d.ts.map +1 -0
  338. package/dist/esm/components/settings/AppPage_AgentWorkOverrideRateSettings.js +129 -0
  339. package/dist/esm/components/settings/AppPage_AgentWorkOverrideRateSettings.js.map +1 -0
  340. package/dist/esm/components/settings/AppPage_AgentWorkOverrideRateSettings.labels.d.ts +3 -0
  341. package/dist/esm/components/settings/AppPage_AgentWorkOverrideRateSettings.labels.d.ts.map +1 -0
  342. package/dist/esm/components/settings/AppPage_AgentWorkOverrideRateSettings.labels.js +34 -0
  343. package/dist/esm/components/settings/AppPage_AgentWorkOverrideRateSettings.labels.js.map +1 -0
  344. package/dist/esm/components/settings/AppPage_AppearanceSettings.d.ts.map +1 -1
  345. package/dist/esm/components/settings/AppPage_AppearanceSettings.js +9 -11
  346. package/dist/esm/components/settings/AppPage_AppearanceSettings.js.map +1 -1
  347. package/dist/esm/components/settings/AppPage_AppearanceSettings.labels.d.ts.map +1 -1
  348. package/dist/esm/components/settings/AppPage_AppearanceSettings.labels.js +3 -2
  349. package/dist/esm/components/settings/AppPage_AppearanceSettings.labels.js.map +1 -1
  350. package/dist/esm/components/settings/AppPage_BillingSettings.d.ts +4 -2
  351. package/dist/esm/components/settings/AppPage_BillingSettings.d.ts.map +1 -1
  352. package/dist/esm/components/settings/AppPage_BillingSettings.js +21 -3
  353. package/dist/esm/components/settings/AppPage_BillingSettings.js.map +1 -1
  354. package/dist/esm/components/settings/AppPage_BillingSettings.labels.d.ts.map +1 -1
  355. package/dist/esm/components/settings/AppPage_BillingSettings.labels.js +5 -10
  356. package/dist/esm/components/settings/AppPage_BillingSettings.labels.js.map +1 -1
  357. package/dist/esm/components/settings/AppPage_ConnectedAccountsSettings.d.ts +58 -0
  358. package/dist/esm/components/settings/AppPage_ConnectedAccountsSettings.d.ts.map +1 -1
  359. package/dist/esm/components/settings/AppPage_ConnectedAccountsSettings.js +243 -40
  360. package/dist/esm/components/settings/AppPage_ConnectedAccountsSettings.js.map +1 -1
  361. package/dist/esm/components/settings/AppPage_ConnectedAccountsSettings.labels.d.ts.map +1 -1
  362. package/dist/esm/components/settings/AppPage_ConnectedAccountsSettings.labels.js +67 -6
  363. package/dist/esm/components/settings/AppPage_ConnectedAccountsSettings.labels.js.map +1 -1
  364. package/dist/esm/components/settings/AppPage_InvitationsSettings.d.ts.map +1 -1
  365. package/dist/esm/components/settings/AppPage_InvitationsSettings.js +19 -11
  366. package/dist/esm/components/settings/AppPage_InvitationsSettings.js.map +1 -1
  367. package/dist/esm/components/settings/AppPage_InvitationsSettings.labels.d.ts.map +1 -1
  368. package/dist/esm/components/settings/AppPage_InvitationsSettings.labels.js +4 -2
  369. package/dist/esm/components/settings/AppPage_InvitationsSettings.labels.js.map +1 -1
  370. package/dist/esm/components/settings/SettingsHub.d.ts.map +1 -1
  371. package/dist/esm/components/settings/SettingsHub.js +3 -0
  372. package/dist/esm/components/settings/SettingsHub.js.map +1 -1
  373. package/dist/esm/components/settings/SettingsResourceOperationPanel.d.ts.map +1 -1
  374. package/dist/esm/components/settings/SettingsResourceOperationPanel.js +16 -1
  375. package/dist/esm/components/settings/SettingsResourceOperationPanel.js.map +1 -1
  376. package/dist/esm/components/settings/useOwnerProviderConnections.d.ts +59 -0
  377. package/dist/esm/components/settings/useOwnerProviderConnections.d.ts.map +1 -0
  378. package/dist/esm/components/settings/useOwnerProviderConnections.js +136 -0
  379. package/dist/esm/components/settings/useOwnerProviderConnections.js.map +1 -0
  380. package/dist/esm/components/views/chart-view/chart-view.utils.d.ts +5 -0
  381. package/dist/esm/components/views/chart-view/chart-view.utils.d.ts.map +1 -1
  382. package/dist/esm/components/views/chart-view/chart-view.utils.js +5 -0
  383. package/dist/esm/components/views/chart-view/chart-view.utils.js.map +1 -1
  384. package/dist/esm/components/views/chart-view/useResourceChartData.d.ts +50 -0
  385. package/dist/esm/components/views/chart-view/useResourceChartData.d.ts.map +1 -0
  386. package/dist/esm/components/views/chart-view/useResourceChartData.js +72 -0
  387. package/dist/esm/components/views/chart-view/useResourceChartData.js.map +1 -0
  388. package/dist/esm/components/views/composite-view/CompositeLayout.d.ts.map +1 -1
  389. package/dist/esm/components/views/composite-view/CompositeLayout.js +2 -1
  390. package/dist/esm/components/views/composite-view/CompositeLayout.js.map +1 -1
  391. package/dist/esm/core/app-shell/AppShellBuildingBlocks.d.ts +86 -0
  392. package/dist/esm/core/app-shell/AppShellBuildingBlocks.d.ts.map +1 -0
  393. package/dist/esm/core/app-shell/AppShellBuildingBlocks.js +187 -0
  394. package/dist/esm/core/app-shell/AppShellBuildingBlocks.js.map +1 -0
  395. package/dist/esm/core/app-shell/PortalContainerContext.d.ts +5 -2
  396. package/dist/esm/core/app-shell/PortalContainerContext.d.ts.map +1 -1
  397. package/dist/esm/core/app-shell/PortalContainerContext.js +5 -2
  398. package/dist/esm/core/app-shell/PortalContainerContext.js.map +1 -1
  399. package/dist/esm/core/app-shell/app-shell.schemas.d.ts +18 -9
  400. package/dist/esm/core/app-shell/app-shell.schemas.d.ts.map +1 -1
  401. package/dist/esm/core/app-shell/app-shell.schemas.js +1 -0
  402. package/dist/esm/core/app-shell/app-shell.schemas.js.map +1 -1
  403. package/dist/esm/core/app-shell/useAppShellLayout.d.ts +10 -0
  404. package/dist/esm/core/app-shell/useAppShellLayout.d.ts.map +1 -1
  405. package/dist/esm/core/app-shell/useAppShellLayout.js +28 -5
  406. package/dist/esm/core/app-shell/useAppShellLayout.js.map +1 -1
  407. package/dist/esm/core/app-shell/usePublicShellLayout.d.ts.map +1 -1
  408. package/dist/esm/core/app-shell/usePublicShellLayout.js +38 -0
  409. package/dist/esm/core/app-shell/usePublicShellLayout.js.map +1 -1
  410. package/dist/esm/core/automated-layout/automated-layout.frontend.utils.d.ts +15 -1
  411. package/dist/esm/core/automated-layout/automated-layout.frontend.utils.d.ts.map +1 -1
  412. package/dist/esm/core/automated-layout/automated-layout.frontend.utils.js +47 -13
  413. package/dist/esm/core/automated-layout/automated-layout.frontend.utils.js.map +1 -1
  414. package/dist/esm/core/billing/BillingContext.d.ts +25 -2
  415. package/dist/esm/core/billing/BillingContext.d.ts.map +1 -1
  416. package/dist/esm/core/billing/BillingContext.js +16 -25
  417. package/dist/esm/core/billing/BillingContext.js.map +1 -1
  418. package/dist/esm/core/billing/billing-provider-display.frontend.utils.d.ts +11 -3
  419. package/dist/esm/core/billing/billing-provider-display.frontend.utils.d.ts.map +1 -1
  420. package/dist/esm/core/billing/billing-provider-display.frontend.utils.js +14 -8
  421. package/dist/esm/core/billing/billing-provider-display.frontend.utils.js.map +1 -1
  422. package/dist/esm/core/billing/useBillingPlanChange.d.ts.map +1 -1
  423. package/dist/esm/core/billing/useBillingPlanChange.js +2 -0
  424. package/dist/esm/core/billing/useBillingPlanChange.js.map +1 -1
  425. package/dist/esm/core/components-registry/assert-registry-completeness.frontend.helper.d.ts.map +1 -1
  426. package/dist/esm/core/components-registry/assert-registry-completeness.frontend.helper.js +1 -0
  427. package/dist/esm/core/components-registry/assert-registry-completeness.frontend.helper.js.map +1 -1
  428. package/dist/esm/core/components-registry/provider-component-registry.frontend.service.d.ts +29 -229
  429. package/dist/esm/core/components-registry/provider-component-registry.frontend.service.d.ts.map +1 -1
  430. package/dist/esm/core/components-registry/provider-component-registry.frontend.service.js +29 -327
  431. package/dist/esm/core/components-registry/provider-component-registry.frontend.service.js.map +1 -1
  432. package/dist/esm/core/components-registry/useProviderComponent.frontend.hooks.d.ts +17 -27
  433. package/dist/esm/core/components-registry/useProviderComponent.frontend.hooks.d.ts.map +1 -1
  434. package/dist/esm/core/components-registry/useProviderComponent.frontend.hooks.js +28 -48
  435. package/dist/esm/core/components-registry/useProviderComponent.frontend.hooks.js.map +1 -1
  436. package/dist/esm/core/config/app-configuration-frontend.schemas.d.ts +21 -11
  437. package/dist/esm/core/config/app-configuration-frontend.schemas.d.ts.map +1 -1
  438. package/dist/esm/core/config/app-configuration-frontend.schemas.js +4 -4
  439. package/dist/esm/core/config/app-configuration-frontend.schemas.js.map +1 -1
  440. package/dist/esm/core/config/app-level-components.frontend.schemas.d.ts +17 -0
  441. package/dist/esm/core/config/app-level-components.frontend.schemas.d.ts.map +1 -1
  442. package/dist/esm/core/config/app-level-components.frontend.schemas.js +17 -0
  443. package/dist/esm/core/config/app-level-components.frontend.schemas.js.map +1 -1
  444. package/dist/esm/core/config/chart-view.frontend.schemas.d.ts +10 -10
  445. package/dist/esm/core/config/engine-settings-destinations.d.ts.map +1 -1
  446. package/dist/esm/core/config/engine-settings-destinations.js +221 -6
  447. package/dist/esm/core/config/engine-settings-destinations.js.map +1 -1
  448. package/dist/esm/core/config/launcher-items.frontend.schemas.d.ts +8 -0
  449. package/dist/esm/core/config/launcher-items.frontend.schemas.d.ts.map +1 -1
  450. package/dist/esm/core/config/launcher-items.frontend.schemas.js +1 -0
  451. package/dist/esm/core/config/launcher-items.frontend.schemas.js.map +1 -1
  452. package/dist/esm/core/config/settings-hub.frontend.schemas.d.ts +10 -1
  453. package/dist/esm/core/config/settings-hub.frontend.schemas.d.ts.map +1 -1
  454. package/dist/esm/core/config/settings-hub.frontend.schemas.js +9 -0
  455. package/dist/esm/core/config/settings-hub.frontend.schemas.js.map +1 -1
  456. package/dist/esm/core/config/verify-launcher-content.d.ts.map +1 -1
  457. package/dist/esm/core/config/verify-launcher-content.js +30 -19
  458. package/dist/esm/core/config/verify-launcher-content.js.map +1 -1
  459. package/dist/esm/core/errors/ErrorContext.d.ts.map +1 -1
  460. package/dist/esm/core/errors/ErrorContext.js +9 -1
  461. package/dist/esm/core/errors/ErrorContext.js.map +1 -1
  462. package/dist/esm/core/errors/GlobalErrorHandler.d.ts.map +1 -1
  463. package/dist/esm/core/errors/GlobalErrorHandler.js +5 -4
  464. package/dist/esm/core/errors/GlobalErrorHandler.js.map +1 -1
  465. package/dist/esm/core/errors/RouterErrorBoundary.js +1 -1
  466. package/dist/esm/core/errors/RouterErrorBoundary.js.map +1 -1
  467. package/dist/esm/core/errors/errors-builder.frontend.services.d.ts +2 -2
  468. package/dist/esm/core/errors/errors-builder.frontend.services.d.ts.map +1 -1
  469. package/dist/esm/core/errors/errors-builder.frontend.services.js +4 -4
  470. package/dist/esm/core/errors/errors-builder.frontend.services.js.map +1 -1
  471. package/dist/esm/core/errors/user-facing-error-message.frontend.utils.js +1 -1
  472. package/dist/esm/core/errors/user-facing-error-message.frontend.utils.js.map +1 -1
  473. package/dist/esm/core/events/NotificationContext.d.ts.map +1 -1
  474. package/dist/esm/core/events/NotificationContext.js +23 -5
  475. package/dist/esm/core/events/NotificationContext.js.map +1 -1
  476. package/dist/esm/core/events/events.frontend.schemas.d.ts +110 -43
  477. package/dist/esm/core/events/events.frontend.schemas.d.ts.map +1 -1
  478. package/dist/esm/core/events/events.frontend.schemas.js +89 -15
  479. package/dist/esm/core/events/events.frontend.schemas.js.map +1 -1
  480. package/dist/esm/core/execution/useExecutionParticipationRMM.d.ts +2 -0
  481. package/dist/esm/core/execution/useExecutionParticipationRMM.d.ts.map +1 -1
  482. package/dist/esm/core/execution/useExecutionParticipationRMM.js +2 -1
  483. package/dist/esm/core/execution/useExecutionParticipationRMM.js.map +1 -1
  484. package/dist/esm/core/execution/useExecutionResourceOperationSurface.d.ts +1 -1
  485. package/dist/esm/core/execution/useExecutionResourceOperationSurface.d.ts.map +1 -1
  486. package/dist/esm/core/execution/useExecutionResourceOperationSurface.js +5 -2
  487. package/dist/esm/core/execution/useExecutionResourceOperationSurface.js.map +1 -1
  488. package/dist/esm/core/external-providers/ConsentBasedProviderSdks.d.ts +63 -0
  489. package/dist/esm/core/external-providers/ConsentBasedProviderSdks.d.ts.map +1 -0
  490. package/dist/esm/core/external-providers/ConsentBasedProviderSdks.js +131 -0
  491. package/dist/esm/core/external-providers/ConsentBasedProviderSdks.js.map +1 -0
  492. package/dist/esm/core/external-providers/ProviderAddressLookupCombobox.d.ts +61 -0
  493. package/dist/esm/core/external-providers/ProviderAddressLookupCombobox.d.ts.map +1 -0
  494. package/dist/esm/core/external-providers/ProviderAddressLookupCombobox.js +178 -0
  495. package/dist/esm/core/external-providers/ProviderAddressLookupCombobox.js.map +1 -0
  496. package/dist/esm/core/external-providers/ProviderAddressLookupHost.d.ts +52 -0
  497. package/dist/esm/core/external-providers/ProviderAddressLookupHost.d.ts.map +1 -0
  498. package/dist/esm/core/external-providers/ProviderAddressLookupHost.js +144 -0
  499. package/dist/esm/core/external-providers/ProviderAddressLookupHost.js.map +1 -0
  500. package/dist/esm/core/external-providers/ProviderFilePickerHost.d.ts +22 -1
  501. package/dist/esm/core/external-providers/ProviderFilePickerHost.d.ts.map +1 -1
  502. package/dist/esm/core/external-providers/ProviderFilePickerHost.js +23 -3
  503. package/dist/esm/core/external-providers/ProviderFilePickerHost.js.map +1 -1
  504. package/dist/esm/core/external-providers/provider-address-lookup-selection.frontend.utils.d.ts +55 -0
  505. package/dist/esm/core/external-providers/provider-address-lookup-selection.frontend.utils.d.ts.map +1 -0
  506. package/dist/esm/core/external-providers/provider-address-lookup-selection.frontend.utils.js +65 -0
  507. package/dist/esm/core/external-providers/provider-address-lookup-selection.frontend.utils.js.map +1 -0
  508. package/dist/esm/core/external-providers/provider-scope-reauthorization-offers.frontend.d.ts +63 -0
  509. package/dist/esm/core/external-providers/provider-scope-reauthorization-offers.frontend.d.ts.map +1 -0
  510. package/dist/esm/core/external-providers/provider-scope-reauthorization-offers.frontend.js +100 -0
  511. package/dist/esm/core/external-providers/provider-scope-reauthorization-offers.frontend.js.map +1 -0
  512. package/dist/esm/core/flows-actors/FlowsActorsContext.d.ts +45 -7
  513. package/dist/esm/core/flows-actors/FlowsActorsContext.d.ts.map +1 -1
  514. package/dist/esm/core/flows-actors/FlowsActorsContext.js +112 -28
  515. package/dist/esm/core/flows-actors/FlowsActorsContext.js.map +1 -1
  516. package/dist/esm/core/flows-actors/usePendingDecisions.d.ts +32 -0
  517. package/dist/esm/core/flows-actors/usePendingDecisions.d.ts.map +1 -0
  518. package/dist/esm/core/flows-actors/usePendingDecisions.js +91 -0
  519. package/dist/esm/core/flows-actors/usePendingDecisions.js.map +1 -0
  520. package/dist/esm/core/guidance/GuidanceRenderer.d.ts.map +1 -1
  521. package/dist/esm/core/guidance/GuidanceRenderer.js +3 -2
  522. package/dist/esm/core/guidance/GuidanceRenderer.js.map +1 -1
  523. package/dist/esm/core/i18n/I18nContext.d.ts +22 -8
  524. package/dist/esm/core/i18n/I18nContext.d.ts.map +1 -1
  525. package/dist/esm/core/i18n/I18nContext.js +21 -9
  526. package/dist/esm/core/i18n/I18nContext.js.map +1 -1
  527. package/dist/esm/core/i18n/component-label-resolution.utils.d.ts +5 -3
  528. package/dist/esm/core/i18n/component-label-resolution.utils.d.ts.map +1 -1
  529. package/dist/esm/core/i18n/component-label-resolution.utils.js +5 -3
  530. package/dist/esm/core/i18n/component-label-resolution.utils.js.map +1 -1
  531. package/dist/esm/core/i18n/useI18n.d.ts +2 -1
  532. package/dist/esm/core/i18n/useI18n.d.ts.map +1 -1
  533. package/dist/esm/core/i18n/useI18n.js +2 -1
  534. package/dist/esm/core/i18n/useI18n.js.map +1 -1
  535. package/dist/esm/core/loading/LoadingContext.d.ts.map +1 -1
  536. package/dist/esm/core/loading/LoadingContext.js +7 -1
  537. package/dist/esm/core/loading/LoadingContext.js.map +1 -1
  538. package/dist/esm/core/loading/LoadingGate.d.ts.map +1 -1
  539. package/dist/esm/core/loading/LoadingGate.js +19 -1
  540. package/dist/esm/core/loading/LoadingGate.js.map +1 -1
  541. package/dist/esm/core/monitoring/analytics/AnalyticsContext.d.ts +15 -2
  542. package/dist/esm/core/monitoring/analytics/AnalyticsContext.d.ts.map +1 -1
  543. package/dist/esm/core/monitoring/analytics/AnalyticsContext.js +183 -20
  544. package/dist/esm/core/monitoring/analytics/AnalyticsContext.js.map +1 -1
  545. package/dist/esm/core/monitoring/analytics/AnalyticsEventBridge.js +2 -2
  546. package/dist/esm/core/monitoring/analytics/AnalyticsEventBridge.js.map +1 -1
  547. package/dist/esm/core/monitoring/analytics/analytics-provider-registry.frontend.service.d.ts +7 -15
  548. package/dist/esm/core/monitoring/analytics/analytics-provider-registry.frontend.service.d.ts.map +1 -1
  549. package/dist/esm/core/monitoring/analytics/analytics-provider-registry.frontend.service.js +8 -26
  550. package/dist/esm/core/monitoring/analytics/analytics-provider-registry.frontend.service.js.map +1 -1
  551. package/dist/esm/core/monitoring/analytics/analytics-provider.frontend.interface.d.ts +12 -3
  552. package/dist/esm/core/monitoring/analytics/analytics-provider.frontend.interface.d.ts.map +1 -1
  553. package/dist/esm/core/monitoring/analytics/analytics-provider.frontend.interface.js +3 -2
  554. package/dist/esm/core/monitoring/analytics/analytics-provider.frontend.interface.js.map +1 -1
  555. package/dist/esm/core/monitoring/analytics/providers/backend-proxy-analytics.provider.d.ts +42 -0
  556. package/dist/esm/core/monitoring/analytics/providers/backend-proxy-analytics.provider.d.ts.map +1 -1
  557. package/dist/esm/core/monitoring/analytics/providers/backend-proxy-analytics.provider.js +89 -5
  558. package/dist/esm/core/monitoring/analytics/providers/backend-proxy-analytics.provider.js.map +1 -1
  559. package/dist/esm/core/monitoring/analytics/providers/console-analytics.provider.d.ts +2 -0
  560. package/dist/esm/core/monitoring/analytics/providers/console-analytics.provider.d.ts.map +1 -1
  561. package/dist/esm/core/monitoring/analytics/providers/console-analytics.provider.js +2 -0
  562. package/dist/esm/core/monitoring/analytics/providers/console-analytics.provider.js.map +1 -1
  563. package/dist/esm/core/navigation/NavigationContentAreas.d.ts +78 -0
  564. package/dist/esm/core/navigation/NavigationContentAreas.d.ts.map +1 -1
  565. package/dist/esm/core/navigation/NavigationContentAreas.js +264 -16
  566. package/dist/esm/core/navigation/NavigationContentAreas.js.map +1 -1
  567. package/dist/esm/core/navigation/NavigationContext.d.ts +8 -0
  568. package/dist/esm/core/navigation/NavigationContext.d.ts.map +1 -1
  569. package/dist/esm/core/navigation/NavigationContext.js +137 -30
  570. package/dist/esm/core/navigation/NavigationContext.js.map +1 -1
  571. package/dist/esm/core/navigation/launcher-resolution.d.ts +2 -0
  572. package/dist/esm/core/navigation/launcher-resolution.d.ts.map +1 -1
  573. package/dist/esm/core/navigation/launcher-resolution.js +1 -0
  574. package/dist/esm/core/navigation/launcher-resolution.js.map +1 -1
  575. package/dist/esm/core/navigation/navigation-cascade.d.ts +46 -0
  576. package/dist/esm/core/navigation/navigation-cascade.d.ts.map +1 -0
  577. package/dist/esm/core/navigation/navigation-cascade.js +222 -0
  578. package/dist/esm/core/navigation/navigation-cascade.js.map +1 -0
  579. package/dist/esm/core/navigation/navigation-clean-break.frontend.utils.d.ts.map +1 -1
  580. package/dist/esm/core/navigation/navigation-clean-break.frontend.utils.js +21 -2
  581. package/dist/esm/core/navigation/navigation-clean-break.frontend.utils.js.map +1 -1
  582. package/dist/esm/core/navigation/navigation-controller-internals.d.ts +71 -0
  583. package/dist/esm/core/navigation/navigation-controller-internals.d.ts.map +1 -0
  584. package/dist/esm/core/navigation/navigation-controller-internals.js +84 -0
  585. package/dist/esm/core/navigation/navigation-controller-internals.js.map +1 -0
  586. package/dist/esm/core/navigation/navigation-policy-resolver.service.d.ts +86 -2
  587. package/dist/esm/core/navigation/navigation-policy-resolver.service.d.ts.map +1 -1
  588. package/dist/esm/core/navigation/navigation-policy-resolver.service.js +242 -124
  589. package/dist/esm/core/navigation/navigation-policy-resolver.service.js.map +1 -1
  590. package/dist/esm/core/navigation/navigation.schemas.d.ts +170 -8
  591. package/dist/esm/core/navigation/navigation.schemas.d.ts.map +1 -1
  592. package/dist/esm/core/navigation/navigation.schemas.js +121 -2
  593. package/dist/esm/core/navigation/navigation.schemas.js.map +1 -1
  594. package/dist/esm/core/navigation/navigation.utils.d.ts +102 -6
  595. package/dist/esm/core/navigation/navigation.utils.d.ts.map +1 -1
  596. package/dist/esm/core/navigation/navigation.utils.js +283 -34
  597. package/dist/esm/core/navigation/navigation.utils.js.map +1 -1
  598. package/dist/esm/core/navigation/useIsStackEntryActive.d.ts +0 -10
  599. package/dist/esm/core/navigation/useIsStackEntryActive.d.ts.map +0 -1
  600. package/dist/esm/core/navigation/useIsStackEntryActive.js.map +0 -1
  601. package/dist/esm/core/navigation/useNavigationController.d.ts +28 -157
  602. package/dist/esm/core/navigation/useNavigationController.d.ts.map +1 -1
  603. package/dist/esm/core/navigation/useNavigationController.js +211 -1189
  604. package/dist/esm/core/navigation/useNavigationController.js.map +1 -1
  605. package/dist/esm/core/navigation/useNavigationRouterSync.d.ts +174 -0
  606. package/dist/esm/core/navigation/useNavigationRouterSync.d.ts.map +1 -0
  607. package/dist/esm/core/navigation/useNavigationRouterSync.js +977 -0
  608. package/dist/esm/core/navigation/useNavigationRouterSync.js.map +1 -0
  609. package/dist/esm/core/navigation/useOverlayTitle.d.ts +13 -1
  610. package/dist/esm/core/navigation/useOverlayTitle.d.ts.map +1 -1
  611. package/dist/esm/core/navigation/useOverlayTitle.js +15 -10
  612. package/dist/esm/core/navigation/useOverlayTitle.js.map +1 -1
  613. package/dist/esm/core/navigation/useResponsiveZoneMigration.d.ts +43 -0
  614. package/dist/esm/core/navigation/useResponsiveZoneMigration.d.ts.map +1 -0
  615. package/dist/esm/core/navigation/useResponsiveZoneMigration.js +44 -0
  616. package/dist/esm/core/navigation/useResponsiveZoneMigration.js.map +1 -0
  617. package/dist/esm/core/navigation/zone-collapse-migration.d.ts +83 -0
  618. package/dist/esm/core/navigation/zone-collapse-migration.d.ts.map +1 -0
  619. package/dist/esm/core/navigation/zone-collapse-migration.js +116 -0
  620. package/dist/esm/core/navigation/zone-collapse-migration.js.map +1 -0
  621. package/dist/esm/core/navigation/zone-collapse.d.ts +51 -0
  622. package/dist/esm/core/navigation/zone-collapse.d.ts.map +1 -0
  623. package/dist/esm/core/navigation/zone-collapse.js +59 -0
  624. package/dist/esm/core/navigation/zone-collapse.js.map +1 -0
  625. package/dist/esm/core/navigation/zone-emphasis.d.ts +3 -0
  626. package/dist/esm/core/navigation/zone-emphasis.d.ts.map +1 -1
  627. package/dist/esm/core/navigation/zone-emphasis.js +26 -4
  628. package/dist/esm/core/navigation/zone-emphasis.js.map +1 -1
  629. package/dist/esm/core/navigation/zone-visible-entry.d.ts +22 -0
  630. package/dist/esm/core/navigation/zone-visible-entry.d.ts.map +1 -1
  631. package/dist/esm/core/navigation/zone-visible-entry.js +25 -0
  632. package/dist/esm/core/navigation/zone-visible-entry.js.map +1 -1
  633. package/dist/esm/core/requests/websockets/WebSocketContext.d.ts.map +1 -1
  634. package/dist/esm/core/requests/websockets/WebSocketContext.js +53 -18
  635. package/dist/esm/core/requests/websockets/WebSocketContext.js.map +1 -1
  636. package/dist/esm/core/requests/websockets/WebSocketEventBridge.d.ts.map +1 -1
  637. package/dist/esm/core/requests/websockets/WebSocketEventBridge.js +3 -1
  638. package/dist/esm/core/requests/websockets/WebSocketEventBridge.js.map +1 -1
  639. package/dist/esm/core/requests/websockets/useNotificationBadges.d.ts +22 -0
  640. package/dist/esm/core/requests/websockets/useNotificationBadges.d.ts.map +1 -1
  641. package/dist/esm/core/requests/websockets/useNotificationBadges.js +72 -3
  642. package/dist/esm/core/requests/websockets/useNotificationBadges.js.map +1 -1
  643. package/dist/esm/core/requests/websockets/usePublishNotificationBadgeCount.d.ts +28 -0
  644. package/dist/esm/core/requests/websockets/usePublishNotificationBadgeCount.d.ts.map +1 -0
  645. package/dist/esm/core/requests/websockets/usePublishNotificationBadgeCount.js +86 -0
  646. package/dist/esm/core/requests/websockets/usePublishNotificationBadgeCount.js.map +1 -0
  647. package/dist/esm/core/requests/wildo-http-client-manual-calls.frontend.service.d.ts +38 -3
  648. package/dist/esm/core/requests/wildo-http-client-manual-calls.frontend.service.d.ts.map +1 -1
  649. package/dist/esm/core/requests/wildo-http-client-manual-calls.frontend.service.js +57 -2
  650. package/dist/esm/core/requests/wildo-http-client-manual-calls.frontend.service.js.map +1 -1
  651. package/dist/esm/core/requests/wildo-http-client-resources.frontend.service.d.ts.map +1 -1
  652. package/dist/esm/core/requests/wildo-http-client-resources.frontend.service.js +4 -2
  653. package/dist/esm/core/requests/wildo-http-client-resources.frontend.service.js.map +1 -1
  654. package/dist/esm/core/requests/wildo-http-client.frontend.service.d.ts +30 -1
  655. package/dist/esm/core/requests/wildo-http-client.frontend.service.d.ts.map +1 -1
  656. package/dist/esm/core/requests/wildo-http-client.frontend.service.js +47 -4
  657. package/dist/esm/core/requests/wildo-http-client.frontend.service.js.map +1 -1
  658. package/dist/esm/core/resources/ResourceRegistryContext.d.ts.map +1 -1
  659. package/dist/esm/core/resources/ResourceRegistryContext.js +22 -1
  660. package/dist/esm/core/resources/ResourceRegistryContext.js.map +1 -1
  661. package/dist/esm/core/resources/context-resource-identifiers.frontend.utils.js +1 -1
  662. package/dist/esm/core/resources/context-resource-identifiers.frontend.utils.js.map +1 -1
  663. package/dist/esm/core/resources/frontend-resource.utils.d.ts +22 -1
  664. package/dist/esm/core/resources/frontend-resource.utils.d.ts.map +1 -1
  665. package/dist/esm/core/resources/frontend-resource.utils.js +25 -2
  666. package/dist/esm/core/resources/frontend-resource.utils.js.map +1 -1
  667. package/dist/esm/core/resources/operation-semantics.frontend.utils.d.ts +113 -13
  668. package/dist/esm/core/resources/operation-semantics.frontend.utils.d.ts.map +1 -1
  669. package/dist/esm/core/resources/operation-semantics.frontend.utils.js +173 -20
  670. package/dist/esm/core/resources/operation-semantics.frontend.utils.js.map +1 -1
  671. package/dist/esm/core/resources/relationship-surface-runtime.frontend.utils.d.ts +11 -0
  672. package/dist/esm/core/resources/relationship-surface-runtime.frontend.utils.d.ts.map +1 -1
  673. package/dist/esm/core/resources/relationship-surface-runtime.frontend.utils.js +7 -0
  674. package/dist/esm/core/resources/relationship-surface-runtime.frontend.utils.js.map +1 -1
  675. package/dist/esm/core/resources/resource-label-field-paths.frontend.utils.d.ts +3 -2
  676. package/dist/esm/core/resources/resource-label-field-paths.frontend.utils.d.ts.map +1 -1
  677. package/dist/esm/core/resources/resource-label-field-paths.frontend.utils.js +13 -5
  678. package/dist/esm/core/resources/resource-label-field-paths.frontend.utils.js.map +1 -1
  679. package/dist/esm/core/resources/resources-repository.frontend.service.d.ts +6 -0
  680. package/dist/esm/core/resources/resources-repository.frontend.service.d.ts.map +1 -1
  681. package/dist/esm/core/resources/resources-repository.frontend.service.js +90 -1
  682. package/dist/esm/core/resources/resources-repository.frontend.service.js.map +1 -1
  683. package/dist/esm/core/resources/resources.frontend.schemas.d.ts +139 -16
  684. package/dist/esm/core/resources/resources.frontend.schemas.d.ts.map +1 -1
  685. package/dist/esm/core/resources/resources.frontend.schemas.js +110 -11
  686. package/dist/esm/core/resources/resources.frontend.schemas.js.map +1 -1
  687. package/dist/esm/core/resources/rmm/ResourceMutationManager.d.ts.map +1 -1
  688. package/dist/esm/core/resources/rmm/ResourceMutationManager.js +3 -1
  689. package/dist/esm/core/resources/rmm/ResourceMutationManager.js.map +1 -1
  690. package/dist/esm/core/resources/rmm/update-like-mutation-fallback.frontend.d.ts +10 -0
  691. package/dist/esm/core/resources/rmm/update-like-mutation-fallback.frontend.d.ts.map +1 -1
  692. package/dist/esm/core/resources/rmm/update-like-mutation-fallback.frontend.js +8 -0
  693. package/dist/esm/core/resources/rmm/update-like-mutation-fallback.frontend.js.map +1 -1
  694. package/dist/esm/core/resources/rmm/useResourceRMM.d.ts +7 -0
  695. package/dist/esm/core/resources/rmm/useResourceRMM.d.ts.map +1 -1
  696. package/dist/esm/core/resources/rmm/useResourceRMM.js +9 -2
  697. package/dist/esm/core/resources/rmm/useResourceRMM.js.map +1 -1
  698. package/dist/esm/core/resources/useOperationDirectExecution.d.ts +59 -0
  699. package/dist/esm/core/resources/useOperationDirectExecution.d.ts.map +1 -0
  700. package/dist/esm/core/resources/useOperationDirectExecution.js +278 -0
  701. package/dist/esm/core/resources/useOperationDirectExecution.js.map +1 -0
  702. package/dist/esm/core/resources/useResourceOperationActions.d.ts +1 -1
  703. package/dist/esm/core/resources/useResourceOperationActions.d.ts.map +1 -1
  704. package/dist/esm/core/resources/useResourceOperationActions.js +69 -22
  705. package/dist/esm/core/resources/useResourceOperationActions.js.map +1 -1
  706. package/dist/esm/core/resources/useResourceOperationSurface.d.ts +8 -6
  707. package/dist/esm/core/resources/useResourceOperationSurface.d.ts.map +1 -1
  708. package/dist/esm/core/resources/useResourceOperationSurface.js +3 -2
  709. package/dist/esm/core/resources/useResourceOperationSurface.js.map +1 -1
  710. package/dist/esm/core/runtime/AppRouter.d.ts.map +1 -1
  711. package/dist/esm/core/runtime/AppRouter.js +23 -2
  712. package/dist/esm/core/runtime/AppRouter.js.map +1 -1
  713. package/dist/esm/core/runtime/ApplicationContext.shared.d.ts +4 -2
  714. package/dist/esm/core/runtime/ApplicationContext.shared.d.ts.map +1 -1
  715. package/dist/esm/core/runtime/ApplicationContext.shared.js.map +1 -1
  716. package/dist/esm/core/runtime/ApplicationMainContext.d.ts +12 -2
  717. package/dist/esm/core/runtime/ApplicationMainContext.d.ts.map +1 -1
  718. package/dist/esm/core/runtime/ApplicationMainContext.js +5 -2
  719. package/dist/esm/core/runtime/ApplicationMainContext.js.map +1 -1
  720. package/dist/esm/core/runtime/domain-module.frontend.definitions.d.ts +25 -1
  721. package/dist/esm/core/runtime/domain-module.frontend.definitions.d.ts.map +1 -1
  722. package/dist/esm/core/runtime/domain-module.frontend.definitions.js +37 -1
  723. package/dist/esm/core/runtime/domain-module.frontend.definitions.js.map +1 -1
  724. package/dist/esm/core/runtime/start-application.frontend.service.d.ts +21 -2
  725. package/dist/esm/core/runtime/start-application.frontend.service.d.ts.map +1 -1
  726. package/dist/esm/core/runtime/start-application.frontend.service.js +51 -4
  727. package/dist/esm/core/runtime/start-application.frontend.service.js.map +1 -1
  728. package/dist/esm/core/security/AuthSessionContext.d.ts +11 -0
  729. package/dist/esm/core/security/AuthSessionContext.d.ts.map +1 -1
  730. package/dist/esm/core/security/AuthSessionContext.js +70 -22
  731. package/dist/esm/core/security/AuthSessionContext.js.map +1 -1
  732. package/dist/esm/core/security/StepUpAuthContext.d.ts.map +1 -1
  733. package/dist/esm/core/security/StepUpAuthContext.js +10 -2
  734. package/dist/esm/core/security/StepUpAuthContext.js.map +1 -1
  735. package/dist/esm/core/security/UserOrgsContext.d.ts.map +1 -1
  736. package/dist/esm/core/security/UserOrgsContext.js +72 -8
  737. package/dist/esm/core/security/UserOrgsContext.js.map +1 -1
  738. package/dist/esm/core/security/route-organization-access.frontend.utils.d.ts +7 -0
  739. package/dist/esm/core/security/route-organization-access.frontend.utils.d.ts.map +1 -1
  740. package/dist/esm/core/security/route-organization-access.frontend.utils.js +8 -2
  741. package/dist/esm/core/security/route-organization-access.frontend.utils.js.map +1 -1
  742. package/dist/esm/core/security/useGrantedConsentPurposes.d.ts +30 -0
  743. package/dist/esm/core/security/useGrantedConsentPurposes.d.ts.map +1 -0
  744. package/dist/esm/core/security/useGrantedConsentPurposes.js +38 -0
  745. package/dist/esm/core/security/useGrantedConsentPurposes.js.map +1 -0
  746. package/dist/esm/core/ui/UIContext.d.ts.map +1 -1
  747. package/dist/esm/core/ui/UIContext.js +10 -6
  748. package/dist/esm/core/ui/UIContext.js.map +1 -1
  749. package/dist/esm/core/ui/color-conversion.utils.d.ts +20 -0
  750. package/dist/esm/core/ui/color-conversion.utils.d.ts.map +1 -1
  751. package/dist/esm/core/ui/color-conversion.utils.js +39 -5
  752. package/dist/esm/core/ui/color-conversion.utils.js.map +1 -1
  753. package/dist/esm/core/ui/themes/default.theme.d.ts.map +1 -1
  754. package/dist/esm/core/ui/themes/default.theme.js +22 -2
  755. package/dist/esm/core/ui/themes/default.theme.js.map +1 -1
  756. package/dist/esm/core/ui/ui.frontend.schemas.d.ts +6 -6
  757. package/dist/esm/core/ui/ui.frontend.schemas.d.ts.map +1 -1
  758. package/dist/esm/core/ui/ui.frontend.schemas.js +3 -3
  759. package/dist/esm/core/ui/ui.frontend.schemas.js.map +1 -1
  760. package/dist/esm/index.d.ts +10 -1
  761. package/dist/esm/index.d.ts.map +1 -1
  762. package/dist/esm/index.js +19 -1
  763. package/dist/esm/index.js.map +1 -1
  764. package/dist/esm/testing/app-shell-placement-coverage.d.ts +43 -0
  765. package/dist/esm/testing/app-shell-placement-coverage.d.ts.map +1 -0
  766. package/dist/esm/testing/app-shell-placement-coverage.js +114 -0
  767. package/dist/esm/testing/app-shell-placement-coverage.js.map +1 -0
  768. package/dist/esm/testing/mock-builders.d.ts.map +1 -1
  769. package/dist/esm/testing/mock-builders.js +5 -0
  770. package/dist/esm/testing/mock-builders.js.map +1 -1
  771. package/dist/esm/testing.d.ts +1 -0
  772. package/dist/esm/testing.d.ts.map +1 -1
  773. package/dist/esm/testing.js +1 -0
  774. package/dist/esm/testing.js.map +1 -1
  775. package/package.json +9 -7
  776. package/dist/esm/core/navigation/useIsStackEntryActive.js +0 -15
  777. package/dist/tsconfig.build.tsbuildinfo +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"AnalyticsEventBridge.js","sourceRoot":"","sources":["../../../../../../src/core/monitoring/analytics/AnalyticsEventBridge.tsx"],"names":[],"mappings":"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","sourcesContent":["/**\n * Analytics Event Bridge\n * \n * Bridges EventBus events to analytics providers (auto-instrumentation)\n * and contains the frontend value moment engine (5 signal types).\n * \n * Renders nothing — pure bridge component.\n */\n\nimport React, { useCallback, useEffect, useMemo, useRef } from 'react';\nimport {\n type AnalyticsConfig,\n type ValueMoment,\n ValueSignalType,\n ValueMomentMode,\n ValueMomentRole,\n ValueMomentScope,\n VALUE_MOMENT_EVENT_PREFIX,\n VALUE_MOMENT_SIGNAL_ALL_COMPLETED,\n AnalyticsEventName,\n AnalyticsTriggerSource,\n AnalyticsHotkeyKey,\n UserNotificationLevel,\n MAIN_API_BASE_PATH,\n} from '@wildo-ai/saas-models';\nimport type { AnalyticsIdentity } from './AnalyticsContext';\nimport { useAnalytics } from './useAnalytics';\nimport { useEventBus } from '~wildo-frontend-lib/core/events/useEventBus';\nimport { FrontendEvents } from '~wildo-frontend-lib/core/events/events.frontend.schemas';\nimport { getManualCallsHttpClient } from '~wildo-frontend-lib/core/requests/wildo-http-client-manual-calls.frontend.service';\n\n// ─── Props ──────────────────────────────────────────────────────\n\nexport interface AnalyticsMomentProgress {\n signals: Map<string, Set<number>>;\n counts: Map<string, number>;\n lastFired: Map<string, number>;\n completed: Set<string>;\n}\ninterface AnalyticsEventBridgeProps {\n identity: AnalyticsIdentity;\n progress: AnalyticsMomentProgress;\n config?: AnalyticsConfig['autoInstrumentation'];\n valueMoments?: ValueMoment[];\n}\n\n// ─── Component ──────────────────────────────────────────────────\n\nexport const AnalyticsEventBridge: React.FC<AnalyticsEventBridgeProps> = ({ config, valueMoments, identity, progress }) => {\n const {\n track,\n page,\n isActive,\n sessionStartTimestamp,\n achievedMoments,\n markMomentAchieved,\n _onTrackRef,\n } = useAnalytics();\n const { on, emit } = useEventBus();\n\n const activeGeneration = useRef(true);\n useEffect(() => { activeGeneration.current = true; return () => { activeGeneration.current = false; }; }, []);\n\n // ─── Internal state ─────────────────────────────────────────\n\n // Track which signals have been achieved (for ALL mode compound moments)\n const achievedSignalsRef = useRef(progress.signals);\n // Track event occurrence counts per signal (for RESOURCE_OPERATION threshold)\n const completedMomentsRef = useRef(progress.completed);\n const eventCountsRef = useRef(progress.counts);\n // Track anti-pattern last-fired timestamps (for cooldown)\n const lastFiredRef = useRef(progress.lastFired);\n // Track RESOURCE_STATE cached counts\n const resourceCountsRef = useRef<Map<string, number>>(new Map());\n\n // Stable refs for callbacks to avoid stale closures\n const trackRef = useRef(track);\n useEffect(() => { trackRef.current = track; }, [track]);\n\n const markMomentAchievedRef = useRef(markMomentAchieved);\n useEffect(() => { markMomentAchievedRef.current = markMomentAchieved; }, [markMomentAchieved]);\n\n // All moments from config\n const allMoments = useMemo(() => valueMoments ?? [], [valueMoments]);\n\n // Definition identity and its declared scope own progress, independently of the active full\n // identity. Thus a USER counter survives organization switching; organization counters do not mix.\n const momentKey = useCallback((moment: ValueMoment) => JSON.stringify([\n identity.applicationId, moment.scope, moment.scope === ValueMomentScope.ORGANIZATION ? identity.organizationId : identity.userId,\n moment,\n ]), [identity.applicationId, identity.userId, identity.organizationId]);\n\n // ─── Helpers ────────────────────────────────────────────────\n\n const shouldEvaluateMoment = useCallback((moment: ValueMoment): boolean => {\n if (moment.scope === ValueMomentScope.ORGANIZATION ? !identity.organizationId : !identity.userId) return false;\n // Non-ANTI_PATTERN: skip if already achieved\n if (moment.role !== ValueMomentRole.ANTI_PATTERN) {\n if (achievedMoments.has(moment.identifier) || completedMomentsRef.current.has(momentKey(moment))) return false;\n }\n\n // Check requires — all prerequisites must be achieved\n if (moment.requires?.length) {\n if (!moment.requires.every(req => achievedMoments.has(req))) return false;\n }\n\n // Check beforeStage — suppress if ANY is achieved\n if (moment.beforeStage?.length) {\n if (moment.beforeStage.some(stage => achievedMoments.has(stage))) return false;\n }\n\n // Anti-pattern cooldown check\n if (moment.role === ValueMomentRole.ANTI_PATTERN) {\n const cooldown = moment.cooldownMs ?? 300_000;\n const lastFired = lastFiredRef.current.get(momentKey(moment));\n if (lastFired && (Date.now() - lastFired) < cooldown) return false;\n }\n\n return true;\n }, [achievedMoments, identity, momentKey]);\n\n const checkValueMoment = useCallback((moment: ValueMoment, signalIndex: number) => {\n if (!activeGeneration.current || !shouldEvaluateMoment(moment)) return;\n\n const key = moment.identifier;\n const progressKey = momentKey(moment);\n if (!achievedSignalsRef.current.has(progressKey)) {\n achievedSignalsRef.current.set(progressKey, new Set());\n }\n const achieved = achievedSignalsRef.current.get(progressKey)!;\n achieved.add(signalIndex);\n\n const shouldFire =\n moment.mode === ValueMomentMode.ANY ||\n achieved.size === moment.signals.length;\n\n if (!shouldFire) return;\n\n if (moment.role !== ValueMomentRole.ANTI_PATTERN) completedMomentsRef.current.add(progressKey);\n\n const publish = () => {\n if (!activeGeneration.current) return;\n const prefix = moment.role === ValueMomentRole.ANTI_PATTERN ? ValueMomentRole.ANTI_PATTERN : VALUE_MOMENT_EVENT_PREFIX;\n trackRef.current(`${prefix}.${key}`, {\n signalIndex: moment.mode === ValueMomentMode.ANY ? signalIndex : undefined,\n signalType: moment.mode === ValueMomentMode.ANY ? moment.signals[signalIndex].signalType : VALUE_MOMENT_SIGNAL_ALL_COMPLETED,\n elapsedMs: Date.now() - sessionStartTimestamp, role: moment.role, scope: moment.scope,\n });\n if (moment.onAchieved?.frontendEvent) emit(FrontendEvents.ANALYTICS_MOMENT_ACHIEVED, {\n momentIdentifier: key, role: moment.role, scope: moment.scope ?? ValueMomentScope.USER,\n triggerSource: AnalyticsTriggerSource.FRONTEND,\n });\n };\n if (moment.role === ValueMomentRole.ANTI_PATTERN) {\n lastFiredRef.current.set(progressKey, Date.now());\n publish();\n } else {\n // A server-refused achievement must not drive downstream UI/analytics handlers either.\n Promise.resolve(markMomentAchievedRef.current(key)).then(accepted => {\n if (accepted) publish();\n else completedMomentsRef.current.delete(progressKey);\n });\n }\n }, [shouldEvaluateMoment, sessionStartTimestamp, emit, momentKey]);\n\n const matchesFilter = useCallback(\n (resultSummary: Record<string, unknown> | undefined, filter?: Record<string, unknown>): boolean => {\n if (!filter) return true;\n if (!resultSummary) return false;\n return Object.entries(filter).every(([k, v]) => resultSummary[k] === v);\n },\n [],\n );\n\n\n\n // ═══════════════════════════════════════════════════════════════\n // RESOURCE_STATE: Initial count queries on mount\n // ═══════════════════════════════════════════════════════════════\n\n useEffect(() => {\n if (!isActive) return;\n const httpClient = getManualCallsHttpClient();\n\n for (const moment of allMoments) {\n if (!shouldEvaluateMoment(moment)) continue;\n moment.signals.forEach((signal, idx) => {\n if (signal.signalType !== ValueSignalType.RESOURCE_STATE) return;\n const filterHash = JSON.stringify(signal.filter || {});\n const cacheKey = `${signal.resourceType}:${filterHash}`;\n\n httpClient\n .get(`${MAIN_API_BASE_PATH}/resources/${signal.resourceType}`, {\n params: { limit: 1, filter: signal.filter },\n })\n .then((response: unknown) => {\n if (!activeGeneration.current) return;\n const res = response as { totalCount?: number };\n const count = res.totalCount ?? 0;\n resourceCountsRef.current.set(cacheKey, count);\n if (count >= signal.threshold) {\n checkValueMoment(moment, idx);\n }\n })\n .catch(() => {\n /* Count query failed — will re-try on next event */\n });\n });\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [isActive, allMoments]);\n\n // ═══════════════════════════════════════════════════════════════\n // RESOURCE_STATE: Re-query on visibility change (tab focus)\n // ═══════════════════════════════════════════════════════════════\n\n useEffect(() => {\n if (!isActive) return;\n const httpClient = getManualCallsHttpClient();\n\n const handler = () => {\n if (document.visibilityState !== 'visible') return;\n for (const moment of allMoments) {\n if (!shouldEvaluateMoment(moment)) continue;\n moment.signals.forEach((signal, idx) => {\n if (signal.signalType !== ValueSignalType.RESOURCE_STATE) return;\n const filterHash = JSON.stringify(signal.filter || {});\n const cacheKey = `${signal.resourceType}:${filterHash}`;\n\n httpClient\n .get(`${MAIN_API_BASE_PATH}/resources/${signal.resourceType}`, {\n params: { limit: 1, filter: signal.filter },\n })\n .then((response: unknown) => {\n if (!activeGeneration.current) return;\n const res = response as { totalCount?: number };\n const count = res.totalCount ?? 0;\n resourceCountsRef.current.set(cacheKey, count);\n if (count >= signal.threshold) {\n checkValueMoment(moment, idx);\n }\n })\n .catch(() => {});\n });\n }\n };\n\n document.addEventListener('visibilitychange', handler);\n return () => document.removeEventListener('visibilitychange', handler);\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [isActive, allMoments]);\n\n // ═══════════════════════════════════════════════════════════════\n // PAGE VIEWS + VIEW_VISIT value signals\n // ═══════════════════════════════════════════════════════════════\n\n useEffect(() => {\n if (!isActive) return;\n return on(FrontendEvents.NAVIGATION_ZONE_CHANGED, (payload) => {\n // Page view auto-instrumentation\n if (config?.pageViews) {\n page(window.location.pathname, {\n contentType: payload.currentContent?.contentType,\n zone: payload.zone,\n stackDepth: payload.stackDepth,\n });\n }\n\n // Value moment: VIEW_VISIT signals\n if (payload.currentContent) {\n const content = payload.currentContent;\n for (const moment of allMoments) {\n moment.signals.forEach((signal, idx) => {\n if (signal.signalType !== ValueSignalType.VIEW_VISIT) return;\n if (content.contentType !== signal.contentType) return;\n if (signal.viewRef && (!('viewRef' in content) || (content as { viewRef?: string }).viewRef !== signal.viewRef)) return;\n checkValueMoment(moment, idx);\n });\n }\n }\n });\n }, [isActive, config?.pageViews, allMoments, on, page, checkValueMoment]);\n\n // ═══════════════════════════════════════════════════════════════\n // RESOURCE OPERATIONS + RESOURCE_OPERATION value signals + RESOURCE_STATE updates\n // ═══════════════════════════════════════════════════════════════\n\n useEffect(() => {\n if (!isActive) return;\n return on(FrontendEvents.NOTIFY_RESOURCE_SUCCESS, (payload) => {\n // Auto-instrumentation\n if (config?.resourceOperations) {\n track(AnalyticsEventName.RESOURCE_OPERATION, {\n resourceType: payload.resourceType,\n operation: payload.operationIdentifier,\n });\n }\n\n // RESOURCE_OPERATION value signals (with filter + threshold support)\n const resultSummary = payload.resultSummary as Record<string, unknown> | undefined;\n\n for (const moment of allMoments) {\n moment.signals.forEach((signal, idx) => {\n if (signal.signalType !== ValueSignalType.RESOURCE_OPERATION) return;\n if (payload.resourceType !== signal.resourceType) return;\n if (payload.operationIdentifier !== signal.operation) return;\n if (!matchesFilter(resultSummary, signal.filter as Record<string, unknown> | undefined)) return;\n\n // Count eligible occurrences independently for each declaration. Sharing a counter\n // across moments would count one physical event again for every matching definition.\n if (!activeGeneration.current || !shouldEvaluateMoment(moment)) return;\n if (signal.threshold && signal.threshold > 1) {\n const countKey = JSON.stringify([momentKey(moment), idx]);\n const current = (eventCountsRef.current.get(countKey) ?? 0) + 1;\n eventCountsRef.current.set(countKey, current);\n if (current < signal.threshold) return;\n }\n\n checkValueMoment(moment, idx);\n });\n }\n\n // RESOURCE_STATE: Update cached counts heuristically\n const httpClient = getManualCallsHttpClient();\n for (const moment of allMoments) {\n for (const signal of moment.signals) {\n if (signal.signalType !== ValueSignalType.RESOURCE_STATE) continue;\n if (payload.resourceType !== signal.resourceType) continue;\n const filterHash = JSON.stringify(signal.filter || {});\n const cacheKey = `${signal.resourceType}:${filterHash}`;\n // Re-query the population for every mutation. A shared heuristic increment counted a\n // single create repeatedly for multiple consumers and could not respect changed filters.\n httpClient\n .get(`${MAIN_API_BASE_PATH}/resources/${signal.resourceType}`, {\n params: { limit: 1, filter: signal.filter },\n })\n .then((response: unknown) => {\n if (!activeGeneration.current) return;\n const count = (response as { totalCount?: number }).totalCount ?? 0;\n resourceCountsRef.current.set(cacheKey, count);\n if (count >= signal.threshold) checkValueMoment(moment, moment.signals.indexOf(signal));\n })\n .catch(() => {});\n }\n }\n });\n }, [isActive, config?.resourceOperations, allMoments, on, track, checkValueMoment, matchesFilter, shouldEvaluateMoment, momentKey]);\n\n // ═══════════════════════════════════════════════════════════════\n // ERRORS\n // ═══════════════════════════════════════════════════════════════\n\n useEffect(() => {\n if (!isActive || !config?.trackErrors) return;\n return on(FrontendEvents.ERROR_OCCURED, (payload) => {\n track(AnalyticsEventName.ERROR, {\n errorType: payload.error?.type,\n errorSeverity: payload.error?.severity,\n });\n });\n }, [isActive, config?.trackErrors, on, track]);\n\n // ═══════════════════════════════════════════════════════════════\n // USER LIFECYCLE\n // ═══════════════════════════════════════════════════════════════\n\n useEffect(() => {\n if (!isActive || !config?.userLifecycle) return;\n const unsubs = [\n on(FrontendEvents.USER_LOGIN, () => track(AnalyticsEventName.USER_LOGIN)),\n on(FrontendEvents.USER_LOGOUT, () => track(AnalyticsEventName.USER_LOGOUT)),\n on(FrontendEvents.USER_STATUS_CHANGED, (p) =>\n track(AnalyticsEventName.USER_STATUS_CHANGED, { newStatus: p.newStatus, oldStatus: p.oldStatus }),\n ),\n ];\n return () => unsubs.forEach(u => u());\n }, [isActive, config?.userLifecycle, on, track]);\n\n // ═══════════════════════════════════════════════════════════════\n // NOTIFICATIONS\n // ═══════════════════════════════════════════════════════════════\n\n useEffect(() => {\n if (!isActive || !config?.notifications) return;\n const unsubs = [\n on(FrontendEvents.NOTIFY_CUSTOM_INFO, (p) =>\n track(AnalyticsEventName.NOTIFICATION, { level: UserNotificationLevel.INFO, identifier: p.identifier }),\n ),\n on(FrontendEvents.NOTIFY_CUSTOM_SUCCESS, (p) =>\n track(AnalyticsEventName.NOTIFICATION, { level: UserNotificationLevel.SUCCESS, identifier: p.identifier }),\n ),\n on(FrontendEvents.NOTIFY_CUSTOM_WARNING, (p) =>\n track(AnalyticsEventName.NOTIFICATION, { level: UserNotificationLevel.WARNING, identifier: p.identifier }),\n ),\n on(FrontendEvents.NOTIFY_CUSTOM_ERROR, (p) =>\n track(AnalyticsEventName.NOTIFICATION, { level: UserNotificationLevel.ERROR, identifier: p.identifier }),\n ),\n ];\n return () => unsubs.forEach(u => u());\n }, [isActive, config?.notifications, on, track]);\n\n // ═══════════════════════════════════════════════════════════════\n // HOTKEYS\n // ═══════════════════════════════════════════════════════════════\n\n useEffect(() => {\n if (!isActive || !config?.hotkeys) return;\n const unsubs = [\n on(FrontendEvents.HOTKEY_COMMAND_MENU_OPEN, () => track(AnalyticsEventName.HOTKEY_USED, { key: AnalyticsHotkeyKey.COMMAND_MENU })),\n on(FrontendEvents.HOTKEY_SIDEBAR_TOGGLE, () => track(AnalyticsEventName.HOTKEY_USED, { key: AnalyticsHotkeyKey.SIDEBAR_TOGGLE })),\n on(FrontendEvents.HOTKEY_NOTIFICATIONS_OPEN, () => track(AnalyticsEventName.HOTKEY_USED, { key: AnalyticsHotkeyKey.NOTIFICATIONS })),\n on(FrontendEvents.HOTKEY_QUICK_SWITCHER_OPEN, () =>\n track(AnalyticsEventName.HOTKEY_USED, { key: AnalyticsHotkeyKey.QUICK_SWITCHER }),\n ),\n on(FrontendEvents.HOTKEY_SHORTCUTS_HELP, () =>\n track(AnalyticsEventName.HOTKEY_USED, { key: AnalyticsHotkeyKey.SHORTCUTS_HELP }),\n ),\n ];\n return () => unsubs.forEach(u => u());\n }, [isActive, config?.hotkeys, on, track]);\n\n // ═══════════════════════════════════════════════════════════════\n // MILESTONE & LIFECYCLE — engagement signals for analytics\n // ═══════════════════════════════════════════════════════════════\n\n useEffect(() => {\n if (!isActive) return;\n const unsubs = [\n on(FrontendEvents.MILESTONE_ACHIEVED, (payload) => {\n track('milestone_achieved', {\n milestoneRef: payload.milestoneRef,\n category: payload.category,\n points: payload.points,\n scope: payload.scope,\n });\n }),\n on(FrontendEvents.LIFECYCLE_STAGE_CHANGED, (payload) => {\n track('lifecycle_stage_changed', {\n previousStage: payload.previousStage,\n newStage: payload.newStage,\n scope: payload.scope,\n trigger: payload.trigger,\n });\n }),\n ];\n return () => unsubs.forEach(u => u());\n }, [isActive, on, track]);\n\n // ═══════════════════════════════════════════════════════════════\n // CUSTOM_EVENT + FEATURE_ACCESS value signals via _onTrackRef\n // ═══════════════════════════════════════════════════════════════\n\n useEffect(() => {\n if (!isActive) return;\n\n _onTrackRef.current = (name: string, properties?: Record<string, unknown>) => {\n for (const moment of allMoments) {\n moment.signals.forEach((signal, idx) => {\n // CUSTOM_EVENT: match by eventName + optional threshold counting\n if (signal.signalType === ValueSignalType.CUSTOM_EVENT && signal.eventName === name) {\n if (!activeGeneration.current || !shouldEvaluateMoment(moment)) return;\n if (signal.threshold && signal.threshold > 1) {\n const countKey = JSON.stringify([momentKey(moment), idx]);\n const current = (eventCountsRef.current.get(countKey) ?? 0) + 1;\n eventCountsRef.current.set(countKey, current);\n if (current < signal.threshold) return;\n }\n checkValueMoment(moment, idx);\n }\n // FEATURE_ACCESS: match by featureId\n if (\n signal.signalType === ValueSignalType.FEATURE_ACCESS &&\n name === AnalyticsEventName.FEATURE_ACCESSED &&\n signal.featureId === properties?.featureId\n ) {\n checkValueMoment(moment, idx);\n }\n });\n }\n };\n\n return () => {\n _onTrackRef.current = null;\n };\n }, [isActive, allMoments, checkValueMoment, shouldEvaluateMoment, momentKey, _onTrackRef]);\n\n return null; // Bridge component, no UI\n};\n"]}
1
+ {"version":3,"file":"AnalyticsEventBridge.js","sourceRoot":"","sources":["../../../../../../src/core/monitoring/analytics/AnalyticsEventBridge.tsx"],"names":[],"mappings":"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","sourcesContent":["/**\n * Analytics Event Bridge\n * \n * Bridges EventBus events to analytics providers (auto-instrumentation)\n * and contains the frontend value moment engine (5 signal types).\n * \n * Renders nothing — pure bridge component.\n */\n\nimport React, { useCallback, useEffect, useMemo, useRef } from 'react';\nimport {\n type AnalyticsConfig,\n type ValueMoment,\n ValueSignalType,\n ValueMomentMode,\n ValueMomentRole,\n ValueMomentScope,\n VALUE_MOMENT_EVENT_PREFIX,\n VALUE_MOMENT_SIGNAL_ALL_COMPLETED,\n AnalyticsEventName,\n AnalyticsTriggerSource,\n AnalyticsHotkeyKey,\n UserNotificationLevel,\n MAIN_API_BASE_PATH,\n} from '@wildo-ai/saas-models';\nimport type { AnalyticsIdentity } from './AnalyticsContext';\nimport { useAnalytics } from './useAnalytics';\nimport { useEventBus } from '~wildo-frontend-lib/core/events/useEventBus';\nimport { FrontendEvents } from '~wildo-frontend-lib/core/events/events.frontend.schemas';\nimport { getManualCallsHttpClient } from '~wildo-frontend-lib/core/requests/wildo-http-client-manual-calls.frontend.service';\n\n// ─── Props ──────────────────────────────────────────────────────\n\nexport interface AnalyticsMomentProgress {\n signals: Map<string, Set<number>>;\n counts: Map<string, number>;\n lastFired: Map<string, number>;\n completed: Set<string>;\n}\ninterface AnalyticsEventBridgeProps {\n identity: AnalyticsIdentity;\n progress: AnalyticsMomentProgress;\n config?: AnalyticsConfig['autoInstrumentation'];\n valueMoments?: ValueMoment[];\n}\n\n// ─── Component ──────────────────────────────────────────────────\n\nexport const AnalyticsEventBridge: React.FC<AnalyticsEventBridgeProps> = ({ config, valueMoments, identity, progress }) => {\n const {\n track,\n page,\n isActive,\n sessionStartTimestamp,\n achievedMoments,\n markMomentAchieved,\n _onTrackRef,\n } = useAnalytics();\n const { on, emit } = useEventBus();\n\n const activeGeneration = useRef(true);\n useEffect(() => { activeGeneration.current = true; return () => { activeGeneration.current = false; }; }, []);\n\n // ─── Internal state ─────────────────────────────────────────\n\n // Track which signals have been achieved (for ALL mode compound moments)\n const achievedSignalsRef = useRef(progress.signals);\n // Track event occurrence counts per signal (for RESOURCE_OPERATION threshold)\n const completedMomentsRef = useRef(progress.completed);\n const eventCountsRef = useRef(progress.counts);\n // Track anti-pattern last-fired timestamps (for cooldown)\n const lastFiredRef = useRef(progress.lastFired);\n // Track RESOURCE_STATE cached counts\n const resourceCountsRef = useRef<Map<string, number>>(new Map());\n\n // Stable refs for callbacks to avoid stale closures\n const trackRef = useRef(track);\n useEffect(() => { trackRef.current = track; }, [track]);\n\n const markMomentAchievedRef = useRef(markMomentAchieved);\n useEffect(() => { markMomentAchievedRef.current = markMomentAchieved; }, [markMomentAchieved]);\n\n // All moments from config\n const allMoments = useMemo(() => valueMoments ?? [], [valueMoments]);\n\n // Definition identity and its declared scope own progress, independently of the active full\n // identity. Thus a USER counter survives organization switching; organization counters do not mix.\n const momentKey = useCallback((moment: ValueMoment) => JSON.stringify([\n identity.applicationId, moment.scope, moment.scope === ValueMomentScope.ORGANIZATION ? identity.organizationId : identity.userId,\n moment,\n ]), [identity.applicationId, identity.userId, identity.organizationId]);\n\n // ─── Helpers ────────────────────────────────────────────────\n\n const shouldEvaluateMoment = useCallback((moment: ValueMoment): boolean => {\n if (moment.scope === ValueMomentScope.ORGANIZATION ? !identity.organizationId : !identity.userId) return false;\n // Non-ANTI_PATTERN: skip if already achieved\n if (moment.role !== ValueMomentRole.ANTI_PATTERN) {\n if (achievedMoments.has(moment.identifier) || completedMomentsRef.current.has(momentKey(moment))) return false;\n }\n\n // Check requires — all prerequisites must be achieved\n if (moment.requires?.length) {\n if (!moment.requires.every(req => achievedMoments.has(req))) return false;\n }\n\n // Check beforeStage — suppress if ANY is achieved\n if (moment.beforeStage?.length) {\n if (moment.beforeStage.some(stage => achievedMoments.has(stage))) return false;\n }\n\n // Anti-pattern cooldown check\n if (moment.role === ValueMomentRole.ANTI_PATTERN) {\n const cooldown = moment.cooldownMs ?? 300_000;\n const lastFired = lastFiredRef.current.get(momentKey(moment));\n if (lastFired && (Date.now() - lastFired) < cooldown) return false;\n }\n\n return true;\n }, [achievedMoments, identity, momentKey]);\n\n const checkValueMoment = useCallback((moment: ValueMoment, signalIndex: number) => {\n if (!activeGeneration.current || !shouldEvaluateMoment(moment)) return;\n\n const key = moment.identifier;\n const progressKey = momentKey(moment);\n if (!achievedSignalsRef.current.has(progressKey)) {\n achievedSignalsRef.current.set(progressKey, new Set());\n }\n const achieved = achievedSignalsRef.current.get(progressKey)!;\n achieved.add(signalIndex);\n\n const shouldFire =\n moment.mode === ValueMomentMode.ANY ||\n achieved.size === moment.signals.length;\n\n if (!shouldFire) return;\n\n if (moment.role !== ValueMomentRole.ANTI_PATTERN) completedMomentsRef.current.add(progressKey);\n\n const publish = () => {\n if (!activeGeneration.current) return;\n const prefix = moment.role === ValueMomentRole.ANTI_PATTERN ? ValueMomentRole.ANTI_PATTERN : VALUE_MOMENT_EVENT_PREFIX;\n trackRef.current(`${prefix}.${key}`, {\n signalIndex: moment.mode === ValueMomentMode.ANY ? signalIndex : undefined,\n signalType: moment.mode === ValueMomentMode.ANY ? moment.signals[signalIndex].signalType : VALUE_MOMENT_SIGNAL_ALL_COMPLETED,\n elapsedMs: Date.now() - sessionStartTimestamp, role: moment.role, scope: moment.scope,\n });\n if (moment.onAchieved?.frontendEvent) emit(FrontendEvents.ANALYTICS_MOMENT_ACHIEVED, {\n momentIdentifier: key, role: moment.role, scope: moment.scope ?? ValueMomentScope.USER,\n triggerSource: AnalyticsTriggerSource.FRONTEND,\n });\n };\n if (moment.role === ValueMomentRole.ANTI_PATTERN) {\n lastFiredRef.current.set(progressKey, Date.now());\n publish();\n } else {\n // A server-refused achievement must not drive downstream UI/analytics handlers either.\n Promise.resolve(markMomentAchievedRef.current(key)).then(accepted => {\n if (accepted) publish();\n else completedMomentsRef.current.delete(progressKey);\n });\n }\n }, [shouldEvaluateMoment, sessionStartTimestamp, emit, momentKey]);\n\n const matchesFilter = useCallback(\n (resultSummary: Record<string, unknown> | undefined, filter?: Record<string, unknown>): boolean => {\n if (!filter) return true;\n if (!resultSummary) return false;\n return Object.entries(filter).every(([k, v]) => resultSummary[k] === v);\n },\n [],\n );\n\n\n\n // ═══════════════════════════════════════════════════════════════\n // RESOURCE_STATE: Initial count queries on mount\n // ═══════════════════════════════════════════════════════════════\n\n useEffect(() => {\n if (!isActive) return;\n const httpClient = getManualCallsHttpClient();\n\n for (const moment of allMoments) {\n if (!shouldEvaluateMoment(moment)) continue;\n moment.signals.forEach((signal, idx) => {\n if (signal.signalType !== ValueSignalType.RESOURCE_STATE) return;\n const filterHash = JSON.stringify(signal.filter || {});\n const cacheKey = `${signal.resourceType}:${filterHash}`;\n\n httpClient\n .get(`${MAIN_API_BASE_PATH}/resources/${signal.resourceType}`, {\n params: { limit: 1, filter: signal.filter },\n })\n .then((response: unknown) => {\n if (!activeGeneration.current) return;\n const res = response as { totalCount?: number };\n const count = res.totalCount ?? 0;\n resourceCountsRef.current.set(cacheKey, count);\n if (count >= signal.threshold) {\n checkValueMoment(moment, idx);\n }\n })\n .catch(() => {\n /* Count query failed — will re-try on next event */\n });\n });\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [isActive, allMoments]);\n\n // ═══════════════════════════════════════════════════════════════\n // RESOURCE_STATE: Re-query on visibility change (tab focus)\n // ═══════════════════════════════════════════════════════════════\n\n useEffect(() => {\n if (!isActive) return;\n const httpClient = getManualCallsHttpClient();\n\n const handler = () => {\n if (document.visibilityState !== 'visible') return;\n for (const moment of allMoments) {\n if (!shouldEvaluateMoment(moment)) continue;\n moment.signals.forEach((signal, idx) => {\n if (signal.signalType !== ValueSignalType.RESOURCE_STATE) return;\n const filterHash = JSON.stringify(signal.filter || {});\n const cacheKey = `${signal.resourceType}:${filterHash}`;\n\n httpClient\n .get(`${MAIN_API_BASE_PATH}/resources/${signal.resourceType}`, {\n params: { limit: 1, filter: signal.filter },\n })\n .then((response: unknown) => {\n if (!activeGeneration.current) return;\n const res = response as { totalCount?: number };\n const count = res.totalCount ?? 0;\n resourceCountsRef.current.set(cacheKey, count);\n if (count >= signal.threshold) {\n checkValueMoment(moment, idx);\n }\n })\n .catch(() => {});\n });\n }\n };\n\n document.addEventListener('visibilitychange', handler);\n return () => document.removeEventListener('visibilitychange', handler);\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [isActive, allMoments]);\n\n // ═══════════════════════════════════════════════════════════════\n // PAGE VIEWS + VIEW_VISIT value signals\n // ═══════════════════════════════════════════════════════════════\n\n useEffect(() => {\n if (!isActive) return;\n return on(FrontendEvents.NAVIGATION_ZONE_CHANGED, (payload) => {\n // Page view auto-instrumentation\n if (config?.pageViews) {\n page(window.location.pathname, {\n contentType: payload.currentContent?.contentType,\n zone: payload.zone,\n stackDepth: payload.stackDepth,\n });\n }\n\n // Value moment: VIEW_VISIT signals\n if (payload.currentContent) {\n const content = payload.currentContent;\n for (const moment of allMoments) {\n moment.signals.forEach((signal, idx) => {\n if (signal.signalType !== ValueSignalType.VIEW_VISIT) return;\n if (content.contentType !== signal.contentType) return;\n if (signal.viewRef && (!('viewRef' in content) || (content as { viewRef?: string }).viewRef !== signal.viewRef)) return;\n checkValueMoment(moment, idx);\n });\n }\n }\n });\n }, [isActive, config?.pageViews, allMoments, on, page, checkValueMoment]);\n\n // ═══════════════════════════════════════════════════════════════\n // RESOURCE OPERATIONS + RESOURCE_OPERATION value signals + RESOURCE_STATE updates\n // ═══════════════════════════════════════════════════════════════\n\n useEffect(() => {\n if (!isActive) return;\n return on(FrontendEvents.NOTIFY_RESOURCE_SUCCESS, (payload) => {\n // Auto-instrumentation\n if (config?.resourceOperations) {\n track(AnalyticsEventName.RESOURCE_OPERATION, {\n resourceType: payload.resourceType,\n operation: payload.operationIdentifier,\n });\n }\n\n // RESOURCE_OPERATION value signals (with filter + threshold support)\n const resultSummary = payload.resultSummary as Record<string, unknown> | undefined;\n\n for (const moment of allMoments) {\n moment.signals.forEach((signal, idx) => {\n if (signal.signalType !== ValueSignalType.RESOURCE_OPERATION) return;\n if (payload.resourceType !== signal.resourceType) return;\n if (payload.operationIdentifier !== signal.operation) return;\n if (!matchesFilter(resultSummary, signal.filter as Record<string, unknown> | undefined)) return;\n\n // Count eligible occurrences independently for each declaration. Sharing a counter\n // across moments would count one physical event again for every matching definition.\n if (!activeGeneration.current || !shouldEvaluateMoment(moment)) return;\n if (signal.threshold && signal.threshold > 1) {\n const countKey = JSON.stringify([momentKey(moment), idx]);\n const current = (eventCountsRef.current.get(countKey) ?? 0) + 1;\n eventCountsRef.current.set(countKey, current);\n if (current < signal.threshold) return;\n }\n\n checkValueMoment(moment, idx);\n });\n }\n\n // RESOURCE_STATE: Update cached counts heuristically\n const httpClient = getManualCallsHttpClient();\n for (const moment of allMoments) {\n for (const signal of moment.signals) {\n if (signal.signalType !== ValueSignalType.RESOURCE_STATE) continue;\n if (payload.resourceType !== signal.resourceType) continue;\n const filterHash = JSON.stringify(signal.filter || {});\n const cacheKey = `${signal.resourceType}:${filterHash}`;\n // Re-query the population for every mutation. A shared heuristic increment counted a\n // single create repeatedly for multiple consumers and could not respect changed filters.\n httpClient\n .get(`${MAIN_API_BASE_PATH}/resources/${signal.resourceType}`, {\n params: { limit: 1, filter: signal.filter },\n })\n .then((response: unknown) => {\n if (!activeGeneration.current) return;\n const count = (response as { totalCount?: number }).totalCount ?? 0;\n resourceCountsRef.current.set(cacheKey, count);\n if (count >= signal.threshold) checkValueMoment(moment, moment.signals.indexOf(signal));\n })\n .catch(() => {});\n }\n }\n });\n }, [isActive, config?.resourceOperations, allMoments, on, track, checkValueMoment, matchesFilter, shouldEvaluateMoment, momentKey]);\n\n // ═══════════════════════════════════════════════════════════════\n // ERRORS\n // ═══════════════════════════════════════════════════════════════\n\n useEffect(() => {\n if (!isActive || !config?.trackErrors) return;\n return on(FrontendEvents.ERROR_OCCURED, (payload) => {\n track(AnalyticsEventName.ERROR, {\n errorType: payload.error?.type,\n errorSeverity: payload.error?.severity,\n });\n });\n }, [isActive, config?.trackErrors, on, track]);\n\n // ═══════════════════════════════════════════════════════════════\n // USER LIFECYCLE\n // ═══════════════════════════════════════════════════════════════\n\n useEffect(() => {\n if (!isActive || !config?.userLifecycle) return;\n const unsubs = [\n // USER_LOGIN / USER_LOGOUT are counted by `AnalyticsContextProvider` (#1977): this bridge is keyed on\n // the identity those events change, so it is remounted by the very transitions they announce.\n on(FrontendEvents.USER_STATUS_CHANGED, (p) =>\n track(AnalyticsEventName.USER_STATUS_CHANGED, { newStatus: p.newStatus, oldStatus: p.oldStatus }),\n ),\n ];\n return () => unsubs.forEach(u => u());\n }, [isActive, config?.userLifecycle, on, track]);\n\n // ═══════════════════════════════════════════════════════════════\n // NOTIFICATIONS\n // ═══════════════════════════════════════════════════════════════\n\n useEffect(() => {\n if (!isActive || !config?.notifications) return;\n const unsubs = [\n on(FrontendEvents.NOTIFY_CUSTOM_INFO, (p) =>\n track(AnalyticsEventName.NOTIFICATION, { level: UserNotificationLevel.INFO, identifier: p.identifier }),\n ),\n on(FrontendEvents.NOTIFY_CUSTOM_SUCCESS, (p) =>\n track(AnalyticsEventName.NOTIFICATION, { level: UserNotificationLevel.SUCCESS, identifier: p.identifier }),\n ),\n on(FrontendEvents.NOTIFY_CUSTOM_WARNING, (p) =>\n track(AnalyticsEventName.NOTIFICATION, { level: UserNotificationLevel.WARNING, identifier: p.identifier }),\n ),\n on(FrontendEvents.NOTIFY_CUSTOM_ERROR, (p) =>\n track(AnalyticsEventName.NOTIFICATION, { level: UserNotificationLevel.ERROR, identifier: p.identifier }),\n ),\n ];\n return () => unsubs.forEach(u => u());\n }, [isActive, config?.notifications, on, track]);\n\n // ═══════════════════════════════════════════════════════════════\n // HOTKEYS\n // ═══════════════════════════════════════════════════════════════\n\n useEffect(() => {\n if (!isActive || !config?.hotkeys) return;\n const unsubs = [\n on(FrontendEvents.HOTKEY_COMMAND_MENU_OPEN, () => track(AnalyticsEventName.HOTKEY_USED, { key: AnalyticsHotkeyKey.COMMAND_MENU })),\n on(FrontendEvents.HOTKEY_SIDEBAR_TOGGLE, () => track(AnalyticsEventName.HOTKEY_USED, { key: AnalyticsHotkeyKey.SIDEBAR_TOGGLE })),\n on(FrontendEvents.HOTKEY_NOTIFICATIONS_OPEN, () => track(AnalyticsEventName.HOTKEY_USED, { key: AnalyticsHotkeyKey.NOTIFICATIONS })),\n on(FrontendEvents.HOTKEY_QUICK_SWITCHER_OPEN, () =>\n track(AnalyticsEventName.HOTKEY_USED, { key: AnalyticsHotkeyKey.QUICK_SWITCHER }),\n ),\n on(FrontendEvents.HOTKEY_SHORTCUTS_HELP, () =>\n track(AnalyticsEventName.HOTKEY_USED, { key: AnalyticsHotkeyKey.SHORTCUTS_HELP }),\n ),\n ];\n return () => unsubs.forEach(u => u());\n }, [isActive, config?.hotkeys, on, track]);\n\n // ═══════════════════════════════════════════════════════════════\n // MILESTONE & LIFECYCLE — engagement signals for analytics\n // ═══════════════════════════════════════════════════════════════\n\n useEffect(() => {\n if (!isActive) return;\n const unsubs = [\n on(FrontendEvents.MILESTONE_ACHIEVED, (payload) => {\n track('milestone_achieved', {\n milestoneRef: payload.milestoneRef,\n category: payload.category,\n points: payload.points,\n scope: payload.scope,\n });\n }),\n on(FrontendEvents.LIFECYCLE_STAGE_CHANGED, (payload) => {\n track('lifecycle_stage_changed', {\n previousStage: payload.previousStage,\n newStage: payload.newStage,\n scope: payload.scope,\n trigger: payload.trigger,\n });\n }),\n ];\n return () => unsubs.forEach(u => u());\n }, [isActive, on, track]);\n\n // ═══════════════════════════════════════════════════════════════\n // CUSTOM_EVENT + FEATURE_ACCESS value signals via _onTrackRef\n // ═══════════════════════════════════════════════════════════════\n\n useEffect(() => {\n if (!isActive) return;\n\n _onTrackRef.current = (name: string, properties?: Record<string, unknown>) => {\n for (const moment of allMoments) {\n moment.signals.forEach((signal, idx) => {\n // CUSTOM_EVENT: match by eventName + optional threshold counting\n if (signal.signalType === ValueSignalType.CUSTOM_EVENT && signal.eventName === name) {\n if (!activeGeneration.current || !shouldEvaluateMoment(moment)) return;\n if (signal.threshold && signal.threshold > 1) {\n const countKey = JSON.stringify([momentKey(moment), idx]);\n const current = (eventCountsRef.current.get(countKey) ?? 0) + 1;\n eventCountsRef.current.set(countKey, current);\n if (current < signal.threshold) return;\n }\n checkValueMoment(moment, idx);\n }\n // FEATURE_ACCESS: match by featureId\n if (\n signal.signalType === ValueSignalType.FEATURE_ACCESS &&\n name === AnalyticsEventName.FEATURE_ACCESSED &&\n signal.featureId === properties?.featureId\n ) {\n checkValueMoment(moment, idx);\n }\n });\n }\n };\n\n return () => {\n _onTrackRef.current = null;\n };\n }, [isActive, allMoments, checkValueMoment, shouldEvaluateMoment, momentKey, _onTrackRef]);\n\n return null; // Bridge component, no UI\n};\n"]}
@@ -1,25 +1,17 @@
1
1
  /**
2
- * Analytics Provider Registry
2
+ * The ENGINE's own analytics destinations (`console`, `backend_proxy`), resolved from `analytics.providers`.
3
3
  *
4
- * Manages analytics provider registration, factory resolution from config,
5
- * and httpClient injection for built-in providers.
4
+ * Deliberately closed to vendors (#1704). It used to take custom factories (`registerFactory`) and the
5
+ * application could pass vendor clients through `AnalyticsContextProvider`'s `customProviders`, which put a
6
+ * vendor behind a second consent gate and outside the service's CSP footprint. A vendor is now a
7
+ * `FRONTEND_PRODUCT_ANALYTICS` provider module, started by the consent-based activation consumer and fed by
8
+ * `AnalyticsContext` through its `FrontendProductAnalyticsSink`.
6
9
  */
7
10
  import { type AnalyticsProviderConfig } from '@wildo-ai/saas-models';
8
11
  import type { IAnalyticsProvider } from './analytics-provider.frontend.interface';
9
12
  import type { WildoBackendHttpClient_ManualCalls } from '../../../core/requests/wildo-http-client-manual-calls.frontend.service';
10
- type ProviderFactory = (httpClient: WildoBackendHttpClient_ManualCalls, config?: Record<string, unknown>) => IAnalyticsProvider;
11
13
  export declare class AnalyticsProviderRegistry {
12
- private customFactories;
13
- /**
14
- * Register a custom provider factory by type key.
15
- */
16
- registerFactory(type: string, factory: ProviderFactory): void;
17
- /**
18
- * Resolve providers from configuration array.
19
- * Built-in types (console, backend_proxy) are resolved from internal factories.
20
- * Custom types fall back to registered factories.
21
- */
14
+ /** Resolve the engine destinations an application's `analytics.providers` selects. */
22
15
  resolveFromConfig(configs: AnalyticsProviderConfig[], httpClient: WildoBackendHttpClient_ManualCalls): IAnalyticsProvider[];
23
16
  }
24
- export {};
25
17
  //# sourceMappingURL=analytics-provider-registry.frontend.service.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"analytics-provider-registry.frontend.service.d.ts","sourceRoot":"","sources":["../../../../../../src/core/monitoring/analytics/analytics-provider-registry.frontend.service.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAyB,KAAK,uBAAuB,EAAE,MAAM,uBAAuB,CAAC;AAC5F,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,yCAAyC,CAAC;AAClF,OAAO,KAAK,EAAE,kCAAkC,EAAE,MAAM,mFAAmF,CAAC;AAI5I,KAAK,eAAe,GAAG,CAAC,UAAU,EAAE,kCAAkC,EAAE,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,kBAAkB,CAAC;AAOhI,qBAAa,yBAAyB;IACpC,OAAO,CAAC,eAAe,CAAsC;IAE7D;;OAEG;IACH,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,eAAe,GAAG,IAAI;IAI7D;;;;OAIG;IACH,iBAAiB,CACf,OAAO,EAAE,uBAAuB,EAAE,EAClC,UAAU,EAAE,kCAAkC,GAC7C,kBAAkB,EAAE;CAcxB"}
1
+ {"version":3,"file":"analytics-provider-registry.frontend.service.d.ts","sourceRoot":"","sources":["../../../../../../src/core/monitoring/analytics/analytics-provider-registry.frontend.service.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAyB,KAAK,uBAAuB,EAAE,MAAM,uBAAuB,CAAC;AAC5F,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,yCAAyC,CAAC;AAClF,OAAO,KAAK,EAAE,kCAAkC,EAAE,MAAM,mFAAmF,CAAC;AAW5I,qBAAa,yBAAyB;IACpC,sFAAsF;IACtF,iBAAiB,CACf,OAAO,EAAE,uBAAuB,EAAE,EAClC,UAAU,EAAE,kCAAkC,GAC7C,kBAAkB,EAAE;CAGxB"}
@@ -1,8 +1,11 @@
1
1
  /**
2
- * Analytics Provider Registry
2
+ * The ENGINE's own analytics destinations (`console`, `backend_proxy`), resolved from `analytics.providers`.
3
3
  *
4
- * Manages analytics provider registration, factory resolution from config,
5
- * and httpClient injection for built-in providers.
4
+ * Deliberately closed to vendors (#1704). It used to take custom factories (`registerFactory`) and the
5
+ * application could pass vendor clients through `AnalyticsContextProvider`'s `customProviders`, which put a
6
+ * vendor behind a second consent gate and outside the service's CSP footprint. A vendor is now a
7
+ * `FRONTEND_PRODUCT_ANALYTICS` provider module, started by the consent-based activation consumer and fed by
8
+ * `AnalyticsContext` through its `FrontendProductAnalyticsSink`.
6
9
  */
7
10
  import { AnalyticsProviderType } from '@wildo-ai/saas-models';
8
11
  import { ConsoleAnalyticsProvider } from './providers/console-analytics.provider.js';
@@ -12,30 +15,9 @@ const builtInFactories = {
12
15
  [AnalyticsProviderType.BACKEND_PROXY]: (httpClient) => new BackendProxyAnalyticsProvider(httpClient),
13
16
  };
14
17
  export class AnalyticsProviderRegistry {
15
- customFactories = new Map();
16
- /**
17
- * Register a custom provider factory by type key.
18
- */
19
- registerFactory(type, factory) {
20
- this.customFactories.set(type, factory);
21
- }
22
- /**
23
- * Resolve providers from configuration array.
24
- * Built-in types (console, backend_proxy) are resolved from internal factories.
25
- * Custom types fall back to registered factories.
26
- */
18
+ /** Resolve the engine destinations an application's `analytics.providers` selects. */
27
19
  resolveFromConfig(configs, httpClient) {
28
- const providers = [];
29
- for (const cfg of configs) {
30
- const factory = builtInFactories[cfg.providerType] ?? this.customFactories.get(cfg.providerType);
31
- if (factory) {
32
- providers.push(factory(httpClient, cfg.config));
33
- }
34
- else {
35
- console.warn(`[AnalyticsProviderRegistry] Unknown provider type: ${cfg.providerType}`);
36
- }
37
- }
38
- return providers;
20
+ return configs.map((cfg) => builtInFactories[cfg.providerType](httpClient, cfg.config));
39
21
  }
40
22
  }
41
23
  //# sourceMappingURL=analytics-provider-registry.frontend.service.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"analytics-provider-registry.frontend.service.js","sourceRoot":"","sources":["../../../../../../src/core/monitoring/analytics/analytics-provider-registry.frontend.service.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,qBAAqB,EAAgC,MAAM,uBAAuB,CAAC;AAG5F,OAAO,EAAE,wBAAwB,EAAE,MAAM,wCAAwC,CAAC;AAClF,OAAO,EAAE,6BAA6B,EAAE,MAAM,8CAA8C,CAAC;AAI7F,MAAM,gBAAgB,GAAoC;IACxD,CAAC,qBAAqB,CAAC,OAAO,CAAC,EAAE,GAAG,EAAE,CAAC,IAAI,wBAAwB,EAAE;IACrE,CAAC,qBAAqB,CAAC,aAAa,CAAC,EAAE,CAAC,UAAU,EAAE,EAAE,CAAC,IAAI,6BAA6B,CAAC,UAAU,CAAC;CACrG,CAAC;AAEF,MAAM,OAAO,yBAAyB;IAC5B,eAAe,GAAG,IAAI,GAAG,EAA2B,CAAC;IAE7D;;OAEG;IACH,eAAe,CAAC,IAAY,EAAE,OAAwB;QACpD,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;IAC1C,CAAC;IAED;;;;OAIG;IACH,iBAAiB,CACf,OAAkC,EAClC,UAA8C;QAE9C,MAAM,SAAS,GAAyB,EAAE,CAAC;QAE3C,KAAK,MAAM,GAAG,IAAI,OAAO,EAAE,CAAC;YAC1B,MAAM,OAAO,GAAG,gBAAgB,CAAC,GAAG,CAAC,YAAY,CAAC,IAAI,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;YACjG,IAAI,OAAO,EAAE,CAAC;gBACZ,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,UAAU,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC;YAClD,CAAC;iBAAM,CAAC;gBACN,OAAO,CAAC,IAAI,CAAC,sDAAsD,GAAG,CAAC,YAAY,EAAE,CAAC,CAAC;YACzF,CAAC;QACH,CAAC;QAED,OAAO,SAAS,CAAC;IACnB,CAAC;CACF","sourcesContent":["/**\n * Analytics Provider Registry\n * \n * Manages analytics provider registration, factory resolution from config,\n * and httpClient injection for built-in providers.\n */\n\nimport { AnalyticsProviderType, type AnalyticsProviderConfig } from '@wildo-ai/saas-models';\nimport type { IAnalyticsProvider } from './analytics-provider.frontend.interface';\nimport type { WildoBackendHttpClient_ManualCalls } from '~wildo-frontend-lib/core/requests/wildo-http-client-manual-calls.frontend.service';\nimport { ConsoleAnalyticsProvider } from './providers/console-analytics.provider';\nimport { BackendProxyAnalyticsProvider } from './providers/backend-proxy-analytics.provider';\n\ntype ProviderFactory = (httpClient: WildoBackendHttpClient_ManualCalls, config?: Record<string, unknown>) => IAnalyticsProvider;\n\nconst builtInFactories: Record<string, ProviderFactory> = {\n [AnalyticsProviderType.CONSOLE]: () => new ConsoleAnalyticsProvider(),\n [AnalyticsProviderType.BACKEND_PROXY]: (httpClient) => new BackendProxyAnalyticsProvider(httpClient),\n};\n\nexport class AnalyticsProviderRegistry {\n private customFactories = new Map<string, ProviderFactory>();\n\n /**\n * Register a custom provider factory by type key.\n */\n registerFactory(type: string, factory: ProviderFactory): void {\n this.customFactories.set(type, factory);\n }\n\n /**\n * Resolve providers from configuration array.\n * Built-in types (console, backend_proxy) are resolved from internal factories.\n * Custom types fall back to registered factories.\n */\n resolveFromConfig(\n configs: AnalyticsProviderConfig[],\n httpClient: WildoBackendHttpClient_ManualCalls,\n ): IAnalyticsProvider[] {\n const providers: IAnalyticsProvider[] = [];\n\n for (const cfg of configs) {\n const factory = builtInFactories[cfg.providerType] ?? this.customFactories.get(cfg.providerType);\n if (factory) {\n providers.push(factory(httpClient, cfg.config));\n } else {\n console.warn(`[AnalyticsProviderRegistry] Unknown provider type: ${cfg.providerType}`);\n }\n }\n\n return providers;\n }\n}\n"]}
1
+ {"version":3,"file":"analytics-provider-registry.frontend.service.js","sourceRoot":"","sources":["../../../../../../src/core/monitoring/analytics/analytics-provider-registry.frontend.service.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAE,qBAAqB,EAAgC,MAAM,uBAAuB,CAAC;AAG5F,OAAO,EAAE,wBAAwB,EAAE,MAAM,wCAAwC,CAAC;AAClF,OAAO,EAAE,6BAA6B,EAAE,MAAM,8CAA8C,CAAC;AAI7F,MAAM,gBAAgB,GAA6D;IACjF,CAAC,qBAAqB,CAAC,OAAO,CAAC,EAAE,GAAG,EAAE,CAAC,IAAI,wBAAwB,EAAE;IACrE,CAAC,qBAAqB,CAAC,aAAa,CAAC,EAAE,CAAC,UAAU,EAAE,EAAE,CAAC,IAAI,6BAA6B,CAAC,UAAU,CAAC;CACrG,CAAC;AAEF,MAAM,OAAO,yBAAyB;IACpC,sFAAsF;IACtF,iBAAiB,CACf,OAAkC,EAClC,UAA8C;QAE9C,OAAO,OAAO,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,gBAAgB,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC,UAAU,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC;IAC1F,CAAC;CACF","sourcesContent":["/**\n * The ENGINE's own analytics destinations (`console`, `backend_proxy`), resolved from `analytics.providers`.\n *\n * Deliberately closed to vendors (#1704). It used to take custom factories (`registerFactory`) and the\n * application could pass vendor clients through `AnalyticsContextProvider`'s `customProviders`, which put a\n * vendor behind a second consent gate and outside the service's CSP footprint. A vendor is now a\n * `FRONTEND_PRODUCT_ANALYTICS` provider module, started by the consent-based activation consumer and fed by\n * `AnalyticsContext` through its `FrontendProductAnalyticsSink`.\n */\n\nimport { AnalyticsProviderType, type AnalyticsProviderConfig } from '@wildo-ai/saas-models';\nimport type { IAnalyticsProvider } from './analytics-provider.frontend.interface';\nimport type { WildoBackendHttpClient_ManualCalls } from '~wildo-frontend-lib/core/requests/wildo-http-client-manual-calls.frontend.service';\nimport { ConsoleAnalyticsProvider } from './providers/console-analytics.provider';\nimport { BackendProxyAnalyticsProvider } from './providers/backend-proxy-analytics.provider';\n\ntype ProviderFactory = (httpClient: WildoBackendHttpClient_ManualCalls, config?: Record<string, unknown>) => IAnalyticsProvider;\n\nconst builtInFactories: Readonly<Record<AnalyticsProviderType, ProviderFactory>> = {\n [AnalyticsProviderType.CONSOLE]: () => new ConsoleAnalyticsProvider(),\n [AnalyticsProviderType.BACKEND_PROXY]: (httpClient) => new BackendProxyAnalyticsProvider(httpClient),\n};\n\nexport class AnalyticsProviderRegistry {\n /** Resolve the engine destinations an application's `analytics.providers` selects. */\n resolveFromConfig(\n configs: AnalyticsProviderConfig[],\n httpClient: WildoBackendHttpClient_ManualCalls,\n ): IAnalyticsProvider[] {\n return configs.map((cfg) => builtInFactories[cfg.providerType](httpClient, cfg.config));\n }\n}\n"]}
@@ -1,8 +1,9 @@
1
1
  /**
2
2
  * Analytics Provider Interface
3
3
  *
4
- * Defines the contract for analytics providers (console, backend proxy, PostHog, etc.).
5
- * Implemented by both built-in providers and app-custom providers.
4
+ * Defines the contract for the ENGINE's own analytics destinations (console, backend proxy).
5
+ * A vendor (PostHog, …) is a `FRONTEND_PRODUCT_ANALYTICS` provider module instead, reached through
6
+ * its `FrontendProductAnalyticsSink` (#1704).
6
7
  */
7
8
  export interface AnalyticsEvent {
8
9
  /** Event name (e.g., 'page_view', 'resource_create', 'feature_blocked') */
@@ -29,8 +30,16 @@ export interface IAnalyticsProvider {
29
30
  track(event: AnalyticsEvent): void;
30
31
  /** Track a page view (convenience — could be a track() call internally) */
31
32
  page(path: string, properties?: Record<string, unknown>): void;
32
- /** Reset provider state (called on logout or consent revocation) */
33
+ /**
34
+ * Forget the person (called on every `USER_LOGOUT`). A destination that buffers sends what it holds
35
+ * under the departing person first, while their consent still holds (#1977).
36
+ */
33
37
  reset(): void;
38
+ /**
39
+ * Drop anything not yet sent, without sending it (called when the person withdraws the consent the
40
+ * destination rests on). Events collected under a grant are not transmitted after its withdrawal.
41
+ */
42
+ discard(): void;
34
43
  /** Shutdown provider (called on app unmount) */
35
44
  shutdown(): Promise<void>;
36
45
  }
@@ -1 +1 @@
1
- {"version":3,"file":"analytics-provider.frontend.interface.d.ts","sourceRoot":"","sources":["../../../../../../src/core/monitoring/analytics/analytics-provider.frontend.interface.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,MAAM,WAAW,cAAc;IAC7B,2EAA2E;IAC3E,IAAI,EAAE,MAAM,CAAC;IACb,qDAAqD;IACrD,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACrC,kCAAkC;IAClC,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,qBAAqB;IACpC,MAAM,EAAE,MAAM,CAAC;IACf,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,wDAAwD;IACxD,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAClC;AAED,MAAM,WAAW,kBAAkB;IACjC,uDAAuD;IACvD,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IAEtB,iEAAiE;IACjE,UAAU,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAE5D,8DAA8D;IAC9D,QAAQ,CAAC,QAAQ,EAAE,qBAAqB,GAAG,IAAI,CAAC;IAEhD,qBAAqB;IACrB,KAAK,CAAC,KAAK,EAAE,cAAc,GAAG,IAAI,CAAC;IAEnC,2EAA2E;IAC3E,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC;IAE/D,oEAAoE;IACpE,KAAK,IAAI,IAAI,CAAC;IAEd,gDAAgD;IAChD,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CAC3B"}
1
+ {"version":3,"file":"analytics-provider.frontend.interface.d.ts","sourceRoot":"","sources":["../../../../../../src/core/monitoring/analytics/analytics-provider.frontend.interface.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,MAAM,WAAW,cAAc;IAC7B,2EAA2E;IAC3E,IAAI,EAAE,MAAM,CAAC;IACb,qDAAqD;IACrD,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACrC,kCAAkC;IAClC,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,qBAAqB;IACpC,MAAM,EAAE,MAAM,CAAC;IACf,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,wDAAwD;IACxD,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAClC;AAED,MAAM,WAAW,kBAAkB;IACjC,uDAAuD;IACvD,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IAEtB,iEAAiE;IACjE,UAAU,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAE5D,8DAA8D;IAC9D,QAAQ,CAAC,QAAQ,EAAE,qBAAqB,GAAG,IAAI,CAAC;IAEhD,qBAAqB;IACrB,KAAK,CAAC,KAAK,EAAE,cAAc,GAAG,IAAI,CAAC;IAEnC,2EAA2E;IAC3E,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC;IAE/D;;;OAGG;IACH,KAAK,IAAI,IAAI,CAAC;IAEd;;;OAGG;IACH,OAAO,IAAI,IAAI,CAAC;IAEhB,gDAAgD;IAChD,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CAC3B"}
@@ -1,7 +1,8 @@
1
1
  /**
2
2
  * Analytics Provider Interface
3
3
  *
4
- * Defines the contract for analytics providers (console, backend proxy, PostHog, etc.).
5
- * Implemented by both built-in providers and app-custom providers.
4
+ * Defines the contract for the ENGINE's own analytics destinations (console, backend proxy).
5
+ * A vendor (PostHog, …) is a `FRONTEND_PRODUCT_ANALYTICS` provider module instead, reached through
6
+ * its `FrontendProductAnalyticsSink` (#1704).
6
7
  */
7
8
  //# sourceMappingURL=analytics-provider.frontend.interface.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"analytics-provider.frontend.interface.js","sourceRoot":"","sources":["../../../../../../src/core/monitoring/analytics/analytics-provider.frontend.interface.ts"],"names":[],"mappings":"AAAA;;;;;GAKG","sourcesContent":["/**\n * Analytics Provider Interface\n * \n * Defines the contract for analytics providers (console, backend proxy, PostHog, etc.).\n * Implemented by both built-in providers and app-custom providers.\n */\n\nexport interface AnalyticsEvent {\n /** Event name (e.g., 'page_view', 'resource_create', 'feature_blocked') */\n name: string;\n /** Event properties (structured, typed per event) */\n properties?: Record<string, unknown>;\n /** Timestamp (defaults to now) */\n timestamp?: number;\n}\n\nexport interface AnalyticsUserIdentity {\n userId: string;\n organizationId?: string;\n /** User properties for enrichment (role, plan, etc.) */\n traits?: Record<string, unknown>;\n}\n\nexport interface IAnalyticsProvider {\n /** Unique provider name (for logging and debugging) */\n readonly name: string;\n\n /** Initialize the provider (called once, after consent check) */\n initialize(config?: Record<string, unknown>): Promise<void>;\n\n /** Identify the current user (called on login, org switch) */\n identify(identity: AnalyticsUserIdentity): void;\n\n /** Track an event */\n track(event: AnalyticsEvent): void;\n\n /** Track a page view (convenience — could be a track() call internally) */\n page(path: string, properties?: Record<string, unknown>): void;\n\n /** Reset provider state (called on logout or consent revocation) */\n reset(): void;\n\n /** Shutdown provider (called on app unmount) */\n shutdown(): Promise<void>;\n}\n"]}
1
+ {"version":3,"file":"analytics-provider.frontend.interface.js","sourceRoot":"","sources":["../../../../../../src/core/monitoring/analytics/analytics-provider.frontend.interface.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG","sourcesContent":["/**\n * Analytics Provider Interface\n * \n * Defines the contract for the ENGINE's own analytics destinations (console, backend proxy).\n * A vendor (PostHog, …) is a `FRONTEND_PRODUCT_ANALYTICS` provider module instead, reached through\n * its `FrontendProductAnalyticsSink` (#1704).\n */\n\nexport interface AnalyticsEvent {\n /** Event name (e.g., 'page_view', 'resource_create', 'feature_blocked') */\n name: string;\n /** Event properties (structured, typed per event) */\n properties?: Record<string, unknown>;\n /** Timestamp (defaults to now) */\n timestamp?: number;\n}\n\nexport interface AnalyticsUserIdentity {\n userId: string;\n organizationId?: string;\n /** User properties for enrichment (role, plan, etc.) */\n traits?: Record<string, unknown>;\n}\n\nexport interface IAnalyticsProvider {\n /** Unique provider name (for logging and debugging) */\n readonly name: string;\n\n /** Initialize the provider (called once, after consent check) */\n initialize(config?: Record<string, unknown>): Promise<void>;\n\n /** Identify the current user (called on login, org switch) */\n identify(identity: AnalyticsUserIdentity): void;\n\n /** Track an event */\n track(event: AnalyticsEvent): void;\n\n /** Track a page view (convenience — could be a track() call internally) */\n page(path: string, properties?: Record<string, unknown>): void;\n\n /**\n * Forget the person (called on every `USER_LOGOUT`). A destination that buffers sends what it holds\n * under the departing person first, while their consent still holds (#1977).\n */\n reset(): void;\n\n /**\n * Drop anything not yet sent, without sending it (called when the person withdraws the consent the\n * destination rests on). Events collected under a grant are not transmitted after its withdrawal.\n */\n discard(): void;\n\n /** Shutdown provider (called on app unmount) */\n shutdown(): Promise<void>;\n}\n"]}
@@ -14,12 +14,54 @@ export declare class BackendProxyAnalyticsProvider implements IAnalyticsProvider
14
14
  private flushInterval;
15
15
  private httpClient;
16
16
  private identity;
17
+ /**
18
+ * Advances whenever the buffer is abandoned — `reset`, `discard`, or `identify` naming a different person —
19
+ * so a send in flight at that moment that later fails is not put back into a buffer it no longer belongs to.
20
+ */
21
+ private generation;
17
22
  constructor(httpClient: WildoBackendHttpClient_ManualCalls);
18
23
  initialize(config?: Record<string, unknown>): Promise<void>;
24
+ /**
25
+ * Name the person the next events belong to.
26
+ *
27
+ * A buffer can wait indefinitely while its person holds no token of theirs (see `flush`), so what it
28
+ * holds belongs to the identity it was collected under. Should a DIFFERENT person be identified without a
29
+ * `reset` in between, those events are dropped, never sent under the newcomer's identity and token
30
+ * (#1977 review M1). `AnalyticsContextProvider` always resets on `USER_LOGOUT` first, so this is the
31
+ * guard for a caller that does not, not the ordinary path. Events collected before anyone was identified
32
+ * stay: they carry no person, and crediting them to whoever signs in is what `identify` is for.
33
+ */
19
34
  identify(identity: AnalyticsUserIdentity): void;
20
35
  track(event: AnalyticsEvent): void;
21
36
  page(path: string, properties?: Record<string, unknown>): void;
37
+ /**
38
+ * Forget the person — AFTER sending what was buffered under them (#1977).
39
+ *
40
+ * `reset` is how `AnalyticsContextProvider` answers `USER_LOGOUT`, and it tracks the sign-out event
41
+ * immediately before; `track` only buffers, so clearing the buffer here discarded the sign-out event
42
+ * and up to one flush interval of the person's own events. They are sent now, under the departing
43
+ * identity and a credential that is provably THEIRS (see {@link credentialOf}); with none — the backend
44
+ * already ended the session, or the client already holds the next person's token — they cannot be
45
+ * attributed honestly and are dropped. The send is bound to that credential, so a 401 on it is final:
46
+ * it cannot start a token renewal that would race the sign-out and restore the departed session. A
47
+ * failed departure send is never re-buffered into the next person's buffer.
48
+ */
22
49
  reset(): void;
50
+ /**
51
+ * The client's CURRENT token, if it belongs to `identity` — read from the token's own `userId` claim.
52
+ *
53
+ * Not the token held when the person was identified: it rotates, so an hour-old token would be refused.
54
+ * Not simply the current token either: when one person replaces another (#1977 review N2) the client
55
+ * already holds the NEXT person's token, and the backend attributes a batch to the bearer's user, so the
56
+ * departing person's events would be recorded as the next person's. `null` when the two disagree, when
57
+ * no token is held, or when the token cannot be read.
58
+ */
59
+ private credentialOf;
60
+ /**
61
+ * Drop what is buffered without sending it — the person withdrew their consent (#1977 review). Events
62
+ * collected under the grant are not transmitted after it has been withdrawn.
63
+ */
64
+ discard(): void;
23
65
  shutdown(): Promise<void>;
24
66
  private flush;
25
67
  }
@@ -1 +1 @@
1
- {"version":3,"file":"backend-proxy-analytics.provider.d.ts","sourceRoot":"","sources":["../../../../../../../src/core/monitoring/analytics/providers/backend-proxy-analytics.provider.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,qBAAqB,EAAsB,MAAM,uBAAuB,CAAC;AAClF,OAAO,KAAK,EAAE,kBAAkB,EAAE,cAAc,EAAE,qBAAqB,EAAE,MAAM,qFAAqF,CAAC;AACrK,OAAO,KAAK,EAAE,kCAAkC,EAAE,MAAM,mFAAmF,CAAC;AAM5I,qBAAa,6BAA8B,YAAW,kBAAkB;IACtE,QAAQ,CAAC,IAAI,uCAAuC;IACpD,OAAO,CAAC,MAAM,CAAwB;IACtC,OAAO,CAAC,aAAa,CAA+C;IACpE,OAAO,CAAC,UAAU,CAAqC;IACvD,OAAO,CAAC,QAAQ,CAAsC;gBAE1C,UAAU,EAAE,kCAAkC;IAIpD,UAAU,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;IAKjE,QAAQ,CAAC,QAAQ,EAAE,qBAAqB,GAAG,IAAI;IAI/C,KAAK,CAAC,KAAK,EAAE,cAAc,GAAG,IAAI;IAUlC,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI;IAI9D,KAAK,IAAI,IAAI;IAKP,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;YAQjB,KAAK;CAcpB"}
1
+ {"version":3,"file":"backend-proxy-analytics.provider.d.ts","sourceRoot":"","sources":["../../../../../../../src/core/monitoring/analytics/providers/backend-proxy-analytics.provider.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,qBAAqB,EAAsB,MAAM,uBAAuB,CAAC;AAClF,OAAO,KAAK,EAAE,kBAAkB,EAAE,cAAc,EAAE,qBAAqB,EAAE,MAAM,qFAAqF,CAAC;AACrK,OAAO,KAAK,EAAE,kCAAkC,EAAE,MAAM,mFAAmF,CAAC;AAO5I,qBAAa,6BAA8B,YAAW,kBAAkB;IACtE,QAAQ,CAAC,IAAI,uCAAuC;IACpD,OAAO,CAAC,MAAM,CAAwB;IACtC,OAAO,CAAC,aAAa,CAA+C;IACpE,OAAO,CAAC,UAAU,CAAqC;IACvD,OAAO,CAAC,QAAQ,CAAsC;IACtD;;;OAGG;IACH,OAAO,CAAC,UAAU,CAAK;gBAEX,UAAU,EAAE,kCAAkC;IAIpD,UAAU,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;IAKjE;;;;;;;;;OASG;IACH,QAAQ,CAAC,QAAQ,EAAE,qBAAqB,GAAG,IAAI;IAQ/C,KAAK,CAAC,KAAK,EAAE,cAAc,GAAG,IAAI;IAUlC,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI;IAI9D;;;;;;;;;;;OAWG;IACH,KAAK,IAAI,IAAI;IAgBb;;;;;;;;OAQG;IACH,OAAO,CAAC,YAAY;IAUpB;;;OAGG;IACH,OAAO,IAAI,IAAI;IAOT,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;YAQjB,KAAK;CA4BpB"}
@@ -6,6 +6,7 @@
6
6
  * backend needs to aggregate events for internal dashboards.
7
7
  */
8
8
  import { AnalyticsProviderType, AnalyticsEventName } from '@wildo-ai/saas-models';
9
+ import { decodeJwtPayload } from '../../../../core/security/jwt.frontend.utils.js';
9
10
  const MAX_BUFFER_SIZE = 50;
10
11
  const DEFAULT_FLUSH_INTERVAL_MS = 10_000;
11
12
  const FLUSH_THRESHOLD = 20;
@@ -15,6 +16,11 @@ export class BackendProxyAnalyticsProvider {
15
16
  flushInterval = null;
16
17
  httpClient;
17
18
  identity = null;
19
+ /**
20
+ * Advances whenever the buffer is abandoned — `reset`, `discard`, or `identify` naming a different person —
21
+ * so a send in flight at that moment that later fails is not put back into a buffer it no longer belongs to.
22
+ */
23
+ generation = 0;
18
24
  constructor(httpClient) {
19
25
  this.httpClient = httpClient;
20
26
  }
@@ -22,7 +28,21 @@ export class BackendProxyAnalyticsProvider {
22
28
  const flushMs = config?.flushIntervalMs ?? DEFAULT_FLUSH_INTERVAL_MS;
23
29
  this.flushInterval = setInterval(() => this.flush(), flushMs);
24
30
  }
31
+ /**
32
+ * Name the person the next events belong to.
33
+ *
34
+ * A buffer can wait indefinitely while its person holds no token of theirs (see `flush`), so what it
35
+ * holds belongs to the identity it was collected under. Should a DIFFERENT person be identified without a
36
+ * `reset` in between, those events are dropped, never sent under the newcomer's identity and token
37
+ * (#1977 review M1). `AnalyticsContextProvider` always resets on `USER_LOGOUT` first, so this is the
38
+ * guard for a caller that does not, not the ordinary path. Events collected before anyone was identified
39
+ * stay: they carry no person, and crediting them to whoever signs in is what `identify` is for.
40
+ */
25
41
  identify(identity) {
42
+ if (this.identity !== null && this.identity.userId !== identity.userId) {
43
+ this.buffer = [];
44
+ this.generation += 1;
45
+ }
26
46
  this.identity = identity;
27
47
  }
28
48
  track(event) {
@@ -37,9 +57,60 @@ export class BackendProxyAnalyticsProvider {
37
57
  page(path, properties) {
38
58
  this.track({ name: AnalyticsEventName.PAGE_VIEW, properties: { path, ...properties } });
39
59
  }
60
+ /**
61
+ * Forget the person — AFTER sending what was buffered under them (#1977).
62
+ *
63
+ * `reset` is how `AnalyticsContextProvider` answers `USER_LOGOUT`, and it tracks the sign-out event
64
+ * immediately before; `track` only buffers, so clearing the buffer here discarded the sign-out event
65
+ * and up to one flush interval of the person's own events. They are sent now, under the departing
66
+ * identity and a credential that is provably THEIRS (see {@link credentialOf}); with none — the backend
67
+ * already ended the session, or the client already holds the next person's token — they cannot be
68
+ * attributed honestly and are dropped. The send is bound to that credential, so a 401 on it is final:
69
+ * it cannot start a token renewal that would race the sign-out and restore the departed session. A
70
+ * failed departure send is never re-buffered into the next person's buffer.
71
+ */
40
72
  reset() {
73
+ const departing = this.buffer;
74
+ const departingIdentity = this.identity;
75
+ const departingCredential = this.credentialOf(departingIdentity);
76
+ this.generation += 1;
41
77
  this.buffer = [];
42
78
  this.identity = null;
79
+ if (departing.length === 0 || departingCredential === null)
80
+ return;
81
+ void this.httpClient
82
+ .postAnalyticsEvents({ events: departing, userId: departingIdentity?.userId }, { sessionBoundCredential: departingCredential, silent: true })
83
+ .catch(() => { });
84
+ }
85
+ /**
86
+ * The client's CURRENT token, if it belongs to `identity` — read from the token's own `userId` claim.
87
+ *
88
+ * Not the token held when the person was identified: it rotates, so an hour-old token would be refused.
89
+ * Not simply the current token either: when one person replaces another (#1977 review N2) the client
90
+ * already holds the NEXT person's token, and the backend attributes a batch to the bearer's user, so the
91
+ * departing person's events would be recorded as the next person's. `null` when the two disagree, when
92
+ * no token is held, or when the token cannot be read.
93
+ */
94
+ credentialOf(identity) {
95
+ const token = this.httpClient.getAuthToken();
96
+ if (!token || !identity)
97
+ return null;
98
+ try {
99
+ return decodeJwtPayload(token).userId === identity.userId ? token : null;
100
+ }
101
+ catch {
102
+ return null;
103
+ }
104
+ }
105
+ /**
106
+ * Drop what is buffered without sending it — the person withdrew their consent (#1977 review). Events
107
+ * collected under the grant are not transmitted after it has been withdrawn.
108
+ */
109
+ discard() {
110
+ this.buffer = [];
111
+ // A periodic send in flight now must not be re-buffered on failure, or `shutdown` would send it after
112
+ // the grant was withdrawn (#1977 review L1).
113
+ this.generation += 1;
43
114
  }
44
115
  async shutdown() {
45
116
  if (this.flushInterval) {
@@ -51,16 +122,29 @@ export class BackendProxyAnalyticsProvider {
51
122
  async flush() {
52
123
  if (this.buffer.length === 0)
53
124
  return;
125
+ // Bound to the credential of the person the events belong to, read NOW: the request's interceptors run
126
+ // later, and the person may have changed by then. When a person is identified but the client holds no
127
+ // token of theirs — the next person's already, or none — the events wait: sending them unbound would
128
+ // credit them to whoever the client's token names (#1977 review). `reset` then drops them if the person
129
+ // has gone. Unidentified events are sent as they are.
130
+ const credential = this.credentialOf(this.identity);
131
+ if (this.identity !== null && credential === null) {
132
+ this.buffer = this.buffer.slice(-MAX_BUFFER_SIZE);
133
+ return;
134
+ }
54
135
  const events = [...this.buffer];
136
+ const generation = this.generation;
55
137
  this.buffer = [];
56
138
  try {
57
- await this.httpClient.postAnalyticsEvents({
58
- events,
59
- userId: this.identity?.userId,
60
- });
139
+ await this.httpClient.postAnalyticsEvents({ events, userId: this.identity?.userId },
140
+ // Silent: a refused analytics send is re-buffered, never surfaced to the reader as an error.
141
+ credential === null ? { silent: true } : { sessionBoundCredential: credential, silent: true });
61
142
  }
62
143
  catch {
63
- // Re-buffer on failure (with cap to prevent memory leak)
144
+ // Re-buffer on failure (with cap to prevent memory leak) — unless the person changed meanwhile, whose
145
+ // events must not be sent under the next identity.
146
+ if (generation !== this.generation)
147
+ return;
64
148
  this.buffer = [...events.slice(-MAX_BUFFER_SIZE), ...this.buffer].slice(0, MAX_BUFFER_SIZE);
65
149
  }
66
150
  }
@@ -1 +1 @@
1
- {"version":3,"file":"backend-proxy-analytics.provider.js","sourceRoot":"","sources":["../../../../../../../src/core/monitoring/analytics/providers/backend-proxy-analytics.provider.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,qBAAqB,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AAIlF,MAAM,eAAe,GAAG,EAAE,CAAC;AAC3B,MAAM,yBAAyB,GAAG,MAAM,CAAC;AACzC,MAAM,eAAe,GAAG,EAAE,CAAC;AAE3B,MAAM,OAAO,6BAA6B;IAC/B,IAAI,GAAG,qBAAqB,CAAC,aAAa,CAAC;IAC5C,MAAM,GAAqB,EAAE,CAAC;IAC9B,aAAa,GAA0C,IAAI,CAAC;IAC5D,UAAU,CAAqC;IAC/C,QAAQ,GAAiC,IAAI,CAAC;IAEtD,YAAY,UAA8C;QACxD,IAAI,CAAC,UAAU,GAAG,UAAU,CAAC;IAC/B,CAAC;IAED,KAAK,CAAC,UAAU,CAAC,MAAgC;QAC/C,MAAM,OAAO,GAAI,MAAM,EAAE,eAA0B,IAAI,yBAAyB,CAAC;QACjF,IAAI,CAAC,aAAa,GAAG,WAAW,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,KAAK,EAAE,EAAE,OAAO,CAAC,CAAC;IAChE,CAAC;IAED,QAAQ,CAAC,QAA+B;QACtC,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC;IAC3B,CAAC;IAED,KAAK,CAAC,KAAqB;QACzB,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC;YACf,GAAG,KAAK;YACR,SAAS,EAAE,KAAK,CAAC,SAAS,IAAI,IAAI,CAAC,GAAG,EAAE;SACzC,CAAC,CAAC;QACH,IAAI,IAAI,CAAC,MAAM,CAAC,MAAM,IAAI,eAAe,EAAE,CAAC;YAC1C,IAAI,CAAC,KAAK,EAAE,CAAC;QACf,CAAC;IACH,CAAC;IAED,IAAI,CAAC,IAAY,EAAE,UAAoC;QACrD,IAAI,CAAC,KAAK,CAAC,EAAE,IAAI,EAAE,kBAAkB,CAAC,SAAS,EAAE,UAAU,EAAE,EAAE,IAAI,EAAE,GAAG,UAAU,EAAE,EAAE,CAAC,CAAC;IAC1F,CAAC;IAED,KAAK;QACH,IAAI,CAAC,MAAM,GAAG,EAAE,CAAC;QACjB,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC;IACvB,CAAC;IAED,KAAK,CAAC,QAAQ;QACZ,IAAI,IAAI,CAAC,aAAa,EAAE,CAAC;YACvB,aAAa,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;YAClC,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC;QAC5B,CAAC;QACD,MAAM,IAAI,CAAC,KAAK,EAAE,CAAC;IACrB,CAAC;IAEO,KAAK,CAAC,KAAK;QACjB,IAAI,IAAI,CAAC,MAAM,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO;QACrC,MAAM,MAAM,GAAG,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC;QAChC,IAAI,CAAC,MAAM,GAAG,EAAE,CAAC;QACjB,IAAI,CAAC;YACH,MAAM,IAAI,CAAC,UAAU,CAAC,mBAAmB,CAAC;gBACxC,MAAM;gBACN,MAAM,EAAE,IAAI,CAAC,QAAQ,EAAE,MAAM;aAC9B,CAAC,CAAC;QACL,CAAC;QAAC,MAAM,CAAC;YACP,yDAAyD;YACzD,IAAI,CAAC,MAAM,GAAG,CAAC,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,eAAe,CAAC,EAAE,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,eAAe,CAAC,CAAC;QAC9F,CAAC;IACH,CAAC;CACF","sourcesContent":["/**\n * Backend Proxy Analytics Provider\n * \n * Sends events to the backend analytics ingestion endpoint.\n * Useful when ad-blockers block client-side analytics or when\n * backend needs to aggregate events for internal dashboards.\n */\n\nimport { AnalyticsProviderType, AnalyticsEventName } from '@wildo-ai/saas-models';\nimport type { IAnalyticsProvider, AnalyticsEvent, AnalyticsUserIdentity } from '~wildo-frontend-lib/core/monitoring/analytics/analytics-provider.frontend.interface';\nimport type { WildoBackendHttpClient_ManualCalls } from '~wildo-frontend-lib/core/requests/wildo-http-client-manual-calls.frontend.service';\n\nconst MAX_BUFFER_SIZE = 50;\nconst DEFAULT_FLUSH_INTERVAL_MS = 10_000;\nconst FLUSH_THRESHOLD = 20;\n\nexport class BackendProxyAnalyticsProvider implements IAnalyticsProvider {\n readonly name = AnalyticsProviderType.BACKEND_PROXY;\n private buffer: AnalyticsEvent[] = [];\n private flushInterval: ReturnType<typeof setInterval> | null = null;\n private httpClient: WildoBackendHttpClient_ManualCalls;\n private identity: AnalyticsUserIdentity | null = null;\n\n constructor(httpClient: WildoBackendHttpClient_ManualCalls) {\n this.httpClient = httpClient;\n }\n\n async initialize(config?: Record<string, unknown>): Promise<void> {\n const flushMs = (config?.flushIntervalMs as number) ?? DEFAULT_FLUSH_INTERVAL_MS;\n this.flushInterval = setInterval(() => this.flush(), flushMs);\n }\n\n identify(identity: AnalyticsUserIdentity): void {\n this.identity = identity;\n }\n\n track(event: AnalyticsEvent): void {\n this.buffer.push({\n ...event,\n timestamp: event.timestamp ?? Date.now(),\n });\n if (this.buffer.length >= FLUSH_THRESHOLD) {\n this.flush();\n }\n }\n\n page(path: string, properties?: Record<string, unknown>): void {\n this.track({ name: AnalyticsEventName.PAGE_VIEW, properties: { path, ...properties } });\n }\n\n reset(): void {\n this.buffer = [];\n this.identity = null;\n }\n\n async shutdown(): Promise<void> {\n if (this.flushInterval) {\n clearInterval(this.flushInterval);\n this.flushInterval = null;\n }\n await this.flush();\n }\n\n private async flush(): Promise<void> {\n if (this.buffer.length === 0) return;\n const events = [...this.buffer];\n this.buffer = [];\n try {\n await this.httpClient.postAnalyticsEvents({\n events,\n userId: this.identity?.userId,\n });\n } catch {\n // Re-buffer on failure (with cap to prevent memory leak)\n this.buffer = [...events.slice(-MAX_BUFFER_SIZE), ...this.buffer].slice(0, MAX_BUFFER_SIZE);\n }\n }\n}\n"]}
1
+ {"version":3,"file":"backend-proxy-analytics.provider.js","sourceRoot":"","sources":["../../../../../../../src/core/monitoring/analytics/providers/backend-proxy-analytics.provider.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,qBAAqB,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AAGlF,OAAO,EAAE,gBAAgB,EAAE,MAAM,sDAAsD,CAAC;AAExF,MAAM,eAAe,GAAG,EAAE,CAAC;AAC3B,MAAM,yBAAyB,GAAG,MAAM,CAAC;AACzC,MAAM,eAAe,GAAG,EAAE,CAAC;AAE3B,MAAM,OAAO,6BAA6B;IAC/B,IAAI,GAAG,qBAAqB,CAAC,aAAa,CAAC;IAC5C,MAAM,GAAqB,EAAE,CAAC;IAC9B,aAAa,GAA0C,IAAI,CAAC;IAC5D,UAAU,CAAqC;IAC/C,QAAQ,GAAiC,IAAI,CAAC;IACtD;;;OAGG;IACK,UAAU,GAAG,CAAC,CAAC;IAEvB,YAAY,UAA8C;QACxD,IAAI,CAAC,UAAU,GAAG,UAAU,CAAC;IAC/B,CAAC;IAED,KAAK,CAAC,UAAU,CAAC,MAAgC;QAC/C,MAAM,OAAO,GAAI,MAAM,EAAE,eAA0B,IAAI,yBAAyB,CAAC;QACjF,IAAI,CAAC,aAAa,GAAG,WAAW,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,KAAK,EAAE,EAAE,OAAO,CAAC,CAAC;IAChE,CAAC;IAED;;;;;;;;;OASG;IACH,QAAQ,CAAC,QAA+B;QACtC,IAAI,IAAI,CAAC,QAAQ,KAAK,IAAI,IAAI,IAAI,CAAC,QAAQ,CAAC,MAAM,KAAK,QAAQ,CAAC,MAAM,EAAE,CAAC;YACvE,IAAI,CAAC,MAAM,GAAG,EAAE,CAAC;YACjB,IAAI,CAAC,UAAU,IAAI,CAAC,CAAC;QACvB,CAAC;QACD,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC;IAC3B,CAAC;IAED,KAAK,CAAC,KAAqB;QACzB,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC;YACf,GAAG,KAAK;YACR,SAAS,EAAE,KAAK,CAAC,SAAS,IAAI,IAAI,CAAC,GAAG,EAAE;SACzC,CAAC,CAAC;QACH,IAAI,IAAI,CAAC,MAAM,CAAC,MAAM,IAAI,eAAe,EAAE,CAAC;YAC1C,IAAI,CAAC,KAAK,EAAE,CAAC;QACf,CAAC;IACH,CAAC;IAED,IAAI,CAAC,IAAY,EAAE,UAAoC;QACrD,IAAI,CAAC,KAAK,CAAC,EAAE,IAAI,EAAE,kBAAkB,CAAC,SAAS,EAAE,UAAU,EAAE,EAAE,IAAI,EAAE,GAAG,UAAU,EAAE,EAAE,CAAC,CAAC;IAC1F,CAAC;IAED;;;;;;;;;;;OAWG;IACH,KAAK;QACH,MAAM,SAAS,GAAG,IAAI,CAAC,MAAM,CAAC;QAC9B,MAAM,iBAAiB,GAAG,IAAI,CAAC,QAAQ,CAAC;QACxC,MAAM,mBAAmB,GAAG,IAAI,CAAC,YAAY,CAAC,iBAAiB,CAAC,CAAC;QACjE,IAAI,CAAC,UAAU,IAAI,CAAC,CAAC;QACrB,IAAI,CAAC,MAAM,GAAG,EAAE,CAAC;QACjB,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC;QACrB,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC,IAAI,mBAAmB,KAAK,IAAI;YAAE,OAAO;QACnE,KAAK,IAAI,CAAC,UAAU;aACjB,mBAAmB,CAClB,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,iBAAiB,EAAE,MAAM,EAAE,EACxD,EAAE,sBAAsB,EAAE,mBAAmB,EAAE,MAAM,EAAE,IAAI,EAAE,CAC9D;aACA,KAAK,CAAC,GAAG,EAAE,GAA6D,CAAC,CAAC,CAAC;IAChF,CAAC;IAED;;;;;;;;OAQG;IACK,YAAY,CAAC,QAAsC;QACzD,MAAM,KAAK,GAAG,IAAI,CAAC,UAAU,CAAC,YAAY,EAAE,CAAC;QAC7C,IAAI,CAAC,KAAK,IAAI,CAAC,QAAQ;YAAE,OAAO,IAAI,CAAC;QACrC,IAAI,CAAC;YACH,OAAO,gBAAgB,CAAuB,KAAK,CAAC,CAAC,MAAM,KAAK,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC;QACjG,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,IAAI,CAAC;QACd,CAAC;IACH,CAAC;IAED;;;OAGG;IACH,OAAO;QACL,IAAI,CAAC,MAAM,GAAG,EAAE,CAAC;QACjB,sGAAsG;QACtG,6CAA6C;QAC7C,IAAI,CAAC,UAAU,IAAI,CAAC,CAAC;IACvB,CAAC;IAED,KAAK,CAAC,QAAQ;QACZ,IAAI,IAAI,CAAC,aAAa,EAAE,CAAC;YACvB,aAAa,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;YAClC,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC;QAC5B,CAAC;QACD,MAAM,IAAI,CAAC,KAAK,EAAE,CAAC;IACrB,CAAC;IAEO,KAAK,CAAC,KAAK;QACjB,IAAI,IAAI,CAAC,MAAM,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO;QACrC,uGAAuG;QACvG,sGAAsG;QACtG,qGAAqG;QACrG,wGAAwG;QACxG,sDAAsD;QACtD,MAAM,UAAU,GAAG,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QACpD,IAAI,IAAI,CAAC,QAAQ,KAAK,IAAI,IAAI,UAAU,KAAK,IAAI,EAAE,CAAC;YAClD,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,eAAe,CAAC,CAAC;YAClD,OAAO;QACT,CAAC;QACD,MAAM,MAAM,GAAG,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC;QAChC,MAAM,UAAU,GAAG,IAAI,CAAC,UAAU,CAAC;QACnC,IAAI,CAAC,MAAM,GAAG,EAAE,CAAC;QACjB,IAAI,CAAC;YACH,MAAM,IAAI,CAAC,UAAU,CAAC,mBAAmB,CACvC,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,CAAC,QAAQ,EAAE,MAAM,EAAE;YACzC,6FAA6F;YAC7F,UAAU,KAAK,IAAI,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,sBAAsB,EAAE,UAAU,EAAE,MAAM,EAAE,IAAI,EAAE,CAC9F,CAAC;QACJ,CAAC;QAAC,MAAM,CAAC;YACP,sGAAsG;YACtG,mDAAmD;YACnD,IAAI,UAAU,KAAK,IAAI,CAAC,UAAU;gBAAE,OAAO;YAC3C,IAAI,CAAC,MAAM,GAAG,CAAC,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,eAAe,CAAC,EAAE,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,eAAe,CAAC,CAAC;QAC9F,CAAC;IACH,CAAC;CACF","sourcesContent":["/**\n * Backend Proxy Analytics Provider\n * \n * Sends events to the backend analytics ingestion endpoint.\n * Useful when ad-blockers block client-side analytics or when\n * backend needs to aggregate events for internal dashboards.\n */\n\nimport { AnalyticsProviderType, AnalyticsEventName } from '@wildo-ai/saas-models';\nimport type { IAnalyticsProvider, AnalyticsEvent, AnalyticsUserIdentity } from '~wildo-frontend-lib/core/monitoring/analytics/analytics-provider.frontend.interface';\nimport type { WildoBackendHttpClient_ManualCalls } from '~wildo-frontend-lib/core/requests/wildo-http-client-manual-calls.frontend.service';\nimport { decodeJwtPayload } from '~wildo-frontend-lib/core/security/jwt.frontend.utils';\n\nconst MAX_BUFFER_SIZE = 50;\nconst DEFAULT_FLUSH_INTERVAL_MS = 10_000;\nconst FLUSH_THRESHOLD = 20;\n\nexport class BackendProxyAnalyticsProvider implements IAnalyticsProvider {\n readonly name = AnalyticsProviderType.BACKEND_PROXY;\n private buffer: AnalyticsEvent[] = [];\n private flushInterval: ReturnType<typeof setInterval> | null = null;\n private httpClient: WildoBackendHttpClient_ManualCalls;\n private identity: AnalyticsUserIdentity | null = null;\n /**\n * Advances whenever the buffer is abandoned — `reset`, `discard`, or `identify` naming a different person —\n * so a send in flight at that moment that later fails is not put back into a buffer it no longer belongs to.\n */\n private generation = 0;\n\n constructor(httpClient: WildoBackendHttpClient_ManualCalls) {\n this.httpClient = httpClient;\n }\n\n async initialize(config?: Record<string, unknown>): Promise<void> {\n const flushMs = (config?.flushIntervalMs as number) ?? DEFAULT_FLUSH_INTERVAL_MS;\n this.flushInterval = setInterval(() => this.flush(), flushMs);\n }\n\n /**\n * Name the person the next events belong to.\n *\n * A buffer can wait indefinitely while its person holds no token of theirs (see `flush`), so what it\n * holds belongs to the identity it was collected under. Should a DIFFERENT person be identified without a\n * `reset` in between, those events are dropped, never sent under the newcomer's identity and token\n * (#1977 review M1). `AnalyticsContextProvider` always resets on `USER_LOGOUT` first, so this is the\n * guard for a caller that does not, not the ordinary path. Events collected before anyone was identified\n * stay: they carry no person, and crediting them to whoever signs in is what `identify` is for.\n */\n identify(identity: AnalyticsUserIdentity): void {\n if (this.identity !== null && this.identity.userId !== identity.userId) {\n this.buffer = [];\n this.generation += 1;\n }\n this.identity = identity;\n }\n\n track(event: AnalyticsEvent): void {\n this.buffer.push({\n ...event,\n timestamp: event.timestamp ?? Date.now(),\n });\n if (this.buffer.length >= FLUSH_THRESHOLD) {\n this.flush();\n }\n }\n\n page(path: string, properties?: Record<string, unknown>): void {\n this.track({ name: AnalyticsEventName.PAGE_VIEW, properties: { path, ...properties } });\n }\n\n /**\n * Forget the person — AFTER sending what was buffered under them (#1977).\n *\n * `reset` is how `AnalyticsContextProvider` answers `USER_LOGOUT`, and it tracks the sign-out event\n * immediately before; `track` only buffers, so clearing the buffer here discarded the sign-out event\n * and up to one flush interval of the person's own events. They are sent now, under the departing\n * identity and a credential that is provably THEIRS (see {@link credentialOf}); with none — the backend\n * already ended the session, or the client already holds the next person's token — they cannot be\n * attributed honestly and are dropped. The send is bound to that credential, so a 401 on it is final:\n * it cannot start a token renewal that would race the sign-out and restore the departed session. A\n * failed departure send is never re-buffered into the next person's buffer.\n */\n reset(): void {\n const departing = this.buffer;\n const departingIdentity = this.identity;\n const departingCredential = this.credentialOf(departingIdentity);\n this.generation += 1;\n this.buffer = [];\n this.identity = null;\n if (departing.length === 0 || departingCredential === null) return;\n void this.httpClient\n .postAnalyticsEvents(\n { events: departing, userId: departingIdentity?.userId },\n { sessionBoundCredential: departingCredential, silent: true },\n )\n .catch(() => { /* the session is over; nothing to re-buffer them into */ });\n }\n\n /**\n * The client's CURRENT token, if it belongs to `identity` — read from the token's own `userId` claim.\n *\n * Not the token held when the person was identified: it rotates, so an hour-old token would be refused.\n * Not simply the current token either: when one person replaces another (#1977 review N2) the client\n * already holds the NEXT person's token, and the backend attributes a batch to the bearer's user, so the\n * departing person's events would be recorded as the next person's. `null` when the two disagree, when\n * no token is held, or when the token cannot be read.\n */\n private credentialOf(identity: AnalyticsUserIdentity | null): string | null {\n const token = this.httpClient.getAuthToken();\n if (!token || !identity) return null;\n try {\n return decodeJwtPayload<{ userId?: unknown }>(token).userId === identity.userId ? token : null;\n } catch {\n return null;\n }\n }\n\n /**\n * Drop what is buffered without sending it — the person withdrew their consent (#1977 review). Events\n * collected under the grant are not transmitted after it has been withdrawn.\n */\n discard(): void {\n this.buffer = [];\n // A periodic send in flight now must not be re-buffered on failure, or `shutdown` would send it after\n // the grant was withdrawn (#1977 review L1).\n this.generation += 1;\n }\n\n async shutdown(): Promise<void> {\n if (this.flushInterval) {\n clearInterval(this.flushInterval);\n this.flushInterval = null;\n }\n await this.flush();\n }\n\n private async flush(): Promise<void> {\n if (this.buffer.length === 0) return;\n // Bound to the credential of the person the events belong to, read NOW: the request's interceptors run\n // later, and the person may have changed by then. When a person is identified but the client holds no\n // token of theirs — the next person's already, or none — the events wait: sending them unbound would\n // credit them to whoever the client's token names (#1977 review). `reset` then drops them if the person\n // has gone. Unidentified events are sent as they are.\n const credential = this.credentialOf(this.identity);\n if (this.identity !== null && credential === null) {\n this.buffer = this.buffer.slice(-MAX_BUFFER_SIZE);\n return;\n }\n const events = [...this.buffer];\n const generation = this.generation;\n this.buffer = [];\n try {\n await this.httpClient.postAnalyticsEvents(\n { events, userId: this.identity?.userId },\n // Silent: a refused analytics send is re-buffered, never surfaced to the reader as an error.\n credential === null ? { silent: true } : { sessionBoundCredential: credential, silent: true },\n );\n } catch {\n // Re-buffer on failure (with cap to prevent memory leak) — unless the person changed meanwhile, whose\n // events must not be sent under the next identity.\n if (generation !== this.generation) return;\n this.buffer = [...events.slice(-MAX_BUFFER_SIZE), ...this.buffer].slice(0, MAX_BUFFER_SIZE);\n }\n }\n}\n"]}