@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":"WebSocketEventBridge.js","sourceRoot":"","sources":["../../../../../../src/core/requests/websockets/WebSocketEventBridge.tsx"],"names":[],"mappings":"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","sourcesContent":["import React, { useEffect, useMemo } from 'react';\nimport { useWebSocket } from './useWebSocket';\nimport { useEventBus } from '~wildo-frontend-lib/core/events/useEventBus';\nimport { useResourceRegistry } from '~wildo-frontend-lib/core/resources/useResourceRegistry';\nimport { WebSocketResourceValidationService } from './websocket-resource-validation.frontend.service';\nimport { \n FrontendEvents, \n FrontendEventResourceOperation, \n FrontendEventBadgeCountChanged,\n FrontendEventResourceEditing,\n FrontendEventResourceCustom,\n FrontendEventNotifyCustom,\n type FrontendEvent_AnalyticsMomentAchieved,\n type FrontendEvent_MilestoneAchieved,\n type FrontendEvent_ProgressionUpdated,\n type FrontendEvent_LifecycleStageChanged,\n} from '~wildo-frontend-lib/core/events/events.frontend.schemas';\nimport {\n AnalyticsTriggerSource,\n CoreResourceOperation,\n CoreWebSocketEvent,\n WS_ResourceDeletedPayload,\n WS_ResourceNotificationPayload,\n WS_ResourceUpdatedPayload,\n WS_BadgeUpdatePayload,\n WS_BulkJobProgressPayload,\n WS_ResourceEditingPayload,\n WS_ResourceCustomEventPayload,\n WS_UserNotificationPayload,\n WS_AnalyticsMomentAchievedPayload,\n NotificationLevel,\n ResourceAction,\n ResourceOperationVariantType,\n ResourcesConfig_OperationPathUtils,\n OnboardingStatus,\n WebSocketResourceDeliveryTarget,\n type WS_GuidanceStateChangedPayload,\n type WS_MilestoneAchievedPayload,\n type WS_ProgressionUpdatedPayload,\n type WS_LifecycleStageChangedPayload,\n} from '@wildo-ai/saas-models';\nimport { getOperationsForCoreSemantic } from '~wildo-frontend-lib/core/resources/operation-semantics.frontend.utils';\nimport { frontendResourceUtils, FrontendResourceUtils } from '~wildo-frontend-lib/core/resources/frontend-resource.utils';\nimport { isFrontendOperationAddressableForCurrentContext } from '~wildo-frontend-lib/core/resources/resource-addressability.frontend.utils';\nimport { operationInitiatorParametersSatisfied } from '~wildo-frontend-lib/core/resources/operation-initiator-satisfaction.frontend.utils';\nimport {\n normalizeContextResourceIdentifiersForTransport,\n type ContextResourceIdentifiersInput,\n} from '~wildo-frontend-lib/core/resources/context-resource-identifiers.frontend.utils';\n\n/**\n * WebSocketEventBridge\n * \n * Bridges WebSocket events from the Socket.IO connection to the Frontend EventBus.\n * This component should be mounted once at the app root level, after both\n * WebSocketProvider and EventBusProvider.\n * \n * Events bridged:\n * - resource:notification → RESOURCE_REFRESH, NOTIFY_RESOURCE_*\n * - resource:updated → RESOURCE_REFRESH\n * - resource:deleted → RESOURCE_REFRESH\n * - badge:update → BADGE_COUNT_CHANGED\n * - bulk-job:progress → BULK_JOB_PROGRESS\n * - guidance:state-changed → GUIDANCE_FLOW_ACTIVATED/COMPLETED/DISMISSED\n * \n * Business logic components can then subscribe to EventBus events without\n * knowing the event source (HTTP response, WebSocket, or other).\n */\nexport const WebSocketEventBridge: React.FC = () => {\n const { on, isConnected } = useWebSocket();\n const eventBus = useEventBus();\n const { getResourcesRegistry } = useResourceRegistry();\n const registry = useMemo(() => getResourcesRegistry(), [getResourcesRegistry]);\n\n // Initialize the validation service used by websocket payloads that carry\n // resource-shaped data.\n const validationService = useMemo(() => {\n return new WebSocketResourceValidationService(registry);\n }, [registry]);\n\n useEffect(() => {\n if (!isConnected) {\n return;\n }\n\n // Helper: Map action to default notification level (fallback when notificationLevel not provided)\n const actionToNotificationLevel = (action: ResourceAction | string): NotificationLevel => {\n switch (action) {\n case ResourceAction.CREATED: return NotificationLevel.SUCCESS;\n case ResourceAction.UPDATED: return NotificationLevel.INFO;\n case ResourceAction.DELETED: return NotificationLevel.WARNING;\n default: return NotificationLevel.INFO;\n }\n };\n\n const resolveOperationFromPayload = (params: {\n resourceType: string;\n operationIdentifier: string;\n operationPathKey?: string;\n variantType?: ResourceOperationVariantType;\n isOperationDefault?: boolean;\n isBulkOperation?: boolean;\n variantKey?: string;\n }) => {\n const operations = registry.resourceConfigurations[params.resourceType]?.operations ?? [];\n if (params.operationPathKey) {\n const pathOperation = operations.find((operation) => {\n try {\n return ResourcesConfig_OperationPathUtils.createOperationPathKeyFromOperation(operation) === params.operationPathKey;\n } catch {\n return false;\n }\n });\n if (pathOperation) {\n return pathOperation;\n }\n }\n\n const matchingOperations = operations.filter((operation) => (\n String(operation.operationIdentifier) === params.operationIdentifier\n && (params.variantType == null || operation.variantType === params.variantType)\n && (params.variantKey == null || operation.variantKey === params.variantKey)\n && (params.isBulkOperation == null || (operation.isBulkOperation === true) === params.isBulkOperation)\n && (\n params.isOperationDefault == null\n || Boolean(operation.isOperationDefault) === params.isOperationDefault\n )\n ));\n\n if (matchingOperations.length === 1) {\n return matchingOperations[0];\n }\n\n if (matchingOperations.length > 1) {\n console.warn('[WebSocketEventBridge] Ambiguous operation identity in notification payload; emitting minimal operation context.', {\n resourceType: params.resourceType,\n operationIdentifier: params.operationIdentifier,\n variantType: params.variantType,\n variantKey: params.variantKey,\n isOperationDefault: params.isOperationDefault,\n isBulkOperation: params.isBulkOperation,\n candidateVariants: matchingOperations.map((operation) => ({\n variantType: operation.variantType,\n variantKey: operation.variantKey,\n isOperationDefault: operation.isOperationDefault,\n isBulkOperation: operation.isBulkOperation,\n })),\n });\n }\n\n // Some websocket producers only carry operation identity fields, not the\n // full authored operation object. Rebuild the minimum shape the EventBus\n // contracts expect so downstream consumers can still reason about variant,\n // default-ness, and bulk semantics consistently.\n return {\n operationIdentifier: params.operationIdentifier,\n variantType: params.variantType,\n isOperationDefault: params.isOperationDefault,\n isBulkOperation: params.isBulkOperation,\n variantKey: params.variantKey,\n };\n };\n\n const emitRefreshPayloads = ({\n resourceType,\n resourceIds,\n contextResourceIdentifiers,\n shouldEmitReadRefresh,\n }: {\n resourceType: string;\n resourceIds?: Array<string | null | undefined>;\n contextResourceIdentifiers?: ContextResourceIdentifiersInput;\n shouldEmitReadRefresh: boolean;\n }): void => {\n const resourceConfig = registry.resourceConfigurations[resourceType];\n const flattenedContextIdentifiers = normalizeContextResourceIdentifiersForTransport(\n contextResourceIdentifiers,\n );\n const normalizedContextIdentifiers = Object.fromEntries(\n Object.entries(flattenedContextIdentifiers).flatMap(([identifierKey, resourceIdentifier]) => {\n const normalizedKey = registry.fieldIdentifierToResourceType?.[identifierKey] ?? identifierKey;\n return normalizedKey === identifierKey\n ? [[identifierKey, resourceIdentifier]]\n : [\n [identifierKey, resourceIdentifier],\n [normalizedKey, resourceIdentifier],\n ];\n }),\n );\n const baseContextIdentifiers = {\n ...normalizedContextIdentifiers,\n };\n delete baseContextIdentifiers[resourceType];\n const baseContextualParameters = FrontendResourceUtils.buildContextualParameters(\n baseContextIdentifiers,\n registry,\n );\n\n // This bridge owns generic cache/list/read invalidation only. It does not\n // try to replay authoritative resource data into local state; richer sync\n // semantics stay in the dedicated RMM websocket bridge. The consumers here\n // are generic RESOURCE_REFRESH listeners such as non-RMM readers, list\n // surfaces, and cache invalidation hooks.\n const listOperations = getOperationsForCoreSemantic(\n resourceConfig?.operations ?? [],\n CoreResourceOperation.LIST,\n ).filter((listOperation) =>\n operationInitiatorParametersSatisfied({\n operation: listOperation,\n contextResourceIdentifiers: baseContextIdentifiers,\n contextualParameters: baseContextualParameters,\n })\n );\n const listRefreshTargets = listOperations.length > 0\n ? listOperations\n : [null];\n const baseParentResourcesRequirements = frontendResourceUtils.buildParentResourcesRequirements(\n resourceType as any,\n baseContextIdentifiers,\n registry,\n );\n\n for (const listOperation of listRefreshTargets) {\n eventBus.emit(FrontendEvents.RESOURCE_REFRESH, {\n resourceType,\n operationIdentifier: String(listOperation?.operationIdentifier ?? CoreResourceOperation.LIST),\n variantType: listOperation?.variantType,\n isOperationDefault: listOperation?.isOperationDefault ?? true,\n isBulkOperation: listOperation?.isBulkOperation ?? false,\n variantKey: listOperation?.variantKey,\n contextResourceIdentifiers: baseContextIdentifiers,\n parentResourcesRequirements: baseParentResourcesRequirements,\n operation: (listOperation ?? { operationIdentifier: CoreResourceOperation.LIST }) as any,\n });\n }\n\n const validReadResourceIds = Array.from(new Set(\n (resourceIds ?? []).filter((resourceId): resourceId is string => typeof resourceId === 'string' && resourceId.length > 0),\n ));\n\n if (!shouldEmitReadRefresh || validReadResourceIds.length === 0) {\n return;\n }\n\n const readOperations = getOperationsForCoreSemantic(\n resourceConfig?.operations ?? [],\n CoreResourceOperation.READ,\n {\n requireAddressable: true,\n },\n );\n const emittedReadOperationKeys = new Set<string>();\n\n for (const resourceId of validReadResourceIds) {\n const readContextIdentifiers = {\n ...baseContextIdentifiers,\n [resourceType]: resourceId,\n };\n const readContextualParameters = FrontendResourceUtils.buildContextualParameters(\n readContextIdentifiers,\n registry,\n );\n const readParentResourcesRequirements = frontendResourceUtils.buildParentResourcesRequirements(\n resourceType as any,\n readContextIdentifiers,\n registry,\n );\n const addressableReadOperations = readOperations.filter((readOperation) =>\n resourceConfig\n ? isFrontendOperationAddressableForCurrentContext({\n resourceConfig,\n operation: readOperation,\n registry,\n hasResourceId: true,\n contextResourceIdentifiers: readContextIdentifiers,\n contextualParameters: readContextualParameters,\n })\n : true\n );\n const readRefreshTargets = addressableReadOperations.length > 0\n ? addressableReadOperations\n : [null];\n\n for (const readOperation of readRefreshTargets) {\n const readOperationContext = readOperation\n ?? ({ operationIdentifier: CoreResourceOperation.READ } as any);\n const readOperationKey = [\n resourceId,\n String(readOperationContext.operationIdentifier),\n readOperationContext.variantType ?? '',\n readOperationContext.variantKey ?? '',\n readOperationContext.isBulkOperation ?? false,\n ].join(':');\n if (emittedReadOperationKeys.has(readOperationKey)) {\n continue;\n }\n emittedReadOperationKeys.add(readOperationKey);\n\n eventBus.emit(FrontendEvents.RESOURCE_REFRESH, {\n resourceType,\n operationIdentifier: String(readOperationContext.operationIdentifier ?? CoreResourceOperation.READ),\n variantType: readOperation?.variantType,\n isOperationDefault: readOperation?.isOperationDefault ?? true,\n isBulkOperation: readOperation?.isBulkOperation ?? false,\n variantKey: readOperation?.variantKey,\n contextResourceIdentifiers: readContextIdentifiers,\n parentResourcesRequirements: readParentResourcesRequirements,\n operation: readOperationContext,\n });\n }\n }\n };\n\n // Bridge: resource:notification → EventBus\n const unsubNotification = on<WS_ResourceNotificationPayload>(\n CoreWebSocketEvent.RESOURCE_NOTIFICATION,\n (payload) => {\n const resolvedOperation = resolveOperationFromPayload({\n resourceType: payload.resourceType,\n operationIdentifier: payload.operationIdentifier,\n operationPathKey: payload.operationPathKey,\n variantType: payload.variantType,\n isOperationDefault: payload.isOperationDefault,\n isBulkOperation: payload.isBulkOperation,\n variantKey: payload.variantKey,\n });\n const eventPayload: FrontendEventResourceOperation = {\n serverNotification: payload.deliveryPolicy,\n resourceType: payload.resourceType,\n operationIdentifier: payload.operationIdentifier,\n variantType: resolvedOperation.variantType ?? payload.variantType,\n isOperationDefault: resolvedOperation.isOperationDefault ?? payload.isOperationDefault,\n isBulkOperation: resolvedOperation.isBulkOperation ?? payload.isBulkOperation,\n variantKey: typeof resolvedOperation.variantKey === 'string' ? resolvedOperation.variantKey : payload.variantKey,\n contextResourceIdentifiers: payload.contextResourceIdentifiers ?? {},\n parentResourcesRequirements: [],\n operation: resolvedOperation as any,\n // Include notification context for i18n message resolution\n additionalContext: {\n notificationIdentifier: payload.notificationIdentifier,\n action: payload.action,\n frontendDisplayHints: payload.frontendDisplayHints,\n // How many rows a BULK action changed — the count its outcome message states.\n ...(payload.isBulkOperation ? { affectedCount: payload.affectedIds.length } : {}),\n },\n // Populate resultSummary from WS notification context identifiers\n // (enables analytics RESOURCE_OPERATION filter evaluation)\n resultSummary: payload.contextResourceIdentifiers\n ? { ...payload.contextResourceIdentifiers }\n : undefined,\n };\n\n // Use notificationLevel from payload if provided, otherwise derive from action\n const level = payload.notificationLevel ?? actionToNotificationLevel(payload.action);\n if (level !== NotificationLevel.ERROR) {\n emitRefreshPayloads({\n resourceType: payload.resourceType,\n resourceIds: payload.affectedIds,\n contextResourceIdentifiers: payload.contextResourceIdentifiers ?? {},\n shouldEmitReadRefresh: payload.affectedIds.length > 0 && !(payload.isBulkOperation ?? false),\n });\n }\n\n // Emit notification event with proper typing (use switch to ensure type safety)\n switch (level) {\n case NotificationLevel.SUCCESS:\n eventBus.emit(FrontendEvents.NOTIFY_RESOURCE_SUCCESS, eventPayload);\n break;\n case NotificationLevel.WARNING:\n eventBus.emit(FrontendEvents.NOTIFY_RESOURCE_WARNING, eventPayload);\n break;\n case NotificationLevel.ERROR:\n eventBus.emit(FrontendEvents.NOTIFY_RESOURCE_ERROR, eventPayload);\n break;\n case NotificationLevel.INFO:\n default:\n eventBus.emit(FrontendEvents.NOTIFY_RESOURCE_INFO, eventPayload);\n }\n }\n );\n\n // Bridge: resource:updated → EventBus RESOURCE_REFRESH\n const unsubUpdated = on<WS_ResourceUpdatedPayload>(\n CoreWebSocketEvent.RESOURCE_UPDATED,\n (payload) => {\n // RESOURCE_UPDATED always triggers generic refresh fan-out here so\n // non-RMM consumers still invalidate list/read surfaces. Resource-room\n // sync replay and authoritative refetch decisions remain owned by\n // RMMWebSocketBridge.\n emitRefreshPayloads({\n resourceType: payload.resourceType,\n resourceIds: payload.deliveryTarget === WebSocketResourceDeliveryTarget.SCOPE_ROOM_NOTIFICATION\n ? payload.affectedIds ?? []\n : [payload.resourceId],\n contextResourceIdentifiers: payload.contextResourceIdentifiers ?? {},\n shouldEmitReadRefresh: payload.deliveryTarget === WebSocketResourceDeliveryTarget.SCOPE_ROOM_NOTIFICATION\n ? (payload.affectedIds?.length ?? 0) > 0\n : Boolean(payload.resourceId),\n });\n }\n );\n\n // Bridge: resource:deleted → EventBus RESOURCE_REFRESH\n const unsubDeleted = on<WS_ResourceDeletedPayload>(\n CoreWebSocketEvent.RESOURCE_DELETED,\n (payload) => {\n emitRefreshPayloads({\n resourceType: payload.resourceType,\n resourceIds: [payload.resourceId],\n contextResourceIdentifiers: payload.contextResourceIdentifiers ?? {},\n shouldEmitReadRefresh: Boolean(payload.resourceId),\n });\n }\n );\n\n // Bridge: badge:update → EventBus BADGE_COUNT_CHANGED\n const unsubBadge = on<WS_BadgeUpdatePayload>(\n CoreWebSocketEvent.BADGE_UPDATE,\n (payload) => {\n const eventPayload: FrontendEventBadgeCountChanged = {\n badgeReference: payload.badgeReference,\n badgeCount: payload.badgeCount,\n };\n\n eventBus.emit(FrontendEvents.BADGE_COUNT_CHANGED, eventPayload);\n }\n );\n\n // Bridge: bulk-job:progress → EventBus BULK_JOB_PROGRESS\n //\n // Carried through unchanged: the counts are the server's, and the surface that draws the bar is\n // the one that decides what to say about them. Addressed to the USER rather than to a resource\n // room, because a bulk run spans many rows and no row's room is the right place (#1461).\n const unsubBulkJobProgress = on<WS_BulkJobProgressPayload>(\n CoreWebSocketEvent.BULK_JOB_PROGRESS,\n (payload) => {\n eventBus.emit(FrontendEvents.BULK_JOB_PROGRESS, {\n jobId: payload.jobId,\n resourceType: payload.resourceType,\n operationIdentifier: payload.operationIdentifier,\n attemptedCount: payload.attemptedCount,\n processedCount: payload.processedCount,\n failedCount: payload.failedCount,\n finished: payload.finished,\n ...(payload.failures ? { failures: payload.failures } : {}),\n });\n }\n );\n\n // Bridge: resource:editing:start → EventBus RESOURCE_EDITING_START\n const unsubEditingStart = on<WS_ResourceEditingPayload>(\n CoreWebSocketEvent.RESOURCE_EDITING_START,\n (payload) => {\n if (payload.initiatorUserId) {\n const eventPayload: FrontendEventResourceEditing = {\n resourceType: payload.resourceType,\n resourceId: payload.resourceId,\n userId: payload.initiatorUserId,\n timestamp: payload.timestamp,\n };\n eventBus.emit(FrontendEvents.RESOURCE_EDITING_START, eventPayload);\n }\n }\n );\n\n // Bridge: resource:editing:end → EventBus RESOURCE_EDITING_END\n const unsubEditingEnd = on<WS_ResourceEditingPayload>(\n CoreWebSocketEvent.RESOURCE_EDITING_END,\n (payload) => {\n if (payload.initiatorUserId) {\n const eventPayload: FrontendEventResourceEditing = {\n resourceType: payload.resourceType,\n resourceId: payload.resourceId,\n userId: payload.initiatorUserId,\n timestamp: payload.timestamp,\n };\n eventBus.emit(FrontendEvents.RESOURCE_EDITING_END, eventPayload);\n }\n }\n );\n\n // Bridge: resource:custom → EventBus RESOURCE_CUSTOM_EVENT\n const unsubCustom = on<WS_ResourceCustomEventPayload>(\n CoreWebSocketEvent.RESOURCE_CUSTOM,\n (payload) => {\n // Validate resource data if a custom-event payload includes\n // resource-shaped data. RMM sync-grade replay already validates its\n // dedicated payloads elsewhere.\n let validatedResourceData = payload.resourceData;\n \n // If the custom event carries resource-shaped data, validate that\n // dedicated payload field. `data` remains the event-specific message\n // body and may not share the resource DTO contract.\n if (payload.resourceData && typeof payload.resourceData === 'object' && !Array.isArray(payload.resourceData)) {\n try {\n validatedResourceData = validationService.validateWebSocketResourceData(\n payload.resourceData,\n {\n resourceType: payload.resourceType,\n operationIdentifier: undefined, // Custom events don't have operation identifier\n dataMode: payload.dataMode,\n }\n );\n } catch (error) {\n // If validation fails, log error but don't block the event\n // (backward compatibility - validation is opt-in)\n console.warn('[WebSocketEventBridge] Resource data validation failed:', error);\n // Continue with original data\n validatedResourceData = payload.resourceData;\n }\n }\n\n const eventPayload: FrontendEventResourceCustom = {\n resourceType: payload.resourceType,\n resourceId: payload.resourceId,\n eventName: payload.eventName,\n data: payload.data,\n resourceData: validatedResourceData,\n dataMode: payload.dataMode,\n userId: payload.initiatorUserId,\n timestamp: payload.timestamp,\n };\n eventBus.emit(FrontendEvents.RESOURCE_CUSTOM_EVENT, eventPayload);\n }\n );\n\n // Bridge: user:notification → EventBus NOTIFY_CUSTOM_*\n // Handles direct backend-initiated notifications (not tied to resource operations)\n const unsubUserNotification = on<WS_UserNotificationPayload>(\n CoreWebSocketEvent.USER_NOTIFICATION,\n (payload) => {\n const eventPayload: FrontendEventNotifyCustom = {\n identifier: payload.identifier ?? '',\n data: {\n ...payload.data,\n // Mark as backend notification for display policy handling\n _backendNotification: true,\n // Pass display target for NotificationContext to use\n displayTarget: payload.displayTarget,\n // Pass message and title if provided\n message: payload.message,\n title: payload.title,\n organizationId: payload.organizationId,\n },\n };\n\n // Emit notification event with proper typing (use switch to ensure type safety)\n switch (payload.notificationLevel) {\n case NotificationLevel.INFO:\n eventBus.emit(FrontendEvents.NOTIFY_CUSTOM_INFO, eventPayload);\n break;\n case NotificationLevel.SUCCESS:\n eventBus.emit(FrontendEvents.NOTIFY_CUSTOM_SUCCESS, eventPayload);\n break;\n case NotificationLevel.WARNING:\n eventBus.emit(FrontendEvents.NOTIFY_CUSTOM_WARNING, eventPayload);\n break;\n case NotificationLevel.ERROR:\n eventBus.emit(FrontendEvents.NOTIFY_CUSTOM_ERROR, eventPayload);\n break;\n default:\n eventBus.emit(FrontendEvents.NOTIFY_CUSTOM_INFO, eventPayload);\n }\n }\n );\n\n // Bridge: analytics:moment-achieved → EventBus ANALYTICS_MOMENT_ACHIEVED\n const unsubAnalyticsMoment = on<WS_AnalyticsMomentAchievedPayload>(\n CoreWebSocketEvent.ANALYTICS_MOMENT_ACHIEVED,\n (payload) => {\n const eventPayload: FrontendEvent_AnalyticsMomentAchieved = {\n momentIdentifier: payload.momentIdentifier,\n role: payload.role,\n scope: payload.scope,\n triggerSource: AnalyticsTriggerSource.BACKEND,\n };\n eventBus.emit(FrontendEvents.ANALYTICS_MOMENT_ACHIEVED, eventPayload);\n }\n );\n\n // Bridge: guidance:state-changed → EventBus GUIDANCE_FLOW_*\n const unsubGuidance = on<WS_GuidanceStateChangedPayload>(\n CoreWebSocketEvent.GUIDANCE_STATE_CHANGED,\n (payload) => {\n const eventPayload = {\n flowRef: payload.flowRef,\n triggerSource: payload.triggerSource,\n scope: payload.scope,\n renderMode: payload.renderMode,\n };\n switch (payload.status) {\n case OnboardingStatus.IN_PROGRESS:\n eventBus.emit(FrontendEvents.GUIDANCE_FLOW_ACTIVATED, eventPayload);\n break;\n case OnboardingStatus.COMPLETED:\n eventBus.emit(FrontendEvents.GUIDANCE_FLOW_COMPLETED, eventPayload);\n break;\n case OnboardingStatus.DISMISSED:\n eventBus.emit(FrontendEvents.GUIDANCE_FLOW_DISMISSED, eventPayload);\n break;\n }\n }\n );\n\n // Bridge: progression:milestone-achieved → EventBus MILESTONE_ACHIEVED\n const unsubMilestone = on<WS_MilestoneAchievedPayload>(\n CoreWebSocketEvent.MILESTONE_ACHIEVED,\n (payload) => {\n const eventPayload: FrontendEvent_MilestoneAchieved = {\n milestoneRef: payload.milestoneRef,\n category: payload.category,\n points: payload.points,\n achievedAt: payload.achievedAt,\n scope: payload.scope,\n reward: payload.reward,\n lifecycleTransition: payload.lifecycleTransition,\n totalPoints: payload.totalPoints,\n };\n eventBus.emit(FrontendEvents.MILESTONE_ACHIEVED, eventPayload);\n }\n );\n\n // Bridge: progression:updated → EventBus PROGRESSION_UPDATED\n const unsubProgression = on<WS_ProgressionUpdatedPayload>(\n CoreWebSocketEvent.PROGRESSION_UPDATED,\n (payload) => {\n const eventPayload: FrontendEvent_ProgressionUpdated = {\n scope: payload.scope,\n operationCounts: payload.operationCounts,\n totalPoints: payload.totalPoints,\n updatedAt: payload.updatedAt,\n };\n eventBus.emit(FrontendEvents.PROGRESSION_UPDATED, eventPayload);\n }\n );\n\n // Bridge: lifecycle:stage-changed → EventBus LIFECYCLE_STAGE_CHANGED\n const unsubLifecycle = on<WS_LifecycleStageChangedPayload>(\n CoreWebSocketEvent.LIFECYCLE_STAGE_CHANGED,\n (payload) => {\n const eventPayload: FrontendEvent_LifecycleStageChanged = {\n previousStage: payload.previousStage,\n newStage: payload.newStage,\n scope: payload.scope,\n trigger: payload.trigger,\n changedAt: payload.changedAt,\n activationCriteriaMet: payload.activationCriteriaMet,\n };\n eventBus.emit(FrontendEvents.LIFECYCLE_STAGE_CHANGED, eventPayload);\n }\n );\n\n // Cleanup\n return () => {\n unsubNotification();\n unsubUpdated();\n unsubDeleted();\n unsubBadge();\n unsubBulkJobProgress();\n unsubEditingStart();\n unsubEditingEnd();\n unsubCustom();\n unsubUserNotification();\n unsubAnalyticsMoment();\n unsubGuidance();\n unsubMilestone();\n unsubProgression();\n unsubLifecycle();\n };\n }, [isConnected, on, eventBus, registry, validationService]);\n\n // This component renders nothing\n return null;\n};\n\nexport default WebSocketEventBridge;\n"]}
1
+ {"version":3,"file":"WebSocketEventBridge.js","sourceRoot":"","sources":["../../../../../../src/core/requests/websockets/WebSocketEventBridge.tsx"],"names":[],"mappings":"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","sourcesContent":["import React, { useEffect, useMemo } from 'react';\nimport { useWebSocket } from './useWebSocket';\nimport { publishNotificationBadgeCount } from './useNotificationBadges';\nimport { useEventBus } from '~wildo-frontend-lib/core/events/useEventBus';\nimport { useResourceRegistry } from '~wildo-frontend-lib/core/resources/useResourceRegistry';\nimport { WebSocketResourceValidationService } from './websocket-resource-validation.frontend.service';\nimport { \n FrontendEvents, \n FrontendEventResourceOperation, \n FrontendEventBadgeCountChanged,\n FrontendEventResourceEditing,\n FrontendEventResourceCustom,\n FrontendEventNotifyCustom,\n type FrontendEvent_AnalyticsMomentAchieved,\n type FrontendEvent_MilestoneAchieved,\n type FrontendEvent_ProgressionUpdated,\n type FrontendEvent_LifecycleStageChanged,\n} from '~wildo-frontend-lib/core/events/events.frontend.schemas';\nimport {\n AnalyticsTriggerSource,\n CoreResourceOperation,\n CoreWebSocketEvent,\n WS_ResourceDeletedPayload,\n WS_ResourceNotificationPayload,\n WS_ResourceUpdatedPayload,\n WS_BadgeUpdatePayload,\n WS_BulkJobProgressPayload,\n WS_ResourceEditingPayload,\n WS_ResourceCustomEventPayload,\n WS_UserNotificationPayload,\n WS_AnalyticsMomentAchievedPayload,\n NotificationLevel,\n ResourceAction,\n ResourceOperationVariantType,\n ResourcesConfig_OperationPathUtils,\n OnboardingStatus,\n WebSocketResourceDeliveryTarget,\n type WS_GuidanceStateChangedPayload,\n type WS_MilestoneAchievedPayload,\n type WS_ProgressionUpdatedPayload,\n type WS_LifecycleStageChangedPayload,\n} from '@wildo-ai/saas-models';\nimport { getOperationsForCoreSemantic } from '~wildo-frontend-lib/core/resources/operation-semantics.frontend.utils';\nimport { frontendResourceUtils, FrontendResourceUtils } from '~wildo-frontend-lib/core/resources/frontend-resource.utils';\nimport { isFrontendOperationAddressableForCurrentContext } from '~wildo-frontend-lib/core/resources/resource-addressability.frontend.utils';\nimport { operationInitiatorParametersSatisfied } from '~wildo-frontend-lib/core/resources/operation-initiator-satisfaction.frontend.utils';\nimport {\n normalizeContextResourceIdentifiersForTransport,\n type ContextResourceIdentifiersInput,\n} from '~wildo-frontend-lib/core/resources/context-resource-identifiers.frontend.utils';\n\n/**\n * WebSocketEventBridge\n * \n * Bridges WebSocket events from the Socket.IO connection to the Frontend EventBus.\n * This component should be mounted once at the app root level, after both\n * WebSocketProvider and EventBusProvider.\n * \n * Events bridged:\n * - resource:notification → RESOURCE_REFRESH, NOTIFY_RESOURCE_*\n * - resource:updated → RESOURCE_REFRESH\n * - resource:deleted → RESOURCE_REFRESH\n * - badge:update → BADGE_COUNT_CHANGED\n * - bulk-job:progress → BULK_JOB_PROGRESS\n * - guidance:state-changed → GUIDANCE_FLOW_ACTIVATED/COMPLETED/DISMISSED\n * \n * Business logic components can then subscribe to EventBus events without\n * knowing the event source (HTTP response, WebSocket, or other).\n */\nexport const WebSocketEventBridge: React.FC = () => {\n const { on, isConnected } = useWebSocket();\n const eventBus = useEventBus();\n const { getResourcesRegistry } = useResourceRegistry();\n const registry = useMemo(() => getResourcesRegistry(), [getResourcesRegistry]);\n\n // Initialize the validation service used by websocket payloads that carry\n // resource-shaped data.\n const validationService = useMemo(() => {\n return new WebSocketResourceValidationService(registry);\n }, [registry]);\n\n useEffect(() => {\n if (!isConnected) {\n return;\n }\n\n // Helper: Map action to default notification level (fallback when notificationLevel not provided)\n const actionToNotificationLevel = (action: ResourceAction | string): NotificationLevel => {\n switch (action) {\n case ResourceAction.CREATED: return NotificationLevel.SUCCESS;\n case ResourceAction.UPDATED: return NotificationLevel.INFO;\n case ResourceAction.DELETED: return NotificationLevel.WARNING;\n default: return NotificationLevel.INFO;\n }\n };\n\n const resolveOperationFromPayload = (params: {\n resourceType: string;\n operationIdentifier: string;\n operationPathKey?: string;\n variantType?: ResourceOperationVariantType;\n isOperationDefault?: boolean;\n isBulkOperation?: boolean;\n variantKey?: string;\n }) => {\n const operations = registry.resourceConfigurations[params.resourceType]?.operations ?? [];\n if (params.operationPathKey) {\n const pathOperation = operations.find((operation) => {\n try {\n return ResourcesConfig_OperationPathUtils.createOperationPathKeyFromOperation(operation) === params.operationPathKey;\n } catch {\n return false;\n }\n });\n if (pathOperation) {\n return pathOperation;\n }\n }\n\n const matchingOperations = operations.filter((operation) => (\n String(operation.operationIdentifier) === params.operationIdentifier\n && (params.variantType == null || operation.variantType === params.variantType)\n && (params.variantKey == null || operation.variantKey === params.variantKey)\n && (params.isBulkOperation == null || (operation.isBulkOperation === true) === params.isBulkOperation)\n && (\n params.isOperationDefault == null\n || Boolean(operation.isOperationDefault) === params.isOperationDefault\n )\n ));\n\n if (matchingOperations.length === 1) {\n return matchingOperations[0];\n }\n\n if (matchingOperations.length > 1) {\n console.warn('[WebSocketEventBridge] Ambiguous operation identity in notification payload; emitting minimal operation context.', {\n resourceType: params.resourceType,\n operationIdentifier: params.operationIdentifier,\n variantType: params.variantType,\n variantKey: params.variantKey,\n isOperationDefault: params.isOperationDefault,\n isBulkOperation: params.isBulkOperation,\n candidateVariants: matchingOperations.map((operation) => ({\n variantType: operation.variantType,\n variantKey: operation.variantKey,\n isOperationDefault: operation.isOperationDefault,\n isBulkOperation: operation.isBulkOperation,\n })),\n });\n }\n\n // Some websocket producers only carry operation identity fields, not the\n // full authored operation object. Rebuild the minimum shape the EventBus\n // contracts expect so downstream consumers can still reason about variant,\n // default-ness, and bulk semantics consistently.\n return {\n operationIdentifier: params.operationIdentifier,\n variantType: params.variantType,\n isOperationDefault: params.isOperationDefault,\n isBulkOperation: params.isBulkOperation,\n variantKey: params.variantKey,\n };\n };\n\n const emitRefreshPayloads = ({\n resourceType,\n resourceIds,\n contextResourceIdentifiers,\n shouldEmitReadRefresh,\n }: {\n resourceType: string;\n resourceIds?: Array<string | null | undefined>;\n contextResourceIdentifiers?: ContextResourceIdentifiersInput;\n shouldEmitReadRefresh: boolean;\n }): void => {\n const resourceConfig = registry.resourceConfigurations[resourceType];\n const flattenedContextIdentifiers = normalizeContextResourceIdentifiersForTransport(\n contextResourceIdentifiers,\n );\n const normalizedContextIdentifiers = Object.fromEntries(\n Object.entries(flattenedContextIdentifiers).flatMap(([identifierKey, resourceIdentifier]) => {\n const normalizedKey = registry.fieldIdentifierToResourceType?.[identifierKey] ?? identifierKey;\n return normalizedKey === identifierKey\n ? [[identifierKey, resourceIdentifier]]\n : [\n [identifierKey, resourceIdentifier],\n [normalizedKey, resourceIdentifier],\n ];\n }),\n );\n const baseContextIdentifiers = {\n ...normalizedContextIdentifiers,\n };\n delete baseContextIdentifiers[resourceType];\n const baseContextualParameters = FrontendResourceUtils.buildContextualParameters(\n baseContextIdentifiers,\n registry,\n );\n\n // This bridge owns generic cache/list/read invalidation only. It does not\n // try to replay authoritative resource data into local state; richer sync\n // semantics stay in the dedicated RMM websocket bridge. The consumers here\n // are generic RESOURCE_REFRESH listeners such as non-RMM readers, list\n // surfaces, and cache invalidation hooks.\n const listOperations = getOperationsForCoreSemantic(\n resourceConfig?.operations ?? [],\n CoreResourceOperation.LIST,\n ).filter((listOperation) =>\n operationInitiatorParametersSatisfied({\n operation: listOperation,\n contextResourceIdentifiers: baseContextIdentifiers,\n contextualParameters: baseContextualParameters,\n })\n );\n const listRefreshTargets = listOperations.length > 0\n ? listOperations\n : [null];\n const baseParentResourcesRequirements = frontendResourceUtils.buildParentResourcesRequirements(\n resourceType as any,\n baseContextIdentifiers,\n registry,\n );\n\n for (const listOperation of listRefreshTargets) {\n eventBus.emit(FrontendEvents.RESOURCE_REFRESH, {\n resourceType,\n operationIdentifier: String(listOperation?.operationIdentifier ?? CoreResourceOperation.LIST),\n variantType: listOperation?.variantType,\n isOperationDefault: listOperation?.isOperationDefault ?? true,\n isBulkOperation: listOperation?.isBulkOperation ?? false,\n variantKey: listOperation?.variantKey,\n contextResourceIdentifiers: baseContextIdentifiers,\n parentResourcesRequirements: baseParentResourcesRequirements,\n operation: (listOperation ?? { operationIdentifier: CoreResourceOperation.LIST }) as any,\n });\n }\n\n const validReadResourceIds = Array.from(new Set(\n (resourceIds ?? []).filter((resourceId): resourceId is string => typeof resourceId === 'string' && resourceId.length > 0),\n ));\n\n if (!shouldEmitReadRefresh || validReadResourceIds.length === 0) {\n return;\n }\n\n const readOperations = getOperationsForCoreSemantic(\n resourceConfig?.operations ?? [],\n CoreResourceOperation.READ,\n {\n requireAddressable: true,\n },\n );\n const emittedReadOperationKeys = new Set<string>();\n\n for (const resourceId of validReadResourceIds) {\n const readContextIdentifiers = {\n ...baseContextIdentifiers,\n [resourceType]: resourceId,\n };\n const readContextualParameters = FrontendResourceUtils.buildContextualParameters(\n readContextIdentifiers,\n registry,\n );\n const readParentResourcesRequirements = frontendResourceUtils.buildParentResourcesRequirements(\n resourceType as any,\n readContextIdentifiers,\n registry,\n );\n const addressableReadOperations = readOperations.filter((readOperation) =>\n resourceConfig\n ? isFrontendOperationAddressableForCurrentContext({\n resourceConfig,\n operation: readOperation,\n registry,\n hasResourceId: true,\n contextResourceIdentifiers: readContextIdentifiers,\n contextualParameters: readContextualParameters,\n })\n : true\n );\n const readRefreshTargets = addressableReadOperations.length > 0\n ? addressableReadOperations\n : [null];\n\n for (const readOperation of readRefreshTargets) {\n const readOperationContext = readOperation\n ?? ({ operationIdentifier: CoreResourceOperation.READ } as any);\n const readOperationKey = [\n resourceId,\n String(readOperationContext.operationIdentifier),\n readOperationContext.variantType ?? '',\n readOperationContext.variantKey ?? '',\n readOperationContext.isBulkOperation ?? false,\n ].join(':');\n if (emittedReadOperationKeys.has(readOperationKey)) {\n continue;\n }\n emittedReadOperationKeys.add(readOperationKey);\n\n eventBus.emit(FrontendEvents.RESOURCE_REFRESH, {\n resourceType,\n operationIdentifier: String(readOperationContext.operationIdentifier ?? CoreResourceOperation.READ),\n variantType: readOperation?.variantType,\n isOperationDefault: readOperation?.isOperationDefault ?? true,\n isBulkOperation: readOperation?.isBulkOperation ?? false,\n variantKey: readOperation?.variantKey,\n contextResourceIdentifiers: readContextIdentifiers,\n parentResourcesRequirements: readParentResourcesRequirements,\n operation: readOperationContext,\n });\n }\n }\n };\n\n // Bridge: resource:notification → EventBus\n const unsubNotification = on<WS_ResourceNotificationPayload>(\n CoreWebSocketEvent.RESOURCE_NOTIFICATION,\n (payload) => {\n const resolvedOperation = resolveOperationFromPayload({\n resourceType: payload.resourceType,\n operationIdentifier: payload.operationIdentifier,\n operationPathKey: payload.operationPathKey,\n variantType: payload.variantType,\n isOperationDefault: payload.isOperationDefault,\n isBulkOperation: payload.isBulkOperation,\n variantKey: payload.variantKey,\n });\n const eventPayload: FrontendEventResourceOperation = {\n serverNotification: payload.deliveryPolicy,\n resourceType: payload.resourceType,\n operationIdentifier: payload.operationIdentifier,\n variantType: resolvedOperation.variantType ?? payload.variantType,\n isOperationDefault: resolvedOperation.isOperationDefault ?? payload.isOperationDefault,\n isBulkOperation: resolvedOperation.isBulkOperation ?? payload.isBulkOperation,\n variantKey: typeof resolvedOperation.variantKey === 'string' ? resolvedOperation.variantKey : payload.variantKey,\n contextResourceIdentifiers: payload.contextResourceIdentifiers ?? {},\n parentResourcesRequirements: [],\n operation: resolvedOperation as any,\n // Include notification context for i18n message resolution\n additionalContext: {\n notificationIdentifier: payload.notificationIdentifier,\n action: payload.action,\n frontendDisplayHints: payload.frontendDisplayHints,\n // How many rows a BULK action changed — the count its outcome message states.\n ...(payload.isBulkOperation ? { affectedCount: payload.affectedIds.length } : {}),\n },\n // Populate resultSummary from WS notification context identifiers\n // (enables analytics RESOURCE_OPERATION filter evaluation)\n resultSummary: payload.contextResourceIdentifiers\n ? { ...payload.contextResourceIdentifiers }\n : undefined,\n };\n\n // Use notificationLevel from payload if provided, otherwise derive from action\n const level = payload.notificationLevel ?? actionToNotificationLevel(payload.action);\n if (level !== NotificationLevel.ERROR) {\n emitRefreshPayloads({\n resourceType: payload.resourceType,\n resourceIds: payload.affectedIds,\n contextResourceIdentifiers: payload.contextResourceIdentifiers ?? {},\n shouldEmitReadRefresh: payload.affectedIds.length > 0 && !(payload.isBulkOperation ?? false),\n });\n }\n\n // Emit notification event with proper typing (use switch to ensure type safety)\n switch (level) {\n case NotificationLevel.SUCCESS:\n eventBus.emit(FrontendEvents.NOTIFY_RESOURCE_SUCCESS, eventPayload);\n break;\n case NotificationLevel.WARNING:\n eventBus.emit(FrontendEvents.NOTIFY_RESOURCE_WARNING, eventPayload);\n break;\n case NotificationLevel.ERROR:\n eventBus.emit(FrontendEvents.NOTIFY_RESOURCE_ERROR, eventPayload);\n break;\n case NotificationLevel.INFO:\n default:\n eventBus.emit(FrontendEvents.NOTIFY_RESOURCE_INFO, eventPayload);\n }\n }\n );\n\n // Bridge: resource:updated → EventBus RESOURCE_REFRESH\n const unsubUpdated = on<WS_ResourceUpdatedPayload>(\n CoreWebSocketEvent.RESOURCE_UPDATED,\n (payload) => {\n // RESOURCE_UPDATED always triggers generic refresh fan-out here so\n // non-RMM consumers still invalidate list/read surfaces. Resource-room\n // sync replay and authoritative refetch decisions remain owned by\n // RMMWebSocketBridge.\n emitRefreshPayloads({\n resourceType: payload.resourceType,\n resourceIds: payload.deliveryTarget === WebSocketResourceDeliveryTarget.SCOPE_ROOM_NOTIFICATION\n ? payload.affectedIds ?? []\n : [payload.resourceId],\n contextResourceIdentifiers: payload.contextResourceIdentifiers ?? {},\n shouldEmitReadRefresh: payload.deliveryTarget === WebSocketResourceDeliveryTarget.SCOPE_ROOM_NOTIFICATION\n ? (payload.affectedIds?.length ?? 0) > 0\n : Boolean(payload.resourceId),\n });\n }\n );\n\n // Bridge: resource:deleted → EventBus RESOURCE_REFRESH\n const unsubDeleted = on<WS_ResourceDeletedPayload>(\n CoreWebSocketEvent.RESOURCE_DELETED,\n (payload) => {\n emitRefreshPayloads({\n resourceType: payload.resourceType,\n resourceIds: [payload.resourceId],\n contextResourceIdentifiers: payload.contextResourceIdentifiers ?? {},\n shouldEmitReadRefresh: Boolean(payload.resourceId),\n });\n }\n );\n\n // Bridge: badge:update → EventBus BADGE_COUNT_CHANGED\n const unsubBadge = on<WS_BadgeUpdatePayload>(\n CoreWebSocketEvent.BADGE_UPDATE,\n (payload) => {\n const eventPayload: FrontendEventBadgeCountChanged = {\n badgeReference: payload.badgeReference,\n badgeCount: payload.badgeCount,\n };\n\n // Through the store's one door, so a badge mounted later still reads this count.\n publishNotificationBadgeCount(eventBus.emit, eventPayload);\n }\n );\n\n // Bridge: bulk-job:progress → EventBus BULK_JOB_PROGRESS\n //\n // Carried through unchanged: the counts are the server's, and the surface that draws the bar is\n // the one that decides what to say about them. Addressed to the USER rather than to a resource\n // room, because a bulk run spans many rows and no row's room is the right place (#1461).\n const unsubBulkJobProgress = on<WS_BulkJobProgressPayload>(\n CoreWebSocketEvent.BULK_JOB_PROGRESS,\n (payload) => {\n eventBus.emit(FrontendEvents.BULK_JOB_PROGRESS, {\n jobId: payload.jobId,\n resourceType: payload.resourceType,\n operationIdentifier: payload.operationIdentifier,\n attemptedCount: payload.attemptedCount,\n processedCount: payload.processedCount,\n failedCount: payload.failedCount,\n finished: payload.finished,\n ...(payload.failures ? { failures: payload.failures } : {}),\n });\n }\n );\n\n // Bridge: resource:editing:start → EventBus RESOURCE_EDITING_START\n const unsubEditingStart = on<WS_ResourceEditingPayload>(\n CoreWebSocketEvent.RESOURCE_EDITING_START,\n (payload) => {\n if (payload.initiatorUserId) {\n const eventPayload: FrontendEventResourceEditing = {\n resourceType: payload.resourceType,\n resourceId: payload.resourceId,\n userId: payload.initiatorUserId,\n timestamp: payload.timestamp,\n };\n eventBus.emit(FrontendEvents.RESOURCE_EDITING_START, eventPayload);\n }\n }\n );\n\n // Bridge: resource:editing:end → EventBus RESOURCE_EDITING_END\n const unsubEditingEnd = on<WS_ResourceEditingPayload>(\n CoreWebSocketEvent.RESOURCE_EDITING_END,\n (payload) => {\n if (payload.initiatorUserId) {\n const eventPayload: FrontendEventResourceEditing = {\n resourceType: payload.resourceType,\n resourceId: payload.resourceId,\n userId: payload.initiatorUserId,\n timestamp: payload.timestamp,\n };\n eventBus.emit(FrontendEvents.RESOURCE_EDITING_END, eventPayload);\n }\n }\n );\n\n // Bridge: resource:custom → EventBus RESOURCE_CUSTOM_EVENT\n const unsubCustom = on<WS_ResourceCustomEventPayload>(\n CoreWebSocketEvent.RESOURCE_CUSTOM,\n (payload) => {\n // Validate resource data if a custom-event payload includes\n // resource-shaped data. RMM sync-grade replay already validates its\n // dedicated payloads elsewhere.\n let validatedResourceData = payload.resourceData;\n \n // If the custom event carries resource-shaped data, validate that\n // dedicated payload field. `data` remains the event-specific message\n // body and may not share the resource DTO contract.\n if (payload.resourceData && typeof payload.resourceData === 'object' && !Array.isArray(payload.resourceData)) {\n try {\n validatedResourceData = validationService.validateWebSocketResourceData(\n payload.resourceData,\n {\n resourceType: payload.resourceType,\n operationIdentifier: undefined, // Custom events don't have operation identifier\n dataMode: payload.dataMode,\n }\n );\n } catch (error) {\n // If validation fails, log error but don't block the event\n // (backward compatibility - validation is opt-in)\n console.warn('[WebSocketEventBridge] Resource data validation failed:', error);\n // Continue with original data\n validatedResourceData = payload.resourceData;\n }\n }\n\n const eventPayload: FrontendEventResourceCustom = {\n resourceType: payload.resourceType,\n resourceId: payload.resourceId,\n eventName: payload.eventName,\n data: payload.data,\n resourceData: validatedResourceData,\n dataMode: payload.dataMode,\n userId: payload.initiatorUserId,\n timestamp: payload.timestamp,\n };\n eventBus.emit(FrontendEvents.RESOURCE_CUSTOM_EVENT, eventPayload);\n }\n );\n\n // Bridge: user:notification → EventBus NOTIFY_CUSTOM_*\n // Handles direct backend-initiated notifications (not tied to resource operations)\n const unsubUserNotification = on<WS_UserNotificationPayload>(\n CoreWebSocketEvent.USER_NOTIFICATION,\n (payload) => {\n const eventPayload: FrontendEventNotifyCustom = {\n identifier: payload.identifier ?? '',\n data: {\n ...payload.data,\n // Mark as backend notification for display policy handling\n _backendNotification: true,\n // Pass display target for NotificationContext to use\n displayTarget: payload.displayTarget,\n // Pass message and title if provided\n message: payload.message,\n title: payload.title,\n organizationId: payload.organizationId,\n },\n };\n\n // Emit notification event with proper typing (use switch to ensure type safety)\n switch (payload.notificationLevel) {\n case NotificationLevel.INFO:\n eventBus.emit(FrontendEvents.NOTIFY_CUSTOM_INFO, eventPayload);\n break;\n case NotificationLevel.SUCCESS:\n eventBus.emit(FrontendEvents.NOTIFY_CUSTOM_SUCCESS, eventPayload);\n break;\n case NotificationLevel.WARNING:\n eventBus.emit(FrontendEvents.NOTIFY_CUSTOM_WARNING, eventPayload);\n break;\n case NotificationLevel.ERROR:\n eventBus.emit(FrontendEvents.NOTIFY_CUSTOM_ERROR, eventPayload);\n break;\n default:\n eventBus.emit(FrontendEvents.NOTIFY_CUSTOM_INFO, eventPayload);\n }\n }\n );\n\n // Bridge: analytics:moment-achieved → EventBus ANALYTICS_MOMENT_ACHIEVED\n const unsubAnalyticsMoment = on<WS_AnalyticsMomentAchievedPayload>(\n CoreWebSocketEvent.ANALYTICS_MOMENT_ACHIEVED,\n (payload) => {\n const eventPayload: FrontendEvent_AnalyticsMomentAchieved = {\n momentIdentifier: payload.momentIdentifier,\n role: payload.role,\n scope: payload.scope,\n triggerSource: AnalyticsTriggerSource.BACKEND,\n };\n eventBus.emit(FrontendEvents.ANALYTICS_MOMENT_ACHIEVED, eventPayload);\n }\n );\n\n // Bridge: guidance:state-changed → EventBus GUIDANCE_FLOW_*\n const unsubGuidance = on<WS_GuidanceStateChangedPayload>(\n CoreWebSocketEvent.GUIDANCE_STATE_CHANGED,\n (payload) => {\n const eventPayload = {\n flowRef: payload.flowRef,\n triggerSource: payload.triggerSource,\n scope: payload.scope,\n renderMode: payload.renderMode,\n };\n switch (payload.status) {\n case OnboardingStatus.IN_PROGRESS:\n eventBus.emit(FrontendEvents.GUIDANCE_FLOW_ACTIVATED, eventPayload);\n break;\n case OnboardingStatus.COMPLETED:\n eventBus.emit(FrontendEvents.GUIDANCE_FLOW_COMPLETED, eventPayload);\n break;\n case OnboardingStatus.DISMISSED:\n eventBus.emit(FrontendEvents.GUIDANCE_FLOW_DISMISSED, eventPayload);\n break;\n }\n }\n );\n\n // Bridge: progression:milestone-achieved → EventBus MILESTONE_ACHIEVED\n const unsubMilestone = on<WS_MilestoneAchievedPayload>(\n CoreWebSocketEvent.MILESTONE_ACHIEVED,\n (payload) => {\n const eventPayload: FrontendEvent_MilestoneAchieved = {\n milestoneRef: payload.milestoneRef,\n category: payload.category,\n points: payload.points,\n achievedAt: payload.achievedAt,\n scope: payload.scope,\n reward: payload.reward,\n lifecycleTransition: payload.lifecycleTransition,\n totalPoints: payload.totalPoints,\n };\n eventBus.emit(FrontendEvents.MILESTONE_ACHIEVED, eventPayload);\n }\n );\n\n // Bridge: progression:updated → EventBus PROGRESSION_UPDATED\n const unsubProgression = on<WS_ProgressionUpdatedPayload>(\n CoreWebSocketEvent.PROGRESSION_UPDATED,\n (payload) => {\n const eventPayload: FrontendEvent_ProgressionUpdated = {\n scope: payload.scope,\n operationCounts: payload.operationCounts,\n totalPoints: payload.totalPoints,\n updatedAt: payload.updatedAt,\n };\n eventBus.emit(FrontendEvents.PROGRESSION_UPDATED, eventPayload);\n }\n );\n\n // Bridge: lifecycle:stage-changed → EventBus LIFECYCLE_STAGE_CHANGED\n const unsubLifecycle = on<WS_LifecycleStageChangedPayload>(\n CoreWebSocketEvent.LIFECYCLE_STAGE_CHANGED,\n (payload) => {\n const eventPayload: FrontendEvent_LifecycleStageChanged = {\n previousStage: payload.previousStage,\n newStage: payload.newStage,\n scope: payload.scope,\n trigger: payload.trigger,\n changedAt: payload.changedAt,\n activationCriteriaMet: payload.activationCriteriaMet,\n };\n eventBus.emit(FrontendEvents.LIFECYCLE_STAGE_CHANGED, eventPayload);\n }\n );\n\n // Cleanup\n return () => {\n unsubNotification();\n unsubUpdated();\n unsubDeleted();\n unsubBadge();\n unsubBulkJobProgress();\n unsubEditingStart();\n unsubEditingEnd();\n unsubCustom();\n unsubUserNotification();\n unsubAnalyticsMoment();\n unsubGuidance();\n unsubMilestone();\n unsubProgression();\n unsubLifecycle();\n };\n }, [isConnected, on, eventBus, registry, validationService]);\n\n // This component renders nothing\n return null;\n};\n\nexport default WebSocketEventBridge;\n"]}
@@ -1,4 +1,26 @@
1
1
  import { NotificationBadgeDefinition } from '@wildo-ai/saas-models';
2
+ import { FrontendEvents, type FrontendEventBadgeCountChanged } from '../../../core/events/events.frontend.schemas';
3
+ /**
4
+ * Hand a badge count to the store — the ONE way a count reaches it, from the websocket bridge (a
5
+ * backend push) and from `usePublishNotificationBadgeCount` (a frontend-produced count) alike. Records
6
+ * it for late subscribers, then emits it for the live ones.
7
+ */
8
+ export declare function publishNotificationBadgeCount(emit: (event: FrontendEvents.BADGE_COUNT_CHANGED, payload: FrontendEventBadgeCountChanged) => void, payload: FrontendEventBadgeCountChanged): void;
9
+ /** Forget every recorded count — at an identity boundary, and between tests. */
10
+ export declare function forgetNotificationBadgeCounts(): void;
11
+ /**
12
+ * Where the memory ENDS: renders nothing, and forgets every remembered count when the signed-in user or
13
+ * the current organization changes.
14
+ *
15
+ * Keyed on the app scope's identity rather than on the `USER_LOGOUT` event. When this was written nothing
16
+ * emitted that event (#1454 review, N1; it has had a producer since #1977), and the identity is still the
17
+ * better key: the scope's user id changes on every way a session ends or begins — this tab's sign-out,
18
+ * another tab's, a refresh that fails — and its organization id on every switch, which is the other
19
+ * boundary a count must not cross (N2) and which no sign-out event carries.
20
+ * Mounted by `ApplicationMainProvider` beside the read-cache bridge, which watches the same scope
21
+ * for the same reason.
22
+ */
23
+ export declare function NotificationBadgeMemoryBoundary(): null;
2
24
  /** Resolved, render-ready badge state for one definition. */
3
25
  export interface ResolvedBadgeState {
4
26
  /** Current count (0 until the first push for this identifier arrives). */
@@ -1 +1 @@
1
- {"version":3,"file":"useNotificationBadges.d.ts","sourceRoot":"","sources":["../../../../../../src/core/requests/websockets/useNotificationBadges.ts"],"names":[],"mappings":"AA0BA,OAAO,EACL,2BAA2B,EAI5B,MAAM,uBAAuB,CAAC;AAO/B,6DAA6D;AAC7D,MAAM,WAAW,kBAAkB;IACjC,0EAA0E;IAC1E,KAAK,EAAE,MAAM,CAAC;IACd,wEAAwE;IACxE,KAAK,EAAE,OAAO,CAAC;CAChB;AAED,MAAM,WAAW,2BAA2B;IAC1C,6DAA6D;IAC7D,aAAa,EAAE,CAAC,UAAU,EAAE,2BAA2B,KAAK,kBAAkB,CAAC;CAChF;AAED,eAAO,MAAM,qBAAqB,QAAO,2BAyDxC,CAAC;AAEF,eAAe,qBAAqB,CAAC"}
1
+ {"version":3,"file":"useNotificationBadges.d.ts","sourceRoot":"","sources":["../../../../../../src/core/requests/websockets/useNotificationBadges.ts"],"names":[],"mappings":"AA0BA,OAAO,EACL,2BAA2B,EAI5B,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EAAE,cAAc,EAAE,KAAK,8BAA8B,EAAE,MAAM,yDAAyD,CAAC;AA0B9H;;;;GAIG;AACH,wBAAgB,6BAA6B,CAC3C,IAAI,EAAE,CAAC,KAAK,EAAE,cAAc,CAAC,mBAAmB,EAAE,OAAO,EAAE,8BAA8B,KAAK,IAAI,EAClG,OAAO,EAAE,8BAA8B,GACtC,IAAI,CAIN;AAED,gFAAgF;AAChF,wBAAgB,6BAA6B,IAAI,IAAI,CAEpD;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,+BAA+B,IAAI,IAAI,CAmBtD;AAED,6DAA6D;AAC7D,MAAM,WAAW,kBAAkB;IACjC,0EAA0E;IAC1E,KAAK,EAAE,MAAM,CAAC;IACd,wEAAwE;IACxE,KAAK,EAAE,OAAO,CAAC;CAChB;AAED,MAAM,WAAW,2BAA2B;IAC1C,6DAA6D;IAC7D,aAAa,EAAE,CAAC,UAAU,EAAE,2BAA2B,KAAK,kBAAkB,CAAC;CAChF;AAED,eAAO,MAAM,qBAAqB,QAAO,2BA2DxC,CAAC;AAEF,eAAe,qBAAqB,CAAC"}
@@ -26,16 +26,85 @@ import { useCallback, useEffect, useRef, useState } from 'react';
26
26
  import { NotificationBadgePulse, notificationBadgeIdentityKey, notificationBadgeKeyFromReference, } from '@wildo-ai/saas-models';
27
27
  import { FrontendEvents } from '../../../core/events/events.frontend.schemas.js';
28
28
  import { useEventBus } from '../../../core/events/useEventBus.js';
29
+ import { useAppScopeSafe } from '../../../core/scope/useAppScope.js';
29
30
  /** How long an `ON_INCREASE` badge visibly pulses after a count rise (ms). */
30
31
  const PULSE_WINDOW_MS = 2000;
32
+ /**
33
+ * The LAST count this page was given for each badge key — the store's memory.
34
+ *
35
+ * Each `useNotificationBadges` instance holds its own counts and hears only the events sent after it
36
+ * subscribed, and a count is sent only when it changes. So a badge mounted LATE — a menubar group whose
37
+ * menu opens after the count arrived, a navigation remounted by a route change — showed nothing until
38
+ * the next change (#1454 review). Every producer now writes through
39
+ * {@link publishNotificationBadgeCount}, which records the count here before emitting it, and every new
40
+ * instance starts from what is recorded.
41
+ *
42
+ * Page-wide by design: one browser page hosts one application, and a count is a fact about this
43
+ * session's view of it. Cleared whenever the signed-in USER or the current ORGANIZATION changes
44
+ * ({@link NotificationBadgeMemoryBoundary}), so a second person signing in on the same page never sees
45
+ * the first person's counts, and an organization switch never seeds a badge with the previous
46
+ * organization's. The memory is keyed without a scope id, so clearing at the boundary is what keeps a
47
+ * count from crossing it.
48
+ */
49
+ const lastBadgeCountsByKey = new Map();
50
+ /**
51
+ * Hand a badge count to the store — the ONE way a count reaches it, from the websocket bridge (a
52
+ * backend push) and from `usePublishNotificationBadgeCount` (a frontend-produced count) alike. Records
53
+ * it for late subscribers, then emits it for the live ones.
54
+ */
55
+ export function publishNotificationBadgeCount(emit, payload) {
56
+ const badgeKey = notificationBadgeKeyFromReference(payload.badgeReference);
57
+ if (badgeKey)
58
+ lastBadgeCountsByKey.set(badgeKey, payload.badgeCount);
59
+ emit(FrontendEvents.BADGE_COUNT_CHANGED, payload);
60
+ }
61
+ /** Forget every recorded count — at an identity boundary, and between tests. */
62
+ export function forgetNotificationBadgeCounts() {
63
+ lastBadgeCountsByKey.clear();
64
+ }
65
+ /**
66
+ * Where the memory ENDS: renders nothing, and forgets every remembered count when the signed-in user or
67
+ * the current organization changes.
68
+ *
69
+ * Keyed on the app scope's identity rather than on the `USER_LOGOUT` event. When this was written nothing
70
+ * emitted that event (#1454 review, N1; it has had a producer since #1977), and the identity is still the
71
+ * better key: the scope's user id changes on every way a session ends or begins — this tab's sign-out,
72
+ * another tab's, a refresh that fails — and its organization id on every switch, which is the other
73
+ * boundary a count must not cross (N2) and which no sign-out event carries.
74
+ * Mounted by `ApplicationMainProvider` beside the read-cache bridge, which watches the same scope
75
+ * for the same reason.
76
+ */
77
+ export function NotificationBadgeMemoryBoundary() {
78
+ const appScope = useAppScopeSafe();
79
+ const userId = appScope?.currentUserId ?? null;
80
+ const organizationId = appScope?.currentOrganizationId ?? null;
81
+ const previous = useRef({ userId, organizationId });
82
+ useEffect(() => {
83
+ const before = previous.current;
84
+ previous.current = { userId, organizationId };
85
+ /*
86
+ * Only a value that was SET and changed is a boundary. An organization id APPEARING after session
87
+ * restore (null → id) belongs to the same session and the same counts: clearing there left a menu
88
+ * opened later empty until the count next moved, since a publisher republishes only on change
89
+ * (re-review N4). A user id going to null is a sign-out and does clear.
90
+ */
91
+ const userChanged = before.userId !== null && before.userId !== userId;
92
+ const organizationChanged = before.organizationId !== null && before.organizationId !== organizationId;
93
+ if (userChanged || organizationChanged)
94
+ forgetNotificationBadgeCounts();
95
+ }, [userId, organizationId]);
96
+ return null;
97
+ }
31
98
  export const useNotificationBadges = () => {
32
99
  const { on } = useEventBus();
33
- const [countsByBadgeKey, setCountsByBadgeKey] = useState({});
100
+ // Seeded from the page's memory, so a badge mounted after its count arrived shows it at once.
101
+ const [countsByBadgeKey, setCountsByBadgeKey] = useState(() => Object.fromEntries(lastBadgeCountsByKey));
34
102
  // Transient `ON_INCREASE` pulse flags, keyed by badge key.
35
103
  const [pulsingByBadgeKey, setPulsingByBadgeKey] = useState({});
36
104
  // Previous counts (ref, not state) so an increase can be detected without
37
- // re-subscribing on every count change.
38
- const previousCountsRef = useRef({});
105
+ // re-subscribing on every count change. Seeded like the counts, so a remembered count is not read
106
+ // as an increase and does not pulse on mount.
107
+ const previousCountsRef = useRef(Object.fromEntries(lastBadgeCountsByKey));
39
108
  useEffect(() => {
40
109
  return on(FrontendEvents.BADGE_COUNT_CHANGED, (payload) => {
41
110
  // A malformed reference, or one naming a scope no badge resource backs, is dropped rather
@@ -1 +1 @@
1
- {"version":3,"file":"useNotificationBadges.js","sourceRoot":"","sources":["../../../../../../src/core/requests/websockets/useNotificationBadges.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * useNotificationBadges — the single frontend badge-count store (R6b).\n *\n * Replaces the retracted dual mechanism (`useBadge`/`useUserBadges` + the\n * launcher's own `badgeCounts` state). Subscribes ONCE to `BADGE_COUNT_CHANGED`\n * and indexes counts by badge KEY — `<scope>:<identifier>`, reduced from the pushed\n * `badgeReference` (`<scope>:<scopeId>:<identifier>`) by `notificationBadgeKeyFromReference`.\n * The backend already scopes every push to the connected user (seed on connect, R6a; recompute on\n * mutation, R5), so the store never needs the session's own scope ids to receive.\n *\n * ## Why the key and not the identifier\n *\n * It used to `split(':')` by hand, take part `[2]`, and index on that — discarding the scope. Two\n * definitions declaring one identifier at different scopes therefore collapsed onto one entry: the\n * second was unreachable and rendered the first's count. The key is the definition's own identity,\n * built by the SAME function `NavigationItemBadge` resolves a `notificationBadgeRef` with and the\n * backend refuses duplicates of at boot, so the store's key and the lookup key cannot drift apart.\n *\n * `scopeId` stays out of the key deliberately: it says WHOSE badge, which a navigation declaration\n * cannot name, and a session only ever receives pushes for its own scope ids.\n *\n * Call it ONCE at a host (e.g. the sidebar behavior) and thread `getBadgeState`\n * down, so there is a single subscription + one shared pulse-timer state.\n */\nimport { useCallback, useEffect, useRef, useState } from 'react';\n\nimport {\n NotificationBadgeDefinition,\n NotificationBadgePulse,\n notificationBadgeIdentityKey,\n notificationBadgeKeyFromReference,\n} from '@wildo-ai/saas-models';\nimport { FrontendEvents, type FrontendEventBadgeCountChanged } from '~wildo-frontend-lib/core/events/events.frontend.schemas';\nimport { useEventBus } from '~wildo-frontend-lib/core/events/useEventBus';\n\n/** How long an `ON_INCREASE` badge visibly pulses after a count rise (ms). */\nconst PULSE_WINDOW_MS = 2000;\n\n/** Resolved, render-ready badge state for one definition. */\nexport interface ResolvedBadgeState {\n /** Current count (0 until the first push for this identifier arrives). */\n count: number;\n /** Already-resolved \"pulse now\", per the definition's pulse trigger. */\n pulse: boolean;\n}\n\nexport interface UseNotificationBadgesResult {\n /** Resolve the live count + pulse for a badge definition. */\n getBadgeState: (definition: NotificationBadgeDefinition) => ResolvedBadgeState;\n}\n\nexport const useNotificationBadges = (): UseNotificationBadgesResult => {\n const { on } = useEventBus();\n\n const [countsByBadgeKey, setCountsByBadgeKey] = useState<Record<string, number>>({});\n // Transient `ON_INCREASE` pulse flags, keyed by badge key.\n const [pulsingByBadgeKey, setPulsingByBadgeKey] = useState<Record<string, boolean>>({});\n // Previous counts (ref, not state) so an increase can be detected without\n // re-subscribing on every count change.\n const previousCountsRef = useRef<Record<string, number>>({});\n\n useEffect(() => {\n return on(FrontendEvents.BADGE_COUNT_CHANGED, (payload: FrontendEventBadgeCountChanged) => {\n // A malformed reference, or one naming a scope no badge resource backs, is dropped rather\n // than indexed under a key nothing can resolve.\n const badgeKey = notificationBadgeKeyFromReference(payload.badgeReference);\n if (!badgeKey) {\n return;\n }\n const previous = previousCountsRef.current[badgeKey] ?? 0;\n previousCountsRef.current[badgeKey] = payload.badgeCount;\n\n setCountsByBadgeKey((prev) => ({ ...prev, [badgeKey]: payload.badgeCount }));\n\n if (payload.badgeCount > previous) {\n setPulsingByBadgeKey((prev) => ({ ...prev, [badgeKey]: true }));\n // Clear the transient pulse after the window (fresh render shows a static badge).\n setTimeout(() => {\n setPulsingByBadgeKey((prev) => ({ ...prev, [badgeKey]: false }));\n }, PULSE_WINDOW_MS);\n }\n });\n }, [on]);\n\n const getBadgeState = useCallback(\n (definition: NotificationBadgeDefinition): ResolvedBadgeState => {\n const badgeKey = notificationBadgeIdentityKey(definition);\n const count = countsByBadgeKey[badgeKey] ?? 0;\n\n let pulse = false;\n switch (definition.display.pulse) {\n case NotificationBadgePulse.WHILE_ACTIVE:\n pulse = count > 0;\n break;\n case NotificationBadgePulse.ON_INCREASE:\n pulse = !!pulsingByBadgeKey[badgeKey];\n break;\n case NotificationBadgePulse.NONE:\n default:\n pulse = false;\n }\n\n return { count, pulse };\n },\n [countsByBadgeKey, pulsingByBadgeKey],\n );\n\n return { getBadgeState };\n};\n\nexport default useNotificationBadges;\n"]}
1
+ {"version":3,"file":"useNotificationBadges.js","sourceRoot":"","sources":["../../../../../../src/core/requests/websockets/useNotificationBadges.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AAEjE,OAAO,EAEL,sBAAsB,EACtB,4BAA4B,EAC5B,iCAAiC,GAClC,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EAAE,cAAc,EAAuC,MAAM,yDAAyD,CAAC;AAC9H,OAAO,EAAE,WAAW,EAAE,MAAM,6CAA6C,CAAC;AAC1E,OAAO,EAAE,eAAe,EAAE,MAAM,4CAA4C,CAAC;AAE7E,8EAA8E;AAC9E,MAAM,eAAe,GAAG,IAAI,CAAC;AAE7B;;;;;;;;;;;;;;;;GAgBG;AACH,MAAM,oBAAoB,GAAG,IAAI,GAAG,EAAkB,CAAC;AAEvD;;;;GAIG;AACH,MAAM,UAAU,6BAA6B,CAC3C,IAAkG,EAClG,OAAuC;IAEvC,MAAM,QAAQ,GAAG,iCAAiC,CAAC,OAAO,CAAC,cAAc,CAAC,CAAC;IAC3E,IAAI,QAAQ;QAAE,oBAAoB,CAAC,GAAG,CAAC,QAAQ,EAAE,OAAO,CAAC,UAAU,CAAC,CAAC;IACrE,IAAI,CAAC,cAAc,CAAC,mBAAmB,EAAE,OAAO,CAAC,CAAC;AACpD,CAAC;AAED,gFAAgF;AAChF,MAAM,UAAU,6BAA6B;IAC3C,oBAAoB,CAAC,KAAK,EAAE,CAAC;AAC/B,CAAC;AAED;;;;;;;;;;;GAWG;AACH,MAAM,UAAU,+BAA+B;IAC7C,MAAM,QAAQ,GAAG,eAAe,EAAE,CAAC;IACnC,MAAM,MAAM,GAAG,QAAQ,EAAE,aAAa,IAAI,IAAI,CAAC;IAC/C,MAAM,cAAc,GAAG,QAAQ,EAAE,qBAAqB,IAAI,IAAI,CAAC;IAC/D,MAAM,QAAQ,GAAG,MAAM,CAAC,EAAE,MAAM,EAAE,cAAc,EAAE,CAAC,CAAC;IACpD,SAAS,CAAC,GAAG,EAAE;QACb,MAAM,MAAM,GAAG,QAAQ,CAAC,OAAO,CAAC;QAChC,QAAQ,CAAC,OAAO,GAAG,EAAE,MAAM,EAAE,cAAc,EAAE,CAAC;QAC9C;;;;;WAKG;QACH,MAAM,WAAW,GAAG,MAAM,CAAC,MAAM,KAAK,IAAI,IAAI,MAAM,CAAC,MAAM,KAAK,MAAM,CAAC;QACvE,MAAM,mBAAmB,GAAG,MAAM,CAAC,cAAc,KAAK,IAAI,IAAI,MAAM,CAAC,cAAc,KAAK,cAAc,CAAC;QACvG,IAAI,WAAW,IAAI,mBAAmB;YAAE,6BAA6B,EAAE,CAAC;IAC1E,CAAC,EAAE,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC,CAAC;IAC7B,OAAO,IAAI,CAAC;AACd,CAAC;AAeD,MAAM,CAAC,MAAM,qBAAqB,GAAG,GAAgC,EAAE;IACrE,MAAM,EAAE,EAAE,EAAE,GAAG,WAAW,EAAE,CAAC;IAE7B,8FAA8F;IAC9F,MAAM,CAAC,gBAAgB,EAAE,mBAAmB,CAAC,GAAG,QAAQ,CAAyB,GAAG,EAAE,CAAC,MAAM,CAAC,WAAW,CAAC,oBAAoB,CAAC,CAAC,CAAC;IACjI,2DAA2D;IAC3D,MAAM,CAAC,iBAAiB,EAAE,oBAAoB,CAAC,GAAG,QAAQ,CAA0B,EAAE,CAAC,CAAC;IACxF,0EAA0E;IAC1E,kGAAkG;IAClG,8CAA8C;IAC9C,MAAM,iBAAiB,GAAG,MAAM,CAAyB,MAAM,CAAC,WAAW,CAAC,oBAAoB,CAAC,CAAC,CAAC;IAEnG,SAAS,CAAC,GAAG,EAAE;QACb,OAAO,EAAE,CAAC,cAAc,CAAC,mBAAmB,EAAE,CAAC,OAAuC,EAAE,EAAE;YACxF,0FAA0F;YAC1F,gDAAgD;YAChD,MAAM,QAAQ,GAAG,iCAAiC,CAAC,OAAO,CAAC,cAAc,CAAC,CAAC;YAC3E,IAAI,CAAC,QAAQ,EAAE,CAAC;gBACd,OAAO;YACT,CAAC;YACD,MAAM,QAAQ,GAAG,iBAAiB,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;YAC1D,iBAAiB,CAAC,OAAO,CAAC,QAAQ,CAAC,GAAG,OAAO,CAAC,UAAU,CAAC;YAEzD,mBAAmB,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,EAAE,GAAG,IAAI,EAAE,CAAC,QAAQ,CAAC,EAAE,OAAO,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC;YAE7E,IAAI,OAAO,CAAC,UAAU,GAAG,QAAQ,EAAE,CAAC;gBAClC,oBAAoB,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,EAAE,GAAG,IAAI,EAAE,CAAC,QAAQ,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;gBAChE,kFAAkF;gBAClF,UAAU,CAAC,GAAG,EAAE;oBACd,oBAAoB,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,EAAE,GAAG,IAAI,EAAE,CAAC,QAAQ,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC;gBACnE,CAAC,EAAE,eAAe,CAAC,CAAC;YACtB,CAAC;QACH,CAAC,CAAC,CAAC;IACL,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;IAET,MAAM,aAAa,GAAG,WAAW,CAC/B,CAAC,UAAuC,EAAsB,EAAE;QAC9D,MAAM,QAAQ,GAAG,4BAA4B,CAAC,UAAU,CAAC,CAAC;QAC1D,MAAM,KAAK,GAAG,gBAAgB,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;QAE9C,IAAI,KAAK,GAAG,KAAK,CAAC;QAClB,QAAQ,UAAU,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;YACjC,KAAK,sBAAsB,CAAC,YAAY;gBACtC,KAAK,GAAG,KAAK,GAAG,CAAC,CAAC;gBAClB,MAAM;YACR,KAAK,sBAAsB,CAAC,WAAW;gBACrC,KAAK,GAAG,CAAC,CAAC,iBAAiB,CAAC,QAAQ,CAAC,CAAC;gBACtC,MAAM;YACR,KAAK,sBAAsB,CAAC,IAAI,CAAC;YACjC;gBACE,KAAK,GAAG,KAAK,CAAC;QAClB,CAAC;QAED,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC;IAC1B,CAAC,EACD,CAAC,gBAAgB,EAAE,iBAAiB,CAAC,CACtC,CAAC;IAEF,OAAO,EAAE,aAAa,EAAE,CAAC;AAC3B,CAAC,CAAC;AAEF,eAAe,qBAAqB,CAAC","sourcesContent":["/**\n * useNotificationBadges — the single frontend badge-count store (R6b).\n *\n * Replaces the retracted dual mechanism (`useBadge`/`useUserBadges` + the\n * launcher's own `badgeCounts` state). Subscribes ONCE to `BADGE_COUNT_CHANGED`\n * and indexes counts by badge KEY — `<scope>:<identifier>`, reduced from the pushed\n * `badgeReference` (`<scope>:<scopeId>:<identifier>`) by `notificationBadgeKeyFromReference`.\n * The backend already scopes every push to the connected user (seed on connect, R6a; recompute on\n * mutation, R5), so the store never needs the session's own scope ids to receive.\n *\n * ## Why the key and not the identifier\n *\n * It used to `split(':')` by hand, take part `[2]`, and index on that — discarding the scope. Two\n * definitions declaring one identifier at different scopes therefore collapsed onto one entry: the\n * second was unreachable and rendered the first's count. The key is the definition's own identity,\n * built by the SAME function `NavigationItemBadge` resolves a `notificationBadgeRef` with and the\n * backend refuses duplicates of at boot, so the store's key and the lookup key cannot drift apart.\n *\n * `scopeId` stays out of the key deliberately: it says WHOSE badge, which a navigation declaration\n * cannot name, and a session only ever receives pushes for its own scope ids.\n *\n * Call it ONCE at a host (e.g. the sidebar behavior) and thread `getBadgeState`\n * down, so there is a single subscription + one shared pulse-timer state.\n */\nimport { useCallback, useEffect, useRef, useState } from 'react';\n\nimport {\n NotificationBadgeDefinition,\n NotificationBadgePulse,\n notificationBadgeIdentityKey,\n notificationBadgeKeyFromReference,\n} from '@wildo-ai/saas-models';\nimport { FrontendEvents, type FrontendEventBadgeCountChanged } from '~wildo-frontend-lib/core/events/events.frontend.schemas';\nimport { useEventBus } from '~wildo-frontend-lib/core/events/useEventBus';\nimport { useAppScopeSafe } from '~wildo-frontend-lib/core/scope/useAppScope';\n\n/** How long an `ON_INCREASE` badge visibly pulses after a count rise (ms). */\nconst PULSE_WINDOW_MS = 2000;\n\n/**\n * The LAST count this page was given for each badge key — the store's memory.\n *\n * Each `useNotificationBadges` instance holds its own counts and hears only the events sent after it\n * subscribed, and a count is sent only when it changes. So a badge mounted LATE — a menubar group whose\n * menu opens after the count arrived, a navigation remounted by a route change — showed nothing until\n * the next change (#1454 review). Every producer now writes through\n * {@link publishNotificationBadgeCount}, which records the count here before emitting it, and every new\n * instance starts from what is recorded.\n *\n * Page-wide by design: one browser page hosts one application, and a count is a fact about this\n * session's view of it. Cleared whenever the signed-in USER or the current ORGANIZATION changes\n * ({@link NotificationBadgeMemoryBoundary}), so a second person signing in on the same page never sees\n * the first person's counts, and an organization switch never seeds a badge with the previous\n * organization's. The memory is keyed without a scope id, so clearing at the boundary is what keeps a\n * count from crossing it.\n */\nconst lastBadgeCountsByKey = new Map<string, number>();\n\n/**\n * Hand a badge count to the store — the ONE way a count reaches it, from the websocket bridge (a\n * backend push) and from `usePublishNotificationBadgeCount` (a frontend-produced count) alike. Records\n * it for late subscribers, then emits it for the live ones.\n */\nexport function publishNotificationBadgeCount(\n emit: (event: FrontendEvents.BADGE_COUNT_CHANGED, payload: FrontendEventBadgeCountChanged) => void,\n payload: FrontendEventBadgeCountChanged,\n): void {\n const badgeKey = notificationBadgeKeyFromReference(payload.badgeReference);\n if (badgeKey) lastBadgeCountsByKey.set(badgeKey, payload.badgeCount);\n emit(FrontendEvents.BADGE_COUNT_CHANGED, payload);\n}\n\n/** Forget every recorded count — at an identity boundary, and between tests. */\nexport function forgetNotificationBadgeCounts(): void {\n lastBadgeCountsByKey.clear();\n}\n\n/**\n * Where the memory ENDS: renders nothing, and forgets every remembered count when the signed-in user or\n * the current organization changes.\n *\n * Keyed on the app scope's identity rather than on the `USER_LOGOUT` event. When this was written nothing\n * emitted that event (#1454 review, N1; it has had a producer since #1977), and the identity is still the\n * better key: the scope's user id changes on every way a session ends or begins — this tab's sign-out,\n * another tab's, a refresh that fails — and its organization id on every switch, which is the other\n * boundary a count must not cross (N2) and which no sign-out event carries.\n * Mounted by `ApplicationMainProvider` beside the read-cache bridge, which watches the same scope\n * for the same reason.\n */\nexport function NotificationBadgeMemoryBoundary(): null {\n const appScope = useAppScopeSafe();\n const userId = appScope?.currentUserId ?? null;\n const organizationId = appScope?.currentOrganizationId ?? null;\n const previous = useRef({ userId, organizationId });\n useEffect(() => {\n const before = previous.current;\n previous.current = { userId, organizationId };\n /*\n * Only a value that was SET and changed is a boundary. An organization id APPEARING after session\n * restore (null → id) belongs to the same session and the same counts: clearing there left a menu\n * opened later empty until the count next moved, since a publisher republishes only on change\n * (re-review N4). A user id going to null is a sign-out and does clear.\n */\n const userChanged = before.userId !== null && before.userId !== userId;\n const organizationChanged = before.organizationId !== null && before.organizationId !== organizationId;\n if (userChanged || organizationChanged) forgetNotificationBadgeCounts();\n }, [userId, organizationId]);\n return null;\n}\n\n/** Resolved, render-ready badge state for one definition. */\nexport interface ResolvedBadgeState {\n /** Current count (0 until the first push for this identifier arrives). */\n count: number;\n /** Already-resolved \"pulse now\", per the definition's pulse trigger. */\n pulse: boolean;\n}\n\nexport interface UseNotificationBadgesResult {\n /** Resolve the live count + pulse for a badge definition. */\n getBadgeState: (definition: NotificationBadgeDefinition) => ResolvedBadgeState;\n}\n\nexport const useNotificationBadges = (): UseNotificationBadgesResult => {\n const { on } = useEventBus();\n\n // Seeded from the page's memory, so a badge mounted after its count arrived shows it at once.\n const [countsByBadgeKey, setCountsByBadgeKey] = useState<Record<string, number>>(() => Object.fromEntries(lastBadgeCountsByKey));\n // Transient `ON_INCREASE` pulse flags, keyed by badge key.\n const [pulsingByBadgeKey, setPulsingByBadgeKey] = useState<Record<string, boolean>>({});\n // Previous counts (ref, not state) so an increase can be detected without\n // re-subscribing on every count change. Seeded like the counts, so a remembered count is not read\n // as an increase and does not pulse on mount.\n const previousCountsRef = useRef<Record<string, number>>(Object.fromEntries(lastBadgeCountsByKey));\n\n useEffect(() => {\n return on(FrontendEvents.BADGE_COUNT_CHANGED, (payload: FrontendEventBadgeCountChanged) => {\n // A malformed reference, or one naming a scope no badge resource backs, is dropped rather\n // than indexed under a key nothing can resolve.\n const badgeKey = notificationBadgeKeyFromReference(payload.badgeReference);\n if (!badgeKey) {\n return;\n }\n const previous = previousCountsRef.current[badgeKey] ?? 0;\n previousCountsRef.current[badgeKey] = payload.badgeCount;\n\n setCountsByBadgeKey((prev) => ({ ...prev, [badgeKey]: payload.badgeCount }));\n\n if (payload.badgeCount > previous) {\n setPulsingByBadgeKey((prev) => ({ ...prev, [badgeKey]: true }));\n // Clear the transient pulse after the window (fresh render shows a static badge).\n setTimeout(() => {\n setPulsingByBadgeKey((prev) => ({ ...prev, [badgeKey]: false }));\n }, PULSE_WINDOW_MS);\n }\n });\n }, [on]);\n\n const getBadgeState = useCallback(\n (definition: NotificationBadgeDefinition): ResolvedBadgeState => {\n const badgeKey = notificationBadgeIdentityKey(definition);\n const count = countsByBadgeKey[badgeKey] ?? 0;\n\n let pulse = false;\n switch (definition.display.pulse) {\n case NotificationBadgePulse.WHILE_ACTIVE:\n pulse = count > 0;\n break;\n case NotificationBadgePulse.ON_INCREASE:\n pulse = !!pulsingByBadgeKey[badgeKey];\n break;\n case NotificationBadgePulse.NONE:\n default:\n pulse = false;\n }\n\n return { count, pulse };\n },\n [countsByBadgeKey, pulsingByBadgeKey],\n );\n\n return { getBadgeState };\n};\n\nexport default useNotificationBadges;\n"]}
@@ -0,0 +1,28 @@
1
+ /** The scopeId a frontend-produced reference carries: required by the wire format, read by nobody. */
2
+ export declare const FRONTEND_PRODUCED_BADGE_SCOPE_ID = "this-session";
3
+ /**
4
+ * @wildo_source:part:start saas.frontend.notifications.publish-badge-count facet:layer:frontend facet:audience:app-developer
5
+ *
6
+ * Publish the count of a `FRONTEND_PRODUCED` notification badge — import from `@wildo-ai/saas-frontend-lib`.
7
+ *
8
+ * - `badgeKey`: the badge KEY, `<scope>:<identifier>` — build it with `buildNotificationBadgeKey` from
9
+ * `@wildo-ai/saas-models`, the same key the navigation item's `notificationBadgeRef` names.
10
+ * - `count`: the current count, or `null` while it is not known yet (nothing is published then — a 0
11
+ * would say "nothing is waiting").
12
+ *
13
+ * Publishes nothing for a key whose definition is not `FRONTEND_PRODUCED` (the backend owns that
14
+ * count) or that no definition declares. Call it from a component mounted wherever the navigation
15
+ * showing the badge is — for a menubar or sidebar badge, a shell companion passed as
16
+ * `shellCompanions` to `ApplicationMainProvider`, which the signed-in shell mounts on every page. A
17
+ * badge that mounts later still reads the last published count.
18
+ *
19
+ * @example
20
+ * export function PublishReviewsOwed(): null {
21
+ * const reviews = useReviewsOwedRows(); // rows the page already reads
22
+ * usePublishNotificationBadgeCount(REVIEWS_OWED_BADGE_KEY, reviews === null ? null : reviews.length);
23
+ * return null;
24
+ * }
25
+ */
26
+ export declare function usePublishNotificationBadgeCount(badgeKey: string, count: number | null): void;
27
+ /** @wildo_source:part:end saas.frontend.notifications.publish-badge-count */
28
+ //# sourceMappingURL=usePublishNotificationBadgeCount.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"usePublishNotificationBadgeCount.d.ts","sourceRoot":"","sources":["../../../../../../src/core/requests/websockets/usePublishNotificationBadgeCount.ts"],"names":[],"mappings":"AAuCA,sGAAsG;AACtG,eAAO,MAAM,gCAAgC,iBAAiB,CAAC;AAE/D;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,wBAAgB,gCAAgC,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI,GAAG,IAAI,CA0B7F;AACD,6EAA6E"}
@@ -0,0 +1,86 @@
1
+ /**
2
+ * usePublishNotificationBadgeCount — the producer side of a `FRONTEND_PRODUCED` badge.
3
+ *
4
+ * A badge's count normally reaches the browser as a backend push (`badge:update`, bridged to
5
+ * `BADGE_COUNT_CHANGED`). A `FRONTEND_PRODUCED` badge has no backend producer: its count is derived
6
+ * from rows the backend cannot count — a projection rather than a repository collection — and which
7
+ * the page already holds and keeps current. This hook publishes that count onto the SAME event the
8
+ * backend bridge emits, so `useNotificationBadges` and `NavigationItemBadge` read it exactly as they
9
+ * read a pushed one. There is one badge store, fed from two directions, never two stores.
10
+ *
11
+ * ## Refuses any other kind
12
+ *
13
+ * A key naming an `EVENT_COUNTER` or `DERIVED_QUERY` definition is not published: the backend owns
14
+ * that count and pushes it, and a page publishing its own number would fight every push. A key that
15
+ * names no definition is not published either — there is nothing to draw it. Both are reported once
16
+ * in development, and neither throws: a badge is chrome, and chrome must not take a page down.
17
+ *
18
+ * ## When the count reaches the navigation
19
+ *
20
+ * On every change of the key or the count, and not before the count is known (`null`): a page that
21
+ * has not read its rows yet has no count, and publishing 0 would say "nothing is waiting" when the
22
+ * truth is "not known yet". The first count arrives after an async read, by which time the navigation
23
+ * drawing the badge has subscribed. The reference's scopeId is {@link FRONTEND_PRODUCED_BADGE_SCOPE_ID}:
24
+ * the browser reduces a reference to its key and never reads the scopeId, and a frontend-produced
25
+ * count belongs to this session by construction.
26
+ */
27
+ import { useEffect, useRef } from 'react';
28
+ import { NotificationBadgeSourceKind, buildNotificationBadgeReference, notificationBadgeIdentityKey, parseNotificationBadgeKey, } from '@wildo-ai/saas-models';
29
+ import { publishNotificationBadgeCount } from './useNotificationBadges.js';
30
+ import { useEventBus } from '../../../core/events/useEventBus.js';
31
+ import { useResourceRegistry } from '../../../core/resources/useResourceRegistry.js';
32
+ import { envLoader } from '../../../core/runtime/env-variable-loader.frontend.service.js';
33
+ /** The scopeId a frontend-produced reference carries: required by the wire format, read by nobody. */
34
+ export const FRONTEND_PRODUCED_BADGE_SCOPE_ID = 'this-session';
35
+ /**
36
+ * @wildo_source:part:start saas.frontend.notifications.publish-badge-count facet:layer:frontend facet:audience:app-developer
37
+ *
38
+ * Publish the count of a `FRONTEND_PRODUCED` notification badge — import from `@wildo-ai/saas-frontend-lib`.
39
+ *
40
+ * - `badgeKey`: the badge KEY, `<scope>:<identifier>` — build it with `buildNotificationBadgeKey` from
41
+ * `@wildo-ai/saas-models`, the same key the navigation item's `notificationBadgeRef` names.
42
+ * - `count`: the current count, or `null` while it is not known yet (nothing is published then — a 0
43
+ * would say "nothing is waiting").
44
+ *
45
+ * Publishes nothing for a key whose definition is not `FRONTEND_PRODUCED` (the backend owns that
46
+ * count) or that no definition declares. Call it from a component mounted wherever the navigation
47
+ * showing the badge is — for a menubar or sidebar badge, a shell companion passed as
48
+ * `shellCompanions` to `ApplicationMainProvider`, which the signed-in shell mounts on every page. A
49
+ * badge that mounts later still reads the last published count.
50
+ *
51
+ * @example
52
+ * export function PublishReviewsOwed(): null {
53
+ * const reviews = useReviewsOwedRows(); // rows the page already reads
54
+ * usePublishNotificationBadgeCount(REVIEWS_OWED_BADGE_KEY, reviews === null ? null : reviews.length);
55
+ * return null;
56
+ * }
57
+ */
58
+ export function usePublishNotificationBadgeCount(badgeKey, count) {
59
+ const { emit } = useEventBus();
60
+ const { registry } = useResourceRegistry();
61
+ const reported = useRef(false);
62
+ const definition = registry.notificationBadgeDefinitions.find((candidate) => notificationBadgeIdentityKey(candidate) === badgeKey);
63
+ const publishable = definition?.source.kind === NotificationBadgeSourceKind.FRONTEND_PRODUCED;
64
+ useEffect(() => {
65
+ if (!publishable) {
66
+ if (!reported.current && envLoader.isDevelopment()) {
67
+ reported.current = true;
68
+ console.warn(definition
69
+ ? `[usePublishNotificationBadgeCount] "${badgeKey}" is a ${definition.source.kind} badge; its count is the backend's, so this page does not publish one.`
70
+ : `[usePublishNotificationBadgeCount] "${badgeKey}" names no registered notification badge definition; nothing would draw it.`);
71
+ }
72
+ return;
73
+ }
74
+ if (count === null)
75
+ return;
76
+ const parsed = parseNotificationBadgeKey(badgeKey);
77
+ if (!parsed)
78
+ return;
79
+ publishNotificationBadgeCount(emit, {
80
+ badgeReference: buildNotificationBadgeReference(parsed.scope, FRONTEND_PRODUCED_BADGE_SCOPE_ID, parsed.identifier),
81
+ badgeCount: Math.max(0, Math.trunc(count)),
82
+ });
83
+ }, [badgeKey, count, publishable, definition, emit]);
84
+ }
85
+ /** @wildo_source:part:end saas.frontend.notifications.publish-badge-count */
86
+ //# sourceMappingURL=usePublishNotificationBadgeCount.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"usePublishNotificationBadgeCount.js","sourceRoot":"","sources":["../../../../../../src/core/requests/websockets/usePublishNotificationBadgeCount.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AACH,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,OAAO,CAAC;AAE1C,OAAO,EACL,2BAA2B,EAC3B,+BAA+B,EAC/B,4BAA4B,EAC5B,yBAAyB,GAC1B,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EAAE,6BAA6B,EAAE,MAAM,yBAAyB,CAAC;AACxE,OAAO,EAAE,WAAW,EAAE,MAAM,6CAA6C,CAAC;AAC1E,OAAO,EAAE,mBAAmB,EAAE,MAAM,wDAAwD,CAAC;AAC7F,OAAO,EAAE,SAAS,EAAE,MAAM,uEAAuE,CAAC;AAElG,sGAAsG;AACtG,MAAM,CAAC,MAAM,gCAAgC,GAAG,cAAc,CAAC;AAE/D;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,MAAM,UAAU,gCAAgC,CAAC,QAAgB,EAAE,KAAoB;IACrF,MAAM,EAAE,IAAI,EAAE,GAAG,WAAW,EAAE,CAAC;IAC/B,MAAM,EAAE,QAAQ,EAAE,GAAG,mBAAmB,EAAE,CAAC;IAC3C,MAAM,QAAQ,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;IAE/B,MAAM,UAAU,GAAG,QAAQ,CAAC,4BAA4B,CAAC,IAAI,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,4BAA4B,CAAC,SAAS,CAAC,KAAK,QAAQ,CAAC,CAAC;IACnI,MAAM,WAAW,GAAG,UAAU,EAAE,MAAM,CAAC,IAAI,KAAK,2BAA2B,CAAC,iBAAiB,CAAC;IAE9F,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,CAAC,WAAW,EAAE,CAAC;YACjB,IAAI,CAAC,QAAQ,CAAC,OAAO,IAAI,SAAS,CAAC,aAAa,EAAE,EAAE,CAAC;gBACnD,QAAQ,CAAC,OAAO,GAAG,IAAI,CAAC;gBACxB,OAAO,CAAC,IAAI,CAAC,UAAU;oBACrB,CAAC,CAAC,uCAAuC,QAAQ,UAAU,UAAU,CAAC,MAAM,CAAC,IAAI,wEAAwE;oBACzJ,CAAC,CAAC,uCAAuC,QAAQ,6EAA6E,CAAC,CAAC;YACpI,CAAC;YACD,OAAO;QACT,CAAC;QACD,IAAI,KAAK,KAAK,IAAI;YAAE,OAAO;QAC3B,MAAM,MAAM,GAAG,yBAAyB,CAAC,QAAQ,CAAC,CAAC;QACnD,IAAI,CAAC,MAAM;YAAE,OAAO;QACpB,6BAA6B,CAAC,IAAI,EAAE;YAClC,cAAc,EAAE,+BAA+B,CAAC,MAAM,CAAC,KAAK,EAAE,gCAAgC,EAAE,MAAM,CAAC,UAAU,CAAC;YAClH,UAAU,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;SAC3C,CAAC,CAAC;IACL,CAAC,EAAE,CAAC,QAAQ,EAAE,KAAK,EAAE,WAAW,EAAE,UAAU,EAAE,IAAI,CAAC,CAAC,CAAC;AACvD,CAAC;AACD,6EAA6E","sourcesContent":["/**\n * usePublishNotificationBadgeCount — the producer side of a `FRONTEND_PRODUCED` badge.\n *\n * A badge's count normally reaches the browser as a backend push (`badge:update`, bridged to\n * `BADGE_COUNT_CHANGED`). A `FRONTEND_PRODUCED` badge has no backend producer: its count is derived\n * from rows the backend cannot count — a projection rather than a repository collection — and which\n * the page already holds and keeps current. This hook publishes that count onto the SAME event the\n * backend bridge emits, so `useNotificationBadges` and `NavigationItemBadge` read it exactly as they\n * read a pushed one. There is one badge store, fed from two directions, never two stores.\n *\n * ## Refuses any other kind\n *\n * A key naming an `EVENT_COUNTER` or `DERIVED_QUERY` definition is not published: the backend owns\n * that count and pushes it, and a page publishing its own number would fight every push. A key that\n * names no definition is not published either — there is nothing to draw it. Both are reported once\n * in development, and neither throws: a badge is chrome, and chrome must not take a page down.\n *\n * ## When the count reaches the navigation\n *\n * On every change of the key or the count, and not before the count is known (`null`): a page that\n * has not read its rows yet has no count, and publishing 0 would say \"nothing is waiting\" when the\n * truth is \"not known yet\". The first count arrives after an async read, by which time the navigation\n * drawing the badge has subscribed. The reference's scopeId is {@link FRONTEND_PRODUCED_BADGE_SCOPE_ID}:\n * the browser reduces a reference to its key and never reads the scopeId, and a frontend-produced\n * count belongs to this session by construction.\n */\nimport { useEffect, useRef } from 'react';\n\nimport {\n NotificationBadgeSourceKind,\n buildNotificationBadgeReference,\n notificationBadgeIdentityKey,\n parseNotificationBadgeKey,\n} from '@wildo-ai/saas-models';\nimport { publishNotificationBadgeCount } from './useNotificationBadges';\nimport { useEventBus } from '~wildo-frontend-lib/core/events/useEventBus';\nimport { useResourceRegistry } from '~wildo-frontend-lib/core/resources/useResourceRegistry';\nimport { envLoader } from '~wildo-frontend-lib/core/runtime/env-variable-loader.frontend.service';\n\n/** The scopeId a frontend-produced reference carries: required by the wire format, read by nobody. */\nexport const FRONTEND_PRODUCED_BADGE_SCOPE_ID = 'this-session';\n\n/**\n * @wildo_source:part:start saas.frontend.notifications.publish-badge-count facet:layer:frontend facet:audience:app-developer\n *\n * Publish the count of a `FRONTEND_PRODUCED` notification badge — import from `@wildo-ai/saas-frontend-lib`.\n *\n * - `badgeKey`: the badge KEY, `<scope>:<identifier>` — build it with `buildNotificationBadgeKey` from\n * `@wildo-ai/saas-models`, the same key the navigation item's `notificationBadgeRef` names.\n * - `count`: the current count, or `null` while it is not known yet (nothing is published then — a 0\n * would say \"nothing is waiting\").\n *\n * Publishes nothing for a key whose definition is not `FRONTEND_PRODUCED` (the backend owns that\n * count) or that no definition declares. Call it from a component mounted wherever the navigation\n * showing the badge is — for a menubar or sidebar badge, a shell companion passed as\n * `shellCompanions` to `ApplicationMainProvider`, which the signed-in shell mounts on every page. A\n * badge that mounts later still reads the last published count.\n *\n * @example\n * export function PublishReviewsOwed(): null {\n * const reviews = useReviewsOwedRows(); // rows the page already reads\n * usePublishNotificationBadgeCount(REVIEWS_OWED_BADGE_KEY, reviews === null ? null : reviews.length);\n * return null;\n * }\n */\nexport function usePublishNotificationBadgeCount(badgeKey: string, count: number | null): void {\n const { emit } = useEventBus();\n const { registry } = useResourceRegistry();\n const reported = useRef(false);\n\n const definition = registry.notificationBadgeDefinitions.find((candidate) => notificationBadgeIdentityKey(candidate) === badgeKey);\n const publishable = definition?.source.kind === NotificationBadgeSourceKind.FRONTEND_PRODUCED;\n\n useEffect(() => {\n if (!publishable) {\n if (!reported.current && envLoader.isDevelopment()) {\n reported.current = true;\n console.warn(definition\n ? `[usePublishNotificationBadgeCount] \"${badgeKey}\" is a ${definition.source.kind} badge; its count is the backend's, so this page does not publish one.`\n : `[usePublishNotificationBadgeCount] \"${badgeKey}\" names no registered notification badge definition; nothing would draw it.`);\n }\n return;\n }\n if (count === null) return;\n const parsed = parseNotificationBadgeKey(badgeKey);\n if (!parsed) return;\n publishNotificationBadgeCount(emit, {\n badgeReference: buildNotificationBadgeReference(parsed.scope, FRONTEND_PRODUCED_BADGE_SCOPE_ID, parsed.identifier),\n badgeCount: Math.max(0, Math.trunc(count)),\n });\n }, [badgeKey, count, publishable, definition, emit]);\n}\n/** @wildo_source:part:end saas.frontend.notifications.publish-badge-count */\n"]}
@@ -5,9 +5,9 @@
5
5
  */
6
6
  import type { AuthenticationResponseJSON, PublicKeyCredentialRequestOptionsJSON } from '@simplewebauthn/browser';
7
7
  import { AvailableLanguage } from '@wildo-ai/presets-components-models';
8
- import type { ProviderOAuth2EndpointPlaceholderPosition } from '@wildo-ai/external-connectors-models';
9
- import type { AggregationQueryResponse, AuthenticationSessionState, AuthInvitationInfoResponse, AuthNextStep, AuthSessionPurpose, ChartDataRequestBody, CrossFrontendHandoffRequest, CrossFrontendHandoffResponse, ExternalIdentitySource, MilestoneDefinition, OneOffTokenExchangeResponse, SsoConnectionType, TokenExchangeOrganizationOnboardingResponse, TokenExchangeResponse, GovernedDocumentAcceptanceOwed } from '@wildo-ai/saas-models';
10
- import { AppConfiguration_FrontendBootstrapResponse, OnboardingObligation, AuthenticationRequest, AuthenticationResponse, AuthFactorLevel, AuthIdentificationResponse, AuthMethod, ReAuthenticationPurpose, type ReAuthenticationIdentityLink, I18nLabelsResponseDto, type FileUploadGrantStatus } from '@wildo-ai/saas-models';
8
+ import { type ProviderOAuth2EndpointPlaceholderPosition } from '@wildo-ai/external-connectors-models';
9
+ import type { AggregationQueryResponse, AuthenticationSessionState, AuthInvitationInfoResponse, AuthNextStep, AuthSessionPurpose, ChartDataRequestBody, CrossFrontendHandoffRequest, CrossFrontendHandoffResponse, ExternalIdentitySource, MilestoneDefinition, OneOffTokenExchangeResponse, SsoConnectionType, TokenExchangeOrganizationOnboardingResponse, TokenExchangeResponse, GovernedDocumentAcceptanceOwed, LinkedProviderConnectionsResponse } from '@wildo-ai/saas-models';
10
+ import { AppConfiguration_FrontendBootstrapResponse, OnboardingObligation, AuthenticationRequest, AuthenticationResponse, AuthFactorLevel, AuthIdentificationResponse, AuthMethod, ReAuthenticationPurpose, type ReAuthenticationIdentityLink, I18nLabelsResponseDto, type AgentWorkOverrideRate, type AgentWorkOverrideRateRequest, type FileUploadGrantStatus } from '@wildo-ai/saas-models';
11
11
  import { RequestOptions, WildoBackendHttpClient, WildoBackendHttpClientConfig, type UploadFileOptions } from './wildo-http-client.frontend.service';
12
12
  /**
13
13
  * What an MFA enrollment ceremony did to the authentication session it was performed on — the
@@ -189,7 +189,18 @@ export interface MyPendingInvitationView {
189
189
  * second — where everybody starts — is exactly when the first one matters.
190
190
  */
191
191
  export interface ConnectableProviderView {
192
+ /** The ref a connect starts through. For a shared connection, its BASE — its members are folded into this entry. */
192
193
  providerRef: string;
194
+ /**
195
+ * The CONNECTION this entry is (#1727): one entry per connection, never one per ref. Equal to `providerRef`.
196
+ * Optional on the wire so an older backend, which listed refs, still reads.
197
+ */
198
+ connectionRef?: string;
199
+ /**
200
+ * Every ref this connection serves here, base first — the features a person grants by connecting it once.
201
+ * `[providerRef]` for a vendor served by one ref.
202
+ */
203
+ servesRefs?: string[];
193
204
  /**
194
205
  * Whether THIS DEPLOYMENT can begin a connection — not whether the vendor supports one.
195
206
  *
@@ -515,6 +526,11 @@ export declare class WildoBackendHttpClient_ManualCalls extends WildoBackendHttp
515
526
  rejected: true;
516
527
  organizationId: string;
517
528
  }>;
529
+ /**
530
+ * The override rate of an organization's experts on its agents' proposals, per group, over a window (#1599).
531
+ * Calls POST /api/v1/agent-work/override-rate; an organization administrator must name the organization.
532
+ */
533
+ summarizeAgentWorkOverrideRate(request: AgentWorkOverrideRateRequest, options?: RequestOptions): Promise<AgentWorkOverrideRate>;
518
534
  /**
519
535
  * Verify an email address using the token and email from the verification link.
520
536
  * Calls POST /api/v1/auth/verify-email
@@ -692,6 +708,17 @@ export declare class WildoBackendHttpClient_ManualCalls extends WildoBackendHttp
692
708
  listConnectableProviders(options?: RequestOptions): Promise<{
693
709
  providers: ConnectableProviderView[];
694
710
  }>;
711
+ /**
712
+ * The connections one owner holds — one entry per CONNECTION (#1727). Calls `GET /api/v1/connections/linked`.
713
+ *
714
+ * `ownerScope` USER lists the caller's own; ORGANIZATION lists a tenant's, and only for a caller holding the role
715
+ * the organization credential list requires. Each entry names the credential rows a disconnect deletes through the
716
+ * credential resource's own DELETE — this client offers no second delete door.
717
+ */
718
+ listLinkedProviderConnections(owner: {
719
+ ownerScope: string;
720
+ ownerId?: string;
721
+ }, options?: RequestOptions): Promise<LinkedProviderConnectionsResponse>;
695
722
  /**
696
723
  * Begin connecting one account. Calls `POST /api/v1/connections/:providerRef/start`.
697
724
  *
@@ -707,6 +734,14 @@ export declare class WildoBackendHttpClient_ManualCalls extends WildoBackendHttp
707
734
  actingForUserId?: string;
708
735
  };
709
736
  scopes?: string[];
737
+ /**
738
+ * GROW the stored connection by these scopes instead of connecting afresh (#1671) — the `requestableScopes` of a
739
+ * `PROVIDER_OPERATION_SCOPE_NOT_GRANTED` refusal's `reauthorization` offer. Sent without `scopes` or
740
+ * `connectionParameters`: the stored connection's are reused.
741
+ */
742
+ addScopes?: string[];
743
+ /** The operation whose refusal offered `addScopes`, named on the grant's audit row. */
744
+ forOperationId?: string;
710
745
  connectionParameters?: Record<string, string>;
711
746
  /** Required `true` when the target lends the linking member's account to the organization. */
712
747
  acknowledgesOrganizationWideUse?: boolean;