@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.
- package/dist/esm/components/actions/action-bar.d.ts +15 -0
- package/dist/esm/components/actions/action-bar.d.ts.map +1 -1
- package/dist/esm/components/actions/action-bar.js +15 -0
- package/dist/esm/components/actions/action-bar.js.map +1 -1
- package/dist/esm/components/ai-elements/decision/approval.d.ts +97 -7
- package/dist/esm/components/ai-elements/decision/approval.d.ts.map +1 -1
- package/dist/esm/components/ai-elements/decision/approval.js.map +1 -1
- package/dist/esm/components/app/AppLayout_AuthenticatedRoute.d.ts.map +1 -1
- package/dist/esm/components/app/AppLayout_AuthenticatedRoute.js +8 -3
- package/dist/esm/components/app/AppLayout_AuthenticatedRoute.js.map +1 -1
- package/dist/esm/components/auth/Auth_EnrollmentRequired.d.ts.map +1 -1
- package/dist/esm/components/auth/Auth_EnrollmentRequired.js +5 -1
- package/dist/esm/components/auth/Auth_EnrollmentRequired.js.map +1 -1
- package/dist/esm/components/auth/Auth_Main.d.ts.map +1 -1
- package/dist/esm/components/auth/Auth_Main.js +1 -4
- package/dist/esm/components/auth/Auth_Main.js.map +1 -1
- package/dist/esm/components/auth/Auth_Register.d.ts.map +1 -1
- package/dist/esm/components/auth/Auth_Register.js +1 -3
- package/dist/esm/components/auth/Auth_Register.js.map +1 -1
- package/dist/esm/components/auth/StepUpAuthDialog.d.ts +7 -0
- package/dist/esm/components/auth/StepUpAuthDialog.d.ts.map +1 -1
- package/dist/esm/components/auth/StepUpAuthDialog.js +13 -7
- package/dist/esm/components/auth/StepUpAuthDialog.js.map +1 -1
- package/dist/esm/components/auth/admin-config/AppPage_SecuritySettings.d.ts.map +1 -1
- package/dist/esm/components/auth/admin-config/AppPage_SecuritySettings.js +32 -33
- package/dist/esm/components/auth/admin-config/AppPage_SecuritySettings.js.map +1 -1
- package/dist/esm/components/auth/admin-config/AppPage_SecuritySettings.labels.d.ts.map +1 -1
- package/dist/esm/components/auth/admin-config/AppPage_SecuritySettings.labels.js +18 -20
- package/dist/esm/components/auth/admin-config/AppPage_SecuritySettings.labels.js.map +1 -1
- package/dist/esm/components/auth/methods/ExternalOAuth2AuthMethod.d.ts.map +1 -1
- package/dist/esm/components/auth/methods/ExternalOAuth2AuthMethod.js +2 -3
- package/dist/esm/components/auth/methods/ExternalOAuth2AuthMethod.js.map +1 -1
- package/dist/esm/components/auth/utils/oauth-provider-display-label.frontend.utils.d.ts +13 -16
- package/dist/esm/components/auth/utils/oauth-provider-display-label.frontend.utils.d.ts.map +1 -1
- package/dist/esm/components/auth/utils/oauth-provider-display-label.frontend.utils.js +18 -15
- package/dist/esm/components/auth/utils/oauth-provider-display-label.frontend.utils.js.map +1 -1
- package/dist/esm/components/billing/billing-invoice-history.js +2 -2
- package/dist/esm/components/billing/billing-invoice-history.js.map +1 -1
- package/dist/esm/components/billing/billing-portal-link.js +2 -2
- package/dist/esm/components/billing/billing-portal-link.js.map +1 -1
- package/dist/esm/components/billing/billing-pricing-table.d.ts +33 -1
- package/dist/esm/components/billing/billing-pricing-table.d.ts.map +1 -1
- package/dist/esm/components/billing/billing-pricing-table.js +34 -5
- package/dist/esm/components/billing/billing-pricing-table.js.map +1 -1
- package/dist/esm/components/billing/billing-subscription-status.js +2 -2
- package/dist/esm/components/billing/billing-subscription-status.js.map +1 -1
- package/dist/esm/components/billing/billing-usage-dashboard.d.ts +2 -0
- package/dist/esm/components/billing/billing-usage-dashboard.d.ts.map +1 -1
- package/dist/esm/components/billing/billing-usage-dashboard.js +1 -0
- package/dist/esm/components/billing/billing-usage-dashboard.js.map +1 -1
- package/dist/esm/components/data-display/DisplayField.d.ts.map +1 -1
- package/dist/esm/components/data-display/DisplayField.js +15 -1
- package/dist/esm/components/data-display/DisplayField.js.map +1 -1
- package/dist/esm/components/data-display/DisplayFieldArray.d.ts.map +1 -1
- package/dist/esm/components/data-display/DisplayFieldArray.js +11 -0
- package/dist/esm/components/data-display/DisplayFieldArray.js.map +1 -1
- package/dist/esm/components/data-display/DisplayFieldEditable.d.ts.map +1 -1
- package/dist/esm/components/data-display/DisplayFieldEditable.js +2 -2
- package/dist/esm/components/data-display/DisplayFieldEditable.js.map +1 -1
- package/dist/esm/components/data-display/DisplayFieldEditableArray.d.ts +12 -2
- package/dist/esm/components/data-display/DisplayFieldEditableArray.d.ts.map +1 -1
- package/dist/esm/components/data-display/DisplayFieldEditableArray.js +3 -2
- package/dist/esm/components/data-display/DisplayFieldEditableArray.js.map +1 -1
- package/dist/esm/components/data-display/DisplayFieldReadOnly.d.ts.map +1 -1
- package/dist/esm/components/data-display/DisplayFieldReadOnly.js +2 -2
- package/dist/esm/components/data-display/DisplayFieldReadOnly.js.map +1 -1
- package/dist/esm/components/data-display/DisplayFieldReadOnlyArraySection.d.ts.map +1 -1
- package/dist/esm/components/data-display/DisplayFieldReadOnlyArraySection.js +8 -2
- package/dist/esm/components/data-display/DisplayFieldReadOnlyArraySection.js.map +1 -1
- package/dist/esm/components/data-display/DisplayValueDispatcher.d.ts.map +1 -1
- package/dist/esm/components/data-display/DisplayValueDispatcher.js +18 -4
- package/dist/esm/components/data-display/DisplayValueDispatcher.js.map +1 -1
- package/dist/esm/components/data-display/ResourceAutomaticDisplayer.d.ts.map +1 -1
- package/dist/esm/components/data-display/ResourceAutomaticDisplayer.js +61 -3
- package/dist/esm/components/data-display/ResourceAutomaticDisplayer.js.map +1 -1
- package/dist/esm/components/data-display/ResourceSummaryDisplayer.d.ts +7 -5
- package/dist/esm/components/data-display/ResourceSummaryDisplayer.d.ts.map +1 -1
- package/dist/esm/components/data-display/ResourceSummaryDisplayer.js.map +1 -1
- package/dist/esm/components/data-display/chromes/DisplayFieldChrome.d.ts +11 -1
- package/dist/esm/components/data-display/chromes/DisplayFieldChrome.d.ts.map +1 -1
- package/dist/esm/components/data-display/chromes/DisplayFieldChrome.js +36 -11
- package/dist/esm/components/data-display/chromes/DisplayFieldChrome.js.map +1 -1
- package/dist/esm/components/data-display/display-field-resolved-props.d.ts +6 -0
- package/dist/esm/components/data-display/display-field-resolved-props.d.ts.map +1 -1
- package/dist/esm/components/data-display/display-field-resolved-props.js.map +1 -1
- package/dist/esm/components/data-display/external-data-provenance/DisplayFieldProvenanceNote.d.ts +23 -0
- package/dist/esm/components/data-display/external-data-provenance/DisplayFieldProvenanceNote.d.ts.map +1 -0
- package/dist/esm/components/data-display/external-data-provenance/DisplayFieldProvenanceNote.js +35 -0
- package/dist/esm/components/data-display/external-data-provenance/DisplayFieldProvenanceNote.js.map +1 -0
- package/dist/esm/components/data-display/external-data-provenance/external-data-provenance.frontend.d.ts +47 -0
- package/dist/esm/components/data-display/external-data-provenance/external-data-provenance.frontend.d.ts.map +1 -0
- package/dist/esm/components/data-display/external-data-provenance/external-data-provenance.frontend.js +124 -0
- package/dist/esm/components/data-display/external-data-provenance/external-data-provenance.frontend.js.map +1 -0
- package/dist/esm/components/data-display/external-data-provenance/useExternalDataFieldProvenance.d.ts +8 -0
- package/dist/esm/components/data-display/external-data-provenance/useExternalDataFieldProvenance.d.ts.map +1 -0
- package/dist/esm/components/data-display/external-data-provenance/useExternalDataFieldProvenance.js +46 -0
- package/dist/esm/components/data-display/external-data-provenance/useExternalDataFieldProvenance.js.map +1 -0
- package/dist/esm/components/feedback/resource-empty-state.d.ts +21 -8
- package/dist/esm/components/feedback/resource-empty-state.d.ts.map +1 -1
- package/dist/esm/components/feedback/resource-empty-state.js +56 -26
- package/dist/esm/components/feedback/resource-empty-state.js.map +1 -1
- package/dist/esm/components/flows-actors/approval.d.ts +29 -7
- package/dist/esm/components/flows-actors/approval.d.ts.map +1 -1
- package/dist/esm/components/flows-actors/approval.js +231 -101
- package/dist/esm/components/flows-actors/approval.js.map +1 -1
- package/dist/esm/components/flows-actors/approval.labels.d.ts.map +1 -1
- package/dist/esm/components/flows-actors/approval.labels.js +57 -0
- package/dist/esm/components/flows-actors/approval.labels.js.map +1 -1
- package/dist/esm/components/flows-actors/system-catalog.d.ts.map +1 -1
- package/dist/esm/components/flows-actors/system-catalog.js +4 -4
- package/dist/esm/components/flows-actors/system-catalog.js.map +1 -1
- package/dist/esm/components/flows-actors/system-catalog.labels.d.ts.map +1 -1
- package/dist/esm/components/flows-actors/system-catalog.labels.js +0 -5
- package/dist/esm/components/flows-actors/system-catalog.labels.js.map +1 -1
- package/dist/esm/components/form/Form.d.ts +2 -2
- package/dist/esm/components/form/Form.js +2 -2
- package/dist/esm/components/form/Form.js.map +1 -1
- package/dist/esm/components/form/automated/AutomatedArrayField.d.ts +28 -3
- package/dist/esm/components/form/automated/AutomatedArrayField.d.ts.map +1 -1
- package/dist/esm/components/form/automated/AutomatedArrayField.js +43 -14
- package/dist/esm/components/form/automated/AutomatedArrayField.js.map +1 -1
- package/dist/esm/components/form/automated/FormField.d.ts +3 -0
- package/dist/esm/components/form/automated/FormField.d.ts.map +1 -1
- package/dist/esm/components/form/automated/FormField.js +60 -21
- package/dist/esm/components/form/automated/FormField.js.map +1 -1
- package/dist/esm/components/form/automated/FormFieldArray.d.ts +6 -3
- package/dist/esm/components/form/automated/FormFieldArray.d.ts.map +1 -1
- package/dist/esm/components/form/automated/FormFieldArray.js +3 -2
- package/dist/esm/components/form/automated/FormFieldArray.js.map +1 -1
- package/dist/esm/components/form/automated/ResourceAutomatedForm.d.ts +5 -4
- package/dist/esm/components/form/automated/ResourceAutomatedForm.d.ts.map +1 -1
- package/dist/esm/components/form/automated/ResourceAutomatedForm.js +148 -55
- package/dist/esm/components/form/automated/ResourceAutomatedForm.js.map +1 -1
- package/dist/esm/components/form/automated/ResourceFormActionsContext.d.ts +30 -0
- package/dist/esm/components/form/automated/ResourceFormActionsContext.d.ts.map +1 -1
- package/dist/esm/components/form/automated/ResourceFormActionsContext.js +30 -1
- package/dist/esm/components/form/automated/ResourceFormActionsContext.js.map +1 -1
- package/dist/esm/components/form/automated/TemplatePlacedFieldsContext.d.ts +79 -0
- package/dist/esm/components/form/automated/TemplatePlacedFieldsContext.d.ts.map +1 -0
- package/dist/esm/components/form/automated/TemplatePlacedFieldsContext.js +203 -0
- package/dist/esm/components/form/automated/TemplatePlacedFieldsContext.js.map +1 -0
- package/dist/esm/components/form/automated/automated-form-submit.utils.d.ts +12 -0
- package/dist/esm/components/form/automated/automated-form-submit.utils.d.ts.map +1 -1
- package/dist/esm/components/form/automated/automated-form-submit.utils.js +11 -0
- package/dist/esm/components/form/automated/automated-form-submit.utils.js.map +1 -1
- package/dist/esm/components/form/chromes/FormFieldChrome.d.ts.map +1 -1
- package/dist/esm/components/form/chromes/FormFieldChrome.js +2 -2
- package/dist/esm/components/form/chromes/FormFieldChrome.js.map +1 -1
- package/dist/esm/components/form/combobox.d.ts +7 -0
- package/dist/esm/components/form/combobox.d.ts.map +1 -1
- package/dist/esm/components/form/combobox.js.map +1 -1
- package/dist/esm/components/form/controls/form-field-checkbox-group.d.ts.map +1 -1
- package/dist/esm/components/form/controls/form-field-checkbox-group.js +13 -0
- package/dist/esm/components/form/controls/form-field-checkbox-group.js.map +1 -1
- package/dist/esm/components/form/fields/form-field-address.d.ts +58 -0
- package/dist/esm/components/form/fields/form-field-address.d.ts.map +1 -1
- package/dist/esm/components/form/fields/form-field-address.js +34 -6
- package/dist/esm/components/form/fields/form-field-address.js.map +1 -1
- package/dist/esm/components/form/fields/form-field-address.labels.d.ts.map +1 -1
- package/dist/esm/components/form/fields/form-field-address.labels.js +60 -1
- package/dist/esm/components/form/fields/form-field-address.labels.js.map +1 -1
- package/dist/esm/components/form/fields/form-field-file.d.ts +0 -12
- package/dist/esm/components/form/fields/form-field-file.d.ts.map +1 -1
- package/dist/esm/components/form/fields/form-field-file.js +34 -13
- package/dist/esm/components/form/fields/form-field-file.js.map +1 -1
- package/dist/esm/components/form/fields/form-field-file.labels.d.ts.map +1 -1
- package/dist/esm/components/form/fields/form-field-file.labels.js +46 -0
- package/dist/esm/components/form/fields/form-field-file.labels.js.map +1 -1
- package/dist/esm/components/form/fields/form-field-string-organization-role.d.ts +73 -0
- package/dist/esm/components/form/fields/form-field-string-organization-role.d.ts.map +1 -0
- package/dist/esm/components/form/fields/form-field-string-organization-role.js +64 -0
- package/dist/esm/components/form/fields/form-field-string-organization-role.js.map +1 -0
- package/dist/esm/components/form/fields/form-field-string.d.ts.map +1 -1
- package/dist/esm/components/form/fields/form-field-string.js +8 -1
- package/dist/esm/components/form/fields/form-field-string.js.map +1 -1
- package/dist/esm/components/form/fields/form-field-string.labels.d.ts.map +1 -1
- package/dist/esm/components/form/fields/form-field-string.labels.js +4 -0
- package/dist/esm/components/form/fields/form-field-string.labels.js.map +1 -1
- package/dist/esm/components/form/validation-errors/FormErrorSummary.js +1 -1
- package/dist/esm/components/form/validation-errors/FormErrorSummary.js.map +1 -1
- package/dist/esm/components/form/validation-errors/resolver-error-nesting.d.ts +31 -0
- package/dist/esm/components/form/validation-errors/resolver-error-nesting.d.ts.map +1 -0
- package/dist/esm/components/form/validation-errors/resolver-error-nesting.js +81 -0
- package/dist/esm/components/form/validation-errors/resolver-error-nesting.js.map +1 -0
- package/dist/esm/components/form/validation-errors/resource-error-notification-context.utils.d.ts +14 -1
- package/dist/esm/components/form/validation-errors/resource-error-notification-context.utils.d.ts.map +1 -1
- package/dist/esm/components/form/validation-errors/resource-error-notification-context.utils.js +14 -0
- package/dist/esm/components/form/validation-errors/resource-error-notification-context.utils.js.map +1 -1
- package/dist/esm/components/form/validation-errors/zod-issue-resolver.d.ts +22 -0
- package/dist/esm/components/form/validation-errors/zod-issue-resolver.d.ts.map +1 -1
- package/dist/esm/components/form/validation-errors/zod-issue-resolver.js +1 -22
- package/dist/esm/components/form/validation-errors/zod-issue-resolver.js.map +1 -1
- package/dist/esm/components/layout/resizable.d.ts +11 -0
- package/dist/esm/components/layout/resizable.d.ts.map +1 -1
- package/dist/esm/components/layout/resizable.js.map +1 -1
- package/dist/esm/components/navigation/app-level/ApplicationLevel_NavigationBack.d.ts +11 -1
- package/dist/esm/components/navigation/app-level/ApplicationLevel_NavigationBack.d.ts.map +1 -1
- package/dist/esm/components/navigation/app-level/ApplicationLevel_NavigationBack.js +15 -3
- package/dist/esm/components/navigation/app-level/ApplicationLevel_NavigationBack.js.map +1 -1
- package/dist/esm/components/navigation/app-level/ApplicationLevel_StatusBar.d.ts +2 -2
- package/dist/esm/components/navigation/app-level/ApplicationLevel_StatusBar.d.ts.map +1 -1
- package/dist/esm/components/navigation/app-level/ApplicationLevel_StatusBar.js.map +1 -1
- package/dist/esm/components/navigation/app-level/HostedComponentInteractionsProvider.d.ts +2 -2
- package/dist/esm/components/navigation/app-level/HostedComponentInteractionsProvider.js +2 -2
- package/dist/esm/components/navigation/app-level/HostedComponentInteractionsProvider.js.map +1 -1
- package/dist/esm/components/navigation/app-level/SidebarResourceBrowser.js +18 -20
- package/dist/esm/components/navigation/app-level/SidebarResourceBrowser.js.map +1 -1
- package/dist/esm/components/navigation/app-level/useCommandMenuBehavior.d.ts.map +1 -1
- package/dist/esm/components/navigation/app-level/useCommandMenuBehavior.js +7 -1
- package/dist/esm/components/navigation/app-level/useCommandMenuBehavior.js.map +1 -1
- package/dist/esm/components/navigation/app-level/useMenuBarBehavior.d.ts.map +1 -1
- package/dist/esm/components/navigation/app-level/useMenuBarBehavior.js +4 -1
- package/dist/esm/components/navigation/app-level/useMenuBarBehavior.js.map +1 -1
- package/dist/esm/components/navigation/app-level/useMenuUserOrgBehavior.d.ts.map +1 -1
- package/dist/esm/components/navigation/app-level/useMenuUserOrgBehavior.js +18 -2
- package/dist/esm/components/navigation/app-level/useMenuUserOrgBehavior.js.map +1 -1
- package/dist/esm/components/navigation/app-level/useSidebarBehavior.d.ts.map +1 -1
- package/dist/esm/components/navigation/app-level/useSidebarBehavior.js +82 -10
- package/dist/esm/components/navigation/app-level/useSidebarBehavior.js.map +1 -1
- package/dist/esm/components/navigation/app-level/useStatusBarBehavior.d.ts +2 -2
- package/dist/esm/components/navigation/app-level/useStatusBarBehavior.d.ts.map +1 -1
- package/dist/esm/components/navigation/app-level/useStatusBarBehavior.js.map +1 -1
- package/dist/esm/components/resources/ResourceCollectionQuickFilterTabs.d.ts.map +1 -1
- package/dist/esm/components/resources/ResourceCollectionQuickFilterTabs.js +8 -1
- package/dist/esm/components/resources/ResourceCollectionQuickFilterTabs.js.map +1 -1
- package/dist/esm/components/resources/ResourceCollectionToolbar.d.ts +8 -2
- package/dist/esm/components/resources/ResourceCollectionToolbar.d.ts.map +1 -1
- package/dist/esm/components/resources/ResourceCollectionToolbar.js +6 -2
- package/dist/esm/components/resources/ResourceCollectionToolbar.js.map +1 -1
- package/dist/esm/components/resources/ResourceLayout_Breadcrumb.d.ts.map +1 -1
- package/dist/esm/components/resources/ResourceLayout_Breadcrumb.js +31 -16
- package/dist/esm/components/resources/ResourceLayout_Breadcrumb.js.map +1 -1
- package/dist/esm/components/resources/ResourceLayout_ContainerDialogs.d.ts.map +1 -1
- package/dist/esm/components/resources/ResourceLayout_ContainerDialogs.js +23 -8
- package/dist/esm/components/resources/ResourceLayout_ContainerDialogs.js.map +1 -1
- package/dist/esm/components/resources/ResourceLayout_ContainerNested.js +2 -2
- package/dist/esm/components/resources/ResourceLayout_ContainerNested.js.map +1 -1
- package/dist/esm/components/resources/ResourceLayout_Header.d.ts +13 -0
- package/dist/esm/components/resources/ResourceLayout_Header.d.ts.map +1 -1
- package/dist/esm/components/resources/ResourceLayout_Header.js +55 -28
- package/dist/esm/components/resources/ResourceLayout_Header.js.map +1 -1
- package/dist/esm/components/resources/ResourceLayout_List.d.ts.map +1 -1
- package/dist/esm/components/resources/ResourceLayout_List.js +41 -20
- package/dist/esm/components/resources/ResourceLayout_List.js.map +1 -1
- package/dist/esm/components/resources/ResourceLayout_List.labels.d.ts.map +1 -1
- package/dist/esm/components/resources/ResourceLayout_List.labels.js +1 -2
- package/dist/esm/components/resources/ResourceLayout_List.labels.js.map +1 -1
- package/dist/esm/components/resources/ResourceLayout_Read.d.ts +9 -4
- package/dist/esm/components/resources/ResourceLayout_Read.d.ts.map +1 -1
- package/dist/esm/components/resources/ResourceLayout_Read.js +30 -11
- package/dist/esm/components/resources/ResourceLayout_Read.js.map +1 -1
- package/dist/esm/components/resources/ResourceLayout_ReadSummary.d.ts.map +1 -1
- package/dist/esm/components/resources/ResourceLayout_ReadSummary.js +4 -2
- package/dist/esm/components/resources/ResourceLayout_ReadSummary.js.map +1 -1
- package/dist/esm/components/resources/ResourceLayout_ReadSummary_TableRow.d.ts.map +1 -1
- package/dist/esm/components/resources/ResourceLayout_ReadSummary_TableRow.js +6 -2
- package/dist/esm/components/resources/ResourceLayout_ReadSummary_TableRow.js.map +1 -1
- package/dist/esm/components/resources/ResourceLayout_Search.d.ts.map +1 -1
- package/dist/esm/components/resources/ResourceLayout_Search.js +30 -14
- package/dist/esm/components/resources/ResourceLayout_Search.js.map +1 -1
- package/dist/esm/components/resources/ResourceLayout_SemanticOperationFallback.d.ts.map +1 -1
- package/dist/esm/components/resources/ResourceLayout_SemanticOperationFallback.js +14 -198
- package/dist/esm/components/resources/ResourceLayout_SemanticOperationFallback.js.map +1 -1
- package/dist/esm/components/resources/ResourceLayout_Update.d.ts +2 -2
- package/dist/esm/components/resources/ResourceLayout_Update.js +2 -2
- package/dist/esm/components/resources/ResourceLayout_Update.js.map +1 -1
- package/dist/esm/components/resources/ResourceListItemRenderer.d.ts.map +1 -1
- package/dist/esm/components/resources/ResourceListItemRenderer.js +69 -39
- package/dist/esm/components/resources/ResourceListItemRenderer.js.map +1 -1
- package/dist/esm/components/resources/ResourceOperationActionDropdown.d.ts +32 -0
- package/dist/esm/components/resources/ResourceOperationActionDropdown.d.ts.map +1 -0
- package/dist/esm/components/resources/ResourceOperationActionDropdown.js +130 -0
- package/dist/esm/components/resources/ResourceOperationActionDropdown.js.map +1 -0
- package/dist/esm/components/resources/collection-create-placement.utils.d.ts +32 -0
- package/dist/esm/components/resources/collection-create-placement.utils.d.ts.map +1 -0
- package/dist/esm/components/resources/collection-create-placement.utils.js +37 -0
- package/dist/esm/components/resources/collection-create-placement.utils.js.map +1 -0
- package/dist/esm/components/resources/embeds/RelatedResourcePreview.d.ts.map +1 -1
- package/dist/esm/components/resources/embeds/RelatedResourcePreview.js +5 -1
- package/dist/esm/components/resources/embeds/RelatedResourcePreview.js.map +1 -1
- package/dist/esm/components/resources/embeds/RelatedResourceSections.d.ts +8 -1
- package/dist/esm/components/resources/embeds/RelatedResourceSections.d.ts.map +1 -1
- package/dist/esm/components/resources/embeds/RelatedResourceSections.js +49 -2
- package/dist/esm/components/resources/embeds/RelatedResourceSections.js.map +1 -1
- package/dist/esm/components/resources/embeds/ResourceEmbeds.d.ts +22 -0
- package/dist/esm/components/resources/embeds/ResourceEmbeds.d.ts.map +1 -1
- package/dist/esm/components/resources/embeds/ResourceEmbeds.js +85 -2
- package/dist/esm/components/resources/embeds/ResourceEmbeds.js.map +1 -1
- package/dist/esm/components/resources/resourceLayout.utils.d.ts +14 -0
- package/dist/esm/components/resources/resourceLayout.utils.d.ts.map +1 -1
- package/dist/esm/components/resources/resourceLayout.utils.js +22 -0
- package/dist/esm/components/resources/resourceLayout.utils.js.map +1 -1
- package/dist/esm/components/resources/skeleton/ArrayField.d.ts.map +1 -1
- package/dist/esm/components/resources/skeleton/ArrayField.js +3 -0
- package/dist/esm/components/resources/skeleton/ArrayField.js.map +1 -1
- package/dist/esm/components/resources/skeleton/FormLayout.d.ts.map +1 -1
- package/dist/esm/components/resources/skeleton/FormLayout.js +33 -1
- package/dist/esm/components/resources/skeleton/FormLayout.js.map +1 -1
- package/dist/esm/components/resources/skeleton/ObjectScope.d.ts.map +1 -1
- package/dist/esm/components/resources/skeleton/ObjectScope.js +3 -0
- package/dist/esm/components/resources/skeleton/ObjectScope.js.map +1 -1
- package/dist/esm/components/resources/skeleton/Section.d.ts +12 -0
- package/dist/esm/components/resources/skeleton/Section.d.ts.map +1 -1
- package/dist/esm/components/resources/skeleton/Section.js +28 -2
- package/dist/esm/components/resources/skeleton/Section.js.map +1 -1
- package/dist/esm/components/resources/skeleton/SectionFieldsContext.d.ts +70 -0
- package/dist/esm/components/resources/skeleton/SectionFieldsContext.d.ts.map +1 -1
- package/dist/esm/components/resources/skeleton/SectionFieldsContext.js +157 -1
- package/dist/esm/components/resources/skeleton/SectionFieldsContext.js.map +1 -1
- package/dist/esm/components/resources/skeleton/WizardLayout.d.ts +6 -0
- package/dist/esm/components/resources/skeleton/WizardLayout.d.ts.map +1 -1
- package/dist/esm/components/resources/skeleton/WizardLayout.js +13 -2
- package/dist/esm/components/resources/skeleton/WizardLayout.js.map +1 -1
- package/dist/esm/components/resources/skeleton/WizardStep.d.ts.map +1 -1
- package/dist/esm/components/resources/skeleton/WizardStep.js +2 -1
- package/dist/esm/components/resources/skeleton/WizardStep.js.map +1 -1
- package/dist/esm/components/resources-fields/_presets/resource-reference/ResourceFieldDisplayPreset_ResourceReference_Default.d.ts.map +1 -1
- package/dist/esm/components/resources-fields/_presets/resource-reference/ResourceFieldDisplayPreset_ResourceReference_Default.js +61 -15
- package/dist/esm/components/resources-fields/_presets/resource-reference/ResourceFieldDisplayPreset_ResourceReference_Default.js.map +1 -1
- package/dist/esm/components/resources-fields/resource-reference/resource-reference.shared.utils.d.ts +24 -2
- package/dist/esm/components/resources-fields/resource-reference/resource-reference.shared.utils.d.ts.map +1 -1
- package/dist/esm/components/resources-fields/resource-reference/resource-reference.shared.utils.js +69 -1
- package/dist/esm/components/resources-fields/resource-reference/resource-reference.shared.utils.js.map +1 -1
- package/dist/esm/components/resources-fields/resource-reference/useResourceSearch.d.ts.map +1 -1
- package/dist/esm/components/resources-fields/resource-reference/useResourceSearch.js +18 -19
- package/dist/esm/components/resources-fields/resource-reference/useResourceSearch.js.map +1 -1
- package/dist/esm/components/sections/ContentSectionContainer.d.ts.map +1 -1
- package/dist/esm/components/sections/ContentSectionContainer.js +5 -4
- package/dist/esm/components/sections/ContentSectionContainer.js.map +1 -1
- package/dist/esm/components/sections/stepper.d.ts +5 -0
- package/dist/esm/components/sections/stepper.d.ts.map +1 -1
- package/dist/esm/components/sections/stepper.js.map +1 -1
- package/dist/esm/components/sections/surface.d.ts.map +1 -1
- package/dist/esm/components/sections/surface.js +12 -3
- package/dist/esm/components/sections/surface.js.map +1 -1
- package/dist/esm/components/settings/AppPage_AgentWorkOverrideRateSettings.d.ts +43 -0
- package/dist/esm/components/settings/AppPage_AgentWorkOverrideRateSettings.d.ts.map +1 -0
- package/dist/esm/components/settings/AppPage_AgentWorkOverrideRateSettings.js +129 -0
- package/dist/esm/components/settings/AppPage_AgentWorkOverrideRateSettings.js.map +1 -0
- package/dist/esm/components/settings/AppPage_AgentWorkOverrideRateSettings.labels.d.ts +3 -0
- package/dist/esm/components/settings/AppPage_AgentWorkOverrideRateSettings.labels.d.ts.map +1 -0
- package/dist/esm/components/settings/AppPage_AgentWorkOverrideRateSettings.labels.js +34 -0
- package/dist/esm/components/settings/AppPage_AgentWorkOverrideRateSettings.labels.js.map +1 -0
- package/dist/esm/components/settings/AppPage_AppearanceSettings.d.ts.map +1 -1
- package/dist/esm/components/settings/AppPage_AppearanceSettings.js +9 -11
- package/dist/esm/components/settings/AppPage_AppearanceSettings.js.map +1 -1
- package/dist/esm/components/settings/AppPage_AppearanceSettings.labels.d.ts.map +1 -1
- package/dist/esm/components/settings/AppPage_AppearanceSettings.labels.js +3 -2
- package/dist/esm/components/settings/AppPage_AppearanceSettings.labels.js.map +1 -1
- package/dist/esm/components/settings/AppPage_BillingSettings.d.ts +4 -2
- package/dist/esm/components/settings/AppPage_BillingSettings.d.ts.map +1 -1
- package/dist/esm/components/settings/AppPage_BillingSettings.js +21 -3
- package/dist/esm/components/settings/AppPage_BillingSettings.js.map +1 -1
- package/dist/esm/components/settings/AppPage_BillingSettings.labels.d.ts.map +1 -1
- package/dist/esm/components/settings/AppPage_BillingSettings.labels.js +5 -10
- package/dist/esm/components/settings/AppPage_BillingSettings.labels.js.map +1 -1
- package/dist/esm/components/settings/AppPage_ConnectedAccountsSettings.d.ts +58 -0
- package/dist/esm/components/settings/AppPage_ConnectedAccountsSettings.d.ts.map +1 -1
- package/dist/esm/components/settings/AppPage_ConnectedAccountsSettings.js +243 -40
- package/dist/esm/components/settings/AppPage_ConnectedAccountsSettings.js.map +1 -1
- package/dist/esm/components/settings/AppPage_ConnectedAccountsSettings.labels.d.ts.map +1 -1
- package/dist/esm/components/settings/AppPage_ConnectedAccountsSettings.labels.js +67 -6
- package/dist/esm/components/settings/AppPage_ConnectedAccountsSettings.labels.js.map +1 -1
- package/dist/esm/components/settings/AppPage_InvitationsSettings.d.ts.map +1 -1
- package/dist/esm/components/settings/AppPage_InvitationsSettings.js +19 -11
- package/dist/esm/components/settings/AppPage_InvitationsSettings.js.map +1 -1
- package/dist/esm/components/settings/AppPage_InvitationsSettings.labels.d.ts.map +1 -1
- package/dist/esm/components/settings/AppPage_InvitationsSettings.labels.js +4 -2
- package/dist/esm/components/settings/AppPage_InvitationsSettings.labels.js.map +1 -1
- package/dist/esm/components/settings/SettingsHub.d.ts.map +1 -1
- package/dist/esm/components/settings/SettingsHub.js +3 -0
- package/dist/esm/components/settings/SettingsHub.js.map +1 -1
- package/dist/esm/components/settings/SettingsResourceOperationPanel.d.ts.map +1 -1
- package/dist/esm/components/settings/SettingsResourceOperationPanel.js +16 -1
- package/dist/esm/components/settings/SettingsResourceOperationPanel.js.map +1 -1
- package/dist/esm/components/settings/useOwnerProviderConnections.d.ts +59 -0
- package/dist/esm/components/settings/useOwnerProviderConnections.d.ts.map +1 -0
- package/dist/esm/components/settings/useOwnerProviderConnections.js +136 -0
- package/dist/esm/components/settings/useOwnerProviderConnections.js.map +1 -0
- package/dist/esm/components/views/chart-view/chart-view.utils.d.ts +5 -0
- package/dist/esm/components/views/chart-view/chart-view.utils.d.ts.map +1 -1
- package/dist/esm/components/views/chart-view/chart-view.utils.js +5 -0
- package/dist/esm/components/views/chart-view/chart-view.utils.js.map +1 -1
- package/dist/esm/components/views/chart-view/useResourceChartData.d.ts +50 -0
- package/dist/esm/components/views/chart-view/useResourceChartData.d.ts.map +1 -0
- package/dist/esm/components/views/chart-view/useResourceChartData.js +72 -0
- package/dist/esm/components/views/chart-view/useResourceChartData.js.map +1 -0
- package/dist/esm/components/views/composite-view/CompositeLayout.d.ts.map +1 -1
- package/dist/esm/components/views/composite-view/CompositeLayout.js +2 -1
- package/dist/esm/components/views/composite-view/CompositeLayout.js.map +1 -1
- package/dist/esm/core/app-shell/AppShellBuildingBlocks.d.ts +86 -0
- package/dist/esm/core/app-shell/AppShellBuildingBlocks.d.ts.map +1 -0
- package/dist/esm/core/app-shell/AppShellBuildingBlocks.js +187 -0
- package/dist/esm/core/app-shell/AppShellBuildingBlocks.js.map +1 -0
- package/dist/esm/core/app-shell/PortalContainerContext.d.ts +5 -2
- package/dist/esm/core/app-shell/PortalContainerContext.d.ts.map +1 -1
- package/dist/esm/core/app-shell/PortalContainerContext.js +5 -2
- package/dist/esm/core/app-shell/PortalContainerContext.js.map +1 -1
- package/dist/esm/core/app-shell/app-shell.schemas.d.ts +18 -9
- package/dist/esm/core/app-shell/app-shell.schemas.d.ts.map +1 -1
- package/dist/esm/core/app-shell/app-shell.schemas.js +1 -0
- package/dist/esm/core/app-shell/app-shell.schemas.js.map +1 -1
- package/dist/esm/core/app-shell/useAppShellLayout.d.ts +10 -0
- package/dist/esm/core/app-shell/useAppShellLayout.d.ts.map +1 -1
- package/dist/esm/core/app-shell/useAppShellLayout.js +28 -5
- package/dist/esm/core/app-shell/useAppShellLayout.js.map +1 -1
- package/dist/esm/core/app-shell/usePublicShellLayout.d.ts.map +1 -1
- package/dist/esm/core/app-shell/usePublicShellLayout.js +38 -0
- package/dist/esm/core/app-shell/usePublicShellLayout.js.map +1 -1
- package/dist/esm/core/automated-layout/automated-layout.frontend.utils.d.ts +15 -1
- package/dist/esm/core/automated-layout/automated-layout.frontend.utils.d.ts.map +1 -1
- package/dist/esm/core/automated-layout/automated-layout.frontend.utils.js +47 -13
- package/dist/esm/core/automated-layout/automated-layout.frontend.utils.js.map +1 -1
- package/dist/esm/core/billing/BillingContext.d.ts +25 -2
- package/dist/esm/core/billing/BillingContext.d.ts.map +1 -1
- package/dist/esm/core/billing/BillingContext.js +16 -25
- package/dist/esm/core/billing/BillingContext.js.map +1 -1
- package/dist/esm/core/billing/billing-provider-display.frontend.utils.d.ts +11 -3
- package/dist/esm/core/billing/billing-provider-display.frontend.utils.d.ts.map +1 -1
- package/dist/esm/core/billing/billing-provider-display.frontend.utils.js +14 -8
- package/dist/esm/core/billing/billing-provider-display.frontend.utils.js.map +1 -1
- package/dist/esm/core/billing/useBillingPlanChange.d.ts.map +1 -1
- package/dist/esm/core/billing/useBillingPlanChange.js +2 -0
- package/dist/esm/core/billing/useBillingPlanChange.js.map +1 -1
- package/dist/esm/core/components-registry/assert-registry-completeness.frontend.helper.d.ts.map +1 -1
- package/dist/esm/core/components-registry/assert-registry-completeness.frontend.helper.js +1 -0
- package/dist/esm/core/components-registry/assert-registry-completeness.frontend.helper.js.map +1 -1
- package/dist/esm/core/components-registry/provider-component-registry.frontend.service.d.ts +29 -229
- package/dist/esm/core/components-registry/provider-component-registry.frontend.service.d.ts.map +1 -1
- package/dist/esm/core/components-registry/provider-component-registry.frontend.service.js +29 -327
- package/dist/esm/core/components-registry/provider-component-registry.frontend.service.js.map +1 -1
- package/dist/esm/core/components-registry/useProviderComponent.frontend.hooks.d.ts +17 -27
- package/dist/esm/core/components-registry/useProviderComponent.frontend.hooks.d.ts.map +1 -1
- package/dist/esm/core/components-registry/useProviderComponent.frontend.hooks.js +28 -48
- package/dist/esm/core/components-registry/useProviderComponent.frontend.hooks.js.map +1 -1
- package/dist/esm/core/config/app-configuration-frontend.schemas.d.ts +21 -11
- package/dist/esm/core/config/app-configuration-frontend.schemas.d.ts.map +1 -1
- package/dist/esm/core/config/app-configuration-frontend.schemas.js +4 -4
- package/dist/esm/core/config/app-configuration-frontend.schemas.js.map +1 -1
- package/dist/esm/core/config/app-level-components.frontend.schemas.d.ts +17 -0
- package/dist/esm/core/config/app-level-components.frontend.schemas.d.ts.map +1 -1
- package/dist/esm/core/config/app-level-components.frontend.schemas.js +17 -0
- package/dist/esm/core/config/app-level-components.frontend.schemas.js.map +1 -1
- package/dist/esm/core/config/chart-view.frontend.schemas.d.ts +10 -10
- package/dist/esm/core/config/engine-settings-destinations.d.ts.map +1 -1
- package/dist/esm/core/config/engine-settings-destinations.js +221 -6
- package/dist/esm/core/config/engine-settings-destinations.js.map +1 -1
- package/dist/esm/core/config/launcher-items.frontend.schemas.d.ts +8 -0
- package/dist/esm/core/config/launcher-items.frontend.schemas.d.ts.map +1 -1
- package/dist/esm/core/config/launcher-items.frontend.schemas.js +1 -0
- package/dist/esm/core/config/launcher-items.frontend.schemas.js.map +1 -1
- package/dist/esm/core/config/settings-hub.frontend.schemas.d.ts +10 -1
- package/dist/esm/core/config/settings-hub.frontend.schemas.d.ts.map +1 -1
- package/dist/esm/core/config/settings-hub.frontend.schemas.js +9 -0
- package/dist/esm/core/config/settings-hub.frontend.schemas.js.map +1 -1
- package/dist/esm/core/config/verify-launcher-content.d.ts.map +1 -1
- package/dist/esm/core/config/verify-launcher-content.js +30 -19
- package/dist/esm/core/config/verify-launcher-content.js.map +1 -1
- package/dist/esm/core/errors/ErrorContext.d.ts.map +1 -1
- package/dist/esm/core/errors/ErrorContext.js +9 -1
- package/dist/esm/core/errors/ErrorContext.js.map +1 -1
- package/dist/esm/core/errors/GlobalErrorHandler.d.ts.map +1 -1
- package/dist/esm/core/errors/GlobalErrorHandler.js +5 -4
- package/dist/esm/core/errors/GlobalErrorHandler.js.map +1 -1
- package/dist/esm/core/errors/RouterErrorBoundary.js +1 -1
- package/dist/esm/core/errors/RouterErrorBoundary.js.map +1 -1
- package/dist/esm/core/errors/errors-builder.frontend.services.d.ts +2 -2
- package/dist/esm/core/errors/errors-builder.frontend.services.d.ts.map +1 -1
- package/dist/esm/core/errors/errors-builder.frontend.services.js +4 -4
- package/dist/esm/core/errors/errors-builder.frontend.services.js.map +1 -1
- package/dist/esm/core/errors/user-facing-error-message.frontend.utils.js +1 -1
- package/dist/esm/core/errors/user-facing-error-message.frontend.utils.js.map +1 -1
- package/dist/esm/core/events/NotificationContext.d.ts.map +1 -1
- package/dist/esm/core/events/NotificationContext.js +23 -5
- package/dist/esm/core/events/NotificationContext.js.map +1 -1
- package/dist/esm/core/events/events.frontend.schemas.d.ts +110 -43
- package/dist/esm/core/events/events.frontend.schemas.d.ts.map +1 -1
- package/dist/esm/core/events/events.frontend.schemas.js +89 -15
- package/dist/esm/core/events/events.frontend.schemas.js.map +1 -1
- package/dist/esm/core/execution/useExecutionParticipationRMM.d.ts +2 -0
- package/dist/esm/core/execution/useExecutionParticipationRMM.d.ts.map +1 -1
- package/dist/esm/core/execution/useExecutionParticipationRMM.js +2 -1
- package/dist/esm/core/execution/useExecutionParticipationRMM.js.map +1 -1
- package/dist/esm/core/execution/useExecutionResourceOperationSurface.d.ts +1 -1
- package/dist/esm/core/execution/useExecutionResourceOperationSurface.d.ts.map +1 -1
- package/dist/esm/core/execution/useExecutionResourceOperationSurface.js +5 -2
- package/dist/esm/core/execution/useExecutionResourceOperationSurface.js.map +1 -1
- package/dist/esm/core/external-providers/ConsentBasedProviderSdks.d.ts +63 -0
- package/dist/esm/core/external-providers/ConsentBasedProviderSdks.d.ts.map +1 -0
- package/dist/esm/core/external-providers/ConsentBasedProviderSdks.js +131 -0
- package/dist/esm/core/external-providers/ConsentBasedProviderSdks.js.map +1 -0
- package/dist/esm/core/external-providers/ProviderAddressLookupCombobox.d.ts +61 -0
- package/dist/esm/core/external-providers/ProviderAddressLookupCombobox.d.ts.map +1 -0
- package/dist/esm/core/external-providers/ProviderAddressLookupCombobox.js +178 -0
- package/dist/esm/core/external-providers/ProviderAddressLookupCombobox.js.map +1 -0
- package/dist/esm/core/external-providers/ProviderAddressLookupHost.d.ts +52 -0
- package/dist/esm/core/external-providers/ProviderAddressLookupHost.d.ts.map +1 -0
- package/dist/esm/core/external-providers/ProviderAddressLookupHost.js +144 -0
- package/dist/esm/core/external-providers/ProviderAddressLookupHost.js.map +1 -0
- package/dist/esm/core/external-providers/ProviderFilePickerHost.d.ts +22 -1
- package/dist/esm/core/external-providers/ProviderFilePickerHost.d.ts.map +1 -1
- package/dist/esm/core/external-providers/ProviderFilePickerHost.js +23 -3
- package/dist/esm/core/external-providers/ProviderFilePickerHost.js.map +1 -1
- package/dist/esm/core/external-providers/provider-address-lookup-selection.frontend.utils.d.ts +55 -0
- package/dist/esm/core/external-providers/provider-address-lookup-selection.frontend.utils.d.ts.map +1 -0
- package/dist/esm/core/external-providers/provider-address-lookup-selection.frontend.utils.js +65 -0
- package/dist/esm/core/external-providers/provider-address-lookup-selection.frontend.utils.js.map +1 -0
- package/dist/esm/core/external-providers/provider-scope-reauthorization-offers.frontend.d.ts +63 -0
- package/dist/esm/core/external-providers/provider-scope-reauthorization-offers.frontend.d.ts.map +1 -0
- package/dist/esm/core/external-providers/provider-scope-reauthorization-offers.frontend.js +100 -0
- package/dist/esm/core/external-providers/provider-scope-reauthorization-offers.frontend.js.map +1 -0
- package/dist/esm/core/flows-actors/FlowsActorsContext.d.ts +45 -7
- package/dist/esm/core/flows-actors/FlowsActorsContext.d.ts.map +1 -1
- package/dist/esm/core/flows-actors/FlowsActorsContext.js +112 -28
- package/dist/esm/core/flows-actors/FlowsActorsContext.js.map +1 -1
- package/dist/esm/core/flows-actors/usePendingDecisions.d.ts +32 -0
- package/dist/esm/core/flows-actors/usePendingDecisions.d.ts.map +1 -0
- package/dist/esm/core/flows-actors/usePendingDecisions.js +91 -0
- package/dist/esm/core/flows-actors/usePendingDecisions.js.map +1 -0
- package/dist/esm/core/guidance/GuidanceRenderer.d.ts.map +1 -1
- package/dist/esm/core/guidance/GuidanceRenderer.js +3 -2
- package/dist/esm/core/guidance/GuidanceRenderer.js.map +1 -1
- package/dist/esm/core/i18n/I18nContext.d.ts +22 -8
- package/dist/esm/core/i18n/I18nContext.d.ts.map +1 -1
- package/dist/esm/core/i18n/I18nContext.js +21 -9
- package/dist/esm/core/i18n/I18nContext.js.map +1 -1
- package/dist/esm/core/i18n/component-label-resolution.utils.d.ts +5 -3
- package/dist/esm/core/i18n/component-label-resolution.utils.d.ts.map +1 -1
- package/dist/esm/core/i18n/component-label-resolution.utils.js +5 -3
- package/dist/esm/core/i18n/component-label-resolution.utils.js.map +1 -1
- package/dist/esm/core/i18n/useI18n.d.ts +2 -1
- package/dist/esm/core/i18n/useI18n.d.ts.map +1 -1
- package/dist/esm/core/i18n/useI18n.js +2 -1
- package/dist/esm/core/i18n/useI18n.js.map +1 -1
- package/dist/esm/core/loading/LoadingContext.d.ts.map +1 -1
- package/dist/esm/core/loading/LoadingContext.js +7 -1
- package/dist/esm/core/loading/LoadingContext.js.map +1 -1
- package/dist/esm/core/loading/LoadingGate.d.ts.map +1 -1
- package/dist/esm/core/loading/LoadingGate.js +19 -1
- package/dist/esm/core/loading/LoadingGate.js.map +1 -1
- package/dist/esm/core/monitoring/analytics/AnalyticsContext.d.ts +15 -2
- package/dist/esm/core/monitoring/analytics/AnalyticsContext.d.ts.map +1 -1
- package/dist/esm/core/monitoring/analytics/AnalyticsContext.js +183 -20
- package/dist/esm/core/monitoring/analytics/AnalyticsContext.js.map +1 -1
- package/dist/esm/core/monitoring/analytics/AnalyticsEventBridge.js +2 -2
- package/dist/esm/core/monitoring/analytics/AnalyticsEventBridge.js.map +1 -1
- package/dist/esm/core/monitoring/analytics/analytics-provider-registry.frontend.service.d.ts +7 -15
- package/dist/esm/core/monitoring/analytics/analytics-provider-registry.frontend.service.d.ts.map +1 -1
- package/dist/esm/core/monitoring/analytics/analytics-provider-registry.frontend.service.js +8 -26
- package/dist/esm/core/monitoring/analytics/analytics-provider-registry.frontend.service.js.map +1 -1
- package/dist/esm/core/monitoring/analytics/analytics-provider.frontend.interface.d.ts +12 -3
- package/dist/esm/core/monitoring/analytics/analytics-provider.frontend.interface.d.ts.map +1 -1
- package/dist/esm/core/monitoring/analytics/analytics-provider.frontend.interface.js +3 -2
- package/dist/esm/core/monitoring/analytics/analytics-provider.frontend.interface.js.map +1 -1
- package/dist/esm/core/monitoring/analytics/providers/backend-proxy-analytics.provider.d.ts +42 -0
- package/dist/esm/core/monitoring/analytics/providers/backend-proxy-analytics.provider.d.ts.map +1 -1
- package/dist/esm/core/monitoring/analytics/providers/backend-proxy-analytics.provider.js +89 -5
- package/dist/esm/core/monitoring/analytics/providers/backend-proxy-analytics.provider.js.map +1 -1
- package/dist/esm/core/monitoring/analytics/providers/console-analytics.provider.d.ts +2 -0
- package/dist/esm/core/monitoring/analytics/providers/console-analytics.provider.d.ts.map +1 -1
- package/dist/esm/core/monitoring/analytics/providers/console-analytics.provider.js +2 -0
- package/dist/esm/core/monitoring/analytics/providers/console-analytics.provider.js.map +1 -1
- package/dist/esm/core/navigation/NavigationContentAreas.d.ts +78 -0
- package/dist/esm/core/navigation/NavigationContentAreas.d.ts.map +1 -1
- package/dist/esm/core/navigation/NavigationContentAreas.js +264 -16
- package/dist/esm/core/navigation/NavigationContentAreas.js.map +1 -1
- package/dist/esm/core/navigation/NavigationContext.d.ts +8 -0
- package/dist/esm/core/navigation/NavigationContext.d.ts.map +1 -1
- package/dist/esm/core/navigation/NavigationContext.js +137 -30
- package/dist/esm/core/navigation/NavigationContext.js.map +1 -1
- package/dist/esm/core/navigation/launcher-resolution.d.ts +2 -0
- package/dist/esm/core/navigation/launcher-resolution.d.ts.map +1 -1
- package/dist/esm/core/navigation/launcher-resolution.js +1 -0
- package/dist/esm/core/navigation/launcher-resolution.js.map +1 -1
- package/dist/esm/core/navigation/navigation-cascade.d.ts +46 -0
- package/dist/esm/core/navigation/navigation-cascade.d.ts.map +1 -0
- package/dist/esm/core/navigation/navigation-cascade.js +222 -0
- package/dist/esm/core/navigation/navigation-cascade.js.map +1 -0
- package/dist/esm/core/navigation/navigation-clean-break.frontend.utils.d.ts.map +1 -1
- package/dist/esm/core/navigation/navigation-clean-break.frontend.utils.js +21 -2
- package/dist/esm/core/navigation/navigation-clean-break.frontend.utils.js.map +1 -1
- package/dist/esm/core/navigation/navigation-controller-internals.d.ts +71 -0
- package/dist/esm/core/navigation/navigation-controller-internals.d.ts.map +1 -0
- package/dist/esm/core/navigation/navigation-controller-internals.js +84 -0
- package/dist/esm/core/navigation/navigation-controller-internals.js.map +1 -0
- package/dist/esm/core/navigation/navigation-policy-resolver.service.d.ts +86 -2
- package/dist/esm/core/navigation/navigation-policy-resolver.service.d.ts.map +1 -1
- package/dist/esm/core/navigation/navigation-policy-resolver.service.js +242 -124
- package/dist/esm/core/navigation/navigation-policy-resolver.service.js.map +1 -1
- package/dist/esm/core/navigation/navigation.schemas.d.ts +170 -8
- package/dist/esm/core/navigation/navigation.schemas.d.ts.map +1 -1
- package/dist/esm/core/navigation/navigation.schemas.js +121 -2
- package/dist/esm/core/navigation/navigation.schemas.js.map +1 -1
- package/dist/esm/core/navigation/navigation.utils.d.ts +102 -6
- package/dist/esm/core/navigation/navigation.utils.d.ts.map +1 -1
- package/dist/esm/core/navigation/navigation.utils.js +283 -34
- package/dist/esm/core/navigation/navigation.utils.js.map +1 -1
- package/dist/esm/core/navigation/useIsStackEntryActive.d.ts +0 -10
- package/dist/esm/core/navigation/useIsStackEntryActive.d.ts.map +0 -1
- package/dist/esm/core/navigation/useIsStackEntryActive.js.map +0 -1
- package/dist/esm/core/navigation/useNavigationController.d.ts +28 -157
- package/dist/esm/core/navigation/useNavigationController.d.ts.map +1 -1
- package/dist/esm/core/navigation/useNavigationController.js +211 -1189
- package/dist/esm/core/navigation/useNavigationController.js.map +1 -1
- package/dist/esm/core/navigation/useNavigationRouterSync.d.ts +174 -0
- package/dist/esm/core/navigation/useNavigationRouterSync.d.ts.map +1 -0
- package/dist/esm/core/navigation/useNavigationRouterSync.js +977 -0
- package/dist/esm/core/navigation/useNavigationRouterSync.js.map +1 -0
- package/dist/esm/core/navigation/useOverlayTitle.d.ts +13 -1
- package/dist/esm/core/navigation/useOverlayTitle.d.ts.map +1 -1
- package/dist/esm/core/navigation/useOverlayTitle.js +15 -10
- package/dist/esm/core/navigation/useOverlayTitle.js.map +1 -1
- package/dist/esm/core/navigation/useResponsiveZoneMigration.d.ts +43 -0
- package/dist/esm/core/navigation/useResponsiveZoneMigration.d.ts.map +1 -0
- package/dist/esm/core/navigation/useResponsiveZoneMigration.js +44 -0
- package/dist/esm/core/navigation/useResponsiveZoneMigration.js.map +1 -0
- package/dist/esm/core/navigation/zone-collapse-migration.d.ts +83 -0
- package/dist/esm/core/navigation/zone-collapse-migration.d.ts.map +1 -0
- package/dist/esm/core/navigation/zone-collapse-migration.js +116 -0
- package/dist/esm/core/navigation/zone-collapse-migration.js.map +1 -0
- package/dist/esm/core/navigation/zone-collapse.d.ts +51 -0
- package/dist/esm/core/navigation/zone-collapse.d.ts.map +1 -0
- package/dist/esm/core/navigation/zone-collapse.js +59 -0
- package/dist/esm/core/navigation/zone-collapse.js.map +1 -0
- package/dist/esm/core/navigation/zone-emphasis.d.ts +3 -0
- package/dist/esm/core/navigation/zone-emphasis.d.ts.map +1 -1
- package/dist/esm/core/navigation/zone-emphasis.js +26 -4
- package/dist/esm/core/navigation/zone-emphasis.js.map +1 -1
- package/dist/esm/core/navigation/zone-visible-entry.d.ts +22 -0
- package/dist/esm/core/navigation/zone-visible-entry.d.ts.map +1 -1
- package/dist/esm/core/navigation/zone-visible-entry.js +25 -0
- package/dist/esm/core/navigation/zone-visible-entry.js.map +1 -1
- package/dist/esm/core/requests/websockets/WebSocketContext.d.ts.map +1 -1
- package/dist/esm/core/requests/websockets/WebSocketContext.js +53 -18
- package/dist/esm/core/requests/websockets/WebSocketContext.js.map +1 -1
- package/dist/esm/core/requests/websockets/WebSocketEventBridge.d.ts.map +1 -1
- package/dist/esm/core/requests/websockets/WebSocketEventBridge.js +3 -1
- package/dist/esm/core/requests/websockets/WebSocketEventBridge.js.map +1 -1
- package/dist/esm/core/requests/websockets/useNotificationBadges.d.ts +22 -0
- package/dist/esm/core/requests/websockets/useNotificationBadges.d.ts.map +1 -1
- package/dist/esm/core/requests/websockets/useNotificationBadges.js +72 -3
- package/dist/esm/core/requests/websockets/useNotificationBadges.js.map +1 -1
- package/dist/esm/core/requests/websockets/usePublishNotificationBadgeCount.d.ts +28 -0
- package/dist/esm/core/requests/websockets/usePublishNotificationBadgeCount.d.ts.map +1 -0
- package/dist/esm/core/requests/websockets/usePublishNotificationBadgeCount.js +86 -0
- package/dist/esm/core/requests/websockets/usePublishNotificationBadgeCount.js.map +1 -0
- package/dist/esm/core/requests/wildo-http-client-manual-calls.frontend.service.d.ts +38 -3
- package/dist/esm/core/requests/wildo-http-client-manual-calls.frontend.service.d.ts.map +1 -1
- package/dist/esm/core/requests/wildo-http-client-manual-calls.frontend.service.js +57 -2
- package/dist/esm/core/requests/wildo-http-client-manual-calls.frontend.service.js.map +1 -1
- package/dist/esm/core/requests/wildo-http-client-resources.frontend.service.d.ts.map +1 -1
- package/dist/esm/core/requests/wildo-http-client-resources.frontend.service.js +4 -2
- package/dist/esm/core/requests/wildo-http-client-resources.frontend.service.js.map +1 -1
- package/dist/esm/core/requests/wildo-http-client.frontend.service.d.ts +30 -1
- package/dist/esm/core/requests/wildo-http-client.frontend.service.d.ts.map +1 -1
- package/dist/esm/core/requests/wildo-http-client.frontend.service.js +47 -4
- package/dist/esm/core/requests/wildo-http-client.frontend.service.js.map +1 -1
- package/dist/esm/core/resources/ResourceRegistryContext.d.ts.map +1 -1
- package/dist/esm/core/resources/ResourceRegistryContext.js +22 -1
- package/dist/esm/core/resources/ResourceRegistryContext.js.map +1 -1
- package/dist/esm/core/resources/context-resource-identifiers.frontend.utils.js +1 -1
- package/dist/esm/core/resources/context-resource-identifiers.frontend.utils.js.map +1 -1
- package/dist/esm/core/resources/frontend-resource.utils.d.ts +22 -1
- package/dist/esm/core/resources/frontend-resource.utils.d.ts.map +1 -1
- package/dist/esm/core/resources/frontend-resource.utils.js +25 -2
- package/dist/esm/core/resources/frontend-resource.utils.js.map +1 -1
- package/dist/esm/core/resources/operation-semantics.frontend.utils.d.ts +113 -13
- package/dist/esm/core/resources/operation-semantics.frontend.utils.d.ts.map +1 -1
- package/dist/esm/core/resources/operation-semantics.frontend.utils.js +173 -20
- package/dist/esm/core/resources/operation-semantics.frontend.utils.js.map +1 -1
- package/dist/esm/core/resources/relationship-surface-runtime.frontend.utils.d.ts +11 -0
- package/dist/esm/core/resources/relationship-surface-runtime.frontend.utils.d.ts.map +1 -1
- package/dist/esm/core/resources/relationship-surface-runtime.frontend.utils.js +7 -0
- package/dist/esm/core/resources/relationship-surface-runtime.frontend.utils.js.map +1 -1
- package/dist/esm/core/resources/resource-label-field-paths.frontend.utils.d.ts +3 -2
- package/dist/esm/core/resources/resource-label-field-paths.frontend.utils.d.ts.map +1 -1
- package/dist/esm/core/resources/resource-label-field-paths.frontend.utils.js +13 -5
- package/dist/esm/core/resources/resource-label-field-paths.frontend.utils.js.map +1 -1
- package/dist/esm/core/resources/resources-repository.frontend.service.d.ts +6 -0
- package/dist/esm/core/resources/resources-repository.frontend.service.d.ts.map +1 -1
- package/dist/esm/core/resources/resources-repository.frontend.service.js +90 -1
- package/dist/esm/core/resources/resources-repository.frontend.service.js.map +1 -1
- package/dist/esm/core/resources/resources.frontend.schemas.d.ts +139 -16
- package/dist/esm/core/resources/resources.frontend.schemas.d.ts.map +1 -1
- package/dist/esm/core/resources/resources.frontend.schemas.js +110 -11
- package/dist/esm/core/resources/resources.frontend.schemas.js.map +1 -1
- package/dist/esm/core/resources/rmm/ResourceMutationManager.d.ts.map +1 -1
- package/dist/esm/core/resources/rmm/ResourceMutationManager.js +3 -1
- package/dist/esm/core/resources/rmm/ResourceMutationManager.js.map +1 -1
- package/dist/esm/core/resources/rmm/update-like-mutation-fallback.frontend.d.ts +10 -0
- package/dist/esm/core/resources/rmm/update-like-mutation-fallback.frontend.d.ts.map +1 -1
- package/dist/esm/core/resources/rmm/update-like-mutation-fallback.frontend.js +8 -0
- package/dist/esm/core/resources/rmm/update-like-mutation-fallback.frontend.js.map +1 -1
- package/dist/esm/core/resources/rmm/useResourceRMM.d.ts +7 -0
- package/dist/esm/core/resources/rmm/useResourceRMM.d.ts.map +1 -1
- package/dist/esm/core/resources/rmm/useResourceRMM.js +9 -2
- package/dist/esm/core/resources/rmm/useResourceRMM.js.map +1 -1
- package/dist/esm/core/resources/useOperationDirectExecution.d.ts +59 -0
- package/dist/esm/core/resources/useOperationDirectExecution.d.ts.map +1 -0
- package/dist/esm/core/resources/useOperationDirectExecution.js +278 -0
- package/dist/esm/core/resources/useOperationDirectExecution.js.map +1 -0
- package/dist/esm/core/resources/useResourceOperationActions.d.ts +1 -1
- package/dist/esm/core/resources/useResourceOperationActions.d.ts.map +1 -1
- package/dist/esm/core/resources/useResourceOperationActions.js +69 -22
- package/dist/esm/core/resources/useResourceOperationActions.js.map +1 -1
- package/dist/esm/core/resources/useResourceOperationSurface.d.ts +8 -6
- package/dist/esm/core/resources/useResourceOperationSurface.d.ts.map +1 -1
- package/dist/esm/core/resources/useResourceOperationSurface.js +3 -2
- package/dist/esm/core/resources/useResourceOperationSurface.js.map +1 -1
- package/dist/esm/core/runtime/AppRouter.d.ts.map +1 -1
- package/dist/esm/core/runtime/AppRouter.js +23 -2
- package/dist/esm/core/runtime/AppRouter.js.map +1 -1
- package/dist/esm/core/runtime/ApplicationContext.shared.d.ts +4 -2
- package/dist/esm/core/runtime/ApplicationContext.shared.d.ts.map +1 -1
- package/dist/esm/core/runtime/ApplicationContext.shared.js.map +1 -1
- package/dist/esm/core/runtime/ApplicationMainContext.d.ts +12 -2
- package/dist/esm/core/runtime/ApplicationMainContext.d.ts.map +1 -1
- package/dist/esm/core/runtime/ApplicationMainContext.js +5 -2
- package/dist/esm/core/runtime/ApplicationMainContext.js.map +1 -1
- package/dist/esm/core/runtime/domain-module.frontend.definitions.d.ts +25 -1
- package/dist/esm/core/runtime/domain-module.frontend.definitions.d.ts.map +1 -1
- package/dist/esm/core/runtime/domain-module.frontend.definitions.js +37 -1
- package/dist/esm/core/runtime/domain-module.frontend.definitions.js.map +1 -1
- package/dist/esm/core/runtime/start-application.frontend.service.d.ts +21 -2
- package/dist/esm/core/runtime/start-application.frontend.service.d.ts.map +1 -1
- package/dist/esm/core/runtime/start-application.frontend.service.js +51 -4
- package/dist/esm/core/runtime/start-application.frontend.service.js.map +1 -1
- package/dist/esm/core/security/AuthSessionContext.d.ts +11 -0
- package/dist/esm/core/security/AuthSessionContext.d.ts.map +1 -1
- package/dist/esm/core/security/AuthSessionContext.js +70 -22
- package/dist/esm/core/security/AuthSessionContext.js.map +1 -1
- package/dist/esm/core/security/StepUpAuthContext.d.ts.map +1 -1
- package/dist/esm/core/security/StepUpAuthContext.js +10 -2
- package/dist/esm/core/security/StepUpAuthContext.js.map +1 -1
- package/dist/esm/core/security/UserOrgsContext.d.ts.map +1 -1
- package/dist/esm/core/security/UserOrgsContext.js +72 -8
- package/dist/esm/core/security/UserOrgsContext.js.map +1 -1
- package/dist/esm/core/security/route-organization-access.frontend.utils.d.ts +7 -0
- package/dist/esm/core/security/route-organization-access.frontend.utils.d.ts.map +1 -1
- package/dist/esm/core/security/route-organization-access.frontend.utils.js +8 -2
- package/dist/esm/core/security/route-organization-access.frontend.utils.js.map +1 -1
- package/dist/esm/core/security/useGrantedConsentPurposes.d.ts +30 -0
- package/dist/esm/core/security/useGrantedConsentPurposes.d.ts.map +1 -0
- package/dist/esm/core/security/useGrantedConsentPurposes.js +38 -0
- package/dist/esm/core/security/useGrantedConsentPurposes.js.map +1 -0
- package/dist/esm/core/ui/UIContext.d.ts.map +1 -1
- package/dist/esm/core/ui/UIContext.js +10 -6
- package/dist/esm/core/ui/UIContext.js.map +1 -1
- package/dist/esm/core/ui/color-conversion.utils.d.ts +20 -0
- package/dist/esm/core/ui/color-conversion.utils.d.ts.map +1 -1
- package/dist/esm/core/ui/color-conversion.utils.js +39 -5
- package/dist/esm/core/ui/color-conversion.utils.js.map +1 -1
- package/dist/esm/core/ui/themes/default.theme.d.ts.map +1 -1
- package/dist/esm/core/ui/themes/default.theme.js +22 -2
- package/dist/esm/core/ui/themes/default.theme.js.map +1 -1
- package/dist/esm/core/ui/ui.frontend.schemas.d.ts +6 -6
- package/dist/esm/core/ui/ui.frontend.schemas.d.ts.map +1 -1
- package/dist/esm/core/ui/ui.frontend.schemas.js +3 -3
- package/dist/esm/core/ui/ui.frontend.schemas.js.map +1 -1
- package/dist/esm/index.d.ts +10 -1
- package/dist/esm/index.d.ts.map +1 -1
- package/dist/esm/index.js +19 -1
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/testing/app-shell-placement-coverage.d.ts +43 -0
- package/dist/esm/testing/app-shell-placement-coverage.d.ts.map +1 -0
- package/dist/esm/testing/app-shell-placement-coverage.js +114 -0
- package/dist/esm/testing/app-shell-placement-coverage.js.map +1 -0
- package/dist/esm/testing/mock-builders.d.ts.map +1 -1
- package/dist/esm/testing/mock-builders.js +5 -0
- package/dist/esm/testing/mock-builders.js.map +1 -1
- package/dist/esm/testing.d.ts +1 -0
- package/dist/esm/testing.d.ts.map +1 -1
- package/dist/esm/testing.js +1 -0
- package/dist/esm/testing.js.map +1 -1
- package/package.json +9 -7
- package/dist/esm/core/navigation/useIsStackEntryActive.js +0 -15
- package/dist/tsconfig.build.tsbuildinfo +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"verify-launcher-content.js","sourceRoot":"","sources":["../../../../../src/core/config/verify-launcher-content.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,EAAE,4BAA4B,EAAE,MAAM,uBAAuB,CAAC;AAOrE,OAAO,EAAE,sBAAsB,EAAE,MAAM,0BAA0B,CAAC;AAClE,OAAO,EACL,qCAAqC,EACrC,iCAAiC,GAClC,MAAM,iDAAiD,CAAC;AACzD,OAAO,EACL,kCAAkC,GACnC,MAAM,sCAAsC,CAAC;AAC9C,OAAO,EACL,6BAA6B,GAC9B,MAAM,yCAAyC,CAAC;AACjD,OAAO,EACL,sBAAsB,EAEtB,yBAAyB,EACzB,oBAAoB,GACrB,MAAM,mCAAmC,CAAC;AAY3C,mEAAmE;AACnE,4BAA4B;AAC5B,mEAAmE;AAEnE,MAAM,CAAN,IAAY,4BAGX;AAHD,WAAY,4BAA4B;IACtC,+CAAe,CAAA;IACf,mDAAmB,CAAA;AACrB,CAAC,EAHW,4BAA4B,KAA5B,4BAA4B,QAGvC;AAED,OAAO,EAAE,wBAAwB,EAAE,MAAM,wBAAwB,CAAC;AAElE,MAAM,CAAN,IAAY,6BAyBX;AAzBD,WAAY,6BAA6B;IACvC,0EAAyC,CAAA;IACzC,4EAA2C,CAAA;IAC3C,kEAAiC,CAAA;IACjC,0EAAyC,CAAA;IACzC,gFAA+C,CAAA;IAC/C,4GAA2E,CAAA;IAC3E,0HAAyF,CAAA;IACzF,oIAAmG,CAAA;IACnG,gHAA+E,CAAA;IAC/E,gHAA+E,CAAA;IAC/E,oGAAmE,CAAA;IACnE,oFAAmD,CAAA;IACnD,sGAAqE,CAAA;IACrE,wGAAuE,CAAA;IACvE,4EAA2C,CAAA;IAC3C,4EAA2C,CAAA;IAC3C;;;;;;OAMG;IACH,4FAA2D,CAAA;AAC7D,CAAC,EAzBW,6BAA6B,KAA7B,6BAA6B,QAyBxC;AA+BD,SAAS,iBAAiB,CAAC,SAAoC;IAC7D,MAAM,qBAAqB,GAAG,IAAI,GAAG,EAAkE,CAAC;IACxG,MAAM,4BAA4B,GAAG,IAAI,GAAG,EAAU,CAAC;IACvD,MAAM,mBAAmB,GAAG,IAAI,GAAG,EAAmC,CAAC;IACvE,MAAM,oBAAoB,GAAG,IAAI,GAAG,EAAoC,CAAC;IACzE,MAAM,qBAAqB,GAAG,IAAI,GAAG,EAAqC,CAAC;IAE3E,MAAM,kBAAkB,GAAG,CACzB,IAA4D,EAC5D,MAAkD,EAC5C,EAAE;QACR,IAAI,IAAI,CAAC,KAAK,KAAK,sBAAsB,CAAC,WAAW,EAAE,CAAC;YACtD,OAAO;QACT,CAAC;QAED,IAAI,qBAAqB,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;YACxC,4BAA4B,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YAC3C,OAAO;QACT,CAAC;QAED,qBAAqB,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,EAAE,EAAE,MAAM,EAAE,CAAC,CAAC;IAClD,CAAC,CAAC;IAEF,KAAK,MAAM,aAAa,IAAI,SAAS,CAAC,cAAc,IAAI,EAAE,EAAE,CAAC;QAC3D,mBAAmB,CAAC,GAAG,CAAC,aAAa,CAAC,GAAG,EAAE,aAAa,CAAC,CAAC;QAC1D,kBAAkB,CAAC,aAAa,EAAE,WAAW,CAAC,CAAC;IACjD,CAAC;IAED,KAAK,MAAM,cAAc,IAAI,SAAS,CAAC,eAAe,IAAI,EAAE,EAAE,CAAC;QAC7D,oBAAoB,CAAC,GAAG,CAAC,cAAc,CAAC,GAAG,EAAE,cAAc,CAAC,CAAC;QAC7D,kBAAkB,CAAC,cAAc,EAAE,YAAY,CAAC,CAAC;IACnD,CAAC;IAED,KAAK,MAAM,eAAe,IAAI,SAAS,CAAC,gBAAgB,IAAI,EAAE,EAAE,CAAC;QAC/D,qBAAqB,CAAC,GAAG,CAAC,eAAe,CAAC,GAAG,EAAE,eAAe,CAAC,CAAC;QAChE,kBAAkB,CAAC,eAAe,EAAE,aAAa,CAAC,CAAC;IACrD,CAAC;IAED,OAAO;QACL,qBAAqB;QACrB,4BAA4B;QAC5B,mBAAmB;QACnB,oBAAoB;QACpB,qBAAqB;KACtB,CAAC;AACJ,CAAC;AAED,SAAS,mBAAmB,CAC1B,IAAmD,EACnD,OAAe,EACf,QAAmC,EACnC,YAA0B,EAC1B,MAAmC,EACnC,KAAiC,EACjC,qBAAyD;IAEzD,MAAM,SAAS,GAAG,KAAK,KAAK,aAAa;QACvC,CAAC,CAAC,iCAAiC,CAAC,IAAI,CAAC,OAAO,EAAE,YAAY,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC;QACtF,CAAC,CAAC,8BAA8B,CAAC,IAAgF,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC;IAChJ,IAAI,CAAC,SAAS,EAAE,CAAC;QACf,OAAO;IACT,CAAC;IAED,QAAQ,SAAS,CAAC,MAAM,EAAE,CAAC;QACzB,KAAK,YAAY,CAAC,CAAC,CAAC;YAClB,MAAM,cAAc,GAAG,YAAY,CAAC,oBAAoB,CAAC,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YAC3E,IAAI,cAAc,IAAI,qBAAqB,IAAI,CAAC,qBAAqB,CAAC,cAAc,CAAC,YAAY,CAAC,EAAE,CAAC;gBACnG,MAAM,CAAC,IAAI,CAAC;oBACV,QAAQ,EAAE,4BAA4B,CAAC,KAAK;oBAC5C,IAAI,EAAE,6BAA6B,CAAC,+BAA+B;oBACnE,OAAO;oBACP,OAAO,EAAE,qBAAqB,IAAI,CAAC,OAAO,2BAA2B,cAAc,CAAC,YAAY,uDAAuD;oBACvJ,IAAI;iBACL,CAAC,CAAC;YACL,CAAC;YACD,MAAM;QACR,CAAC;QAED,KAAK,WAAW,CAAC;QACjB,KAAK,aAAa;YAChB,MAAM;IACV,CAAC;AACH,CAAC;AAED,SAAS,iCAAiC,CACxC,OAAe,EACf,YAA0B,EAC1B,OAAe,EACf,MAAmC,EACnC,IAAqB;IAErB,IAAI,YAAY,CAAC,4BAA4B,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC;QAC3D,MAAM,CAAC,IAAI,CAAC;YACV,QAAQ,EAAE,4BAA4B,CAAC,KAAK;YAC5C,IAAI,EAAE,6BAA6B,CAAC,kBAAkB;YACtD,OAAO;YACP,OAAO,EAAE,yBAAyB,OAAO,4EAA4E;YACrH,IAAI;SACL,CAAC,CAAC;QACH,OAAO,IAAI,CAAC;IACd,CAAC;IAED,MAAM,SAAS,GAAG,YAAY,CAAC,qBAAqB,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;IAClE,IAAI,CAAC,SAAS,EAAE,CAAC;QACf,MAAM,CAAC,IAAI,CAAC;YACV,QAAQ,EAAE,4BAA4B,CAAC,KAAK;YAC5C,IAAI,EAAE,6BAA6B,CAAC,cAAc;YAClD,OAAO;YACP,OAAO,EAAE,qBAAqB,OAAO,uDAAuD;YAC5F,IAAI;SACL,CAAC,CAAC;QACH,OAAO,IAAI,CAAC;IACd,CAAC;IAED,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,SAAS,8BAA8B,CACrC,IAA8E,EAC9E,QAAmC,EACnC,OAAe,EACf,MAAmC;IAEnC,MAAM,cAAc,GAAG,QAAQ,CAAC,sBAAsB,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;IAC1E,IAAI,CAAC,cAAc,EAAE,CAAC;QACpB,MAAM,CAAC,IAAI,CAAC;YACV,QAAQ,EAAE,4BAA4B,CAAC,KAAK;YAC5C,IAAI,EAAE,6BAA6B,CAAC,kBAAkB;YACtD,OAAO;YACP,OAAO,EAAE,kBAAkB,IAAI,CAAC,YAAY,yBAAyB;YACrE,IAAI;SACL,CAAC,CAAC;QACH,OAAO,IAAI,CAAC;IACd,CAAC;IAED,MAAM,WAAW,GAAG,qCAAqC,CAAC;QACxD,YAAY,EAAE,IAAI,CAAC,YAAY;QAC/B,OAAO,EAAE,IAAI,CAAC,OAAO;QACrB,QAAQ;KACT,CAAC,CAAC;IACH,IAAI,WAAW,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC3B,MAAM,CAAC,IAAI,CAAC;YACV,QAAQ,EAAE,4BAA4B,CAAC,KAAK;YAC5C,IAAI,EAAE,6BAA6B,CAAC,kBAAkB;YACtD,OAAO;YACP,OAAO,EAAE,sBAAsB,IAAI,CAAC,OAAO,6CAA6C,IAAI,CAAC,YAAY,yEAAyE;YAClL,IAAI;SACL,CAAC,CAAC;QACH,OAAO,IAAI,CAAC;IACd,CAAC;IAED,MAAM,YAAY,GAAG,iCAAiC,CAAC;QACrD,YAAY,EAAE,IAAI,CAAC,YAAY;QAC/B,OAAO,EAAE,IAAI,CAAC,OAAO;QACrB,QAAQ;KACT,CAAC,CAAC;IACH,IAAI,YAAY,EAAE,CAAC;QACjB,IAAI,YAAY,CAAC,KAAK,KAAK,sBAAsB,CAAC,QAAQ,EAAE,CAAC;YAC3D,MAAM,CAAC,IAAI,CAAC;gBACV,QAAQ,EAAE,4BAA4B,CAAC,KAAK;gBAC5C,IAAI,EAAE,6BAA6B,CAAC,mBAAmB;gBACvD,OAAO;gBACP,OAAO,EAAE,kBAAkB,IAAI,CAAC,OAAO,kBAAkB,IAAI,CAAC,YAAY,kFAAkF;gBAC5J,IAAI;aACL,CAAC,CAAC;YACH,OAAO,IAAI,CAAC;QACd,CAAC;QACD,OAAO,EAAE,MAAM,EAAE,YAAY,CAAC,MAAM,EAAE,CAAC;IACzC,CAAC;IAED,MAAM,CAAC,IAAI,CAAC;QACV,QAAQ,EAAE,4BAA4B,CAAC,KAAK;QAC5C,IAAI,EAAE,6BAA6B,CAAC,cAAc;QAClD,OAAO;QACP,OAAO,EAAE,kBAAkB,IAAI,CAAC,OAAO,kCAAkC,IAAI,CAAC,YAAY,GAAG;QAC7F,IAAI;KACL,CAAC,CAAC;IACH,OAAO,IAAI,CAAC;AACd,CAAC;AAED,mEAAmE;AACnE,8BAA8B;AAC9B,mEAAmE;AAEnE,SAAS,aAAa,CACpB,IAAqB,EACrB,OAAe,EACf,QAAmC,EACnC,YAA0B,EAC1B,MAAmC;AACnC;;;;;;;GAOG;AACH,yBAA8C,EAC9C,qBAAyD;IAEzD,QAAQ,IAAI,CAAC,IAAI,EAAE,CAAC;QAClB,KAAK,sBAAsB,CAAC,kBAAkB,CAAC,CAAC,CAAC;YAC/C,MAAM,cAAc,GAAG,QAAQ,CAAC,sBAAsB,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;YAC1E,IAAI,CAAC,cAAc,EAAE,CAAC;gBACpB,MAAM,CAAC,IAAI,CAAC;oBACV,QAAQ,EAAE,4BAA4B,CAAC,KAAK;oBAC5C,IAAI,EAAE,6BAA6B,CAAC,kBAAkB;oBACtD,OAAO;oBACP,OAAO,EAAE,kBAAkB,IAAI,CAAC,YAAY,yBAAyB;oBACrE,IAAI;iBACL,CAAC,CAAC;gBACH,OAAO;YACT,CAAC;YACD,MAAM,kBAAkB,GAAG,cAAc,CAAC,UAAU,CAAC,MAAM,CACzD,CAAC,EAAsF,EAAE,EAAE,CAAC,CAC1F,EAAE,CAAC,mBAAmB,KAAK,IAAI,CAAC,SAAS,CAC1C,CACF,CAAC;YACF,MAAM,QAAQ,GAAG,IAAI,CAAC,gBAAgB;gBACpC,CAAC,CAAC,kBAAkB,CAAC,IAAI,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,UAAU,KAAK,IAAI,CAAC,gBAAgB,CAAC;gBAC1E,CAAC,CAAC,kBAAkB,CAAC,MAAM,GAAG,CAAC,CAAC;YAClC,IAAI,CAAC,QAAQ,EAAE,CAAC;gBACd,MAAM,CAAC,IAAI,CAAC;oBACV,QAAQ,EAAE,4BAA4B,CAAC,KAAK;oBAC5C,IAAI,EAAE,6BAA6B,CAAC,mBAAmB;oBACvD,OAAO;oBACP,OAAO,EAAE,cAAc,IAAI,CAAC,SAAS,IAAI,IAAI,CAAC,gBAAgB,CAAC,CAAC,CAAC,cAAc,IAAI,CAAC,gBAAgB,GAAG,CAAC,CAAC,CAAC,EAAE,2BAA2B,IAAI,CAAC,YAAY,GAAG;oBAC3J,IAAI;iBACL,CAAC,CAAC;YACL,CAAC;iBAAM,IAAI,CAAC,IAAI,CAAC,gBAAgB,EAAE,CAAC;gBAClC,MAAM,iBAAiB,GAAG,kBAAkB,CAAC,MAAM,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,kBAAkB,KAAK,IAAI,CAAC,CAAC;gBAC5F,IAAI,kBAAkB,CAAC,MAAM,GAAG,CAAC,IAAI,iBAAiB,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;oBACpE,MAAM,CAAC,IAAI,CAAC;wBACV,QAAQ,EAAE,4BAA4B,CAAC,KAAK;wBAC5C,IAAI,EAAE,6BAA6B,CAAC,mBAAmB;wBACvD,OAAO;wBACP,OAAO,EAAE,cAAc,IAAI,CAAC,SAAS,kBAAkB,IAAI,CAAC,YAAY,8DAA8D;wBACtI,IAAI;qBACL,CAAC,CAAC;gBACL,CAAC;YACH,CAAC;YACD,MAAM;QACR,CAAC;QAED,KAAK,sBAAsB,CAAC,IAAI,CAAC,CAAC,CAAC;YACjC,mBAAmB,CAAC,IAAI,EAAE,OAAO,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,EAAE,aAAa,EAAE,qBAAqB,CAAC,CAAC;YACzG,MAAM;QACR,CAAC;QAED,KAAK,sBAAsB,CAAC,aAAa,CAAC,CAAC,CAAC;YAC1C,mBAAmB,CAAC,IAAI,EAAE,OAAO,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,EAAE,UAAU,EAAE,qBAAqB,CAAC,CAAC;YACtG,MAAM;QACR,CAAC;QAED,KAAK,sBAAsB,CAAC,WAAW,CAAC,CAAC,CAAC;YACxC,IAAI,CAAC,CAAC,IAAI,CAAC,OAAO,IAAI,oBAAoB,CAAC,EAAE,CAAC;gBAC5C,MAAM,CAAC,IAAI,CAAC;oBACV,QAAQ,EAAE,4BAA4B,CAAC,KAAK;oBAC5C,IAAI,EAAE,6BAA6B,CAAC,qBAAqB;oBACzD,OAAO;oBACP,OAAO,EAAE,oBAAoB,IAAI,CAAC,OAAO,wCAAwC;oBACjF,IAAI;iBACL,CAAC,CAAC;YACL,CAAC;YACD,MAAM;QACR,CAAC;QAED,KAAK,sBAAsB,CAAC,gBAAgB,CAAC,CAAC,CAAC;YAC7C,IAAI,qBAAqB,IAAI,CAAC,qBAAqB,CAAC,IAAI,CAAC,YAAY,CAAC,EAAE,CAAC;gBACvE,MAAM,CAAC,IAAI,CAAC;oBACV,QAAQ,EAAE,4BAA4B,CAAC,KAAK;oBAC5C,IAAI,EAAE,6BAA6B,CAAC,+BAA+B;oBACnE,OAAO;oBACP,OAAO,EAAE,8BAA8B,IAAI,CAAC,YAAY,iDAAiD;oBACzG,IAAI;iBACL,CAAC,CAAC;YACL,CAAC;YACD,MAAM;QACR,CAAC;QAED,KAAK,sBAAsB,CAAC,gBAAgB,CAAC,CAAC,CAAC;YAC7C,0EAA0E;YAC1E,2EAA2E;YAC3E,4EAA4E;YAC5E,sEAAsE;YACtE,mDAAmD;YACnD,EAAE;YACF,wEAAwE;YACxE,qDAAqD;YACrD,IAAI,IAAI,CAAC,UAAU,KAAK,SAAS,IAAI,CAAC,yBAAyB,CAAC,GAAG,CAAC,IAAI,CAAC,UAAU,CAAC,EAAE,CAAC;gBACrF,MAAM,CAAC,IAAI,CAAC;oBACV,QAAQ,EAAE,4BAA4B,CAAC,KAAK;oBAC5C,IAAI,EAAE,6BAA6B,CAAC,2BAA2B;oBAC/D,OAAO;oBACP,OAAO,EAAE,wCAAwC,IAAI,CAAC,UAAU,sJAAsJ;oBACtN,IAAI;iBACL,CAAC,CAAC;YACL,CAAC;YACD,MAAM;QACR,CAAC;QAED,OAAO,CAAC,CAAC,CAAC;YACR,MAAM,CAAC,IAAI,CAAC;gBACV,QAAQ,EAAE,4BAA4B,CAAC,KAAK;gBAC5C,IAAI,EAAE,6BAA6B,CAAC,mBAAmB;gBACvD,OAAO;gBACP,OAAO,EAAE,oCAAqC,IAAwB,CAAC,IAAI,GAAG;gBAC9E,IAAI;aACL,CAAC,CAAC;QACL,CAAC;IACH,CAAC;AACH,CAAC;AAED;;GAEG;AACH,SAAS,kBAAkB,CACzB,KAAoB,EACpB,OAAe,EACf,QAAmC,EACnC,YAA0B,EAC1B,MAAmC,EACnC,yBAA8C,EAC9C,qBAAyD;IAEzD,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,aAAa,CAAC,IAAI,EAAE,OAAO,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,EAAE,yBAAyB,EAAE,qBAAqB,CAAC,CAAC;QAC/G,yFAAyF;QACzF,6FAA6F;QAC7F,gGAAgG;QAChG,oDAAoD;QACpD,IAAI,IAAI,CAAC,oBAAoB;eACxB,CAAC,QAAQ,CAAC,4BAA4B,CAAC,IAAI,CAC5C,CAAC,UAAU,EAAE,EAAE,CAAC,4BAA4B,CAAC,UAAU,CAAC,KAAK,IAAI,CAAC,oBAAoB,CACvF,EAAE,CAAC;YACJ,MAAM,CAAC,IAAI,CAAC;gBACV,QAAQ,EAAE,4BAA4B,CAAC,KAAK;gBAC5C,IAAI,EAAE,6BAA6B,CAAC,gCAAgC;gBACpE,OAAO;gBACP,OAAO,EAAE,yBAAyB,IAAI,CAAC,oBAAoB,oEAAoE;sBAC3H,sEAAsE;sBACtE,GAAG,QAAQ,CAAC,4BAA4B,CAAC,GAAG,CAAC,4BAA4B,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,QAAQ,EAAE;gBACvG,IAAI;aACL,CAAC,CAAC;QACL,CAAC;QACD,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;YAClB,kBAAkB,CAAC,IAAI,CAAC,QAAQ,EAAE,GAAG,OAAO,WAAW,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,EAAE,yBAAyB,EAAE,qBAAqB,CAAC,CAAC;QAC7I,CAAC;IACH,CAAC;AACH,CAAC;AAED,mEAAmE;AACnE,+BAA+B;AAC/B,mEAAmE;AAEnE,SAAS,oBAAoB,CAC3B,OAAuB,EACvB,QAAmC,EACnC,YAA0B,EAC1B,WAAwB,EACxB,MAAmC,EACnC,yBAA8C,EAC9C,qBAAyD;IAEzD,MAAM,GAAG,GAAG,2BAA2B,OAAO,CAAC,GAAG,GAAG,CAAC;IAEtD,qDAAqD;IACrD,IAAI,OAAO,CAAC,cAAc,IAAI,OAAO,CAAC,cAAc,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAChE,IAAI,WAAW,CAAC,IAAI,KAAK,CAAC,EAAE,CAAC;YAC3B,MAAM,CAAC,IAAI,CAAC;gBACV,QAAQ,EAAE,4BAA4B,CAAC,OAAO;gBAC9C,IAAI,EAAE,6BAA6B,CAAC,uBAAuB;gBAC3D,OAAO,EAAE,GAAG;gBACZ,OAAO,EAAE,yFAAyF;gBAClG,IAAI,EAAE,OAAO;aACd,CAAC,CAAC;QACL,CAAC;aAAM,CAAC;YACN,KAAK,MAAM,OAAO,IAAI,OAAO,CAAC,cAAc,EAAE,CAAC;gBAC7C,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC;oBAC9B,MAAM,CAAC,IAAI,CAAC;wBACV,QAAQ,EAAE,4BAA4B,CAAC,OAAO;wBAC9C,IAAI,EAAE,6BAA6B,CAAC,uBAAuB;wBAC3D,OAAO,EAAE,GAAG;wBACZ,OAAO,EAAE,uBAAuB,OAAO,uCAAuC;wBAC9E,IAAI,EAAE,OAAO;qBACd,CAAC,CAAC;gBACL,CAAC;YACH,CAAC;QACH,CAAC;IACH,CAAC;IAED,QAAQ,OAAO,CAAC,WAAW,EAAE,CAAC;QAC5B,KAAK,yBAAyB,CAAC,eAAe,CAAC,CAAC,CAAC;YAC/C,MAAM,UAAU,GAAG,OAAwC,CAAC;YAC5D,kBAAkB,CAAC,UAAU,CAAC,QAAQ,EAAE,GAAG,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,EAAE,yBAAyB,EAAE,qBAAqB,CAAC,CAAC;YAC/H,MAAM;QACR,CAAC;QAED,KAAK,yBAAyB,CAAC,gBAAgB,CAAC,CAAC,CAAC;YAChD,MAAM,cAAc,GAAG,OAAyC,CAAC;YACjE,MAAM,cAAc,GAAG,QAAQ,CAAC,sBAAsB,CAAC,cAAc,CAAC,YAAY,CAAC,CAAC;YAEpF,IAAI,CAAC,cAAc,EAAE,CAAC;gBACpB,MAAM,CAAC,IAAI,CAAC;oBACV,QAAQ,EAAE,4BAA4B,CAAC,KAAK;oBAC5C,IAAI,EAAE,6BAA6B,CAAC,mCAAmC;oBACvE,OAAO,EAAE,GAAG;oBACZ,OAAO,EAAE,kCAAkC,cAAc,CAAC,YAAY,yBAAyB;oBAC/F,IAAI,EAAE,OAAO;iBACd,CAAC,CAAC;gBACH,MAAM;YACR,CAAC;YAED,IAAI,cAAc,CAAC,SAAS,EAAE,CAAC;gBAC7B,MAAM,QAAQ,GAAG,cAAc,CAAC,UAAU,CAAC,IAAI,CAC7C,CAAC,EAAwD,EAAE,EAAE,CAC3D,EAAE,CAAC,mBAAmB,KAAK,cAAc,CAAC,SAAS;oBACnD,CAAC,CAAC,cAAc,CAAC,gBAAgB,IAAI,EAAE,CAAC,UAAU,KAAK,cAAc,CAAC,gBAAgB,CAAC,CAC1F,CAAC;gBACF,IAAI,CAAC,QAAQ,EAAE,CAAC;oBACd,MAAM,CAAC,IAAI,CAAC;wBACV,QAAQ,EAAE,4BAA4B,CAAC,KAAK;wBAC5C,IAAI,EAAE,6BAA6B,CAAC,0CAA0C;wBAC9E,OAAO,EAAE,GAAG;wBACZ,OAAO,EAAE,qCAAqC,cAAc,CAAC,SAAS,IAAI,cAAc,CAAC,gBAAgB,CAAC,CAAC,CAAC,cAAc,cAAc,CAAC,gBAAgB,GAAG,CAAC,CAAC,CAAC,EAAE,kBAAkB,cAAc,CAAC,YAAY,GAAG;wBACjN,IAAI,EAAE,OAAO;qBACd,CAAC,CAAC;gBACL,CAAC;YACH,CAAC;YAED,IAAI,cAAc,CAAC,iBAAiB,EAAE,CAAC;gBACrC,MAAM,gBAAgB,GAAG,cAAc,CAAC,UAAU,CAAC,IAAI,CACrD,CAAC,EAAwD,EAAE,EAAE,CAC3D,EAAE,CAAC,mBAAmB,KAAK,cAAc,CAAC,iBAAiB;oBAC3D,CAAC,CAAC,cAAc,CAAC,wBAAwB,IAAI,EAAE,CAAC,UAAU,KAAK,cAAc,CAAC,wBAAwB,CAAC,CAC1G,CAAC;gBACF,IAAI,CAAC,gBAAgB,EAAE,CAAC;oBACtB,MAAM,CAAC,IAAI,CAAC;wBACV,QAAQ,EAAE,4BAA4B,CAAC,KAAK;wBAC5C,IAAI,EAAE,6BAA6B,CAAC,+CAA+C;wBACnF,OAAO,EAAE,GAAG;wBACZ,OAAO,EAAE,0CAA0C,cAAc,CAAC,iBAAiB,IAAI,cAAc,CAAC,wBAAwB,CAAC,CAAC,CAAC,cAAc,cAAc,CAAC,wBAAwB,GAAG,CAAC,CAAC,CAAC,EAAE,kBAAkB,cAAc,CAAC,YAAY,GAAG;wBAC9O,IAAI,EAAE,OAAO;qBACd,CAAC,CAAC;gBACL,CAAC;YACH,CAAC;YAED,6EAA6E;YAC7E,uEAAuE;YACvE,IAAI,CAAC,cAAc,CAAC,qBAAqB,EAAE,wBAAwB,EAAE,CAAC;gBACpE,MAAM,CAAC,IAAI,CAAC;oBACV,QAAQ,EAAE,4BAA4B,CAAC,OAAO;oBAC9C,IAAI,EAAE,6BAA6B,CAAC,qCAAqC;oBACzE,OAAO,EAAE,GAAG;oBACZ,OAAO,EAAE,yBAAyB,cAAc,CAAC,YAAY,gGAAgG;oBAC7J,IAAI,EAAE,OAAO;iBACd,CAAC,CAAC;YACL,CAAC;YACD,MAAM;QACR,CAAC;QAED,KAAK,yBAAyB,CAAC,eAAe,CAAC;QAC/C,KAAK,yBAAyB,CAAC,gBAAgB;YAC7C,MAAM;IACV,CAAC;AACH,CAAC;AAED,mEAAmE;AACnE,6BAA6B;AAC7B,mEAAmE;AAEnE;;;;;;;GAOG;AACH,MAAM,UAAU,qBAAqB,CACnC,QAAmC,EACnC,SAAoC,EACpC,qBAAyD;IAEzD,MAAM,MAAM,GAAgC,EAAE,CAAC;IAC/C,MAAM,MAAM,GAAG,SAAS,CAAC,0BAA0B,CAAC;IACpD,MAAM,YAAY,GAAG,iBAAiB,CAAC,SAAS,CAAC,CAAC;IAElD,8EAA8E;IAC9E,6EAA6E;IAC7E,+DAA+D;IAC/D,MAAM,yBAAyB,GAAwB,IAAI,GAAG,CAC5D,wBAAwB,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,CACrF,CAAC;IAEF,4CAA4C;IAC5C,MAAM,WAAW,GAAG,IAAI,GAAG,EAAU,CAAC;IACtC,MAAM,QAAQ,GAAwB,SAAS,CAAC,QAAQ,IAAI,EAAE,CAAC;IAC/D,KAAK,MAAM,IAAI,IAAI,QAAQ,EAAE,CAAC;QAC5B,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAC5B,CAAC;IAED,MAAM,cAAc,GAAG,SAAS,CAAC,QAAQ,EAAE,MAAM,IAAI,EAAE,CAAC;IACxD,MAAM,8BAA8B,GAAG,kCAAkC,CAAC,cAAc,CAAC,CAAC;IAC1F,KAAK,MAAM,SAAS,IAAI,8BAA8B,EAAE,CAAC;QACvD,MAAM,CAAC,IAAI,CAAC;YACV,QAAQ,EAAE,4BAA4B,CAAC,KAAK;YAC5C,IAAI,EAAE,6BAA6B,CAAC,iCAAiC;YACrE,OAAO,EAAE,iBAAiB;YAC1B,OAAO,EAAE,qCAAqC,SAAS,CAAC,YAAY,sEAAsE,SAAS,CAAC,gBAAgB,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE;YACjL,IAAI,EAAE,SAAS;SAChB,CAAC,CAAC;IACL,CAAC;IAED,KAAK,MAAM,gBAAgB,IAAI,YAAY,CAAC,4BAA4B,EAAE,CAAC;QACzE,MAAM,CAAC,IAAI,CAAC;YACV,QAAQ,EAAE,4BAA4B,CAAC,KAAK;YAC5C,IAAI,EAAE,6BAA6B,CAAC,kBAAkB;YACtD,OAAO,EAAE,kBAAkB;YAC3B,OAAO,EAAE,yBAAyB,gBAAgB,+FAA+F;YACjJ,IAAI,EAAE,gBAAgB;SACvB,CAAC,CAAC;IACL,CAAC;IAED,yCAAyC;IACzC,MAAM,aAAa,GAAG,MAAM,CAAC,6BAA6B,CAAC,OAAO,CAAC,CAAC;IACpE,IAAI,OAAO,aAAa,KAAK,QAAQ,IAAI,aAAa,KAAK,IAAI,IAAI,iBAAiB,IAAI,aAAa,EAAE,CAAC;QACtG,MAAM,eAAe,GAAI,aAAwD,CAAC,eAAe,CAAC;QAClG,IAAI,eAAe,EAAE,CAAC;YACpB,KAAK,MAAM,OAAO,IAAI,eAAe,EAAE,CAAC;gBACtC,oBAAoB,CAAC,OAAO,EAAE,QAAQ,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,EAAE,yBAAyB,EAAE,qBAAqB,CAAC,CAAC;YAC/H,CAAC;QACH,CAAC;IACH,CAAC;IAED,sCAAsC;IACtC,MAAM,SAAS,GAAG,MAAM,CAAC,6BAA6B,CAAC,YAAY,CAAC,CAAC;IACrE,IAAI,OAAO,SAAS,KAAK,QAAQ,IAAI,SAAS,KAAK,IAAI,IAAI,UAAU,IAAI,SAAS,EAAE,CAAC;QACnF,MAAM,QAAQ,GAAI,SAA8C,CAAC,QAAQ,CAAC;QAC1E,IAAI,QAAQ,EAAE,CAAC;YACb,KAAK,MAAM,GAAG,IAAI,QAAQ,EAAE,CAAC;gBAC3B,aAAa,CAAC,GAAG,EAAE,uBAAuB,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,EAAE,yBAAyB,EAAE,qBAAqB,CAAC,CAAC;YAChI,CAAC;QACH,CAAC;IACH,CAAC;IAED,gCAAgC;IAChC,MAAM,YAAY,GAAG,MAAM,CAAC,6BAA6B,CAAC,MAAM,CAAC,CAAC;IAClE,IAAI,OAAO,YAAY,KAAK,QAAQ,IAAI,YAAY,KAAK,IAAI,IAAI,UAAU,IAAI,YAAY,EAAE,CAAC;QAC5F,MAAM,QAAQ,GAAI,YAAiD,CAAC,QAAQ,CAAC;QAC7E,IAAI,QAAQ,EAAE,CAAC;YACb,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;gBAC/B,aAAa,CAAC,OAAO,EAAE,iBAAiB,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,EAAE,yBAAyB,EAAE,qBAAqB,CAAC,CAAC;YAC9H,CAAC;QACH,CAAC;IACH,CAAC;IAED,4CAA4C;IAC5C,MAAM,SAAS,GAAG,MAAM,CAAC,6BAA6B,CAAC,mBAAmB,CAAC,CAAC;IAC5E,IAAI,OAAO,SAAS,KAAK,QAAQ,IAAI,SAAS,KAAK,IAAI,IAAI,SAAS,IAAI,SAAS,EAAE,CAAC;QAClF,MAAM,OAAO,GAAI,SAA6C,CAAC,OAAO,CAAC;QACvE,IAAI,OAAO,EAAE,CAAC;YACZ,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;gBAC7B,aAAa,CAAC,MAAM,EAAE,6BAA6B,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,EAAE,yBAAyB,EAAE,qBAAqB,CAAC,CAAC;YACzI,CAAC;QACH,CAAC;IACH,CAAC;IAED,oCAAoC;IACpC,MAAM,QAAQ,GAAG,MAAM,CAAC,6BAA6B,CAAC,aAAa,CAAC,CAAC;IACrE,IAAI,OAAO,QAAQ,KAAK,QAAQ,IAAI,QAAQ,KAAK,IAAI,IAAI,OAAO,IAAI,QAAQ,EAAE,CAAC;QAC7E,MAAM,KAAK,GAAI,QAA0C,CAAC,KAAK,CAAC;QAChE,IAAI,KAAK,EAAE,CAAC;YACV,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;gBACzB,aAAa,CAAC,IAAI,EAAE,qBAAqB,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,EAAE,yBAAyB,EAAE,qBAAqB,CAAC,CAAC;YAC/H,CAAC;QACH,CAAC;IACH,CAAC;IAED,8BAA8B;IAC9B,MAAM,aAAa,GAAG,MAAM,CAAC,6BAA6B,CAAC,OAAO,CAAC,CAAC;IACpE,IAAI,OAAO,aAAa,KAAK,QAAQ,IAAI,aAAa,KAAK,IAAI,IAAI,OAAO,IAAI,aAAa,EAAE,CAAC;QAC5F,MAAM,KAAK,GAAI,aAA2C,CAAC,KAAK,CAAC;QACjE,IAAI,KAAK,EAAE,CAAC;YACV,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;gBACzB,aAAa,CAAC,IAAI,EAAE,eAAe,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,EAAE,yBAAyB,EAAE,qBAAqB,CAAC,CAAC;YACzH,CAAC;QACH,CAAC;IACH,CAAC;IAED,iDAAiD;IACjD,MAAM,aAAa,GAAG,MAAM,CAAC,6BAA6B,CAAC,OAAO,CAAC,CAAC;IACpE,IAAI,OAAO,aAAa,KAAK,QAAQ,IAAI,aAAa,KAAK,IAAI,EAAE,CAAC;QAChE,IAAI,kBAAkB,IAAI,aAAa,EAAE,CAAC;YACxC,MAAM,gBAAgB,GAAI,aAAyE,CAAC,gBAAgB,CAAC;YACrH,IAAI,gBAAgB,EAAE,CAAC;gBACrB,KAAK,MAAM,MAAM,IAAI,gBAAgB,EAAE,CAAC;oBACtC,MAAM,YAAY,GAAG,MAAM,CAAC,aAAoC,CAAC;oBACjE,IAAI,CAAC,CAAC,YAAY,IAAI,MAAM,CAAC,EAAE,CAAC;wBAC9B,MAAM,CAAC,IAAI,CAAC;4BACV,QAAQ,EAAE,4BAA4B,CAAC,KAAK;4BAC5C,IAAI,EAAE,6BAA6B,CAAC,+BAA+B;4BACnE,OAAO,EAAE,0BAA0B;4BACnC,OAAO,EAAE,qBAAqB,MAAM,CAAC,aAAa,mDAAmD;4BACrG,IAAI,EAAE,MAAM;yBACb,CAAC,CAAC;oBACL,CAAC;gBACH,CAAC;YACH,CAAC;QACH,CAAC;QACD,IAAI,OAAO,IAAI,aAAa,EAAE,CAAC;YAC7B,MAAM,KAAK,GAAI,aAA+C,CAAC,KAAK,CAAC;YACrE,IAAI,KAAK,EAAE,CAAC;gBACV,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;oBACzB,aAAa,CAAC,IAAI,EAAE,eAAe,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,EAAE,yBAAyB,EAAE,qBAAqB,CAAC,CAAC;gBACzH,CAAC;YACH,CAAC;QACH,CAAC;IACH,CAAC;IAED,4CAA4C;IAC5C,MAAM,iBAAiB,GAAG,MAAM,CAAC,6BAA6B,CAAC,YAAY,CAAC,CAAC;IAC7E,IAAI,OAAO,iBAAiB,KAAK,QAAQ,IAAI,iBAAiB,KAAK,IAAI,EAAE,CAAC;QACxE,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC1B,MAAM,CAAC,IAAI,CAAC;gBACV,QAAQ,EAAE,4BAA4B,CAAC,OAAO;gBAC9C,IAAI,EAAE,6BAA6B,CAAC,qCAAqC;gBACzE,OAAO,EAAE,cAAc;gBACvB,OAAO,EAAE,yGAAyG;gBAClH,IAAI,EAAE,iBAAiB;aACxB,CAAC,CAAC;QACL,CAAC;IACH,CAAC;SAAM,IAAI,iBAAiB,KAAK,IAAI,EAAE,CAAC;QACtC,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC1B,MAAM,CAAC,IAAI,CAAC;gBACV,QAAQ,EAAE,4BAA4B,CAAC,OAAO;gBAC9C,IAAI,EAAE,6BAA6B,CAAC,qCAAqC;gBACzE,OAAO,EAAE,cAAc;gBACvB,OAAO,EAAE,sGAAsG;gBAC/G,IAAI,EAAE,iBAAiB;aACxB,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAED,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;AAClD,CAAC;AAED,mEAAmE;AACnE,mBAAmB;AACnB,mEAAmE;AAEnE;;;GAGG;AACH,MAAM,UAAU,iCAAiC,CAAC,MAAkC;IAClF,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;QACnB,OAAO,CAAC,GAAG,CAAC,sEAAsE,CAAC,CAAC;QACpF,OAAO;IACT,CAAC;IAED,MAAM,UAAU,GAAG,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,4BAA4B,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC;IACvG,MAAM,YAAY,GAAG,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,4BAA4B,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC;IAE3G,OAAO,CAAC,KAAK,CACX,0BAA0B,UAAU,cAAc,YAAY,aAAa,CAC5E,CAAC;IAEF,KAAK,MAAM,KAAK,IAAI,MAAM,CAAC,MAAM,EAAE,CAAC;QAClC,MAAM,MAAM,GAAG,KAAK,CAAC,QAAQ,KAAK,4BAA4B,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,QAAQ,CAAC;QAC5F,OAAO,CAAC,IAAI,CACV,GAAG,MAAM,KAAK,KAAK,CAAC,IAAI,KAAK,KAAK,CAAC,OAAO,KAAK,KAAK,CAAC,OAAO,EAAE,CAC/D,CAAC;IACJ,CAAC;IAED,OAAO,CAAC,QAAQ,EAAE,CAAC;AACrB,CAAC","sourcesContent":["/**\n * Launcher Content Verification\n *\n * DEV-mode startup validator that walks every content-declaring launcher's\n * configuration and verifies that all declared references resolve to real\n * registry entries (operations, views, engine pages, hosted components).\n *\n * Adapts traversal to each launcher's structural model — sidebar sections\n * use a discriminated union on `contentKind`, while other launchers are\n * flat item arrays.\n *\n * @see launcher-operation-binding-analysis.md §3.11\n * @see app-shell-implementation-plan.md Step 5\n */\n\nimport { notificationBadgeIdentityKey } from '@wildo-ai/saas-models';\n\nimport type { AppConfiguration_Frontend } from './app-configuration-frontend.schemas';\nimport type { FrontendResourcesRegistry, AnyFrontendResourceConfiguration } from '~wildo-frontend-lib/core/resources/resources.frontend.schemas';\nimport type { CompositeViewDefinition } from './composite-view.schemas';\nimport type { FullCustomViewDefinition } from './full-custom-view.schemas';\nimport type { FlowsActorsViewDefinition } from './flows-actors-view.schemas';\nimport { FrontendView_ScopeMode } from './views-frontend.schemas';\nimport {\n findResourceOwnedViewReferenceMatches,\n resolveResourceOwnedViewReference,\n} from './resource-owned-view-resolution.frontend.utils';\nimport {\n findDuplicateAppScopeResourceTypes,\n} from './app-configuration-frontend.schemas';\nimport {\n ApplicationLevelComponentType,\n} from './app-level-components.frontend.schemas';\nimport {\n LauncherItemTargetKind,\n EnginePageRef,\n SidebarSectionContentKind,\n ENGINE_PAGE_METADATA,\n} from './launcher-items.frontend.schemas';\nimport type {\n LauncherItemRef,\n ToolbarItem,\n SidebarItem,\n SidebarSection,\n SidebarSection_NavigationList,\n SidebarSection_ResourceBrowser,\n AppModeDefinition,\n} from './launcher-items.frontend.schemas';\n\n\n// ════════════════════════════════════════════════════════════════\n// Verification Result Types\n// ════════════════════════════════════════════════════════════════\n\nexport enum LauncherVerificationSeverity {\n ERROR = 'error',\n WARNING = 'warning',\n}\n\nimport { resolveSettingsHubConfig } from './useSettingsHubConfig';\n\nexport enum LauncherVerificationErrorCode {\n RESOURCE_NOT_FOUND = 'RESOURCE_NOT_FOUND',\n OPERATION_NOT_FOUND = 'OPERATION_NOT_FOUND',\n VIEW_NOT_FOUND = 'VIEW_NOT_FOUND',\n VIEW_REF_COLLISION = 'VIEW_REF_COLLISION',\n ENGINE_PAGE_NOT_FOUND = 'ENGINE_PAGE_NOT_FOUND',\n RESOURCE_BROWSER_RESOURCE_NOT_FOUND = 'RESOURCE_BROWSER_RESOURCE_NOT_FOUND',\n RESOURCE_BROWSER_BOUND_OPERATION_NOT_FOUND = 'RESOURCE_BROWSER_BOUND_OPERATION_NOT_FOUND',\n RESOURCE_BROWSER_NAVIGATION_OPERATION_NOT_FOUND = 'RESOURCE_BROWSER_NAVIGATION_OPERATION_NOT_FOUND',\n RESOURCE_BROWSER_MISSING_LABEL_CONFIG = 'RESOURCE_BROWSER_MISSING_LABEL_CONFIG',\n ACTIVITY_BAR_ENABLED_BUT_NO_APP_MODES = 'ACTIVITY_BAR_ENABLED_BUT_NO_APP_MODES',\n HOSTED_COMPONENT_NOT_CONFIGURED = 'HOSTED_COMPONENT_NOT_CONFIGURED',\n VISIBLE_IN_MODES_ORPHAN = 'VISIBLE_IN_MODES_ORPHAN',\n NOTIFICATION_BADGE_REF_NOT_FOUND = 'NOTIFICATION_BADGE_REF_NOT_FOUND',\n APP_SCOPE_DUPLICATE_RESOURCE_TYPE = 'APP_SCOPE_DUPLICATE_RESOURCE_TYPE',\n VIEW_NOT_LAUNCHABLE = 'VIEW_NOT_LAUNCHABLE',\n UNKNOWN_TARGET_KIND = 'UNKNOWN_TARGET_KIND',\n /**\n * A launcher opens a Settings Hub section the application did not PLACE.\n *\n * ERROR, because the failure is silent and lands the user somewhere plausible:\n * `resolveItemRef` falls back to the hub's DEFAULT section for an unknown\n * `sectionRef`, so a command labelled \"Billing\" opens Profile.\n */\n SETTINGS_SECTION_NOT_PLACED = 'SETTINGS_SECTION_NOT_PLACED',\n}\n\nexport interface LauncherVerificationError {\n severity: LauncherVerificationSeverity;\n code: LauncherVerificationErrorCode;\n context: string;\n message: string;\n item?: unknown;\n}\n\nexport interface LauncherVerificationResult {\n errors: LauncherVerificationError[];\n isValid: boolean;\n}\n\n// ════════════════════════════════════════════════════════════════\n// View Registry — collected from AppConfiguration_Frontend\n// ════════════════════════════════════════════════════════════════\n\ninterface ViewDefinitionBase {\n ref: string;\n}\n\ninterface ViewRegistry {\n applicationViewsByRef: Map<string, { family: 'composite' | 'fullCustom' | 'flowsActors' }>;\n duplicateApplicationViewRefs: Set<string>;\n compositeViewsByRef: Map<string, CompositeViewDefinition>;\n fullCustomViewsByRef: Map<string, FullCustomViewDefinition>;\n flowsActorsViewsByRef: Map<string, FlowsActorsViewDefinition>;\n}\n\nfunction buildViewRegistry(appConfig: AppConfiguration_Frontend): ViewRegistry {\n const applicationViewsByRef = new Map<string, { family: 'composite' | 'fullCustom' | 'flowsActors' }>();\n const duplicateApplicationViewRefs = new Set<string>();\n const compositeViewsByRef = new Map<string, CompositeViewDefinition>();\n const fullCustomViewsByRef = new Map<string, FullCustomViewDefinition>();\n const flowsActorsViewsByRef = new Map<string, FlowsActorsViewDefinition>();\n\n const registerScopedView = (\n view: ViewDefinitionBase & { scope: FrontendView_ScopeMode },\n family: 'composite' | 'fullCustom' | 'flowsActors',\n ): void => {\n if (view.scope !== FrontendView_ScopeMode.APPLICATION) {\n return;\n }\n\n if (applicationViewsByRef.has(view.ref)) {\n duplicateApplicationViewRefs.add(view.ref);\n return;\n }\n\n applicationViewsByRef.set(view.ref, { family });\n };\n\n for (const compositeView of appConfig.compositeViews ?? []) {\n compositeViewsByRef.set(compositeView.ref, compositeView);\n registerScopedView(compositeView, 'composite');\n }\n\n for (const fullCustomView of appConfig.fullCustomViews ?? []) {\n fullCustomViewsByRef.set(fullCustomView.ref, fullCustomView);\n registerScopedView(fullCustomView, 'fullCustom');\n }\n\n for (const flowsActorsView of appConfig.flowsActorsViews ?? []) {\n flowsActorsViewsByRef.set(flowsActorsView.ref, flowsActorsView);\n registerScopedView(flowsActorsView, 'flowsActors');\n }\n\n return {\n applicationViewsByRef,\n duplicateApplicationViewRefs,\n compositeViewsByRef,\n fullCustomViewsByRef,\n flowsActorsViewsByRef,\n };\n}\n\nfunction verifyScopedViewRef(\n item: Extract<LauncherItemRef, { viewRef: string }>,\n context: string,\n registry: FrontendResourcesRegistry,\n viewRegistry: ViewRegistry,\n errors: LauncherVerificationError[],\n scope: 'application' | 'resource',\n isComponentRegistered?: (componentRef: string) => boolean,\n): void {\n const viewEntry = scope === 'application'\n ? resolveApplicationScopedViewEntry(item.viewRef, viewRegistry, context, errors, item)\n : resolveResourceScopedViewEntry(item as Extract<LauncherItemRef, { kind: LauncherItemTargetKind.RESOURCE_VIEW }>, registry, context, errors);\n if (!viewEntry) {\n return;\n }\n\n switch (viewEntry.family) {\n case 'fullCustom': {\n const fullCustomView = viewRegistry.fullCustomViewsByRef.get(item.viewRef);\n if (fullCustomView && isComponentRegistered && !isComponentRegistered(fullCustomView.componentRef)) {\n errors.push({\n severity: LauncherVerificationSeverity.ERROR,\n code: LauncherVerificationErrorCode.HOSTED_COMPONENT_NOT_CONFIGURED,\n context,\n message: `Full custom view \"${item.viewRef}\" references component \"${fullCustomView.componentRef}\" which is not registered in ComponentRegistryService`,\n item,\n });\n }\n break;\n }\n\n case 'composite':\n case 'flowsActors':\n break;\n }\n}\n\nfunction resolveApplicationScopedViewEntry(\n viewRef: string,\n viewRegistry: ViewRegistry,\n context: string,\n errors: LauncherVerificationError[],\n item: LauncherItemRef,\n): { family: 'composite' | 'fullCustom' | 'flowsActors' } | null {\n if (viewRegistry.duplicateApplicationViewRefs.has(viewRef)) {\n errors.push({\n severity: LauncherVerificationSeverity.ERROR,\n code: LauncherVerificationErrorCode.VIEW_REF_COLLISION,\n context,\n message: `Application view ref \"${viewRef}\" is declared by multiple special-view families in the same launcher scope`,\n item,\n });\n return null;\n }\n\n const viewEntry = viewRegistry.applicationViewsByRef.get(viewRef);\n if (!viewEntry) {\n errors.push({\n severity: LauncherVerificationSeverity.ERROR,\n code: LauncherVerificationErrorCode.VIEW_NOT_FOUND,\n context,\n message: `Application view \"${viewRef}\" not found in any compatible special-view definition`,\n item,\n });\n return null;\n }\n\n return viewEntry;\n}\n\nfunction resolveResourceScopedViewEntry(\n item: Extract<LauncherItemRef, { kind: LauncherItemTargetKind.RESOURCE_VIEW }>,\n registry: FrontendResourcesRegistry,\n context: string,\n errors: LauncherVerificationError[],\n): { family: 'composite' | 'chart' | 'execution' } | null {\n const resourceConfig = registry.resourceConfigurations[item.resourceType];\n if (!resourceConfig) {\n errors.push({\n severity: LauncherVerificationSeverity.ERROR,\n code: LauncherVerificationErrorCode.RESOURCE_NOT_FOUND,\n context,\n message: `Resource type \"${item.resourceType}\" not found in registry`,\n item,\n });\n return null;\n }\n\n const viewMatches = findResourceOwnedViewReferenceMatches({\n resourceType: item.resourceType,\n viewRef: item.viewRef,\n registry,\n });\n if (viewMatches.length > 1) {\n errors.push({\n severity: LauncherVerificationSeverity.ERROR,\n code: LauncherVerificationErrorCode.VIEW_REF_COLLISION,\n context,\n message: `Resource view ref \"${item.viewRef}\" is declared multiple times on resource \"${item.resourceType}\". RESOURCE_VIEW refs must be unique per resource-owned view namespace.`,\n item,\n });\n return null;\n }\n\n const resolvedView = resolveResourceOwnedViewReference({\n resourceType: item.resourceType,\n viewRef: item.viewRef,\n registry,\n });\n if (resolvedView) {\n if (resolvedView.scope !== FrontendView_ScopeMode.RESOURCE) {\n errors.push({\n severity: LauncherVerificationSeverity.ERROR,\n code: LauncherVerificationErrorCode.VIEW_NOT_LAUNCHABLE,\n context,\n message: `Resource view \"${item.viewRef}\" on resource \"${item.resourceType}\" must be declared with RESOURCE scope to be targeted by RESOURCE_VIEW launchers`,\n item,\n });\n return null;\n }\n return { family: resolvedView.family };\n }\n\n errors.push({\n severity: LauncherVerificationSeverity.ERROR,\n code: LauncherVerificationErrorCode.VIEW_NOT_FOUND,\n context,\n message: `Resource view \"${item.viewRef}\" is not declared on resource \"${item.resourceType}\"`,\n item,\n });\n return null;\n}\n\n// ════════════════════════════════════════════════════════════════\n// Item Reference Verification\n// ════════════════════════════════════════════════════════════════\n\nfunction verifyItemRef(\n item: LauncherItemRef,\n context: string,\n registry: FrontendResourcesRegistry,\n viewRegistry: ViewRegistry,\n errors: LauncherVerificationError[],\n /**\n * Section refs the application actually placed in its settings rail.\n *\n * REQUIRED rather than optional on purpose: an optional parameter lets a call\n * site silently skip the check, which is precisely the \"invariant applied at\n * one of N call sites\" shape (`invariant-call-site-enumeration.md`). Required,\n * the compiler enumerates the sites for you.\n */\n placedSettingsSectionRefs: ReadonlySet<string>,\n isComponentRegistered?: (componentRef: string) => boolean,\n): void {\n switch (item.kind) {\n case LauncherItemTargetKind.RESOURCE_OPERATION: {\n const resourceConfig = registry.resourceConfigurations[item.resourceType];\n if (!resourceConfig) {\n errors.push({\n severity: LauncherVerificationSeverity.ERROR,\n code: LauncherVerificationErrorCode.RESOURCE_NOT_FOUND,\n context,\n message: `Resource type \"${item.resourceType}\" not found in registry`,\n item,\n });\n return;\n }\n const matchingOperations = resourceConfig.operations.filter(\n (op: { operationIdentifier: string; variantKey?: string; isOperationDefault?: boolean }) => (\n op.operationIdentifier === item.operation\n ),\n );\n const opExists = item.operationVariant\n ? matchingOperations.some((op) => op.variantKey === item.operationVariant)\n : matchingOperations.length > 0;\n if (!opExists) {\n errors.push({\n severity: LauncherVerificationSeverity.ERROR,\n code: LauncherVerificationErrorCode.OPERATION_NOT_FOUND,\n context,\n message: `Operation \"${item.operation}\"${item.operationVariant ? ` (variant: ${item.operationVariant})` : ''} not found on resource \"${item.resourceType}\"`,\n item,\n });\n } else if (!item.operationVariant) {\n const defaultOperations = matchingOperations.filter((op) => op.isOperationDefault === true);\n if (matchingOperations.length > 1 && defaultOperations.length !== 1) {\n errors.push({\n severity: LauncherVerificationSeverity.ERROR,\n code: LauncherVerificationErrorCode.OPERATION_NOT_FOUND,\n context,\n message: `Operation \"${item.operation}\" on resource \"${item.resourceType}\" is ambiguous without an explicit launcher operationVariant`,\n item,\n });\n }\n }\n break;\n }\n\n case LauncherItemTargetKind.VIEW: {\n verifyScopedViewRef(item, context, registry, viewRegistry, errors, 'application', isComponentRegistered);\n break;\n }\n\n case LauncherItemTargetKind.RESOURCE_VIEW: {\n verifyScopedViewRef(item, context, registry, viewRegistry, errors, 'resource', isComponentRegistered);\n break;\n }\n\n case LauncherItemTargetKind.ENGINE_PAGE: {\n if (!(item.pageRef in ENGINE_PAGE_METADATA)) {\n errors.push({\n severity: LauncherVerificationSeverity.ERROR,\n code: LauncherVerificationErrorCode.ENGINE_PAGE_NOT_FOUND,\n context,\n message: `Engine page ref \"${item.pageRef}\" has no entry in ENGINE_PAGE_METADATA`,\n item,\n });\n }\n break;\n }\n\n case LauncherItemTargetKind.CUSTOM_COMPONENT: {\n if (isComponentRegistered && !isComponentRegistered(item.componentRef)) {\n errors.push({\n severity: LauncherVerificationSeverity.ERROR,\n code: LauncherVerificationErrorCode.HOSTED_COMPONENT_NOT_CONFIGURED,\n context,\n message: `Custom launcher component \"${item.componentRef}\" is not registered in ComponentRegistryService`,\n item,\n });\n }\n break;\n }\n\n case LauncherItemTargetKind.SETTINGS_SECTION: {\n // This case used to `break` with a comment saying a settings launcher ref\n // is \"always structurally valid\" because the hub falls back to its default\n // section. That fallback is exactly why the ref MUST be checked: it turns a\n // dangling reference into a silently wrong destination rather than an\n // error, so nothing downstream can ever report it.\n //\n // An omitted `sectionRef` is legitimate — it means \"open the hub at its\n // default section\" — so only a NAMED ref is checked.\n if (item.sectionRef !== undefined && !placedSettingsSectionRefs.has(item.sectionRef)) {\n errors.push({\n severity: LauncherVerificationSeverity.ERROR,\n code: LauncherVerificationErrorCode.SETTINGS_SECTION_NOT_PLACED,\n context,\n message: `Launcher opens Settings Hub section \"${item.sectionRef}\", which this application does not place in its settings rail (\\`settingsHub.placements\\`); the hub would silently open its default section instead.`,\n item,\n });\n }\n break;\n }\n\n default: {\n errors.push({\n severity: LauncherVerificationSeverity.ERROR,\n code: LauncherVerificationErrorCode.UNKNOWN_TARGET_KIND,\n context,\n message: `Unknown LauncherItemTargetKind: \"${(item as LauncherItemRef).kind}\"`,\n item,\n });\n }\n }\n}\n\n/**\n * Recursively verify sidebar items (navigation list children can nest).\n */\nfunction verifySidebarItems(\n items: SidebarItem[],\n context: string,\n registry: FrontendResourcesRegistry,\n viewRegistry: ViewRegistry,\n errors: LauncherVerificationError[],\n placedSettingsSectionRefs: ReadonlySet<string>,\n isComponentRegistered?: (componentRef: string) => boolean,\n): void {\n for (const item of items) {\n verifyItemRef(item, context, registry, viewRegistry, errors, placedSettingsSectionRefs, isComponentRegistered);\n // Matched on the badge KEY (`<scope>:<identifier>`), which is what `NavigationItemBadge`\n // resolves with and what the badge store indexes by. Matching on the bare `identifier` — the\n // previous behaviour — accepted a ref that names a definition at a DIFFERENT scope from the one\n // that would actually render, and reported nothing.\n if (item.notificationBadgeRef\n && !registry.notificationBadgeDefinitions.some(\n (definition) => notificationBadgeIdentityKey(definition) === item.notificationBadgeRef,\n )) {\n errors.push({\n severity: LauncherVerificationSeverity.ERROR,\n code: LauncherVerificationErrorCode.NOTIFICATION_BADGE_REF_NOT_FOUND,\n context,\n message: `notificationBadgeRef \"${item.notificationBadgeRef}\" does not resolve to a registered notification badge definition. `\n + `A ref is a badge key (\"<scope>:<identifier>\"); registered keys are: `\n + `${registry.notificationBadgeDefinitions.map(notificationBadgeIdentityKey).join(', ') || '(none)'}`,\n item,\n });\n }\n if (item.children) {\n verifySidebarItems(item.children, `${context}.children`, registry, viewRegistry, errors, placedSettingsSectionRefs, isComponentRegistered);\n }\n }\n}\n\n// ════════════════════════════════════════════════════════════════\n// Sidebar Section Verification\n// ════════════════════════════════════════════════════════════════\n\nfunction verifySidebarSection(\n section: SidebarSection,\n registry: FrontendResourcesRegistry,\n viewRegistry: ViewRegistry,\n appModeRefs: Set<string>,\n errors: LauncherVerificationError[],\n placedSettingsSectionRefs: ReadonlySet<string>,\n isComponentRegistered?: (componentRef: string) => boolean,\n): void {\n const ctx = `sidebar.contentSections[${section.ref}]`;\n\n // Verify visibleInModes refs match declared appModes\n if (section.visibleInModes && section.visibleInModes.length > 0) {\n if (appModeRefs.size === 0) {\n errors.push({\n severity: LauncherVerificationSeverity.WARNING,\n code: LauncherVerificationErrorCode.VISIBLE_IN_MODES_ORPHAN,\n context: ctx,\n message: `Section has visibleInModes but no appModes are declared — section will always be hidden`,\n item: section,\n });\n } else {\n for (const modeRef of section.visibleInModes) {\n if (!appModeRefs.has(modeRef)) {\n errors.push({\n severity: LauncherVerificationSeverity.WARNING,\n code: LauncherVerificationErrorCode.VISIBLE_IN_MODES_ORPHAN,\n context: ctx,\n message: `visibleInModes ref \"${modeRef}\" does not match any declared appMode`,\n item: section,\n });\n }\n }\n }\n }\n\n switch (section.contentKind) {\n case SidebarSectionContentKind.NAVIGATION_LIST: {\n const navSection = section as SidebarSection_NavigationList;\n verifySidebarItems(navSection.children, ctx, registry, viewRegistry, errors, placedSettingsSectionRefs, isComponentRegistered);\n break;\n }\n\n case SidebarSectionContentKind.RESOURCE_BROWSER: {\n const browserSection = section as SidebarSection_ResourceBrowser;\n const resourceConfig = registry.resourceConfigurations[browserSection.resourceType];\n\n if (!resourceConfig) {\n errors.push({\n severity: LauncherVerificationSeverity.ERROR,\n code: LauncherVerificationErrorCode.RESOURCE_BROWSER_RESOURCE_NOT_FOUND,\n context: ctx,\n message: `RESOURCE_BROWSER resourceType \"${browserSection.resourceType}\" not found in registry`,\n item: section,\n });\n break;\n }\n\n if (browserSection.operation) {\n const opExists = resourceConfig.operations.some(\n (op: { operationIdentifier: string; variantKey?: string }) =>\n op.operationIdentifier === browserSection.operation &&\n (!browserSection.operationVariant || op.variantKey === browserSection.operationVariant),\n );\n if (!opExists) {\n errors.push({\n severity: LauncherVerificationSeverity.ERROR,\n code: LauncherVerificationErrorCode.RESOURCE_BROWSER_BOUND_OPERATION_NOT_FOUND,\n context: ctx,\n message: `RESOURCE_BROWSER bound operation \"${browserSection.operation}\"${browserSection.operationVariant ? ` (variant: ${browserSection.operationVariant})` : ''} not found on \"${browserSection.resourceType}\"`,\n item: section,\n });\n }\n }\n\n if (browserSection.navigateOperation) {\n const navigateOpExists = resourceConfig.operations.some(\n (op: { operationIdentifier: string; variantKey?: string }) =>\n op.operationIdentifier === browserSection.navigateOperation &&\n (!browserSection.navigateOperationVariant || op.variantKey === browserSection.navigateOperationVariant),\n );\n if (!navigateOpExists) {\n errors.push({\n severity: LauncherVerificationSeverity.ERROR,\n code: LauncherVerificationErrorCode.RESOURCE_BROWSER_NAVIGATION_OPERATION_NOT_FOUND,\n context: ctx,\n message: `RESOURCE_BROWSER navigation operation \"${browserSection.navigateOperation}\"${browserSection.navigateOperationVariant ? ` (variant: ${browserSection.navigateOperationVariant})` : ''} not found on \"${browserSection.resourceType}\"`,\n item: section,\n });\n }\n }\n\n // Warn when no label derivation is configured — SidebarResourceBrowser falls\n // back to instance.name/title/id, but an explicit config is preferred.\n if (!resourceConfig.frontendConfiguration?.getFrontendResourceLabel) {\n errors.push({\n severity: LauncherVerificationSeverity.WARNING,\n code: LauncherVerificationErrorCode.RESOURCE_BROWSER_MISSING_LABEL_CONFIG,\n context: ctx,\n message: `RESOURCE_BROWSER for \"${browserSection.resourceType}\" has no getFrontendResourceLabel configured — instance labels will fall back to name/title/id`,\n item: section,\n });\n }\n break;\n }\n\n case SidebarSectionContentKind.GUIDANCE_WIDGET:\n case SidebarSectionContentKind.CUSTOM_COMPONENT:\n break;\n }\n}\n\n// ════════════════════════════════════════════════════════════════\n// Main Verification Function\n// ════════════════════════════════════════════════════════════════\n\n/**\n * Validates all launcher content declarations against the resource registry\n * and view definitions. Adapts traversal per launcher's structural model.\n *\n * Call at startup in DEV mode only. Returns errors/warnings — does not throw.\n *\n * @see launcher-operation-binding-analysis.md §3.11\n */\nexport function verifyLauncherContent(\n registry: FrontendResourcesRegistry,\n appConfig: AppConfiguration_Frontend,\n isComponentRegistered?: (componentRef: string) => boolean,\n): LauncherVerificationResult {\n const errors: LauncherVerificationError[] = [];\n const config = appConfig.appComponentsConfiguration;\n const viewRegistry = buildViewRegistry(appConfig);\n\n // The section refs this application actually places. Derived through the same\n // resolver the hub renders with, so the verifier cannot disagree with what a\n // user will see — an unplaced destination is absent from both.\n const placedSettingsSectionRefs: ReadonlySet<string> = new Set(\n resolveSettingsHubConfig(appConfig.settingsHub).sections.map(section => section.ref),\n );\n\n // Collect appMode refs for cross-validation\n const appModeRefs = new Set<string>();\n const appModes: AppModeDefinition[] = appConfig.appModes ?? [];\n for (const mode of appModes) {\n appModeRefs.add(mode.ref);\n }\n\n const appScopeFields = appConfig.appScope?.fields ?? [];\n const duplicateAppScopeResourceTypes = findDuplicateAppScopeResourceTypes(appScopeFields);\n for (const duplicate of duplicateAppScopeResourceTypes) {\n errors.push({\n severity: LauncherVerificationSeverity.ERROR,\n code: LauncherVerificationErrorCode.APP_SCOPE_DUPLICATE_RESOURCE_TYPE,\n context: 'appScope.fields',\n message: `Duplicate app-scope resourceType \"${duplicate.resourceType}\" is not allowed in appScope.fields. Conflicting fieldIdentifiers: ${duplicate.fieldIdentifiers.join(', ')}`,\n item: duplicate,\n });\n }\n\n for (const duplicateViewRef of viewRegistry.duplicateApplicationViewRefs) {\n errors.push({\n severity: LauncherVerificationSeverity.ERROR,\n code: LauncherVerificationErrorCode.VIEW_REF_COLLISION,\n context: 'applicationViews',\n message: `Application view ref \"${duplicateViewRef}\" is declared by multiple special-view families. View refs must be unique per launcher scope.`,\n item: duplicateViewRef,\n });\n }\n\n // ── SIDEBAR: verify per content kind ──\n const sidebarConfig = config[ApplicationLevelComponentType.SIDEBAR];\n if (typeof sidebarConfig === 'object' && sidebarConfig !== null && 'contentSections' in sidebarConfig) {\n const contentSections = (sidebarConfig as { contentSections?: SidebarSection[] }).contentSections;\n if (contentSections) {\n for (const section of contentSections) {\n verifySidebarSection(section, registry, viewRegistry, appModeRefs, errors, placedSettingsSectionRefs, isComponentRegistered);\n }\n }\n }\n\n // ── COMMAND_MENU: verify commands ──\n const cmdConfig = config[ApplicationLevelComponentType.COMMAND_MENU];\n if (typeof cmdConfig === 'object' && cmdConfig !== null && 'commands' in cmdConfig) {\n const commands = (cmdConfig as { commands?: LauncherItemRef[] }).commands;\n if (commands) {\n for (const cmd of commands) {\n verifyItemRef(cmd, 'command_menu.commands', registry, viewRegistry, errors, placedSettingsSectionRefs, isComponentRegistered);\n }\n }\n }\n\n // ── HOTKEY: verify bindings ──\n const hotkeyConfig = config[ApplicationLevelComponentType.HOTKEY];\n if (typeof hotkeyConfig === 'object' && hotkeyConfig !== null && 'bindings' in hotkeyConfig) {\n const bindings = (hotkeyConfig as { bindings?: LauncherItemRef[] }).bindings;\n if (bindings) {\n for (const binding of bindings) {\n verifyItemRef(binding, 'hotkey.bindings', registry, viewRegistry, errors, placedSettingsSectionRefs, isComponentRegistered);\n }\n }\n }\n\n // ── QUICK_ACTION_BUTTON: verify actions ──\n const qabConfig = config[ApplicationLevelComponentType.QUICK_ACTION_BUTTON];\n if (typeof qabConfig === 'object' && qabConfig !== null && 'actions' in qabConfig) {\n const actions = (qabConfig as { actions?: LauncherItemRef[] }).actions;\n if (actions) {\n for (const action of actions) {\n verifyItemRef(action, 'quick_action_button.actions', registry, viewRegistry, errors, placedSettingsSectionRefs, isComponentRegistered);\n }\n }\n }\n\n // ── CONTROL_PANEL: verify items ──\n const cpConfig = config[ApplicationLevelComponentType.CONTROL_PANEL];\n if (typeof cpConfig === 'object' && cpConfig !== null && 'items' in cpConfig) {\n const items = (cpConfig as { items?: LauncherItemRef[] }).items;\n if (items) {\n for (const item of items) {\n verifyItemRef(item, 'control_panel.items', registry, viewRegistry, errors, placedSettingsSectionRefs, isComponentRegistered);\n }\n }\n }\n\n // ── TOOLBAR: verify tools ──\n const toolbarConfig = config[ApplicationLevelComponentType.TOOLBAR];\n if (typeof toolbarConfig === 'object' && toolbarConfig !== null && 'tools' in toolbarConfig) {\n const tools = (toolbarConfig as { tools?: ToolbarItem[] }).tools;\n if (tools) {\n for (const tool of tools) {\n verifyItemRef(tool, 'toolbar.tools', registry, viewRegistry, errors, placedSettingsSectionRefs, isComponentRegistered);\n }\n }\n }\n\n // ── MENUBAR: verify hostedComponents + items ──\n const menubarConfig = config[ApplicationLevelComponentType.MENUBAR];\n if (typeof menubarConfig === 'object' && menubarConfig !== null) {\n if ('hostedComponents' in menubarConfig) {\n const hostedComponents = (menubarConfig as { hostedComponents?: Array<{ componentType: string }> }).hostedComponents;\n if (hostedComponents) {\n for (const hosted of hostedComponents) {\n const componentKey = hosted.componentType as keyof typeof config;\n if (!(componentKey in config)) {\n errors.push({\n severity: LauncherVerificationSeverity.ERROR,\n code: LauncherVerificationErrorCode.HOSTED_COMPONENT_NOT_CONFIGURED,\n context: 'menubar.hostedComponents',\n message: `Hosted component \"${hosted.componentType}\" is not configured in appComponentsConfiguration`,\n item: hosted,\n });\n }\n }\n }\n }\n if ('items' in menubarConfig) {\n const items = (menubarConfig as { items?: LauncherItemRef[] }).items;\n if (items) {\n for (const item of items) {\n verifyItemRef(item, 'menubar.items', registry, viewRegistry, errors, placedSettingsSectionRefs, isComponentRegistered);\n }\n }\n }\n }\n\n // ── ACTIVITY_BAR: verify appModes exist ──\n const activityBarConfig = config[ApplicationLevelComponentType.ACTIVITY_BAR];\n if (typeof activityBarConfig === 'object' && activityBarConfig !== null) {\n if (appModes.length === 0) {\n errors.push({\n severity: LauncherVerificationSeverity.WARNING,\n code: LauncherVerificationErrorCode.ACTIVITY_BAR_ENABLED_BUT_NO_APP_MODES,\n context: 'activity_bar',\n message: 'ACTIVITY_BAR is configured but no appModes are declared — the mode selector will have nothing to render',\n item: activityBarConfig,\n });\n }\n } else if (activityBarConfig === true) {\n if (appModes.length === 0) {\n errors.push({\n severity: LauncherVerificationSeverity.WARNING,\n code: LauncherVerificationErrorCode.ACTIVITY_BAR_ENABLED_BUT_NO_APP_MODES,\n context: 'activity_bar',\n message: 'ACTIVITY_BAR is enabled but no appModes are declared — the mode selector will have nothing to render',\n item: activityBarConfig,\n });\n }\n }\n\n return { errors, isValid: errors.length === 0 };\n}\n\n// ════════════════════════════════════════════════════════════════\n// Console Reporter\n// ════════════════════════════════════════════════════════════════\n\n/**\n * Formats and logs verification results to the console.\n * Groups errors by severity and includes a summary table.\n */\nexport function reportLauncherVerificationResults(result: LauncherVerificationResult): void {\n if (result.isValid) {\n console.log('[LauncherVerification] ✓ All launcher content declarations are valid');\n return;\n }\n\n const errorCount = result.errors.filter(e => e.severity === LauncherVerificationSeverity.ERROR).length;\n const warningCount = result.errors.filter(e => e.severity === LauncherVerificationSeverity.WARNING).length;\n\n console.group(\n `[LauncherVerification] ${errorCount} error(s), ${warningCount} warning(s)`,\n );\n\n for (const error of result.errors) {\n const prefix = error.severity === LauncherVerificationSeverity.ERROR ? '✗ ERROR' : '⚠ WARN';\n console.warn(\n `${prefix} [${error.code}] ${error.context}: ${error.message}`,\n );\n }\n\n console.groupEnd();\n}\n"]}
|
|
1
|
+
{"version":3,"file":"verify-launcher-content.js","sourceRoot":"","sources":["../../../../../src/core/config/verify-launcher-content.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Launcher Content Verification\n *\n * DEV-mode startup validator that walks every content-declaring launcher's\n * configuration and verifies that all declared references resolve to real\n * registry entries (operations, views, engine pages, hosted components).\n *\n * Adapts traversal to each launcher's structural model — sidebar sections\n * use a discriminated union on `contentKind`, while other launchers are\n * flat item arrays.\n *\n * @see launcher-operation-binding-analysis.md §3.11\n * @see app-shell-implementation-plan.md Step 5\n */\n\nimport { notificationBadgeIdentityKey } from '@wildo-ai/saas-models';\n\nimport type { AppConfiguration_Frontend } from './app-configuration-frontend.schemas';\nimport type { FrontendResourcesRegistry, AnyFrontendResourceConfiguration } from '~wildo-frontend-lib/core/resources/resources.frontend.schemas';\nimport type { CompositeViewDefinition } from './composite-view.schemas';\nimport type { FullCustomViewDefinition } from './full-custom-view.schemas';\nimport type { FlowsActorsViewDefinition } from './flows-actors-view.schemas';\nimport { FrontendView_ScopeMode } from './views-frontend.schemas';\nimport {\n findResourceOwnedViewReferenceMatches,\n resolveResourceOwnedViewReference,\n} from './resource-owned-view-resolution.frontend.utils';\nimport {\n findDuplicateAppScopeResourceTypes,\n} from './app-configuration-frontend.schemas';\nimport {\n ApplicationLevelComponentType,\n} from './app-level-components.frontend.schemas';\nimport {\n LauncherItemTargetKind,\n EnginePageRef,\n SidebarSectionContentKind,\n ENGINE_PAGE_METADATA,\n} from './launcher-items.frontend.schemas';\nimport type {\n LauncherItemRef,\n MenubarLauncherItem,\n ToolbarItem,\n SidebarItem,\n SidebarSection,\n SidebarSection_NavigationList,\n SidebarSection_ResourceBrowser,\n AppModeDefinition,\n} from './launcher-items.frontend.schemas';\n\n\n// ════════════════════════════════════════════════════════════════\n// Verification Result Types\n// ════════════════════════════════════════════════════════════════\n\nexport enum LauncherVerificationSeverity {\n ERROR = 'error',\n WARNING = 'warning',\n}\n\nimport { resolveSettingsHubConfig } from './useSettingsHubConfig';\n\nexport enum LauncherVerificationErrorCode {\n RESOURCE_NOT_FOUND = 'RESOURCE_NOT_FOUND',\n OPERATION_NOT_FOUND = 'OPERATION_NOT_FOUND',\n VIEW_NOT_FOUND = 'VIEW_NOT_FOUND',\n VIEW_REF_COLLISION = 'VIEW_REF_COLLISION',\n ENGINE_PAGE_NOT_FOUND = 'ENGINE_PAGE_NOT_FOUND',\n RESOURCE_BROWSER_RESOURCE_NOT_FOUND = 'RESOURCE_BROWSER_RESOURCE_NOT_FOUND',\n RESOURCE_BROWSER_BOUND_OPERATION_NOT_FOUND = 'RESOURCE_BROWSER_BOUND_OPERATION_NOT_FOUND',\n RESOURCE_BROWSER_NAVIGATION_OPERATION_NOT_FOUND = 'RESOURCE_BROWSER_NAVIGATION_OPERATION_NOT_FOUND',\n RESOURCE_BROWSER_MISSING_LABEL_CONFIG = 'RESOURCE_BROWSER_MISSING_LABEL_CONFIG',\n ACTIVITY_BAR_ENABLED_BUT_NO_APP_MODES = 'ACTIVITY_BAR_ENABLED_BUT_NO_APP_MODES',\n HOSTED_COMPONENT_NOT_CONFIGURED = 'HOSTED_COMPONENT_NOT_CONFIGURED',\n VISIBLE_IN_MODES_ORPHAN = 'VISIBLE_IN_MODES_ORPHAN',\n NOTIFICATION_BADGE_REF_NOT_FOUND = 'NOTIFICATION_BADGE_REF_NOT_FOUND',\n APP_SCOPE_DUPLICATE_RESOURCE_TYPE = 'APP_SCOPE_DUPLICATE_RESOURCE_TYPE',\n VIEW_NOT_LAUNCHABLE = 'VIEW_NOT_LAUNCHABLE',\n UNKNOWN_TARGET_KIND = 'UNKNOWN_TARGET_KIND',\n /**\n * A launcher opens a Settings Hub section the application did not PLACE.\n *\n * ERROR, because the failure is silent and lands the user somewhere plausible:\n * `resolveItemRef` falls back to the hub's DEFAULT section for an unknown\n * `sectionRef`, so a command labelled \"Billing\" opens Profile.\n */\n SETTINGS_SECTION_NOT_PLACED = 'SETTINGS_SECTION_NOT_PLACED',\n}\n\nexport interface LauncherVerificationError {\n severity: LauncherVerificationSeverity;\n code: LauncherVerificationErrorCode;\n context: string;\n message: string;\n item?: unknown;\n}\n\nexport interface LauncherVerificationResult {\n errors: LauncherVerificationError[];\n isValid: boolean;\n}\n\n// ════════════════════════════════════════════════════════════════\n// View Registry — collected from AppConfiguration_Frontend\n// ════════════════════════════════════════════════════════════════\n\ninterface ViewDefinitionBase {\n ref: string;\n}\n\ninterface ViewRegistry {\n applicationViewsByRef: Map<string, { family: 'composite' | 'fullCustom' | 'flowsActors' }>;\n duplicateApplicationViewRefs: Set<string>;\n compositeViewsByRef: Map<string, CompositeViewDefinition>;\n fullCustomViewsByRef: Map<string, FullCustomViewDefinition>;\n flowsActorsViewsByRef: Map<string, FlowsActorsViewDefinition>;\n}\n\nfunction buildViewRegistry(appConfig: AppConfiguration_Frontend): ViewRegistry {\n const applicationViewsByRef = new Map<string, { family: 'composite' | 'fullCustom' | 'flowsActors' }>();\n const duplicateApplicationViewRefs = new Set<string>();\n const compositeViewsByRef = new Map<string, CompositeViewDefinition>();\n const fullCustomViewsByRef = new Map<string, FullCustomViewDefinition>();\n const flowsActorsViewsByRef = new Map<string, FlowsActorsViewDefinition>();\n\n const registerScopedView = (\n view: ViewDefinitionBase & { scope: FrontendView_ScopeMode },\n family: 'composite' | 'fullCustom' | 'flowsActors',\n ): void => {\n if (view.scope !== FrontendView_ScopeMode.APPLICATION) {\n return;\n }\n\n if (applicationViewsByRef.has(view.ref)) {\n duplicateApplicationViewRefs.add(view.ref);\n return;\n }\n\n applicationViewsByRef.set(view.ref, { family });\n };\n\n for (const compositeView of appConfig.compositeViews ?? []) {\n compositeViewsByRef.set(compositeView.ref, compositeView);\n registerScopedView(compositeView, 'composite');\n }\n\n for (const fullCustomView of appConfig.fullCustomViews ?? []) {\n fullCustomViewsByRef.set(fullCustomView.ref, fullCustomView);\n registerScopedView(fullCustomView, 'fullCustom');\n }\n\n for (const flowsActorsView of appConfig.flowsActorsViews ?? []) {\n flowsActorsViewsByRef.set(flowsActorsView.ref, flowsActorsView);\n registerScopedView(flowsActorsView, 'flowsActors');\n }\n\n return {\n applicationViewsByRef,\n duplicateApplicationViewRefs,\n compositeViewsByRef,\n fullCustomViewsByRef,\n flowsActorsViewsByRef,\n };\n}\n\nfunction verifyScopedViewRef(\n item: Extract<LauncherItemRef, { viewRef: string }>,\n context: string,\n registry: FrontendResourcesRegistry,\n viewRegistry: ViewRegistry,\n errors: LauncherVerificationError[],\n scope: 'application' | 'resource',\n isComponentRegistered?: (componentRef: string) => boolean,\n): void {\n const viewEntry = scope === 'application'\n ? resolveApplicationScopedViewEntry(item.viewRef, viewRegistry, context, errors, item)\n : resolveResourceScopedViewEntry(item as Extract<LauncherItemRef, { kind: LauncherItemTargetKind.RESOURCE_VIEW }>, registry, context, errors);\n if (!viewEntry) {\n return;\n }\n\n switch (viewEntry.family) {\n case 'fullCustom': {\n const fullCustomView = viewRegistry.fullCustomViewsByRef.get(item.viewRef);\n if (fullCustomView && isComponentRegistered && !isComponentRegistered(fullCustomView.componentRef)) {\n errors.push({\n severity: LauncherVerificationSeverity.ERROR,\n code: LauncherVerificationErrorCode.HOSTED_COMPONENT_NOT_CONFIGURED,\n context,\n message: `Full custom view \"${item.viewRef}\" references component \"${fullCustomView.componentRef}\" which is not registered in ComponentRegistryService`,\n item,\n });\n }\n break;\n }\n\n case 'composite':\n case 'flowsActors':\n break;\n }\n}\n\nfunction resolveApplicationScopedViewEntry(\n viewRef: string,\n viewRegistry: ViewRegistry,\n context: string,\n errors: LauncherVerificationError[],\n item: LauncherItemRef,\n): { family: 'composite' | 'fullCustom' | 'flowsActors' } | null {\n if (viewRegistry.duplicateApplicationViewRefs.has(viewRef)) {\n errors.push({\n severity: LauncherVerificationSeverity.ERROR,\n code: LauncherVerificationErrorCode.VIEW_REF_COLLISION,\n context,\n message: `Application view ref \"${viewRef}\" is declared by multiple special-view families in the same launcher scope`,\n item,\n });\n return null;\n }\n\n const viewEntry = viewRegistry.applicationViewsByRef.get(viewRef);\n if (!viewEntry) {\n errors.push({\n severity: LauncherVerificationSeverity.ERROR,\n code: LauncherVerificationErrorCode.VIEW_NOT_FOUND,\n context,\n message: `Application view \"${viewRef}\" not found in any compatible special-view definition`,\n item,\n });\n return null;\n }\n\n return viewEntry;\n}\n\nfunction resolveResourceScopedViewEntry(\n item: Extract<LauncherItemRef, { kind: LauncherItemTargetKind.RESOURCE_VIEW }>,\n registry: FrontendResourcesRegistry,\n context: string,\n errors: LauncherVerificationError[],\n): { family: 'composite' | 'chart' | 'execution' } | null {\n const resourceConfig = registry.resourceConfigurations[item.resourceType];\n if (!resourceConfig) {\n errors.push({\n severity: LauncherVerificationSeverity.ERROR,\n code: LauncherVerificationErrorCode.RESOURCE_NOT_FOUND,\n context,\n message: `Resource type \"${item.resourceType}\" not found in registry`,\n item,\n });\n return null;\n }\n\n const viewMatches = findResourceOwnedViewReferenceMatches({\n resourceType: item.resourceType,\n viewRef: item.viewRef,\n registry,\n });\n if (viewMatches.length > 1) {\n errors.push({\n severity: LauncherVerificationSeverity.ERROR,\n code: LauncherVerificationErrorCode.VIEW_REF_COLLISION,\n context,\n message: `Resource view ref \"${item.viewRef}\" is declared multiple times on resource \"${item.resourceType}\". RESOURCE_VIEW refs must be unique per resource-owned view namespace.`,\n item,\n });\n return null;\n }\n\n const resolvedView = resolveResourceOwnedViewReference({\n resourceType: item.resourceType,\n viewRef: item.viewRef,\n registry,\n });\n if (resolvedView) {\n if (resolvedView.scope !== FrontendView_ScopeMode.RESOURCE) {\n errors.push({\n severity: LauncherVerificationSeverity.ERROR,\n code: LauncherVerificationErrorCode.VIEW_NOT_LAUNCHABLE,\n context,\n message: `Resource view \"${item.viewRef}\" on resource \"${item.resourceType}\" must be declared with RESOURCE scope to be targeted by RESOURCE_VIEW launchers`,\n item,\n });\n return null;\n }\n return { family: resolvedView.family };\n }\n\n errors.push({\n severity: LauncherVerificationSeverity.ERROR,\n code: LauncherVerificationErrorCode.VIEW_NOT_FOUND,\n context,\n message: `Resource view \"${item.viewRef}\" is not declared on resource \"${item.resourceType}\"`,\n item,\n });\n return null;\n}\n\n// ════════════════════════════════════════════════════════════════\n// Item Reference Verification\n// ════════════════════════════════════════════════════════════════\n\nfunction verifyItemRef(\n item: LauncherItemRef,\n context: string,\n registry: FrontendResourcesRegistry,\n viewRegistry: ViewRegistry,\n errors: LauncherVerificationError[],\n /**\n * Section refs the application actually placed in its settings rail.\n *\n * REQUIRED rather than optional on purpose: an optional parameter lets a call\n * site silently skip the check, which is precisely the \"invariant applied at\n * one of N call sites\" shape (`invariant-call-site-enumeration.md`). Required,\n * the compiler enumerates the sites for you.\n */\n placedSettingsSectionRefs: ReadonlySet<string>,\n isComponentRegistered?: (componentRef: string) => boolean,\n): void {\n switch (item.kind) {\n case LauncherItemTargetKind.RESOURCE_OPERATION: {\n const resourceConfig = registry.resourceConfigurations[item.resourceType];\n if (!resourceConfig) {\n errors.push({\n severity: LauncherVerificationSeverity.ERROR,\n code: LauncherVerificationErrorCode.RESOURCE_NOT_FOUND,\n context,\n message: `Resource type \"${item.resourceType}\" not found in registry`,\n item,\n });\n return;\n }\n const matchingOperations = resourceConfig.operations.filter(\n (op: { operationIdentifier: string; variantKey?: string; isOperationDefault?: boolean }) => (\n op.operationIdentifier === item.operation\n ),\n );\n const opExists = item.operationVariant\n ? matchingOperations.some((op) => op.variantKey === item.operationVariant)\n : matchingOperations.length > 0;\n if (!opExists) {\n errors.push({\n severity: LauncherVerificationSeverity.ERROR,\n code: LauncherVerificationErrorCode.OPERATION_NOT_FOUND,\n context,\n message: `Operation \"${item.operation}\"${item.operationVariant ? ` (variant: ${item.operationVariant})` : ''} not found on resource \"${item.resourceType}\"`,\n item,\n });\n } else if (!item.operationVariant) {\n const defaultOperations = matchingOperations.filter((op) => op.isOperationDefault === true);\n if (matchingOperations.length > 1 && defaultOperations.length !== 1) {\n errors.push({\n severity: LauncherVerificationSeverity.ERROR,\n code: LauncherVerificationErrorCode.OPERATION_NOT_FOUND,\n context,\n message: `Operation \"${item.operation}\" on resource \"${item.resourceType}\" is ambiguous without an explicit launcher operationVariant`,\n item,\n });\n }\n }\n break;\n }\n\n case LauncherItemTargetKind.VIEW: {\n verifyScopedViewRef(item, context, registry, viewRegistry, errors, 'application', isComponentRegistered);\n break;\n }\n\n case LauncherItemTargetKind.RESOURCE_VIEW: {\n verifyScopedViewRef(item, context, registry, viewRegistry, errors, 'resource', isComponentRegistered);\n break;\n }\n\n case LauncherItemTargetKind.ENGINE_PAGE: {\n if (!(item.pageRef in ENGINE_PAGE_METADATA)) {\n errors.push({\n severity: LauncherVerificationSeverity.ERROR,\n code: LauncherVerificationErrorCode.ENGINE_PAGE_NOT_FOUND,\n context,\n message: `Engine page ref \"${item.pageRef}\" has no entry in ENGINE_PAGE_METADATA`,\n item,\n });\n }\n break;\n }\n\n case LauncherItemTargetKind.CUSTOM_COMPONENT: {\n if (isComponentRegistered && !isComponentRegistered(item.componentRef)) {\n errors.push({\n severity: LauncherVerificationSeverity.ERROR,\n code: LauncherVerificationErrorCode.HOSTED_COMPONENT_NOT_CONFIGURED,\n context,\n message: `Custom launcher component \"${item.componentRef}\" is not registered in ComponentRegistryService`,\n item,\n });\n }\n break;\n }\n\n case LauncherItemTargetKind.SETTINGS_SECTION: {\n // This case used to `break` with a comment saying a settings launcher ref\n // is \"always structurally valid\" because the hub falls back to its default\n // section. That fallback is exactly why the ref MUST be checked: it turns a\n // dangling reference into a silently wrong destination rather than an\n // error, so nothing downstream can ever report it.\n //\n // An omitted `sectionRef` is legitimate — it means \"open the hub at its\n // default section\" — so only a NAMED ref is checked.\n if (item.sectionRef !== undefined && !placedSettingsSectionRefs.has(item.sectionRef)) {\n errors.push({\n severity: LauncherVerificationSeverity.ERROR,\n code: LauncherVerificationErrorCode.SETTINGS_SECTION_NOT_PLACED,\n context,\n message: `Launcher opens Settings Hub section \"${item.sectionRef}\", which this application does not place in its settings rail (\\`settingsHub.placements\\`); the hub would silently open its default section instead.`,\n item,\n });\n }\n break;\n }\n\n default: {\n errors.push({\n severity: LauncherVerificationSeverity.ERROR,\n code: LauncherVerificationErrorCode.UNKNOWN_TARGET_KIND,\n context,\n message: `Unknown LauncherItemTargetKind: \"${(item as LauncherItemRef).kind}\"`,\n item,\n });\n }\n }\n}\n\n/**\n * A launcher item's `notificationBadgeRef` must name a registered definition — sidebar and menubar\n * items alike, since both draw it with `NavigationItemBadge`.\n *\n * Matched on the badge KEY (`<scope>:<identifier>`), which is what `NavigationItemBadge` resolves\n * with and what the badge store indexes by. Matching on the bare `identifier` — the previous\n * behaviour — accepted a ref that names a definition at a DIFFERENT scope from the one that would\n * actually render, and reported nothing.\n */\nfunction verifyNotificationBadgeRef(\n item: LauncherItemRef & { notificationBadgeRef?: string },\n context: string,\n registry: FrontendResourcesRegistry,\n errors: LauncherVerificationError[],\n): void {\n if (!item.notificationBadgeRef\n || registry.notificationBadgeDefinitions.some((definition) => notificationBadgeIdentityKey(definition) === item.notificationBadgeRef)) {\n return;\n }\n errors.push({\n severity: LauncherVerificationSeverity.ERROR,\n code: LauncherVerificationErrorCode.NOTIFICATION_BADGE_REF_NOT_FOUND,\n context,\n message: `notificationBadgeRef \"${item.notificationBadgeRef}\" does not resolve to a registered notification badge definition. `\n + `A ref is a badge key (\"<scope>:<identifier>\"); registered keys are: `\n + `${registry.notificationBadgeDefinitions.map(notificationBadgeIdentityKey).join(', ') || '(none)'}`,\n item,\n });\n}\n\n/**\n * Recursively verify sidebar items (navigation list children can nest).\n */\nfunction verifySidebarItems(\n items: SidebarItem[],\n context: string,\n registry: FrontendResourcesRegistry,\n viewRegistry: ViewRegistry,\n errors: LauncherVerificationError[],\n placedSettingsSectionRefs: ReadonlySet<string>,\n isComponentRegistered?: (componentRef: string) => boolean,\n): void {\n for (const item of items) {\n verifyItemRef(item, context, registry, viewRegistry, errors, placedSettingsSectionRefs, isComponentRegistered);\n verifyNotificationBadgeRef(item, context, registry, errors);\n if (item.children) {\n verifySidebarItems(item.children, `${context}.children`, registry, viewRegistry, errors, placedSettingsSectionRefs, isComponentRegistered);\n }\n }\n}\n\n// ════════════════════════════════════════════════════════════════\n// Sidebar Section Verification\n// ════════════════════════════════════════════════════════════════\n\nfunction verifySidebarSection(\n section: SidebarSection,\n registry: FrontendResourcesRegistry,\n viewRegistry: ViewRegistry,\n appModeRefs: Set<string>,\n errors: LauncherVerificationError[],\n placedSettingsSectionRefs: ReadonlySet<string>,\n isComponentRegistered?: (componentRef: string) => boolean,\n): void {\n const ctx = `sidebar.contentSections[${section.ref}]`;\n\n // Verify visibleInModes refs match declared appModes\n if (section.visibleInModes && section.visibleInModes.length > 0) {\n if (appModeRefs.size === 0) {\n errors.push({\n severity: LauncherVerificationSeverity.WARNING,\n code: LauncherVerificationErrorCode.VISIBLE_IN_MODES_ORPHAN,\n context: ctx,\n message: `Section has visibleInModes but no appModes are declared — section will always be hidden`,\n item: section,\n });\n } else {\n for (const modeRef of section.visibleInModes) {\n if (!appModeRefs.has(modeRef)) {\n errors.push({\n severity: LauncherVerificationSeverity.WARNING,\n code: LauncherVerificationErrorCode.VISIBLE_IN_MODES_ORPHAN,\n context: ctx,\n message: `visibleInModes ref \"${modeRef}\" does not match any declared appMode`,\n item: section,\n });\n }\n }\n }\n }\n\n switch (section.contentKind) {\n case SidebarSectionContentKind.NAVIGATION_LIST: {\n const navSection = section as SidebarSection_NavigationList;\n verifySidebarItems(navSection.children, ctx, registry, viewRegistry, errors, placedSettingsSectionRefs, isComponentRegistered);\n break;\n }\n\n case SidebarSectionContentKind.RESOURCE_BROWSER: {\n const browserSection = section as SidebarSection_ResourceBrowser;\n const resourceConfig = registry.resourceConfigurations[browserSection.resourceType];\n\n if (!resourceConfig) {\n errors.push({\n severity: LauncherVerificationSeverity.ERROR,\n code: LauncherVerificationErrorCode.RESOURCE_BROWSER_RESOURCE_NOT_FOUND,\n context: ctx,\n message: `RESOURCE_BROWSER resourceType \"${browserSection.resourceType}\" not found in registry`,\n item: section,\n });\n break;\n }\n\n if (browserSection.operation) {\n const opExists = resourceConfig.operations.some(\n (op: { operationIdentifier: string; variantKey?: string }) =>\n op.operationIdentifier === browserSection.operation &&\n (!browserSection.operationVariant || op.variantKey === browserSection.operationVariant),\n );\n if (!opExists) {\n errors.push({\n severity: LauncherVerificationSeverity.ERROR,\n code: LauncherVerificationErrorCode.RESOURCE_BROWSER_BOUND_OPERATION_NOT_FOUND,\n context: ctx,\n message: `RESOURCE_BROWSER bound operation \"${browserSection.operation}\"${browserSection.operationVariant ? ` (variant: ${browserSection.operationVariant})` : ''} not found on \"${browserSection.resourceType}\"`,\n item: section,\n });\n }\n }\n\n if (browserSection.navigateOperation) {\n const navigateOpExists = resourceConfig.operations.some(\n (op: { operationIdentifier: string; variantKey?: string }) =>\n op.operationIdentifier === browserSection.navigateOperation &&\n (!browserSection.navigateOperationVariant || op.variantKey === browserSection.navigateOperationVariant),\n );\n if (!navigateOpExists) {\n errors.push({\n severity: LauncherVerificationSeverity.ERROR,\n code: LauncherVerificationErrorCode.RESOURCE_BROWSER_NAVIGATION_OPERATION_NOT_FOUND,\n context: ctx,\n message: `RESOURCE_BROWSER navigation operation \"${browserSection.navigateOperation}\"${browserSection.navigateOperationVariant ? ` (variant: ${browserSection.navigateOperationVariant})` : ''} not found on \"${browserSection.resourceType}\"`,\n item: section,\n });\n }\n }\n\n // Warn when no label derivation is configured — SidebarResourceBrowser names instances through the shared\n // resolver (`computeFrontendResourceLabel`), which falls back to the record's declared summary fields, then\n // its id; an explicit config is preferred.\n if (!resourceConfig.frontendConfiguration?.getFrontendResourceLabel) {\n errors.push({\n severity: LauncherVerificationSeverity.WARNING,\n code: LauncherVerificationErrorCode.RESOURCE_BROWSER_MISSING_LABEL_CONFIG,\n context: ctx,\n message: `RESOURCE_BROWSER for \"${browserSection.resourceType}\" has no getFrontendResourceLabel configured — instance labels will fall back to the record's summary fields, then its id`,\n item: section,\n });\n }\n break;\n }\n\n case SidebarSectionContentKind.GUIDANCE_WIDGET:\n case SidebarSectionContentKind.CUSTOM_COMPONENT:\n break;\n }\n}\n\n// ════════════════════════════════════════════════════════════════\n// Main Verification Function\n// ════════════════════════════════════════════════════════════════\n\n/**\n * Validates all launcher content declarations against the resource registry\n * and view definitions. Adapts traversal per launcher's structural model.\n *\n * Call at startup in DEV mode only. Returns errors/warnings — does not throw.\n *\n * @see launcher-operation-binding-analysis.md §3.11\n */\nexport function verifyLauncherContent(\n registry: FrontendResourcesRegistry,\n appConfig: AppConfiguration_Frontend,\n isComponentRegistered?: (componentRef: string) => boolean,\n): LauncherVerificationResult {\n const errors: LauncherVerificationError[] = [];\n const config = appConfig.appComponentsConfiguration;\n const viewRegistry = buildViewRegistry(appConfig);\n\n // The section refs this application actually places. Derived through the same\n // resolver the hub renders with, so the verifier cannot disagree with what a\n // user will see — an unplaced destination is absent from both.\n const placedSettingsSectionRefs: ReadonlySet<string> = new Set(\n resolveSettingsHubConfig(appConfig.settingsHub).sections.map(section => section.ref),\n );\n\n // Collect appMode refs for cross-validation\n const appModeRefs = new Set<string>();\n const appModes: AppModeDefinition[] = appConfig.appModes ?? [];\n for (const mode of appModes) {\n appModeRefs.add(mode.ref);\n }\n\n const appScopeFields = appConfig.appScope?.fields ?? [];\n const duplicateAppScopeResourceTypes = findDuplicateAppScopeResourceTypes(appScopeFields);\n for (const duplicate of duplicateAppScopeResourceTypes) {\n errors.push({\n severity: LauncherVerificationSeverity.ERROR,\n code: LauncherVerificationErrorCode.APP_SCOPE_DUPLICATE_RESOURCE_TYPE,\n context: 'appScope.fields',\n message: `Duplicate app-scope resourceType \"${duplicate.resourceType}\" is not allowed in appScope.fields. Conflicting fieldIdentifiers: ${duplicate.fieldIdentifiers.join(', ')}`,\n item: duplicate,\n });\n }\n\n for (const duplicateViewRef of viewRegistry.duplicateApplicationViewRefs) {\n errors.push({\n severity: LauncherVerificationSeverity.ERROR,\n code: LauncherVerificationErrorCode.VIEW_REF_COLLISION,\n context: 'applicationViews',\n message: `Application view ref \"${duplicateViewRef}\" is declared by multiple special-view families. View refs must be unique per launcher scope.`,\n item: duplicateViewRef,\n });\n }\n\n // ── SIDEBAR: verify per content kind ──\n const sidebarConfig = config[ApplicationLevelComponentType.SIDEBAR];\n if (typeof sidebarConfig === 'object' && sidebarConfig !== null && 'contentSections' in sidebarConfig) {\n const contentSections = (sidebarConfig as { contentSections?: SidebarSection[] }).contentSections;\n if (contentSections) {\n for (const section of contentSections) {\n verifySidebarSection(section, registry, viewRegistry, appModeRefs, errors, placedSettingsSectionRefs, isComponentRegistered);\n }\n }\n }\n\n // ── COMMAND_MENU: verify commands ──\n const cmdConfig = config[ApplicationLevelComponentType.COMMAND_MENU];\n if (typeof cmdConfig === 'object' && cmdConfig !== null && 'commands' in cmdConfig) {\n const commands = (cmdConfig as { commands?: LauncherItemRef[] }).commands;\n if (commands) {\n for (const cmd of commands) {\n verifyItemRef(cmd, 'command_menu.commands', registry, viewRegistry, errors, placedSettingsSectionRefs, isComponentRegistered);\n }\n }\n }\n\n // ── HOTKEY: verify bindings ──\n const hotkeyConfig = config[ApplicationLevelComponentType.HOTKEY];\n if (typeof hotkeyConfig === 'object' && hotkeyConfig !== null && 'bindings' in hotkeyConfig) {\n const bindings = (hotkeyConfig as { bindings?: LauncherItemRef[] }).bindings;\n if (bindings) {\n for (const binding of bindings) {\n verifyItemRef(binding, 'hotkey.bindings', registry, viewRegistry, errors, placedSettingsSectionRefs, isComponentRegistered);\n }\n }\n }\n\n // ── QUICK_ACTION_BUTTON: verify actions ──\n const qabConfig = config[ApplicationLevelComponentType.QUICK_ACTION_BUTTON];\n if (typeof qabConfig === 'object' && qabConfig !== null && 'actions' in qabConfig) {\n const actions = (qabConfig as { actions?: LauncherItemRef[] }).actions;\n if (actions) {\n for (const action of actions) {\n verifyItemRef(action, 'quick_action_button.actions', registry, viewRegistry, errors, placedSettingsSectionRefs, isComponentRegistered);\n }\n }\n }\n\n // ── CONTROL_PANEL: verify items ──\n const cpConfig = config[ApplicationLevelComponentType.CONTROL_PANEL];\n if (typeof cpConfig === 'object' && cpConfig !== null && 'items' in cpConfig) {\n const items = (cpConfig as { items?: LauncherItemRef[] }).items;\n if (items) {\n for (const item of items) {\n verifyItemRef(item, 'control_panel.items', registry, viewRegistry, errors, placedSettingsSectionRefs, isComponentRegistered);\n }\n }\n }\n\n // ── TOOLBAR: verify tools ──\n const toolbarConfig = config[ApplicationLevelComponentType.TOOLBAR];\n if (typeof toolbarConfig === 'object' && toolbarConfig !== null && 'tools' in toolbarConfig) {\n const tools = (toolbarConfig as { tools?: ToolbarItem[] }).tools;\n if (tools) {\n for (const tool of tools) {\n verifyItemRef(tool, 'toolbar.tools', registry, viewRegistry, errors, placedSettingsSectionRefs, isComponentRegistered);\n }\n }\n }\n\n // ── MENUBAR: verify hostedComponents + items ──\n const menubarConfig = config[ApplicationLevelComponentType.MENUBAR];\n if (typeof menubarConfig === 'object' && menubarConfig !== null) {\n if ('hostedComponents' in menubarConfig) {\n const hostedComponents = (menubarConfig as { hostedComponents?: Array<{ componentType: string }> }).hostedComponents;\n if (hostedComponents) {\n for (const hosted of hostedComponents) {\n const componentKey = hosted.componentType as keyof typeof config;\n if (!(componentKey in config)) {\n errors.push({\n severity: LauncherVerificationSeverity.ERROR,\n code: LauncherVerificationErrorCode.HOSTED_COMPONENT_NOT_CONFIGURED,\n context: 'menubar.hostedComponents',\n message: `Hosted component \"${hosted.componentType}\" is not configured in appComponentsConfiguration`,\n item: hosted,\n });\n }\n }\n }\n }\n if ('items' in menubarConfig) {\n const items = (menubarConfig as { items?: MenubarLauncherItem[] }).items;\n if (items) {\n for (const item of items) {\n verifyItemRef(item, 'menubar.items', registry, viewRegistry, errors, placedSettingsSectionRefs, isComponentRegistered);\n verifyNotificationBadgeRef(item, 'menubar.items', registry, errors);\n }\n }\n }\n }\n\n // ── ACTIVITY_BAR: verify appModes exist ──\n const activityBarConfig = config[ApplicationLevelComponentType.ACTIVITY_BAR];\n if (typeof activityBarConfig === 'object' && activityBarConfig !== null) {\n if (appModes.length === 0) {\n errors.push({\n severity: LauncherVerificationSeverity.WARNING,\n code: LauncherVerificationErrorCode.ACTIVITY_BAR_ENABLED_BUT_NO_APP_MODES,\n context: 'activity_bar',\n message: 'ACTIVITY_BAR is configured but no appModes are declared — the mode selector will have nothing to render',\n item: activityBarConfig,\n });\n }\n } else if (activityBarConfig === true) {\n if (appModes.length === 0) {\n errors.push({\n severity: LauncherVerificationSeverity.WARNING,\n code: LauncherVerificationErrorCode.ACTIVITY_BAR_ENABLED_BUT_NO_APP_MODES,\n context: 'activity_bar',\n message: 'ACTIVITY_BAR is enabled but no appModes are declared — the mode selector will have nothing to render',\n item: activityBarConfig,\n });\n }\n }\n\n return { errors, isValid: errors.length === 0 };\n}\n\n// ════════════════════════════════════════════════════════════════\n// Console Reporter\n// ════════════════════════════════════════════════════════════════\n\n/**\n * Formats and logs verification results to the console.\n * Groups errors by severity and includes a summary table.\n */\nexport function reportLauncherVerificationResults(result: LauncherVerificationResult): void {\n if (result.isValid) {\n console.log('[LauncherVerification] ✓ All launcher content declarations are valid');\n return;\n }\n\n const errorCount = result.errors.filter(e => e.severity === LauncherVerificationSeverity.ERROR).length;\n const warningCount = result.errors.filter(e => e.severity === LauncherVerificationSeverity.WARNING).length;\n\n console.group(\n `[LauncherVerification] ${errorCount} error(s), ${warningCount} warning(s)`,\n );\n\n for (const error of result.errors) {\n const prefix = error.severity === LauncherVerificationSeverity.ERROR ? '✗ ERROR' : '⚠ WARN';\n console.warn(\n `${prefix} [${error.code}] ${error.context}: ${error.message}`,\n );\n }\n\n console.groupEnd();\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ErrorContext.d.ts","sourceRoot":"","sources":["../../../../../src/core/errors/ErrorContext.tsx"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,EAAE,SAAS,EAA4D,MAAM,OAAO,CAAC;AAUnG,OAAO,EAAE,gBAAgB,EAAE,MAAM,2BAA2B,CAAC;AAM7D;;;;GAIG;AACH,eAAO,MAAM,YAAY,EAAE,KAAK,CAAC,OAAO,CAAC,gBAAgB,GAAG,SAAS,CAA0D,CAAC;AAEhI,eAAO,MAAM,aAAa,EAAE,KAAK,CAAC,EAAE,CAAC;IAAE,QAAQ,EAAE,SAAS,CAAA;CAAE,
|
|
1
|
+
{"version":3,"file":"ErrorContext.d.ts","sourceRoot":"","sources":["../../../../../src/core/errors/ErrorContext.tsx"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,EAAE,SAAS,EAA4D,MAAM,OAAO,CAAC;AAUnG,OAAO,EAAE,gBAAgB,EAAE,MAAM,2BAA2B,CAAC;AAM7D;;;;GAIG;AACH,eAAO,MAAM,YAAY,EAAE,KAAK,CAAC,OAAO,CAAC,gBAAgB,GAAG,SAAS,CAA0D,CAAC;AAEhI,eAAO,MAAM,aAAa,EAAE,KAAK,CAAC,EAAE,CAAC;IAAE,QAAQ,EAAE,SAAS,CAAA;CAAE,CA+P3D,CAAC"}
|
|
@@ -25,13 +25,20 @@ export const ErrorProvider = ({ children }) => {
|
|
|
25
25
|
sharedErrorBuilder.updateUserId(userId);
|
|
26
26
|
sharedErrorBuilder.updateOrganizationId(organizationId);
|
|
27
27
|
}, []);
|
|
28
|
-
|
|
28
|
+
/*
|
|
29
|
+
* Attribute error reports to the person this tab knows, and to nobody once they are gone (#1977).
|
|
30
|
+
* Before `USER_LOGIN` had a producer this listener never ran; it also had no `USER_LOGOUT` half, so
|
|
31
|
+
* once it did run, errors raised after a sign-out would have been reported as the previous person's.
|
|
32
|
+
*/
|
|
29
33
|
useEffect(() => {
|
|
30
34
|
const unsubscribe = on(FrontendEvents.USER_LOGIN, (payload) => {
|
|
31
35
|
if (payload.userId) {
|
|
32
36
|
setUserContext(payload.userId, undefined);
|
|
33
37
|
}
|
|
34
38
|
});
|
|
39
|
+
const unsubscribeLogout = on(FrontendEvents.USER_LOGOUT, () => {
|
|
40
|
+
setUserContext(undefined, undefined);
|
|
41
|
+
});
|
|
35
42
|
const unsubscribe2 = on(FrontendEvents.PRIMARY_SCOPE_CHANGED, (payload) => {
|
|
36
43
|
if (payload.scopeLevel === ResourcePrimaryScope.ORGANIZATIONS && payload.newValue) {
|
|
37
44
|
sharedErrorBuilder.updateOrganizationId(payload.newValue);
|
|
@@ -39,6 +46,7 @@ export const ErrorProvider = ({ children }) => {
|
|
|
39
46
|
});
|
|
40
47
|
return () => {
|
|
41
48
|
unsubscribe();
|
|
49
|
+
unsubscribeLogout();
|
|
42
50
|
unsubscribe2();
|
|
43
51
|
};
|
|
44
52
|
}, [on, setUserContext]);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ErrorContext.js","sourceRoot":"","sources":["../../../../../src/core/errors/ErrorContext.tsx"],"names":[],"mappings":"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","sourcesContent":["import {\n ERROR_DEFINITIONS,\n ErrorActionFrontend,\n ErrorType,\n Error_Frontend_RedirectPolicy,\n ResourcePrimaryScope,\n WildoError_Frontend, describeCaughtError } from '@wildo-ai/saas-models';\nimport React, { ReactNode, createContext, useState, useEffect, useCallback, useMemo } from 'react';\nimport { WINDOW_EVENTS_SLUGS } from '~wildo-frontend-lib/core/commons/window-event.frontend.schemas';\nimport { LoggerFrontendService } from '~wildo-frontend-lib/core/monitoring/logger.frontend.service';\nimport { sharedErrorBuilder } from './errors-builder.frontend.services';\nimport { frontendEventBus } from '~wildo-frontend-lib/core/events/event-bus.frontend.service';\nimport { ErrorManagementService } from './error-management.frontend.service';\nimport { FrontendEvents } from '~wildo-frontend-lib/core/events/events.frontend.schemas';\nimport { useEventBus } from '~wildo-frontend-lib/core/events/useEventBus';\nimport { NavigationZone, NavigationContentType, NavigationSource } from '~wildo-frontend-lib/core/navigation/navigation.schemas';\nimport { ErrorSeverity, FrontendNotificationCustomMessageRefs } from '@wildo-ai/saas-models';\nimport { ErrorContextType } from './errors.frontend.schemas';\n\nconst logger: LoggerFrontendService = LoggerFrontendService.getLogger();\nconst logDebug: (message: string, context?: Record<string, unknown>) => void = logger.debugByType('ErrorContext');\nlogger.setDebugTypeLogging('ErrorContext', false);\n\n/**\n * Error Context\n * Exported for use in separate hook file (Fast Refresh compatibility)\n * @internal - Use useError() hook instead of accessing this directly\n */\nexport const ErrorContext: React.Context<ErrorContextType | undefined> = createContext<ErrorContextType | undefined>(undefined);\n\nexport const ErrorProvider: React.FC<{ children: ReactNode }> = ({ children }) => {\n const { on } = useEventBus();\n\n const setUserContext = useCallback((userId?: string, organizationId?: string) => {\n sharedErrorBuilder.updateUserId(userId);\n sharedErrorBuilder.updateOrganizationId(organizationId);\n }, []);\n\n // Sync with user context changes - updates shared singleton\n useEffect(() => {\n const unsubscribe = on(FrontendEvents.USER_LOGIN, (payload) => {\n if (payload.userId) {\n setUserContext(payload.userId, undefined);\n }\n });\n \n const unsubscribe2 = on(FrontendEvents.PRIMARY_SCOPE_CHANGED, (payload) => {\n if (payload.scopeLevel === ResourcePrimaryScope.ORGANIZATIONS && payload.newValue) {\n sharedErrorBuilder.updateOrganizationId(payload.newValue);\n }\n });\n \n return () => {\n unsubscribe();\n unsubscribe2();\n };\n }, [on, setUserContext]);\n\n const executeFrontendActions = useCallback((wildoErrorParam: WildoError_Frontend) => {\n const frontendActions: ErrorActionFrontend[] = ((wildoErrorParam as WildoError_Frontend).frontendActions || []) as ErrorActionFrontend[];\n frontendActions.forEach(action => {\n try {\n switch (action) {\n case ErrorActionFrontend.NOTIFY:\n case ErrorActionFrontend.SHOW_TOAST: {\n const showToUser: boolean | undefined = (wildoErrorParam as WildoError_Frontend).showToUser;\n if (showToUser !== false) {\n const errorType: ErrorType = (wildoErrorParam as WildoError_Frontend).type;\n const errorDefinition = ERROR_DEFINITIONS[errorType];\n const customMessageReference: string = (wildoErrorParam as WildoError_Frontend).customMessageReference;\n const context = wildoErrorParam.context as Record<string, unknown> | undefined;\n const userGuidance = (wildoErrorParam as any).userGuidance as { explanation?: string; resolution?: string } | undefined;\n const message = userGuidance?.explanation\n || userGuidance?.resolution\n || (context?.message as string)\n || (context?.errorMessage as string)\n || (context?.originalMessage as string)\n || customMessageReference\n || errorDefinition.description;\n \n const eventPayload = {\n identifier: FrontendNotificationCustomMessageRefs.A_TEMP_REF,\n data: {\n message,\n errorType: wildoErrorParam.type,\n customMessageReference: wildoErrorParam.customMessageReference,\n context,\n },\n } as const;\n \n switch (errorDefinition.severity) {\n case 'critical':\n case 'high':\n frontendEventBus.emit(FrontendEvents.NOTIFY_CUSTOM_ERROR, eventPayload);\n break;\n case 'medium':\n frontendEventBus.emit(FrontendEvents.NOTIFY_CUSTOM_WARNING, eventPayload);\n break;\n case 'low':\n frontendEventBus.emit(FrontendEvents.NOTIFY_CUSTOM_INFO, eventPayload);\n break;\n default:\n frontendEventBus.emit(FrontendEvents.NOTIFY_CUSTOM_ERROR, eventPayload);\n }\n }\n break;\n }\n \n case ErrorActionFrontend.DISCONNECT: {\n const errorTypeDisconnect: ErrorType = (wildoErrorParam as WildoError_Frontend).type;\n const timestampDisconnect: Date = (wildoErrorParam as WildoError_Frontend).timestamp;\n \n const logoutEvent = new CustomEvent(WINDOW_EVENTS_SLUGS.LOGOUT, {\n detail: { \n reason: 'error_disconnect', \n errorType: errorTypeDisconnect,\n timestamp: timestampDisconnect \n }\n });\n window.dispatchEvent(logoutEvent);\n break;\n }\n \n case ErrorActionFrontend.REDIRECT: {\n const redirectPolicy: Error_Frontend_RedirectPolicy | undefined = (wildoErrorParam as WildoError_Frontend).redirectPolicy;\n if (redirectPolicy) {\n switch (redirectPolicy) {\n case Error_Frontend_RedirectPolicy.LOGIN:\n window.location.href = '/login';\n break;\n case Error_Frontend_RedirectPolicy.HOME:\n window.location.href = '/';\n break;\n case Error_Frontend_RedirectPolicy.HISTORY_BACK:\n window.history.back();\n break;\n default:\n logDebug('Redirect policy handled by error boundary', { policy: redirectPolicy });\n break;\n }\n }\n break;\n }\n \n case ErrorActionFrontend.REFRESH_TOKEN: {\n const errorTypeRefresh: ErrorType = (wildoErrorParam as WildoError_Frontend).type;\n const timestampRefresh: Date = (wildoErrorParam as WildoError_Frontend).timestamp;\n \n const refreshEvent = new CustomEvent(WINDOW_EVENTS_SLUGS.REFRESH_TOKEN, {\n detail: { \n reason: 'error_refresh', \n errorType: errorTypeRefresh,\n timestamp: timestampRefresh \n }\n });\n window.dispatchEvent(refreshEvent);\n break;\n }\n \n case ErrorActionFrontend.SHOW_MODAL: {\n // The error itself, never text: this provider sits ABOVE the I18nProvider, so the modal's renderer\n // (`ErrorModalContent`) resolves the words. The raw reference, `ERROR_DEFINITIONS` developer\n // description and request context pushed here used to reach the screen (#1159).\n frontendEventBus.emit(FrontendEvents.NAVIGATION_PUSH, {\n zone: NavigationZone.OVERLAY,\n content: {\n contentType: NavigationContentType.ERROR_MODAL,\n errorType: (wildoErrorParam as WildoError_Frontend).type,\n wildoError: wildoErrorParam,\n },\n stackEntryId: `error_modal_${Date.now()}_${Math.random().toString(36).substr(2, 9)}`,\n navigationSource: NavigationSource.CONTROLLER,\n });\n break;\n }\n \n case ErrorActionFrontend.RETRY:\n break;\n }\n } catch (actionError) {\n console.warn('Failed to execute frontend error action', {\n action,\n originalError: wildoErrorParam,\n actionError: describeCaughtError(actionError)\n });\n }\n });\n }, []);\n\n const handleWildoError = useCallback((wildoErrorParam: WildoError_Frontend) => {\n const context: Record<string, any> | undefined = (wildoErrorParam as WildoError_Frontend).context;\n /*\n * Logged at the error's OWN severity. This handler used to write every error to the console at\n * `error` level, so a LOW-severity outcome the behaviour matrix had already decided to keep from\n * the user — a dangling optional reference answering 404 on a silent label probe — still arrived\n * in the console as a red line on every render, indistinguishable from a real failure. The\n * matrix is the one place that ranks an error; the console line follows it.\n */\n const logAtSeverity = (message: string): void => {\n switch (wildoErrorParam.severity) {\n case ErrorSeverity.LOW:\n logger.debug(message, context);\n break;\n case ErrorSeverity.MEDIUM:\n logger.warn(message, context);\n break;\n default:\n logger.error(message, context);\n }\n };\n if (context && typeof context === 'object' && 'originalError' in context) {\n const originalError = context.originalError as unknown;\n const errorMessage = originalError instanceof Error\n ? originalError.message\n : typeof originalError === 'string'\n ? originalError\n : String(originalError);\n logAtSeverity(errorMessage);\n } else {\n const customMessageReference: string = (wildoErrorParam as WildoError_Frontend).customMessageReference;\n logAtSeverity(customMessageReference);\n }\n\n executeFrontendActions(wildoErrorParam);\n }, [executeFrontendActions]);\n\n const handleError = useCallback((error: Error|any, customMessage?: string, additionalContext?: Record<string, unknown>) => {\n const normalizedWildoError = error?.wildoError as WildoError_Frontend | undefined;\n if (normalizedWildoError) {\n const enrichedWildoError: WildoError_Frontend = {\n ...normalizedWildoError,\n context: {\n ...(normalizedWildoError.context || {}),\n ...(customMessage ? { originalError: customMessage } : {}),\n ...additionalContext,\n },\n };\n\n // Already emitted AND displayed: the global handler showed it, so a second toast would duplicate it.\n // A `silent` request is different — its event was emitted with `suppressUserDisplay`, which means\n // \"the CALLER owns the user-facing message\". A caller reporting it here IS that owner, so it is\n // displayed. Treating every emitted error as displayed is what left a refused form save with no\n // words of its own: the form fell back to a fresh `Error`, classified as an uncaught exception (#1447).\n if ((error as any).wildoErrorEventEmitted === true && (normalizedWildoError as any).suppressUserDisplay !== true) {\n logger.error(enrichedWildoError.customMessageReference, enrichedWildoError.context as Record<string, any> | undefined);\n return;\n }\n\n handleWildoError(enrichedWildoError);\n return;\n }\n\n const errorType = ErrorManagementService.classifyError(error);\n const errorMessage = customMessage || error?.message || 'Unknown error';\n const errorDefinition = ERROR_DEFINITIONS[errorType];\n\n const errorContext = {\n originalError: errorMessage,\n ...additionalContext\n };\n\n const wildoError = sharedErrorBuilder.buildWildoError_Frontend(errorType, {\n customMessageReference: errorDefinition?.defaultCustomMessageReference,\n context: errorContext\n });\n\n handleWildoError(wildoError);\n }, [handleWildoError]);\n\n const value = useMemo<ErrorContextType>(() => ({\n handleError,\n handleWildoError,\n setUserContext,\n }), [handleError, handleWildoError, setUserContext]);\n\n return <ErrorContext.Provider value={value}>{children}</ErrorContext.Provider>;\n};\n\n// useError hook is now in separate file: ./useError.ts\n// This separation is required for React Fast Refresh compatibility\n"]}
|
|
1
|
+
{"version":3,"file":"ErrorContext.js","sourceRoot":"","sources":["../../../../../src/core/errors/ErrorContext.tsx"],"names":[],"mappings":"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","sourcesContent":["import {\n ERROR_DEFINITIONS,\n ErrorActionFrontend,\n ErrorType,\n Error_Frontend_RedirectPolicy,\n ResourcePrimaryScope,\n WildoError_Frontend, describeCaughtError } from '@wildo-ai/saas-models';\nimport React, { ReactNode, createContext, useState, useEffect, useCallback, useMemo } from 'react';\nimport { WINDOW_EVENTS_SLUGS } from '~wildo-frontend-lib/core/commons/window-event.frontend.schemas';\nimport { LoggerFrontendService } from '~wildo-frontend-lib/core/monitoring/logger.frontend.service';\nimport { sharedErrorBuilder } from './errors-builder.frontend.services';\nimport { frontendEventBus } from '~wildo-frontend-lib/core/events/event-bus.frontend.service';\nimport { ErrorManagementService } from './error-management.frontend.service';\nimport { FrontendEvents } from '~wildo-frontend-lib/core/events/events.frontend.schemas';\nimport { useEventBus } from '~wildo-frontend-lib/core/events/useEventBus';\nimport { NavigationZone, NavigationContentType, NavigationSource } from '~wildo-frontend-lib/core/navigation/navigation.schemas';\nimport { ErrorSeverity, FrontendNotificationCustomMessageRefs } from '@wildo-ai/saas-models';\nimport { ErrorContextType } from './errors.frontend.schemas';\n\nconst logger: LoggerFrontendService = LoggerFrontendService.getLogger();\nconst logDebug: (message: string, context?: Record<string, unknown>) => void = logger.debugByType('ErrorContext');\nlogger.setDebugTypeLogging('ErrorContext', false);\n\n/**\n * Error Context\n * Exported for use in separate hook file (Fast Refresh compatibility)\n * @internal - Use useError() hook instead of accessing this directly\n */\nexport const ErrorContext: React.Context<ErrorContextType | undefined> = createContext<ErrorContextType | undefined>(undefined);\n\nexport const ErrorProvider: React.FC<{ children: ReactNode }> = ({ children }) => {\n const { on } = useEventBus();\n\n const setUserContext = useCallback((userId?: string, organizationId?: string) => {\n sharedErrorBuilder.updateUserId(userId);\n sharedErrorBuilder.updateOrganizationId(organizationId);\n }, []);\n\n /*\n * Attribute error reports to the person this tab knows, and to nobody once they are gone (#1977).\n * Before `USER_LOGIN` had a producer this listener never ran; it also had no `USER_LOGOUT` half, so\n * once it did run, errors raised after a sign-out would have been reported as the previous person's.\n */\n useEffect(() => {\n const unsubscribe = on(FrontendEvents.USER_LOGIN, (payload) => {\n if (payload.userId) {\n setUserContext(payload.userId, undefined);\n }\n });\n\n const unsubscribeLogout = on(FrontendEvents.USER_LOGOUT, () => {\n setUserContext(undefined, undefined);\n });\n \n const unsubscribe2 = on(FrontendEvents.PRIMARY_SCOPE_CHANGED, (payload) => {\n if (payload.scopeLevel === ResourcePrimaryScope.ORGANIZATIONS && payload.newValue) {\n sharedErrorBuilder.updateOrganizationId(payload.newValue);\n }\n });\n \n return () => {\n unsubscribe();\n unsubscribeLogout();\n unsubscribe2();\n };\n }, [on, setUserContext]);\n\n const executeFrontendActions = useCallback((wildoErrorParam: WildoError_Frontend) => {\n const frontendActions: ErrorActionFrontend[] = ((wildoErrorParam as WildoError_Frontend).frontendActions || []) as ErrorActionFrontend[];\n frontendActions.forEach(action => {\n try {\n switch (action) {\n case ErrorActionFrontend.NOTIFY:\n case ErrorActionFrontend.SHOW_TOAST: {\n const showToUser: boolean | undefined = (wildoErrorParam as WildoError_Frontend).showToUser;\n if (showToUser !== false) {\n const errorType: ErrorType = (wildoErrorParam as WildoError_Frontend).type;\n const errorDefinition = ERROR_DEFINITIONS[errorType];\n const customMessageReference: string = (wildoErrorParam as WildoError_Frontend).customMessageReference;\n const context = wildoErrorParam.context as Record<string, unknown> | undefined;\n const userGuidance = (wildoErrorParam as any).userGuidance as { explanation?: string; resolution?: string } | undefined;\n const message = userGuidance?.explanation\n || userGuidance?.resolution\n || (context?.message as string)\n || (context?.errorMessage as string)\n || (context?.originalMessage as string)\n || customMessageReference\n || errorDefinition.description;\n \n const eventPayload = {\n identifier: FrontendNotificationCustomMessageRefs.A_TEMP_REF,\n data: {\n message,\n errorType: wildoErrorParam.type,\n customMessageReference: wildoErrorParam.customMessageReference,\n context,\n },\n } as const;\n \n switch (errorDefinition.severity) {\n case 'critical':\n case 'high':\n frontendEventBus.emit(FrontendEvents.NOTIFY_CUSTOM_ERROR, eventPayload);\n break;\n case 'medium':\n frontendEventBus.emit(FrontendEvents.NOTIFY_CUSTOM_WARNING, eventPayload);\n break;\n case 'low':\n frontendEventBus.emit(FrontendEvents.NOTIFY_CUSTOM_INFO, eventPayload);\n break;\n default:\n frontendEventBus.emit(FrontendEvents.NOTIFY_CUSTOM_ERROR, eventPayload);\n }\n }\n break;\n }\n \n case ErrorActionFrontend.DISCONNECT: {\n const errorTypeDisconnect: ErrorType = (wildoErrorParam as WildoError_Frontend).type;\n const timestampDisconnect: Date = (wildoErrorParam as WildoError_Frontend).timestamp;\n \n const logoutEvent = new CustomEvent(WINDOW_EVENTS_SLUGS.LOGOUT, {\n detail: { \n reason: 'error_disconnect', \n errorType: errorTypeDisconnect,\n timestamp: timestampDisconnect \n }\n });\n window.dispatchEvent(logoutEvent);\n break;\n }\n \n case ErrorActionFrontend.REDIRECT: {\n const redirectPolicy: Error_Frontend_RedirectPolicy | undefined = (wildoErrorParam as WildoError_Frontend).redirectPolicy;\n if (redirectPolicy) {\n switch (redirectPolicy) {\n case Error_Frontend_RedirectPolicy.LOGIN:\n window.location.href = '/login';\n break;\n case Error_Frontend_RedirectPolicy.HOME:\n window.location.href = '/';\n break;\n case Error_Frontend_RedirectPolicy.HISTORY_BACK:\n window.history.back();\n break;\n default:\n logDebug('Redirect policy handled by error boundary', { policy: redirectPolicy });\n break;\n }\n }\n break;\n }\n \n case ErrorActionFrontend.REFRESH_TOKEN: {\n const errorTypeRefresh: ErrorType = (wildoErrorParam as WildoError_Frontend).type;\n const timestampRefresh: Date = (wildoErrorParam as WildoError_Frontend).timestamp;\n \n const refreshEvent = new CustomEvent(WINDOW_EVENTS_SLUGS.REFRESH_TOKEN, {\n detail: { \n reason: 'error_refresh', \n errorType: errorTypeRefresh,\n timestamp: timestampRefresh \n }\n });\n window.dispatchEvent(refreshEvent);\n break;\n }\n \n case ErrorActionFrontend.SHOW_MODAL: {\n // The error itself, never text: this provider sits ABOVE the I18nProvider, so the modal's renderer\n // (`ErrorModalContent`) resolves the words. The raw reference, `ERROR_DEFINITIONS` developer\n // description and request context pushed here used to reach the screen (#1159).\n frontendEventBus.emit(FrontendEvents.NAVIGATION_PUSH, {\n zone: NavigationZone.OVERLAY,\n content: {\n contentType: NavigationContentType.ERROR_MODAL,\n errorType: (wildoErrorParam as WildoError_Frontend).type,\n wildoError: wildoErrorParam,\n },\n stackEntryId: `error_modal_${Date.now()}_${Math.random().toString(36).substr(2, 9)}`,\n navigationSource: NavigationSource.CONTROLLER,\n });\n break;\n }\n \n case ErrorActionFrontend.RETRY:\n break;\n }\n } catch (actionError) {\n console.warn('Failed to execute frontend error action', {\n action,\n originalError: wildoErrorParam,\n actionError: describeCaughtError(actionError)\n });\n }\n });\n }, []);\n\n const handleWildoError = useCallback((wildoErrorParam: WildoError_Frontend) => {\n const context: Record<string, any> | undefined = (wildoErrorParam as WildoError_Frontend).context;\n /*\n * Logged at the error's OWN severity. This handler used to write every error to the console at\n * `error` level, so a LOW-severity outcome the behaviour matrix had already decided to keep from\n * the user — a dangling optional reference answering 404 on a silent label probe — still arrived\n * in the console as a red line on every render, indistinguishable from a real failure. The\n * matrix is the one place that ranks an error; the console line follows it.\n */\n const logAtSeverity = (message: string): void => {\n switch (wildoErrorParam.severity) {\n case ErrorSeverity.LOW:\n logger.debug(message, context);\n break;\n case ErrorSeverity.MEDIUM:\n logger.warn(message, context);\n break;\n default:\n logger.error(message, context);\n }\n };\n if (context && typeof context === 'object' && 'originalError' in context) {\n const originalError = context.originalError as unknown;\n const errorMessage = originalError instanceof Error\n ? originalError.message\n : typeof originalError === 'string'\n ? originalError\n : String(originalError);\n logAtSeverity(errorMessage);\n } else {\n const customMessageReference: string = (wildoErrorParam as WildoError_Frontend).customMessageReference;\n logAtSeverity(customMessageReference);\n }\n\n executeFrontendActions(wildoErrorParam);\n }, [executeFrontendActions]);\n\n const handleError = useCallback((error: Error|any, customMessage?: string, additionalContext?: Record<string, unknown>) => {\n const normalizedWildoError = error?.wildoError as WildoError_Frontend | undefined;\n if (normalizedWildoError) {\n const enrichedWildoError: WildoError_Frontend = {\n ...normalizedWildoError,\n context: {\n ...(normalizedWildoError.context || {}),\n ...(customMessage ? { originalError: customMessage } : {}),\n ...additionalContext,\n },\n };\n\n // Already emitted AND displayed: the global handler showed it, so a second toast would duplicate it.\n // A `silent` request is different — its event was emitted with `suppressUserDisplay`, which means\n // \"the CALLER owns the user-facing message\". A caller reporting it here IS that owner, so it is\n // displayed. Treating every emitted error as displayed is what left a refused form save with no\n // words of its own: the form fell back to a fresh `Error`, classified as an uncaught exception (#1447).\n if ((error as any).wildoErrorEventEmitted === true && (normalizedWildoError as any).suppressUserDisplay !== true) {\n logger.error(enrichedWildoError.customMessageReference, enrichedWildoError.context as Record<string, any> | undefined);\n return;\n }\n\n handleWildoError(enrichedWildoError);\n return;\n }\n\n const errorType = ErrorManagementService.classifyError(error);\n const errorMessage = customMessage || error?.message || 'Unknown error';\n const errorDefinition = ERROR_DEFINITIONS[errorType];\n\n const errorContext = {\n originalError: errorMessage,\n ...additionalContext\n };\n\n const wildoError = sharedErrorBuilder.buildWildoError_Frontend(errorType, {\n customMessageReference: errorDefinition?.defaultCustomMessageReference,\n context: errorContext\n });\n\n handleWildoError(wildoError);\n }, [handleWildoError]);\n\n const value = useMemo<ErrorContextType>(() => ({\n handleError,\n handleWildoError,\n setUserContext,\n }), [handleError, handleWildoError, setUserContext]);\n\n return <ErrorContext.Provider value={value}>{children}</ErrorContext.Provider>;\n};\n\n// useError hook is now in separate file: ./useError.ts\n// This separation is required for React Fast Refresh compatibility\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"GlobalErrorHandler.d.ts","sourceRoot":"","sources":["../../../../../src/core/errors/GlobalErrorHandler.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAiBH,OAAO,EAAE,uBAAuB,EAAE,MAAM,2BAA2B,CAAC;AAyBpE;;;;;;;;GAQG;AACH,wBAAgB,kBAAkB,CAAC,EACjC,OAAO,GACR,EAAE,uBAAuB,GAAG,IAAI,
|
|
1
|
+
{"version":3,"file":"GlobalErrorHandler.d.ts","sourceRoot":"","sources":["../../../../../src/core/errors/GlobalErrorHandler.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAiBH,OAAO,EAAE,uBAAuB,EAAE,MAAM,2BAA2B,CAAC;AAyBpE;;;;;;;;GAQG;AACH,wBAAgB,kBAAkB,CAAC,EACjC,OAAO,GACR,EAAE,uBAAuB,GAAG,IAAI,CAyMhC;AAED,eAAe,kBAAkB,CAAC"}
|
|
@@ -14,7 +14,7 @@
|
|
|
14
14
|
import { useEffect, useCallback, useRef } from 'react';
|
|
15
15
|
import { ErrorActionFrontend, ERROR_DEFINITIONS, ErrorSeverity, } from '@wildo-ai/saas-models';
|
|
16
16
|
import { useEventBus } from '../../core/events/useEventBus.js';
|
|
17
|
-
import { FrontendEvents } from '../../core/events/events.frontend.schemas.js';
|
|
17
|
+
import { FrontendEvents, SessionEndReason } from '../../core/events/events.frontend.schemas.js';
|
|
18
18
|
import { LoggerFrontendService } from '../../core/monitoring/logger.frontend.service.js';
|
|
19
19
|
import { useError } from './useError.js';
|
|
20
20
|
import { useAuthSession } from '../../core/security/useAuthSession.js';
|
|
@@ -53,7 +53,7 @@ function severityToNotificationType(severity) {
|
|
|
53
53
|
export function GlobalErrorHandler({ onError, }) {
|
|
54
54
|
const { on } = useEventBus();
|
|
55
55
|
const { handleWildoError } = useError();
|
|
56
|
-
const {
|
|
56
|
+
const { endSession, isAuthenticated } = useAuthSession();
|
|
57
57
|
const { notifyError, notifyWarning, notifyInfo } = useNotification();
|
|
58
58
|
// Resolvers for backend error references and guidance → localized human messages. No deps
|
|
59
59
|
// requested: `errors_*` sections load eagerly, so this only borrows the resolvers.
|
|
@@ -78,12 +78,13 @@ export function GlobalErrorHandler({ onError, }) {
|
|
|
78
78
|
const handleForcedLogout = useCallback(() => {
|
|
79
79
|
if (isAuthenticated()) {
|
|
80
80
|
logDebug('triggerLogout requested - logging out via AuthSession');
|
|
81
|
-
|
|
81
|
+
// The backend refused the session; the person did not sign out, so `USER_LOGOUT` says so (#1977).
|
|
82
|
+
endSession(SessionEndReason.SESSION_ENDED);
|
|
82
83
|
}
|
|
83
84
|
else {
|
|
84
85
|
logDebug('triggerLogout requested but not authenticated - skipping logout');
|
|
85
86
|
}
|
|
86
|
-
}, [
|
|
87
|
+
}, [endSession, isAuthenticated]);
|
|
87
88
|
/**
|
|
88
89
|
* Show error notification via NotificationContext
|
|
89
90
|
* Uses policy-driven display (toast + optional notification center)
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"GlobalErrorHandler.js","sourceRoot":"","sources":["../../../../../src/core/errors/GlobalErrorHandler.tsx"],"names":[],"mappings":"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","sourcesContent":["/**\n * Global Error Handler\n * \n * Subscribes to ERROR_OCCURED events from the event bus and executes\n * frontend actions based on the error configuration.\n * \n * This component integrates with:\n * - AuthSession: For authentication error handling (logout)\n * - NotificationContext: For toast and notification center display\n * - ErrorContext: For other frontend actions (REDIRECT, SHOW_MODAL, etc.)\n * \n * Must be rendered inside AuthSessionProvider and NotificationProvider.\n */\n\nimport { useEffect, useCallback, useRef } from 'react';\nimport {\n ErrorActionFrontend,\n WildoError_Frontend,\n ERROR_DEFINITIONS,\n ErrorSeverity,\n} from '@wildo-ai/saas-models';\nimport { useEventBus } from '~wildo-frontend-lib/core/events/useEventBus';\nimport { FrontendEvents, FrontendEventErrorOccured } from '~wildo-frontend-lib/core/events/events.frontend.schemas';\nimport { LoggerFrontendService } from '~wildo-frontend-lib/core/monitoring/logger.frontend.service';\nimport { useError } from './useError';\nimport { useAuthSession } from '~wildo-frontend-lib/core/security/useAuthSession';\nimport { useNotification } from '~wildo-frontend-lib/core/events/useNotification';\nimport { useI18n } from '~wildo-frontend-lib/core/i18n/useI18n';\nimport { errorManagement } from './error-management.frontend.service';\nimport { GlobalErrorHandlerProps } from './errors.frontend.schemas';\nimport { NotificationType } from '~wildo-frontend-lib/core/events/NotificationContext';\nimport { resolveUserFacingErrorMessage, type ErrorMessageTranslators } from './user-facing-error-message.frontend.utils';\n\nconst logger: LoggerFrontendService = LoggerFrontendService.getLogger();\nconst logDebug: (message: string, context?: Record<string, unknown>) => void = logger.debugByType('GlobalErrorHandler');\nlogger.setDebugTypeLogging('GlobalErrorHandler', false);\n\n/**\n * Map error severity to notification type\n */\nfunction severityToNotificationType(severity: ErrorSeverity): NotificationType {\n switch (severity) {\n case ErrorSeverity.CRITICAL:\n case ErrorSeverity.HIGH:\n return 'error';\n case ErrorSeverity.MEDIUM:\n return 'warning';\n case ErrorSeverity.LOW:\n return 'info';\n default:\n return 'error';\n }\n}\n\n/**\n * Global Error Handler Component\n * \n * Subscribes to ERROR_OCCURED events and executes frontend actions.\n * Integrates with AuthSession for authentication error handling (logout).\n * Delegates notification display to NotificationContext.\n * \n * Should be rendered once, inside the AuthSessionProvider and NotificationProvider.\n */\nexport function GlobalErrorHandler({\n onError,\n}: GlobalErrorHandlerProps): null {\n const { on } = useEventBus();\n const { handleWildoError } = useError();\n const { logout, isAuthenticated } = useAuthSession();\n const { notifyError, notifyWarning, notifyInfo } = useNotification();\n // Resolvers for backend error references and guidance → localized human messages. No deps\n // requested: `errors_*` sections load eagerly, so this only borrows the resolvers.\n //\n // Held in a ref: `tErrorMessage` (and the whole I18n context value) is NOT\n // memoized, so a new identity is produced on every I18nProvider render. Using it\n // directly as a `useCallback` dep would ripple through `showErrorNotification` →\n // `handleErrorEvent` → the `ERROR_OCCURED` subscription effect, re-subscribing\n // the global handler on every i18n render. The ref keeps those callbacks (and the\n // subscription) stable while always reading the latest resolvers.\n const { tErrorMessage, tErrorGuidance } = useI18n();\n const translatorsRef = useRef<ErrorMessageTranslators>({ tErrorMessage, tErrorGuidance });\n translatorsRef.current = { tErrorMessage, tErrorGuidance };\n \n /**\n * Tear down the AuthSession in response to a `triggerLogout` error.\n *\n * Only logs out when currently authenticated, to avoid a redundant logout\n * (e.g. when the token-refresh interceptor already logged the session out).\n * Fires for ANY error flagged `triggerLogout`, not only AUTHENTICATION-typed\n * ones — see the gate in handleErrorEvent.\n */\n const handleForcedLogout = useCallback(() => {\n if (isAuthenticated()) {\n logDebug('triggerLogout requested - logging out via AuthSession');\n logout();\n } else {\n logDebug('triggerLogout requested but not authenticated - skipping logout');\n }\n }, [logout, isAuthenticated]);\n \n /**\n * Show error notification via NotificationContext\n * Uses policy-driven display (toast + optional notification center)\n */\n const showErrorNotification = useCallback((wildoError: WildoError_Frontend) => {\n const errorDefinition = ERROR_DEFINITIONS[wildoError.type];\n const severity = (wildoError as any).severity || errorDefinition?.severity || ErrorSeverity.MEDIUM;\n // The global toast speaks for no particular surface, so no surface words are passed: a generic\n // bucket shows its own label. Server `context.message` / `originalMessage` and the raw reference\n // are never shown — an unresolvable message falls to the default label, or to its key path when\n // even that is unauthored (see `resolveUserFacingErrorMessage`).\n const message = resolveUserFacingErrorMessage(wildoError, { translators: translatorsRef.current });\n const notificationType = severityToNotificationType(severity);\n \n // Use appropriate notification method based on severity\n const notificationData = {\n errorType: wildoError.type,\n severity,\n context: wildoError.context,\n };\n \n switch (notificationType) {\n case 'error':\n notifyError(message, { data: notificationData });\n break;\n case 'warning':\n notifyWarning(message, { data: notificationData });\n break;\n case 'info':\n notifyInfo(message, { data: notificationData });\n break;\n }\n \n logDebug('Error notification displayed via NotificationContext', {\n errorType: wildoError.type,\n severity,\n notificationType,\n message,\n });\n }, [notifyError, notifyWarning, notifyInfo]);\n \n /**\n * Handle ERROR_OCCURED event\n *\n * Delegates to ErrorContext.handleWildoError for action execution, but intercepts\n * any error flagged `triggerLogout` to tear down the session via the AuthSession\n * `logout()` callback instead of the DISCONNECT window-event fallback.\n */\n const handleErrorEvent = useCallback((payload: FrontendEventErrorOccured) => {\n let wildoError: WildoError_Frontend = payload.error;\n\n logDebug('Received ERROR_OCCURED event', {\n errorType: wildoError.type,\n customMessageReference: wildoError.customMessageReference,\n triggerLogout: wildoError.triggerLogout,\n });\n \n // Check for duplicate errors using deduplication service\n if (errorManagement.shouldSuppress(wildoError)) {\n logDebug('Error suppressed (duplicate)', {\n errorType: wildoError.type,\n customMessageReference: wildoError.customMessageReference,\n });\n return; // Don't process duplicate\n }\n \n // `triggerLogout` is the authoritative \"force a logout\" signal (set by the HTTP\n // error-behavior matrix, e.g. a 401 invalid session). It drives the AuthSession\n // logout on its own — deliberately NOT additionally gated on\n // `type === AUTHENTICATION`. The error's `type` is taken from the backend payload\n // (`backendErrorType || behavior.errorType` in buildWildoError), so a 401 whose\n // backend type is not AUTHENTICATION would still carry triggerLogout=true; an extra\n // type gate would silently swallow that logout. Mirrors `handleHttpError`'s\n // `shouldLogout`, which is also triggerLogout-only.\n const shouldTriggerLogout = wildoError.triggerLogout === true;\n\n // Handle logout via AuthSession if needed (before delegating to ErrorContext)\n if (shouldTriggerLogout) {\n logDebug('triggerLogout=true - calling AuthSession logout handler');\n handleForcedLogout();\n \n // Remove DISCONNECT action from frontendActions since we already handled logout\n const frontendActions = (wildoError.frontendActions || []) as ErrorActionFrontend[];\n if (frontendActions.includes(ErrorActionFrontend.DISCONNECT)) {\n wildoError = {\n ...wildoError,\n frontendActions: frontendActions.filter(a => a !== ErrorActionFrontend.DISCONNECT),\n };\n }\n }\n \n // Log error for analytics/debugging\n logDebug('Error occurred', {\n errorType: wildoError.type,\n customMessageReference: wildoError.customMessageReference,\n });\n \n // `suppressUserDisplay` (set when the originating request was `silent`) means\n // the CALLER owns the user-facing error UX — e.g. a resource form already shows\n // NOTIFY_RESOURCE_ERROR + inline field errors. In that case strip ALL display\n // actions (toast + modal) so the global handler never double-surfaces the error,\n // while still running the side-effect actions below (REDIRECT, DISCONNECT) and\n // the auth-logout handled earlier. This is what lets a silent resource mutation\n // log out on 401 without raising a duplicate global toast.\n //\n // INVARIANT (load-bearing): we deliberately KEEP REDIRECT/DISCONNECT here, so the\n // \"silent\" contract relies on HTTP_ERROR_BEHAVIOR_MATRIX never placing those two\n // actions at a risk level a silent caller can reach (today the matrix only adds\n // REDIRECT at HIGH/CRITICAL, and silent callers are autosave / RMM-fallback /\n // guidance / uniqueness — MEDIUM-or-lower). If you add REDIRECT/DISCONNECT at a\n // lower risk, OR via `setHttpErrorBehaviorOverride`, a silent background op would\n // navigate/disconnect with NO visible toast to explain it — add those to the\n // strip list here if that ever changes.\n const suppressUserDisplay = (wildoError as any).suppressUserDisplay === true;\n const shouldShowNotification = !suppressUserDisplay && (wildoError as any).showToUser !== false;\n const frontendActions = (wildoError.frontendActions || []) as ErrorActionFrontend[];\n const hasNotifyAction = frontendActions.includes(ErrorActionFrontend.NOTIFY)\n || frontendActions.includes(ErrorActionFrontend.SHOW_TOAST);\n\n let errorForDelegation = wildoError;\n if (suppressUserDisplay) {\n errorForDelegation = {\n ...wildoError,\n frontendActions: frontendActions.filter(\n action => action !== ErrorActionFrontend.NOTIFY\n && action !== ErrorActionFrontend.SHOW_TOAST\n && action !== ErrorActionFrontend.SHOW_MODAL,\n ),\n };\n } else if (shouldShowNotification && hasNotifyAction) {\n showErrorNotification(wildoError);\n errorForDelegation = {\n ...wildoError,\n frontendActions: frontendActions.filter(\n action => action !== ErrorActionFrontend.NOTIFY && action !== ErrorActionFrontend.SHOW_TOAST,\n ),\n };\n }\n \n // Call custom error handler if provided\n if (onError) {\n onError(wildoError);\n }\n \n // Delegate to ErrorContext for other frontend actions (REDIRECT, SHOW_MODAL, etc.)\n // Note: We've already handled NOTIFY above via NotificationContext\n handleWildoError(errorForDelegation);\n }, [handleWildoError, onError, handleForcedLogout, showErrorNotification]);\n \n // Subscribe to ERROR_OCCURED events\n useEffect(() => {\n logDebug('Subscribing to ERROR_OCCURED events', {\n eventName: FrontendEvents.ERROR_OCCURED,\n });\n \n const unsubscribe = on(FrontendEvents.ERROR_OCCURED, handleErrorEvent);\n \n return () => {\n logDebug('Unsubscribing from ERROR_OCCURED events');\n unsubscribe();\n };\n }, [on, handleErrorEvent]);\n \n // This component renders nothing - it only subscribes to events\n return null;\n}\n\nexport default GlobalErrorHandler;\n"]}
|
|
1
|
+
{"version":3,"file":"GlobalErrorHandler.js","sourceRoot":"","sources":["../../../../../src/core/errors/GlobalErrorHandler.tsx"],"names":[],"mappings":"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","sourcesContent":["/**\n * Global Error Handler\n * \n * Subscribes to ERROR_OCCURED events from the event bus and executes\n * frontend actions based on the error configuration.\n * \n * This component integrates with:\n * - AuthSession: For authentication error handling (logout)\n * - NotificationContext: For toast and notification center display\n * - ErrorContext: For other frontend actions (REDIRECT, SHOW_MODAL, etc.)\n * \n * Must be rendered inside AuthSessionProvider and NotificationProvider.\n */\n\nimport { useEffect, useCallback, useRef } from 'react';\nimport {\n ErrorActionFrontend,\n WildoError_Frontend,\n ERROR_DEFINITIONS,\n ErrorSeverity,\n} from '@wildo-ai/saas-models';\nimport { useEventBus } from '~wildo-frontend-lib/core/events/useEventBus';\nimport { FrontendEvents, FrontendEventErrorOccured, SessionEndReason } from '~wildo-frontend-lib/core/events/events.frontend.schemas';\nimport { LoggerFrontendService } from '~wildo-frontend-lib/core/monitoring/logger.frontend.service';\nimport { useError } from './useError';\nimport { useAuthSession } from '~wildo-frontend-lib/core/security/useAuthSession';\nimport { useNotification } from '~wildo-frontend-lib/core/events/useNotification';\nimport { useI18n } from '~wildo-frontend-lib/core/i18n/useI18n';\nimport { errorManagement } from './error-management.frontend.service';\nimport { GlobalErrorHandlerProps } from './errors.frontend.schemas';\nimport { NotificationType } from '~wildo-frontend-lib/core/events/NotificationContext';\nimport { resolveUserFacingErrorMessage, type ErrorMessageTranslators } from './user-facing-error-message.frontend.utils';\n\nconst logger: LoggerFrontendService = LoggerFrontendService.getLogger();\nconst logDebug: (message: string, context?: Record<string, unknown>) => void = logger.debugByType('GlobalErrorHandler');\nlogger.setDebugTypeLogging('GlobalErrorHandler', false);\n\n/**\n * Map error severity to notification type\n */\nfunction severityToNotificationType(severity: ErrorSeverity): NotificationType {\n switch (severity) {\n case ErrorSeverity.CRITICAL:\n case ErrorSeverity.HIGH:\n return 'error';\n case ErrorSeverity.MEDIUM:\n return 'warning';\n case ErrorSeverity.LOW:\n return 'info';\n default:\n return 'error';\n }\n}\n\n/**\n * Global Error Handler Component\n * \n * Subscribes to ERROR_OCCURED events and executes frontend actions.\n * Integrates with AuthSession for authentication error handling (logout).\n * Delegates notification display to NotificationContext.\n * \n * Should be rendered once, inside the AuthSessionProvider and NotificationProvider.\n */\nexport function GlobalErrorHandler({\n onError,\n}: GlobalErrorHandlerProps): null {\n const { on } = useEventBus();\n const { handleWildoError } = useError();\n const { endSession, isAuthenticated } = useAuthSession();\n const { notifyError, notifyWarning, notifyInfo } = useNotification();\n // Resolvers for backend error references and guidance → localized human messages. No deps\n // requested: `errors_*` sections load eagerly, so this only borrows the resolvers.\n //\n // Held in a ref: `tErrorMessage` (and the whole I18n context value) is NOT\n // memoized, so a new identity is produced on every I18nProvider render. Using it\n // directly as a `useCallback` dep would ripple through `showErrorNotification` →\n // `handleErrorEvent` → the `ERROR_OCCURED` subscription effect, re-subscribing\n // the global handler on every i18n render. The ref keeps those callbacks (and the\n // subscription) stable while always reading the latest resolvers.\n const { tErrorMessage, tErrorGuidance } = useI18n();\n const translatorsRef = useRef<ErrorMessageTranslators>({ tErrorMessage, tErrorGuidance });\n translatorsRef.current = { tErrorMessage, tErrorGuidance };\n \n /**\n * Tear down the AuthSession in response to a `triggerLogout` error.\n *\n * Only logs out when currently authenticated, to avoid a redundant logout\n * (e.g. when the token-refresh interceptor already logged the session out).\n * Fires for ANY error flagged `triggerLogout`, not only AUTHENTICATION-typed\n * ones — see the gate in handleErrorEvent.\n */\n const handleForcedLogout = useCallback(() => {\n if (isAuthenticated()) {\n logDebug('triggerLogout requested - logging out via AuthSession');\n // The backend refused the session; the person did not sign out, so `USER_LOGOUT` says so (#1977).\n endSession(SessionEndReason.SESSION_ENDED);\n } else {\n logDebug('triggerLogout requested but not authenticated - skipping logout');\n }\n }, [endSession, isAuthenticated]);\n \n /**\n * Show error notification via NotificationContext\n * Uses policy-driven display (toast + optional notification center)\n */\n const showErrorNotification = useCallback((wildoError: WildoError_Frontend) => {\n const errorDefinition = ERROR_DEFINITIONS[wildoError.type];\n const severity = (wildoError as any).severity || errorDefinition?.severity || ErrorSeverity.MEDIUM;\n // The global toast speaks for no particular surface, so no surface words are passed: a generic\n // bucket shows its own label. Server `context.message` / `originalMessage` and the raw reference\n // are never shown — an unresolvable message falls to the default label, or to its key path when\n // even that is unauthored (see `resolveUserFacingErrorMessage`).\n const message = resolveUserFacingErrorMessage(wildoError, { translators: translatorsRef.current });\n const notificationType = severityToNotificationType(severity);\n \n // Use appropriate notification method based on severity\n const notificationData = {\n errorType: wildoError.type,\n severity,\n context: wildoError.context,\n };\n \n switch (notificationType) {\n case 'error':\n notifyError(message, { data: notificationData });\n break;\n case 'warning':\n notifyWarning(message, { data: notificationData });\n break;\n case 'info':\n notifyInfo(message, { data: notificationData });\n break;\n }\n \n logDebug('Error notification displayed via NotificationContext', {\n errorType: wildoError.type,\n severity,\n notificationType,\n message,\n });\n }, [notifyError, notifyWarning, notifyInfo]);\n \n /**\n * Handle ERROR_OCCURED event\n *\n * Delegates to ErrorContext.handleWildoError for action execution, but intercepts\n * any error flagged `triggerLogout` to tear down the session via the AuthSession\n * `logout()` callback instead of the DISCONNECT window-event fallback.\n */\n const handleErrorEvent = useCallback((payload: FrontendEventErrorOccured) => {\n let wildoError: WildoError_Frontend = payload.error;\n\n logDebug('Received ERROR_OCCURED event', {\n errorType: wildoError.type,\n customMessageReference: wildoError.customMessageReference,\n triggerLogout: wildoError.triggerLogout,\n });\n \n // Check for duplicate errors using deduplication service\n if (errorManagement.shouldSuppress(wildoError)) {\n logDebug('Error suppressed (duplicate)', {\n errorType: wildoError.type,\n customMessageReference: wildoError.customMessageReference,\n });\n return; // Don't process duplicate\n }\n \n // `triggerLogout` is the authoritative \"force a logout\" signal (set by the HTTP\n // error-behavior matrix, e.g. a 401 invalid session). It drives the AuthSession\n // logout on its own — deliberately NOT additionally gated on\n // `type === AUTHENTICATION`. The error's `type` is taken from the backend payload\n // (`backendErrorType || behavior.errorType` in buildWildoError), so a 401 whose\n // backend type is not AUTHENTICATION would still carry triggerLogout=true; an extra\n // type gate would silently swallow that logout. Mirrors `handleHttpError`'s\n // `shouldLogout`, which is also triggerLogout-only.\n const shouldTriggerLogout = wildoError.triggerLogout === true;\n\n // Handle logout via AuthSession if needed (before delegating to ErrorContext)\n if (shouldTriggerLogout) {\n logDebug('triggerLogout=true - calling AuthSession logout handler');\n handleForcedLogout();\n \n // Remove DISCONNECT action from frontendActions since we already handled logout\n const frontendActions = (wildoError.frontendActions || []) as ErrorActionFrontend[];\n if (frontendActions.includes(ErrorActionFrontend.DISCONNECT)) {\n wildoError = {\n ...wildoError,\n frontendActions: frontendActions.filter(a => a !== ErrorActionFrontend.DISCONNECT),\n };\n }\n }\n \n // Log error for analytics/debugging\n logDebug('Error occurred', {\n errorType: wildoError.type,\n customMessageReference: wildoError.customMessageReference,\n });\n \n // `suppressUserDisplay` (set when the originating request was `silent`) means\n // the CALLER owns the user-facing error UX — e.g. a resource form already shows\n // NOTIFY_RESOURCE_ERROR + inline field errors. In that case strip ALL display\n // actions (toast + modal) so the global handler never double-surfaces the error,\n // while still running the side-effect actions below (REDIRECT, DISCONNECT) and\n // the auth-logout handled earlier. This is what lets a silent resource mutation\n // log out on 401 without raising a duplicate global toast.\n //\n // INVARIANT (load-bearing): we deliberately KEEP REDIRECT/DISCONNECT here, so the\n // \"silent\" contract relies on HTTP_ERROR_BEHAVIOR_MATRIX never placing those two\n // actions at a risk level a silent caller can reach (today the matrix only adds\n // REDIRECT at HIGH/CRITICAL, and silent callers are autosave / RMM-fallback /\n // guidance / uniqueness — MEDIUM-or-lower). If you add REDIRECT/DISCONNECT at a\n // lower risk, OR via `setHttpErrorBehaviorOverride`, a silent background op would\n // navigate/disconnect with NO visible toast to explain it — add those to the\n // strip list here if that ever changes.\n const suppressUserDisplay = (wildoError as any).suppressUserDisplay === true;\n const shouldShowNotification = !suppressUserDisplay && (wildoError as any).showToUser !== false;\n const frontendActions = (wildoError.frontendActions || []) as ErrorActionFrontend[];\n const hasNotifyAction = frontendActions.includes(ErrorActionFrontend.NOTIFY)\n || frontendActions.includes(ErrorActionFrontend.SHOW_TOAST);\n\n let errorForDelegation = wildoError;\n if (suppressUserDisplay) {\n errorForDelegation = {\n ...wildoError,\n frontendActions: frontendActions.filter(\n action => action !== ErrorActionFrontend.NOTIFY\n && action !== ErrorActionFrontend.SHOW_TOAST\n && action !== ErrorActionFrontend.SHOW_MODAL,\n ),\n };\n } else if (shouldShowNotification && hasNotifyAction) {\n showErrorNotification(wildoError);\n errorForDelegation = {\n ...wildoError,\n frontendActions: frontendActions.filter(\n action => action !== ErrorActionFrontend.NOTIFY && action !== ErrorActionFrontend.SHOW_TOAST,\n ),\n };\n }\n \n // Call custom error handler if provided\n if (onError) {\n onError(wildoError);\n }\n \n // Delegate to ErrorContext for other frontend actions (REDIRECT, SHOW_MODAL, etc.)\n // Note: We've already handled NOTIFY above via NotificationContext\n handleWildoError(errorForDelegation);\n }, [handleWildoError, onError, handleForcedLogout, showErrorNotification]);\n \n // Subscribe to ERROR_OCCURED events\n useEffect(() => {\n logDebug('Subscribing to ERROR_OCCURED events', {\n eventName: FrontendEvents.ERROR_OCCURED,\n });\n \n const unsubscribe = on(FrontendEvents.ERROR_OCCURED, handleErrorEvent);\n \n return () => {\n logDebug('Unsubscribing from ERROR_OCCURED events');\n unsubscribe();\n };\n }, [on, handleErrorEvent]);\n \n // This component renders nothing - it only subscribes to events\n return null;\n}\n\nexport default GlobalErrorHandler;\n"]}
|
|
@@ -211,7 +211,7 @@ export const RouterErrorBoundary = () => {
|
|
|
211
211
|
// Helper: try i18n first, then fall back to raw string
|
|
212
212
|
const resolveField = (field, rawValue) => {
|
|
213
213
|
if (guidanceKey && i18nContext) {
|
|
214
|
-
const i18nValue = i18nContext.tErrorGuidance(guidanceKey, field);
|
|
214
|
+
const i18nValue = i18nContext.tErrorGuidance(guidanceKey, field, userGuidance.params);
|
|
215
215
|
if (i18nValue)
|
|
216
216
|
return i18nValue;
|
|
217
217
|
}
|