@open-mercato/core 0.6.8-develop.7100.1.fbf66fca35 → 0.7.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.turbo/turbo-build.log +1 -1
- package/dist/helpers/integration/api.js +1 -13
- package/dist/helpers/integration/api.js.map +2 -2
- package/dist/helpers/integration/communicationChannelsFixtures.js +0 -19
- package/dist/helpers/integration/communicationChannelsFixtures.js.map +2 -2
- package/dist/modules/api_keys/api/keys/route.js +1 -1
- package/dist/modules/api_keys/api/keys/route.js.map +2 -2
- package/dist/modules/api_keys/backend/api-keys/page.js +1 -3
- package/dist/modules/api_keys/backend/api-keys/page.js.map +2 -2
- package/dist/modules/attachments/api/route.js +2 -2
- package/dist/modules/attachments/api/route.js.map +2 -2
- package/dist/modules/attachments/components/AttachmentLibrary.js +0 -2
- package/dist/modules/attachments/components/AttachmentLibrary.js.map +2 -2
- package/dist/modules/attachments/di.js +1 -11
- package/dist/modules/attachments/di.js.map +2 -2
- package/dist/modules/attachments/index.js.map +1 -1
- package/dist/modules/attachments/lib/scoped-upload-service.js +2 -15
- package/dist/modules/attachments/lib/scoped-upload-service.js.map +2 -2
- package/dist/modules/attachments/lib/upload-limits.js +2 -6
- package/dist/modules/attachments/lib/upload-limits.js.map +2 -2
- package/dist/modules/audit_logs/backend/audit-logs/page.js +0 -6
- package/dist/modules/audit_logs/backend/audit-logs/page.js.map +2 -2
- package/dist/modules/audit_logs/lib/display-helpers.js +11 -19
- package/dist/modules/audit_logs/lib/display-helpers.js.map +2 -2
- package/dist/modules/audit_logs/services/actionLogService.js +12 -57
- package/dist/modules/audit_logs/services/actionLogService.js.map +3 -3
- package/dist/modules/auth/acl.js +5 -30
- package/dist/modules/auth/acl.js.map +2 -2
- package/dist/modules/auth/api/feature-check.js +2 -8
- package/dist/modules/auth/api/feature-check.js.map +2 -2
- package/dist/modules/auth/api/login.js +20 -4
- package/dist/modules/auth/api/login.js.map +2 -2
- package/dist/modules/auth/api/roles/acl/route.js +33 -28
- package/dist/modules/auth/api/roles/acl/route.js.map +2 -2
- package/dist/modules/auth/api/routeError.js +11 -0
- package/dist/modules/auth/api/routeError.js.map +7 -0
- package/dist/modules/auth/api/session/refresh.js +1 -25
- package/dist/modules/auth/api/session/refresh.js.map +2 -2
- package/dist/modules/auth/api/users/acl/route.js +73 -102
- package/dist/modules/auth/api/users/acl/route.js.map +2 -2
- package/dist/modules/auth/api/users/route.js +5 -13
- package/dist/modules/auth/api/users/route.js.map +2 -2
- package/dist/modules/auth/backend/roles/[id]/edit/page.meta.js +1 -5
- package/dist/modules/auth/backend/roles/[id]/edit/page.meta.js.map +2 -2
- package/dist/modules/auth/backend/roles/page.js +1 -3
- package/dist/modules/auth/backend/roles/page.js.map +2 -2
- package/dist/modules/auth/backend/users/[id]/edit/page.meta.js +1 -5
- package/dist/modules/auth/backend/users/[id]/edit/page.meta.js.map +2 -2
- package/dist/modules/auth/backend/users/page.js +1 -2
- package/dist/modules/auth/backend/users/page.js.map +2 -2
- package/dist/modules/auth/components/AclEditor.js +30 -39
- package/dist/modules/auth/components/AclEditor.js.map +2 -2
- package/dist/modules/auth/data/entities.js.map +2 -2
- package/dist/modules/auth/data/validators.js +1 -5
- package/dist/modules/auth/data/validators.js.map +2 -2
- package/dist/modules/auth/di.js +9 -35
- package/dist/modules/auth/di.js.map +2 -2
- package/dist/modules/auth/frontend/reset/[token]/page.js +0 -46
- package/dist/modules/auth/frontend/reset/[token]/page.js.map +2 -2
- package/dist/modules/auth/lib/grantChecks.js.map +2 -2
- package/dist/modules/auth/services/authService.js +2 -16
- package/dist/modules/auth/services/authService.js.map +2 -2
- package/dist/modules/auth/services/rbacService.js +24 -67
- package/dist/modules/auth/services/rbacService.js.map +3 -3
- package/dist/modules/business_rules/backend/logs/page.js +1 -3
- package/dist/modules/business_rules/backend/logs/page.js.map +2 -2
- package/dist/modules/business_rules/backend/rules/[id]/page.meta.js +6 -1
- package/dist/modules/business_rules/backend/rules/[id]/page.meta.js.map +2 -2
- package/dist/modules/business_rules/backend/rules/create/page.meta.js +5 -1
- package/dist/modules/business_rules/backend/rules/create/page.meta.js.map +2 -2
- package/dist/modules/business_rules/backend/rules/page.js +1 -3
- package/dist/modules/business_rules/backend/rules/page.js.map +2 -2
- package/dist/modules/business_rules/backend/sets/[id]/page.meta.js +6 -1
- package/dist/modules/business_rules/backend/sets/[id]/page.meta.js.map +2 -2
- package/dist/modules/business_rules/backend/sets/create/page.meta.js +5 -1
- package/dist/modules/business_rules/backend/sets/create/page.meta.js.map +2 -2
- package/dist/modules/business_rules/backend/sets/page.js +1 -3
- package/dist/modules/business_rules/backend/sets/page.js.map +2 -2
- package/dist/modules/business_rules/lib/expression-evaluator.js +9 -9
- package/dist/modules/business_rules/lib/expression-evaluator.js.map +2 -2
- package/dist/modules/business_rules/lib/rule-evaluator.js +9 -10
- package/dist/modules/business_rules/lib/rule-evaluator.js.map +2 -2
- package/dist/modules/catalog/ai-agents.js +1 -1
- package/dist/modules/catalog/ai-agents.js.map +1 -1
- package/dist/modules/catalog/ai-tools/merchandising-pack.js +2 -2
- package/dist/modules/catalog/ai-tools/merchandising-pack.js.map +2 -2
- package/dist/modules/catalog/backend/catalog/products/MerchandisingAssistantSheet.js +2 -5
- package/dist/modules/catalog/backend/catalog/products/MerchandisingAssistantSheet.js.map +2 -2
- package/dist/modules/catalog/components/categories/CategoriesDataTable.js +0 -2
- package/dist/modules/catalog/components/categories/CategoriesDataTable.js.map +2 -2
- package/dist/modules/catalog/components/products/ProductsDataTable.js +1 -7
- package/dist/modules/catalog/components/products/ProductsDataTable.js.map +2 -2
- package/dist/modules/catalog/widgets/injection/merchandising-assistant-trigger/widget.client.js +0 -2
- package/dist/modules/catalog/widgets/injection/merchandising-assistant-trigger/widget.client.js.map +2 -2
- package/dist/modules/communication_channels/api/post/channels/[id]/test-send/route.js +1 -9
- package/dist/modules/communication_channels/api/post/channels/[id]/test-send/route.js.map +2 -2
- package/dist/modules/communication_channels/api/post/test-seed/route.js +10 -95
- package/dist/modules/communication_channels/api/post/test-seed/route.js.map +2 -2
- package/dist/modules/communication_channels/backend/communication_channels/channels/page.js +0 -3
- package/dist/modules/communication_channels/backend/communication_channels/channels/page.js.map +2 -2
- package/dist/modules/communication_channels/commands/ingest-inbound-message.js +1 -14
- package/dist/modules/communication_channels/commands/ingest-inbound-message.js.map +2 -2
- package/dist/modules/communication_channels/di.js +1 -7
- package/dist/modules/communication_channels/di.js.map +2 -2
- package/dist/modules/communication_channels/lib/email-capabilities.js +1 -4
- package/dist/modules/communication_channels/lib/email-capabilities.js.map +2 -2
- package/dist/modules/communication_channels/lib/test-seed.js +2 -41
- package/dist/modules/communication_channels/lib/test-seed.js.map +2 -2
- package/dist/modules/configs/lib/system-status.js +0 -9
- package/dist/modules/configs/lib/system-status.js.map +2 -2
- package/dist/modules/currencies/backend/currencies/page.js +1 -3
- package/dist/modules/currencies/backend/currencies/page.js.map +2 -2
- package/dist/modules/currencies/backend/exchange-rates/page.js +1 -3
- package/dist/modules/currencies/backend/exchange-rates/page.js.map +2 -2
- package/dist/modules/customer_accounts/api/admin/domain-mappings.js +0 -9
- package/dist/modules/customer_accounts/api/admin/domain-mappings.js.map +2 -2
- package/dist/modules/customer_accounts/backend/customer_accounts/roles/page.js +1 -3
- package/dist/modules/customer_accounts/backend/customer_accounts/roles/page.js.map +2 -2
- package/dist/modules/customer_accounts/backend/customer_accounts/settings/CustomerAccountsSettingsPageClient.js +84 -0
- package/dist/modules/customer_accounts/backend/customer_accounts/settings/CustomerAccountsSettingsPageClient.js.map +7 -0
- package/dist/modules/customer_accounts/backend/customer_accounts/settings/page.js +7 -81
- package/dist/modules/customer_accounts/backend/customer_accounts/settings/page.js.map +2 -2
- package/dist/modules/customer_accounts/backend/customer_accounts/users/PortalUsersPageClient.js +523 -0
- package/dist/modules/customer_accounts/backend/customer_accounts/users/PortalUsersPageClient.js.map +7 -0
- package/dist/modules/customer_accounts/backend/customer_accounts/users/[id]/PortalUserDetailPageClient.js +731 -0
- package/dist/modules/customer_accounts/backend/customer_accounts/users/[id]/PortalUserDetailPageClient.js.map +7 -0
- package/dist/modules/customer_accounts/backend/customer_accounts/users/[id]/page.js +7 -727
- package/dist/modules/customer_accounts/backend/customer_accounts/users/[id]/page.js.map +2 -2
- package/dist/modules/customer_accounts/backend/customer_accounts/users/page.js +7 -521
- package/dist/modules/customer_accounts/backend/customer_accounts/users/page.js.map +2 -2
- package/dist/modules/customer_accounts/extension-points.js +1 -1
- package/dist/modules/customer_accounts/extension-points.js.map +2 -2
- package/dist/modules/customer_accounts/lib/portalUrl.js +69 -0
- package/dist/modules/customer_accounts/lib/portalUrl.js.map +7 -0
- package/dist/modules/customer_accounts/services/domainMappingService.js +0 -10
- package/dist/modules/customer_accounts/services/domainMappingService.js.map +2 -2
- package/dist/modules/customers/ai-tools/companies-pack.js +1 -4
- package/dist/modules/customers/ai-tools/companies-pack.js.map +2 -2
- package/dist/modules/customers/ai-tools/deal-analyzer-pack.js +2 -13
- package/dist/modules/customers/ai-tools/deal-analyzer-pack.js.map +2 -2
- package/dist/modules/customers/ai-tools/deals-pack.js +6 -52
- package/dist/modules/customers/ai-tools/deals-pack.js.map +2 -2
- package/dist/modules/customers/ai-tools/people-pack.js +1 -4
- package/dist/modules/customers/ai-tools/people-pack.js.map +2 -2
- package/dist/modules/customers/api/activities/route.js +6 -48
- package/dist/modules/customers/api/activities/route.js.map +2 -2
- package/dist/modules/customers/api/companies/[id]/people/route.js +64 -20
- package/dist/modules/customers/api/companies/[id]/people/route.js.map +2 -2
- package/dist/modules/customers/api/companies/[id]/route.js +94 -17
- package/dist/modules/customers/api/companies/[id]/route.js.map +2 -2
- package/dist/modules/customers/api/dashboard/widgets/customer-todos/route.js +5 -8
- package/dist/modules/customers/api/dashboard/widgets/customer-todos/route.js.map +2 -2
- package/dist/modules/customers/api/deals/[id]/companies/route.js +1 -1
- package/dist/modules/customers/api/deals/[id]/companies/route.js.map +2 -2
- package/dist/modules/customers/api/deals/[id]/people/route.js +1 -1
- package/dist/modules/customers/api/deals/[id]/people/route.js.map +2 -2
- package/dist/modules/customers/api/deals/[id]/route.js +25 -8
- package/dist/modules/customers/api/deals/[id]/route.js.map +2 -2
- package/dist/modules/customers/api/deals/[id]/stats/route.js +22 -3
- package/dist/modules/customers/api/deals/[id]/stats/route.js.map +2 -2
- package/dist/modules/customers/api/deals/aggregate/route.js +4 -11
- package/dist/modules/customers/api/deals/aggregate/route.js.map +2 -2
- package/dist/modules/customers/api/deals/map/route.js +1 -2
- package/dist/modules/customers/api/deals/map/route.js.map +2 -2
- package/dist/modules/customers/api/deals/route.js +1 -38
- package/dist/modules/customers/api/deals/route.js.map +2 -2
- package/dist/modules/customers/api/entity-roles-factory.js +4 -4
- package/dist/modules/customers/api/entity-roles-factory.js.map +2 -2
- package/dist/modules/customers/api/interactions/route.js +1 -3
- package/dist/modules/customers/api/interactions/route.js.map +2 -2
- package/dist/modules/customers/api/interactions/tasks/route.js +4 -27
- package/dist/modules/customers/api/interactions/tasks/route.js.map +2 -2
- package/dist/modules/customers/api/people/[id]/companies/[linkId]/route.js +3 -4
- package/dist/modules/customers/api/people/[id]/companies/[linkId]/route.js.map +2 -2
- package/dist/modules/customers/api/people/[id]/companies/context.js +1 -1
- package/dist/modules/customers/api/people/[id]/companies/context.js.map +2 -2
- package/dist/modules/customers/api/people/[id]/companies/enriched/route.js +1 -1
- package/dist/modules/customers/api/people/[id]/companies/enriched/route.js.map +2 -2
- package/dist/modules/customers/api/people/[id]/route.js +10 -11
- package/dist/modules/customers/api/people/[id]/route.js.map +2 -2
- package/dist/modules/customers/api/people/check-phone/route.js +9 -51
- package/dist/modules/customers/api/people/check-phone/route.js.map +2 -2
- package/dist/modules/customers/api/todos/route.js +5 -30
- package/dist/modules/customers/api/todos/route.js.map +2 -2
- package/dist/modules/customers/backend/customers/companies/page.js +4 -6
- package/dist/modules/customers/backend/customers/companies/page.js.map +2 -2
- package/dist/modules/customers/backend/customers/deals/[id]/page.js +1 -6
- package/dist/modules/customers/backend/customers/deals/[id]/page.js.map +2 -2
- package/dist/modules/customers/backend/customers/deals/page.js +4 -7
- package/dist/modules/customers/backend/customers/deals/page.js.map +2 -2
- package/dist/modules/customers/backend/customers/deals/pipeline/components/Lane.js +13 -4
- package/dist/modules/customers/backend/customers/deals/pipeline/components/Lane.js.map +2 -2
- package/dist/modules/customers/backend/customers/deals/pipeline/components/StatusFilterPopover.js +14 -85
- package/dist/modules/customers/backend/customers/deals/pipeline/components/StatusFilterPopover.js.map +2 -2
- package/dist/modules/customers/backend/customers/people/page.js +4 -6
- package/dist/modules/customers/backend/customers/people/page.js.map +2 -2
- package/dist/modules/customers/backend/hooks/useEmailDuplicateCheck.js +3 -9
- package/dist/modules/customers/backend/hooks/useEmailDuplicateCheck.js.map +2 -2
- package/dist/modules/customers/commands/deals.js +34 -21
- package/dist/modules/customers/commands/deals.js.map +2 -2
- package/dist/modules/customers/commands/interactions.js.map +1 -1
- package/dist/modules/customers/commands/personCompanyLinks.js +2 -131
- package/dist/modules/customers/commands/personCompanyLinks.js.map +2 -2
- package/dist/modules/customers/components/CustomerTodosTable.js +0 -1
- package/dist/modules/customers/components/CustomerTodosTable.js.map +2 -2
- package/dist/modules/customers/components/DealsKpiStrip.js +6 -7
- package/dist/modules/customers/components/DealsKpiStrip.js.map +2 -2
- package/dist/modules/customers/components/calendar/AgendaList.js +2 -2
- package/dist/modules/customers/components/calendar/AgendaList.js.map +2 -2
- package/dist/modules/customers/components/calendar/CalendarEventEditor.js +1 -1
- package/dist/modules/customers/components/calendar/CalendarEventEditor.js.map +2 -2
- package/dist/modules/customers/components/calendar/CalendarScreen.js +1 -1
- package/dist/modules/customers/components/calendar/CalendarScreen.js.map +2 -2
- package/dist/modules/customers/components/calendar/CalendarSettingsModal.js +1 -1
- package/dist/modules/customers/components/calendar/CalendarSettingsModal.js.map +2 -2
- package/dist/modules/customers/components/calendar/EventBlock.js +1 -1
- package/dist/modules/customers/components/calendar/EventBlock.js.map +2 -2
- package/dist/modules/customers/components/calendar/EventPeekPopover.js +2 -3
- package/dist/modules/customers/components/calendar/EventPeekPopover.js.map +2 -2
- package/dist/modules/customers/components/calendar/editor/PeopleField.js +5 -40
- package/dist/modules/customers/components/calendar/editor/PeopleField.js.map +2 -2
- package/dist/modules/customers/components/calendar/editor/hooks.js +1 -2
- package/dist/modules/customers/components/calendar/editor/hooks.js.map +2 -2
- package/dist/modules/customers/components/calendar/types.js +1 -1
- package/dist/modules/customers/components/calendar/types.js.map +2 -2
- package/dist/modules/customers/components/detail/AssignRoleDialog.js +33 -28
- package/dist/modules/customers/components/detail/AssignRoleDialog.js.map +2 -2
- package/dist/modules/customers/components/detail/CompanyKpiBar.js +4 -5
- package/dist/modules/customers/components/detail/CompanyKpiBar.js.map +2 -2
- package/dist/modules/customers/components/detail/CompanyPeopleSection.js +1 -3
- package/dist/modules/customers/components/detail/CompanyPeopleSection.js.map +2 -2
- package/dist/modules/customers/components/detail/DealForm.js +7 -19
- package/dist/modules/customers/components/detail/DealForm.js.map +2 -2
- package/dist/modules/customers/components/detail/DealsSection.js +5 -6
- package/dist/modules/customers/components/detail/DealsSection.js.map +2 -2
- package/dist/modules/customers/components/detail/EntityTagsDialog.js +11 -35
- package/dist/modules/customers/components/detail/EntityTagsDialog.js.map +2 -2
- package/dist/modules/customers/components/detail/PersonCompaniesSection.js +1 -3
- package/dist/modules/customers/components/detail/PersonCompaniesSection.js.map +2 -2
- package/dist/modules/customers/components/detail/hooks/usePersonTasks.js +13 -19
- package/dist/modules/customers/components/detail/hooks/usePersonTasks.js.map +2 -2
- package/dist/modules/customers/components/detail/schedule/ParticipantsField.js +4 -4
- package/dist/modules/customers/components/detail/schedule/ParticipantsField.js.map +2 -2
- package/dist/modules/customers/components/detail/schedule/useScheduleFormState.js +3 -3
- package/dist/modules/customers/components/detail/schedule/useScheduleFormState.js.map +2 -2
- package/dist/modules/customers/components/detail/utils.js +5 -5
- package/dist/modules/customers/components/detail/utils.js.map +2 -2
- package/dist/modules/customers/data/entities.js.map +1 -1
- package/dist/modules/customers/data/validators.js +3 -32
- package/dist/modules/customers/data/validators.js.map +2 -2
- package/dist/modules/customers/events.js +0 -5
- package/dist/modules/customers/events.js.map +2 -2
- package/dist/modules/customers/lib/calendar/conflicts.js +2 -8
- package/dist/modules/customers/lib/calendar/conflicts.js.map +2 -2
- package/dist/modules/customers/lib/calendar/editorPayload.js +2 -3
- package/dist/modules/customers/lib/calendar/editorPayload.js.map +2 -2
- package/dist/modules/customers/lib/calendar/mapItem.js +3 -8
- package/dist/modules/customers/lib/calendar/mapItem.js.map +2 -2
- package/dist/modules/customers/lib/dealStatus.js +0 -30
- package/dist/modules/customers/lib/dealStatus.js.map +2 -2
- package/dist/modules/customers/lib/findPeopleByAddresses.js +0 -1
- package/dist/modules/customers/lib/findPeopleByAddresses.js.map +2 -2
- package/dist/modules/customers/lib/personCompanies.js +2 -100
- package/dist/modules/customers/lib/personCompanies.js.map +2 -2
- package/dist/modules/customers/lib/todoCompatibility.js +0 -12
- package/dist/modules/customers/lib/todoCompatibility.js.map +2 -2
- package/dist/modules/dashboards/lib/widgetScope.js +1 -6
- package/dist/modules/dashboards/lib/widgetScope.js.map +2 -2
- package/dist/modules/data_sync/backend/data-sync/page.js +1 -3
- package/dist/modules/data_sync/backend/data-sync/page.js.map +2 -2
- package/dist/modules/data_sync/lib/sync-engine.js +6 -72
- package/dist/modules/data_sync/lib/sync-engine.js.map +2 -2
- package/dist/modules/data_sync/workers/sync-export.js +1 -5
- package/dist/modules/data_sync/workers/sync-export.js.map +2 -2
- package/dist/modules/data_sync/workers/sync-import.js +1 -5
- package/dist/modules/data_sync/workers/sync-import.js.map +2 -2
- package/dist/modules/devices/acl.js +1 -9
- package/dist/modules/devices/acl.js.map +2 -2
- package/dist/modules/devices/api/admin/devices/[id]/route.js +32 -5
- package/dist/modules/devices/api/admin/devices/[id]/route.js.map +2 -2
- package/dist/modules/devices/api/admin/devices/route.js +1 -14
- package/dist/modules/devices/api/admin/devices/route.js.map +2 -2
- package/dist/modules/devices/api/deviceList.js +12 -99
- package/dist/modules/devices/api/deviceList.js.map +2 -2
- package/dist/modules/devices/api/openapi.js +1 -3
- package/dist/modules/devices/api/openapi.js.map +2 -2
- package/dist/modules/devices/api/route.js +1 -9
- package/dist/modules/devices/api/route.js.map +2 -2
- package/dist/modules/devices/backend/devices/[id]/page.js +26 -10
- package/dist/modules/devices/backend/devices/[id]/page.js.map +2 -2
- package/dist/modules/devices/backend/devices/create/page.js +1 -17
- package/dist/modules/devices/backend/devices/create/page.js.map +2 -2
- package/dist/modules/devices/backend/devices/page.js +34 -28
- package/dist/modules/devices/backend/devices/page.js.map +2 -2
- package/dist/modules/devices/setup.js +2 -6
- package/dist/modules/devices/setup.js.map +2 -2
- package/dist/modules/directory/backend/directory/organizations/page.js +1 -2
- package/dist/modules/directory/backend/directory/organizations/page.js.map +2 -2
- package/dist/modules/directory/backend/directory/tenants/page.js +1 -2
- package/dist/modules/directory/backend/directory/tenants/page.js.map +2 -2
- package/dist/modules/directory/di.js +0 -9
- package/dist/modules/directory/di.js.map +2 -2
- package/dist/modules/directory/utils/organizationScope.js.map +2 -2
- package/dist/modules/entities/api/records.js +2 -4
- package/dist/modules/entities/api/records.js.map +2 -2
- package/dist/modules/entities/backend/entities/user/[entityId]/records/page.js +1 -3
- package/dist/modules/entities/backend/entities/user/[entityId]/records/page.js.map +2 -2
- package/dist/modules/eudr/api/plots/route.js +1 -5
- package/dist/modules/eudr/api/plots/route.js.map +2 -2
- package/dist/modules/eudr/backend/eudr/evidence-submissions/[id]/page.meta.js +3 -1
- package/dist/modules/eudr/backend/eudr/evidence-submissions/[id]/page.meta.js.map +2 -2
- package/dist/modules/eudr/backend/eudr/evidence-submissions/create/page.meta.js +1 -0
- package/dist/modules/eudr/backend/eudr/evidence-submissions/create/page.meta.js.map +2 -2
- package/dist/modules/eudr/backend/eudr/evidence-submissions/page.js +0 -3
- package/dist/modules/eudr/backend/eudr/evidence-submissions/page.js.map +2 -2
- package/dist/modules/eudr/backend/eudr/evidence-submissions/page.meta.js +4 -1
- package/dist/modules/eudr/backend/eudr/evidence-submissions/page.meta.js.map +2 -2
- package/dist/modules/eudr/backend/eudr/page.meta.js +2 -2
- package/dist/modules/eudr/backend/eudr/page.meta.js.map +2 -2
- package/dist/modules/eudr/backend/eudr/plots/[id]/page.js +8 -2
- package/dist/modules/eudr/backend/eudr/plots/[id]/page.js.map +2 -2
- package/dist/modules/eudr/backend/eudr/plots/[id]/page.meta.js +3 -1
- package/dist/modules/eudr/backend/eudr/plots/[id]/page.meta.js.map +2 -2
- package/dist/modules/eudr/backend/eudr/plots/create/page.js +8 -2
- package/dist/modules/eudr/backend/eudr/plots/create/page.js.map +2 -2
- package/dist/modules/eudr/backend/eudr/plots/create/page.meta.js +1 -0
- package/dist/modules/eudr/backend/eudr/plots/create/page.meta.js.map +2 -2
- package/dist/modules/eudr/backend/eudr/plots/page.js +0 -3
- package/dist/modules/eudr/backend/eudr/plots/page.js.map +2 -2
- package/dist/modules/eudr/backend/eudr/plots/page.meta.js +4 -1
- package/dist/modules/eudr/backend/eudr/plots/page.meta.js.map +2 -2
- package/dist/modules/eudr/backend/eudr/product-mappings/[id]/page.meta.js +3 -1
- package/dist/modules/eudr/backend/eudr/product-mappings/[id]/page.meta.js.map +2 -2
- package/dist/modules/eudr/backend/eudr/product-mappings/create/page.meta.js +1 -0
- package/dist/modules/eudr/backend/eudr/product-mappings/create/page.meta.js.map +2 -2
- package/dist/modules/eudr/backend/eudr/product-mappings/page.js +0 -3
- package/dist/modules/eudr/backend/eudr/product-mappings/page.js.map +2 -2
- package/dist/modules/eudr/backend/eudr/product-mappings/page.meta.js +4 -1
- package/dist/modules/eudr/backend/eudr/product-mappings/page.meta.js.map +2 -2
- package/dist/modules/eudr/backend/eudr/risk-assessments/[id]/page.meta.js +3 -1
- package/dist/modules/eudr/backend/eudr/risk-assessments/[id]/page.meta.js.map +2 -2
- package/dist/modules/eudr/backend/eudr/risk-assessments/create/page.meta.js +1 -0
- package/dist/modules/eudr/backend/eudr/risk-assessments/create/page.meta.js.map +2 -2
- package/dist/modules/eudr/backend/eudr/risk-assessments/page.js +0 -3
- package/dist/modules/eudr/backend/eudr/risk-assessments/page.js.map +2 -2
- package/dist/modules/eudr/backend/eudr/risk-assessments/page.meta.js +4 -1
- package/dist/modules/eudr/backend/eudr/risk-assessments/page.meta.js.map +2 -2
- package/dist/modules/eudr/backend/eudr/statements/[id]/page.js +2 -0
- package/dist/modules/eudr/backend/eudr/statements/[id]/page.js.map +2 -2
- package/dist/modules/eudr/backend/eudr/statements/[id]/page.meta.js +3 -1
- package/dist/modules/eudr/backend/eudr/statements/[id]/page.meta.js.map +2 -2
- package/dist/modules/eudr/backend/eudr/statements/create/page.meta.js +1 -0
- package/dist/modules/eudr/backend/eudr/statements/create/page.meta.js.map +2 -2
- package/dist/modules/eudr/backend/eudr/statements/page.js +30 -28
- package/dist/modules/eudr/backend/eudr/statements/page.js.map +2 -2
- package/dist/modules/eudr/backend/eudr/statements/page.meta.js +4 -1
- package/dist/modules/eudr/backend/eudr/statements/page.meta.js.map +2 -2
- package/dist/modules/eudr/commands/statements.js +8 -3
- package/dist/modules/eudr/commands/statements.js.map +2 -2
- package/dist/modules/eudr/components/crudErrorI18n.js +21 -1
- package/dist/modules/eudr/components/crudErrorI18n.js.map +2 -2
- package/dist/modules/eudr/components/formConfig.js +6 -2
- package/dist/modules/eudr/components/formConfig.js.map +2 -2
- package/dist/modules/eudr/data/validators.js +1 -4
- package/dist/modules/eudr/data/validators.js.map +2 -2
- package/dist/modules/eudr/lib/statement-lifecycle.js +9 -1
- package/dist/modules/eudr/lib/statement-lifecycle.js.map +2 -2
- package/dist/modules/feature_toggles/components/FeatureTogglesTable.js +0 -1
- package/dist/modules/feature_toggles/components/FeatureTogglesTable.js.map +2 -2
- package/dist/modules/feature_toggles/components/OverridesTable.js +0 -1
- package/dist/modules/feature_toggles/components/OverridesTable.js.map +2 -2
- package/dist/modules/feature_toggles/defaults.json +8 -0
- package/dist/modules/inbox_ops/backend/inbox-ops/log/page.js +0 -3
- package/dist/modules/inbox_ops/backend/inbox-ops/log/page.js.map +2 -2
- package/dist/modules/inbox_ops/backend/inbox-ops/page.js +0 -3
- package/dist/modules/inbox_ops/backend/inbox-ops/page.js.map +2 -2
- package/dist/modules/inbox_ops/lib/htmlToPlainText.js +12 -1
- package/dist/modules/inbox_ops/lib/htmlToPlainText.js.map +2 -2
- package/dist/modules/integrations/api/[id]/credentials/route.js +1 -6
- package/dist/modules/integrations/api/[id]/credentials/route.js.map +2 -2
- package/dist/modules/integrations/backend/integrations/[id]/page.js +29 -38
- package/dist/modules/integrations/backend/integrations/[id]/page.js.map +2 -2
- package/dist/modules/integrations/backend/integrations/bundle/[id]/page.js +9 -36
- package/dist/modules/integrations/backend/integrations/bundle/[id]/page.js.map +2 -2
- package/dist/modules/integrations/data/validators.js +3 -11
- package/dist/modules/integrations/data/validators.js.map +2 -2
- package/dist/modules/integrations/lib/credentials-masking.js +2 -6
- package/dist/modules/integrations/lib/credentials-masking.js.map +2 -2
- package/dist/modules/messages/api/[id]/route.js +1 -29
- package/dist/modules/messages/api/[id]/route.js.map +2 -2
- package/dist/modules/messages/api/openapi.js +2 -17
- package/dist/modules/messages/api/openapi.js.map +2 -2
- package/dist/modules/messages/api/route.js +2 -17
- package/dist/modules/messages/api/route.js.map +2 -2
- package/dist/modules/messages/components/MessagesInboxPageClient.js +14 -7
- package/dist/modules/messages/components/MessagesInboxPageClient.js.map +2 -2
- package/dist/modules/messages/components/inboxFilters.js +0 -15
- package/dist/modules/messages/components/inboxFilters.js.map +2 -2
- package/dist/modules/messages/components/message-detail/hooks/useMessageDetailsConversation.js +1 -11
- package/dist/modules/messages/components/message-detail/hooks/useMessageDetailsConversation.js.map +2 -2
- package/dist/modules/messages/components/message-detail/panels/MessageHeader.js +1 -3
- package/dist/modules/messages/components/message-detail/panels/MessageHeader.js.map +2 -2
- package/dist/modules/messages/components/message-detail/panels/thread-panel.js +1 -2
- package/dist/modules/messages/components/message-detail/panels/thread-panel.js.map +2 -2
- package/dist/modules/messages/components/messageListLabels.js +2 -14
- package/dist/modules/messages/components/messageListLabels.js.map +2 -2
- package/dist/modules/messages/data/validators.js +4 -18
- package/dist/modules/messages/data/validators.js.map +2 -2
- package/dist/modules/payment_gateways/api/webhook/[provider]/route.js +6 -4
- package/dist/modules/payment_gateways/api/webhook/[provider]/route.js.map +2 -2
- package/dist/modules/payment_gateways/backend/payment-gateways/page.js +1 -3
- package/dist/modules/payment_gateways/backend/payment-gateways/page.js.map +2 -2
- package/dist/modules/payment_gateways/lib/webhook-processor.js +0 -7
- package/dist/modules/payment_gateways/lib/webhook-processor.js.map +2 -2
- package/dist/modules/planner/backend/planner/availability-rulesets/page.js +0 -3
- package/dist/modules/planner/backend/planner/availability-rulesets/page.js.map +2 -2
- package/dist/modules/push_notifications/backend/push_notifications/page.js +1 -3
- package/dist/modules/push_notifications/backend/push_notifications/page.js.map +2 -2
- package/dist/modules/push_notifications/backend/push_notifications/send/page.js +1 -1
- package/dist/modules/push_notifications/backend/push_notifications/send/page.js.map +2 -2
- package/dist/modules/query_index/lib/engine.js +51 -150
- package/dist/modules/query_index/lib/engine.js.map +2 -2
- package/dist/modules/query_index/lib/search-tokens.js +3 -79
- package/dist/modules/query_index/lib/search-tokens.js.map +2 -2
- package/dist/modules/resources/backend/resources/resource-types/page.js +1 -3
- package/dist/modules/resources/backend/resources/resource-types/page.js.map +2 -2
- package/dist/modules/resources/backend/resources/resources/page.js +1 -3
- package/dist/modules/resources/backend/resources/resources/page.js.map +2 -2
- package/dist/modules/sales/backend/sales/channels/offers/page.js +0 -3
- package/dist/modules/sales/backend/sales/channels/offers/page.js.map +2 -2
- package/dist/modules/sales/backend/sales/channels/page.js +0 -3
- package/dist/modules/sales/backend/sales/channels/page.js.map +2 -2
- package/dist/modules/sales/backend/sales/documents/[id]/page.js +8 -10
- package/dist/modules/sales/backend/sales/documents/[id]/page.js.map +2 -2
- package/dist/modules/sales/commands/documents.js +1 -79
- package/dist/modules/sales/commands/documents.js.map +2 -2
- package/dist/modules/sales/components/PriceWithCurrency.js +5 -7
- package/dist/modules/sales/components/PriceWithCurrency.js.map +2 -2
- package/dist/modules/sales/components/channels/SalesChannelOffersPanel.js +0 -3
- package/dist/modules/sales/components/channels/SalesChannelOffersPanel.js.map +2 -2
- package/dist/modules/sales/components/documents/AdjustmentsSection.js +6 -8
- package/dist/modules/sales/components/documents/AdjustmentsSection.js.map +2 -2
- package/dist/modules/sales/components/documents/ItemsSection.js +22 -51
- package/dist/modules/sales/components/documents/ItemsSection.js.map +2 -2
- package/dist/modules/sales/components/documents/LineItemDialog.js +19 -84
- package/dist/modules/sales/components/documents/LineItemDialog.js.map +2 -2
- package/dist/modules/sales/components/documents/PaymentsSection.js +9 -23
- package/dist/modules/sales/components/documents/PaymentsSection.js.map +2 -2
- package/dist/modules/sales/components/documents/ReturnsSection.js +6 -8
- package/dist/modules/sales/components/documents/ReturnsSection.js.map +2 -2
- package/dist/modules/sales/components/documents/SalesDocumentsTable.js +14 -68
- package/dist/modules/sales/components/documents/SalesDocumentsTable.js.map +2 -2
- package/dist/modules/sales/components/documents/SalesOrderDraftLines.js +5 -6
- package/dist/modules/sales/components/documents/SalesOrderDraftLines.js.map +2 -2
- package/dist/modules/sales/components/documents/ShipmentDialog.js +4 -5
- package/dist/modules/sales/components/documents/ShipmentDialog.js.map +2 -2
- package/dist/modules/sales/components/documents/ShipmentsSection.js +6 -8
- package/dist/modules/sales/components/documents/ShipmentsSection.js.map +2 -2
- package/dist/modules/sales/components/documents/lineItemUtils.js +2 -2
- package/dist/modules/sales/components/documents/lineItemUtils.js.map +2 -2
- package/dist/modules/sales/data/entities.js +2 -8
- package/dist/modules/sales/data/entities.js.map +2 -2
- package/dist/modules/sales/extension-points.js +0 -1
- package/dist/modules/sales/extension-points.js.map +2 -2
- package/dist/modules/sales/setup.js +0 -2
- package/dist/modules/sales/setup.js.map +2 -2
- package/dist/modules/sales/widgets/injection/document-history/widget.client.js +44 -2
- package/dist/modules/sales/widgets/injection/document-history/widget.client.js.map +2 -2
- package/dist/modules/sales/widgets/injection/payment-gateway-status-column/widget.js +2 -10
- package/dist/modules/sales/widgets/injection/payment-gateway-status-column/widget.js.map +2 -2
- package/dist/modules/sales/widgets/injection-table.js +7 -4
- package/dist/modules/sales/widgets/injection-table.js.map +2 -2
- package/dist/modules/staff/backend/staff/leave-requests/page.js +0 -3
- package/dist/modules/staff/backend/staff/leave-requests/page.js.map +2 -2
- package/dist/modules/staff/backend/staff/my-leave-requests/page.js +0 -3
- package/dist/modules/staff/backend/staff/my-leave-requests/page.js.map +2 -2
- package/dist/modules/staff/backend/staff/team-members/page.js +0 -3
- package/dist/modules/staff/backend/staff/team-members/page.js.map +2 -2
- package/dist/modules/staff/backend/staff/team-roles/page.js +0 -3
- package/dist/modules/staff/backend/staff/team-roles/page.js.map +2 -2
- package/dist/modules/staff/backend/staff/teams/[id]/edit/page.js +0 -3
- package/dist/modules/staff/backend/staff/teams/[id]/edit/page.js.map +2 -2
- package/dist/modules/staff/backend/staff/teams/page.js +0 -3
- package/dist/modules/staff/backend/staff/teams/page.js.map +2 -2
- package/dist/modules/staff/backend/staff/timesheets/page.js +18 -29
- package/dist/modules/staff/backend/staff/timesheets/page.js.map +2 -2
- package/dist/modules/staff/backend/staff/timesheets/projects/page.js +0 -3
- package/dist/modules/staff/backend/staff/timesheets/projects/page.js.map +2 -2
- package/dist/modules/sync_excel/lib/adapters/customers.js +0 -1
- package/dist/modules/sync_excel/lib/adapters/customers.js.map +2 -2
- package/dist/modules/warranty_claims/api/assignees/route.js +3 -3
- package/dist/modules/warranty_claims/api/assignees/route.js.map +2 -2
- package/dist/modules/warranty_claims/api/portal/attachments/route.js +2 -2
- package/dist/modules/warranty_claims/api/portal/attachments/route.js.map +2 -2
- package/dist/modules/warranty_claims/api/portal/claims/route.js +9 -12
- package/dist/modules/warranty_claims/api/portal/claims/route.js.map +2 -2
- package/dist/modules/warranty_claims/backend/page.js +0 -3
- package/dist/modules/warranty_claims/backend/page.js.map +2 -2
- package/dist/modules/warranty_claims/backend/warranty_claims/registrations/page.js +0 -3
- package/dist/modules/warranty_claims/backend/warranty_claims/registrations/page.js.map +2 -2
- package/dist/modules/warranty_claims/backend/warranty_claims/troubleshooting-guides/page.js +0 -3
- package/dist/modules/warranty_claims/backend/warranty_claims/troubleshooting-guides/page.js.map +2 -2
- package/dist/modules/warranty_claims/backend/warranty_claims/vendor-policies/page.js +0 -3
- package/dist/modules/warranty_claims/backend/warranty_claims/vendor-policies/page.js.map +2 -2
- package/dist/modules/warranty_claims/frontend/[orgSlug]/portal/claims/page.js +0 -3
- package/dist/modules/warranty_claims/frontend/[orgSlug]/portal/claims/page.js.map +2 -2
- package/dist/modules/wms/api/warehouses/route.js +9 -13
- package/dist/modules/wms/api/warehouses/route.js.map +2 -2
- package/dist/modules/wms/api/zones/route.js +2 -15
- package/dist/modules/wms/api/zones/route.js.map +2 -2
- package/dist/modules/wms/commands/configuration.js +9 -121
- package/dist/modules/wms/commands/configuration.js.map +2 -2
- package/dist/modules/wms/commands/inventory-actions.js +0 -3
- package/dist/modules/wms/commands/inventory-actions.js.map +2 -2
- package/dist/modules/wms/commands/shared.js +1 -9
- package/dist/modules/wms/commands/shared.js.map +2 -2
- package/dist/modules/wms/components/backend/WmsConfigurationPage.js +111 -76
- package/dist/modules/wms/components/backend/WmsConfigurationPage.js.map +3 -3
- package/dist/modules/wms/components/backend/WmsInventoryConsolePage.js +0 -1
- package/dist/modules/wms/components/backend/WmsInventoryConsolePage.js.map +2 -2
- package/dist/modules/wms/components/backend/WmsLocationDetailPage.js +20 -16
- package/dist/modules/wms/components/backend/WmsLocationDetailPage.js.map +2 -2
- package/dist/modules/wms/components/backend/WmsLotDetailPage.js +10 -6
- package/dist/modules/wms/components/backend/WmsLotDetailPage.js.map +2 -2
- package/dist/modules/wms/components/backend/WmsLotsListPage.js +0 -1
- package/dist/modules/wms/components/backend/WmsLotsListPage.js.map +2 -2
- package/dist/modules/wms/components/backend/WmsOperationalDashboardPage.js +11 -7
- package/dist/modules/wms/components/backend/WmsOperationalDashboardPage.js.map +2 -2
- package/dist/modules/wms/components/backend/WmsSkuDetailPage.js +10 -6
- package/dist/modules/wms/components/backend/WmsSkuDetailPage.js.map +2 -2
- package/dist/modules/wms/components/backend/inventoryMutationLoaders.js +20 -27
- package/dist/modules/wms/components/backend/inventoryMutationLoaders.js.map +2 -2
- package/dist/modules/workflows/backend/definitions/page.js +1 -3
- package/dist/modules/workflows/backend/definitions/page.js.map +2 -2
- package/dist/modules/workflows/backend/events/page.js +1 -3
- package/dist/modules/workflows/backend/events/page.js.map +2 -2
- package/dist/modules/workflows/backend/instances/page.js +1 -3
- package/dist/modules/workflows/backend/instances/page.js.map +2 -2
- package/dist/modules/workflows/backend/tasks/page.js +1 -3
- package/dist/modules/workflows/backend/tasks/page.js.map +2 -2
- package/dist/modules/workflows/lib/activity-executor.js +0 -4
- package/dist/modules/workflows/lib/activity-executor.js.map +2 -2
- package/package.json +10 -9
- package/src/helpers/integration/api.ts +1 -33
- package/src/helpers/integration/communicationChannelsFixtures.ts +1 -69
- package/src/modules/api_keys/api/keys/route.ts +1 -3
- package/src/modules/api_keys/backend/api-keys/page.tsx +1 -4
- package/src/modules/attachments/AGENTS.md +0 -15
- package/src/modules/attachments/api/route.ts +2 -2
- package/src/modules/attachments/components/AttachmentLibrary.tsx +0 -3
- package/src/modules/attachments/di.ts +0 -16
- package/src/modules/attachments/i18n/de.json +0 -5
- package/src/modules/attachments/i18n/en.json +0 -5
- package/src/modules/attachments/i18n/es.json +0 -5
- package/src/modules/attachments/i18n/ko.json +0 -5
- package/src/modules/attachments/i18n/pl.json +0 -5
- package/src/modules/attachments/index.ts +0 -10
- package/src/modules/attachments/lib/scoped-upload-service.ts +0 -46
- package/src/modules/attachments/lib/upload-limits.ts +2 -6
- package/src/modules/audit_logs/backend/audit-logs/page.tsx +0 -8
- package/src/modules/audit_logs/lib/display-helpers.tsx +32 -42
- package/src/modules/audit_logs/services/actionLogService.ts +11 -74
- package/src/modules/auth/acl.ts +6 -30
- package/src/modules/auth/api/feature-check.ts +3 -10
- package/src/modules/auth/api/login.ts +24 -9
- package/src/modules/auth/api/roles/acl/route.ts +39 -42
- package/src/modules/auth/api/routeError.ts +30 -0
- package/src/modules/auth/api/session/refresh.ts +1 -32
- package/src/modules/auth/api/users/acl/route.ts +101 -185
- package/src/modules/auth/api/users/route.ts +5 -18
- package/src/modules/auth/backend/roles/[id]/edit/page.meta.ts +2 -5
- package/src/modules/auth/backend/roles/page.tsx +2 -4
- package/src/modules/auth/backend/users/[id]/edit/page.meta.ts +2 -5
- package/src/modules/auth/backend/users/page.tsx +2 -3
- package/src/modules/auth/components/AclEditor.tsx +33 -63
- package/src/modules/auth/data/entities.ts +1 -4
- package/src/modules/auth/data/validators.ts +0 -5
- package/src/modules/auth/di.ts +16 -46
- package/src/modules/auth/frontend/reset/[token]/page.tsx +0 -74
- package/src/modules/auth/i18n/de.json +0 -389
- package/src/modules/auth/i18n/en.json +0 -389
- package/src/modules/auth/i18n/es.json +0 -389
- package/src/modules/auth/i18n/ko.json +0 -389
- package/src/modules/auth/i18n/pl.json +2 -391
- package/src/modules/auth/lib/grantChecks.ts +0 -6
- package/src/modules/auth/services/authService.ts +2 -18
- package/src/modules/auth/services/rbacService.ts +24 -110
- package/src/modules/business_rules/backend/logs/page.tsx +1 -4
- package/src/modules/business_rules/backend/rules/[id]/page.meta.ts +5 -0
- package/src/modules/business_rules/backend/rules/create/page.meta.ts +5 -1
- package/src/modules/business_rules/backend/rules/page.tsx +1 -4
- package/src/modules/business_rules/backend/sets/[id]/page.meta.ts +5 -0
- package/src/modules/business_rules/backend/sets/create/page.meta.ts +5 -1
- package/src/modules/business_rules/backend/sets/page.tsx +1 -4
- package/src/modules/business_rules/lib/expression-evaluator.ts +9 -9
- package/src/modules/business_rules/lib/rule-evaluator.ts +9 -10
- package/src/modules/catalog/ai-agents.ts +1 -1
- package/src/modules/catalog/ai-tools/merchandising-pack.ts +2 -2
- package/src/modules/catalog/backend/catalog/products/MerchandisingAssistantSheet.tsx +5 -12
- package/src/modules/catalog/components/categories/CategoriesDataTable.tsx +0 -3
- package/src/modules/catalog/components/products/ProductsDataTable.tsx +0 -7
- package/src/modules/catalog/i18n/de.json +0 -1
- package/src/modules/catalog/i18n/en.json +0 -1
- package/src/modules/catalog/i18n/es.json +0 -1
- package/src/modules/catalog/i18n/ko.json +0 -1
- package/src/modules/catalog/i18n/pl.json +0 -1
- package/src/modules/catalog/widgets/injection/merchandising-assistant-trigger/widget.client.tsx +0 -4
- package/src/modules/communication_channels/api/post/channels/[id]/test-send/route.ts +1 -17
- package/src/modules/communication_channels/api/post/test-seed/route.ts +16 -155
- package/src/modules/communication_channels/backend/communication_channels/channels/page.tsx +0 -4
- package/src/modules/communication_channels/commands/ingest-inbound-message.ts +1 -38
- package/src/modules/communication_channels/di.ts +0 -7
- package/src/modules/communication_channels/lib/adapter.ts +0 -14
- package/src/modules/communication_channels/lib/email-capabilities.ts +0 -4
- package/src/modules/communication_channels/lib/test-seed.ts +4 -64
- package/src/modules/configs/i18n/de.json +0 -2
- package/src/modules/configs/i18n/en.json +0 -2
- package/src/modules/configs/i18n/es.json +0 -2
- package/src/modules/configs/i18n/ko.json +0 -2
- package/src/modules/configs/i18n/pl.json +0 -2
- package/src/modules/configs/lib/system-status.ts +0 -9
- package/src/modules/currencies/backend/currencies/page.tsx +1 -4
- package/src/modules/currencies/backend/exchange-rates/page.tsx +1 -4
- package/src/modules/customer_accounts/api/admin/domain-mappings.ts +0 -7
- package/src/modules/customer_accounts/backend/customer_accounts/roles/page.tsx +1 -4
- package/src/modules/customer_accounts/backend/customer_accounts/settings/CustomerAccountsSettingsPageClient.tsx +138 -0
- package/src/modules/customer_accounts/backend/customer_accounts/settings/page.tsx +8 -132
- package/src/modules/customer_accounts/backend/customer_accounts/users/PortalUsersPageClient.tsx +598 -0
- package/src/modules/customer_accounts/backend/customer_accounts/users/[id]/PortalUserDetailPageClient.tsx +838 -0
- package/src/modules/customer_accounts/backend/customer_accounts/users/[id]/page.tsx +6 -838
- package/src/modules/customer_accounts/backend/customer_accounts/users/page.tsx +6 -590
- package/src/modules/customer_accounts/extension-points.ts +1 -1
- package/src/modules/customer_accounts/lib/portalUrl.ts +112 -0
- package/src/modules/customer_accounts/services/domainMappingService.ts +0 -10
- package/src/modules/customers/ai-tools/companies-pack.ts +1 -4
- package/src/modules/customers/ai-tools/deal-analyzer-pack.ts +2 -17
- package/src/modules/customers/ai-tools/deals-pack.ts +1 -66
- package/src/modules/customers/ai-tools/people-pack.ts +1 -4
- package/src/modules/customers/api/activities/route.ts +0 -45
- package/src/modules/customers/api/companies/[id]/people/route.ts +73 -24
- package/src/modules/customers/api/companies/[id]/route.ts +107 -24
- package/src/modules/customers/api/dashboard/widgets/customer-todos/route.ts +8 -16
- package/src/modules/customers/api/deals/[id]/companies/route.ts +1 -4
- package/src/modules/customers/api/deals/[id]/people/route.ts +1 -4
- package/src/modules/customers/api/deals/[id]/route.ts +28 -17
- package/src/modules/customers/api/deals/[id]/stats/route.ts +25 -10
- package/src/modules/customers/api/deals/aggregate/route.ts +4 -14
- package/src/modules/customers/api/deals/map/route.ts +0 -1
- package/src/modules/customers/api/deals/route.ts +1 -50
- package/src/modules/customers/api/entity-roles-factory.ts +4 -8
- package/src/modules/customers/api/interactions/route.ts +2 -8
- package/src/modules/customers/api/interactions/tasks/route.ts +1 -24
- package/src/modules/customers/api/people/[id]/companies/[linkId]/route.ts +4 -12
- package/src/modules/customers/api/people/[id]/companies/context.ts +1 -4
- package/src/modules/customers/api/people/[id]/companies/enriched/route.ts +1 -4
- package/src/modules/customers/api/people/[id]/route.ts +11 -16
- package/src/modules/customers/api/people/check-phone/route.ts +10 -75
- package/src/modules/customers/api/todos/route.ts +2 -27
- package/src/modules/customers/backend/customers/companies/page.tsx +4 -7
- package/src/modules/customers/backend/customers/deals/[id]/page.tsx +2 -7
- package/src/modules/customers/backend/customers/deals/page.tsx +4 -10
- package/src/modules/customers/backend/customers/deals/pipeline/components/Lane.tsx +14 -5
- package/src/modules/customers/backend/customers/deals/pipeline/components/StatusFilterPopover.tsx +27 -109
- package/src/modules/customers/backend/customers/people/page.tsx +4 -7
- package/src/modules/customers/backend/hooks/useEmailDuplicateCheck.ts +4 -12
- package/src/modules/customers/commands/deals.ts +59 -34
- package/src/modules/customers/commands/interactions.ts +1 -1
- package/src/modules/customers/commands/personCompanyLinks.ts +8 -224
- package/src/modules/customers/components/CustomerTodosTable.tsx +0 -2
- package/src/modules/customers/components/DealsKpiStrip.tsx +7 -7
- package/src/modules/customers/components/calendar/AgendaList.tsx +3 -3
- package/src/modules/customers/components/calendar/CalendarEventEditor.tsx +1 -1
- package/src/modules/customers/components/calendar/CalendarScreen.tsx +1 -1
- package/src/modules/customers/components/calendar/CalendarSettingsModal.tsx +1 -1
- package/src/modules/customers/components/calendar/EventBlock.tsx +2 -2
- package/src/modules/customers/components/calendar/EventPeekPopover.tsx +2 -4
- package/src/modules/customers/components/calendar/editor/PeopleField.tsx +5 -61
- package/src/modules/customers/components/calendar/editor/hooks.ts +1 -7
- package/src/modules/customers/components/calendar/types.ts +2 -2
- package/src/modules/customers/components/detail/AssignRoleDialog.tsx +12 -7
- package/src/modules/customers/components/detail/CompanyKpiBar.tsx +4 -5
- package/src/modules/customers/components/detail/CompanyPeopleSection.tsx +1 -8
- package/src/modules/customers/components/detail/DealForm.tsx +2 -22
- package/src/modules/customers/components/detail/DealsSection.tsx +5 -11
- package/src/modules/customers/components/detail/EntityTagsDialog.tsx +12 -58
- package/src/modules/customers/components/detail/PersonCompaniesSection.tsx +1 -8
- package/src/modules/customers/components/detail/hooks/usePersonTasks.ts +14 -23
- package/src/modules/customers/components/detail/schedule/ParticipantsField.tsx +5 -5
- package/src/modules/customers/components/detail/schedule/useScheduleFormState.ts +5 -5
- package/src/modules/customers/components/detail/types.ts +1 -1
- package/src/modules/customers/components/detail/utils.ts +5 -15
- package/src/modules/customers/data/entities.ts +1 -1
- package/src/modules/customers/data/validators.ts +9 -50
- package/src/modules/customers/events.ts +0 -5
- package/src/modules/customers/i18n/de.json +1 -9
- package/src/modules/customers/i18n/en.json +1 -9
- package/src/modules/customers/i18n/es.json +1 -9
- package/src/modules/customers/i18n/ko.json +1 -9
- package/src/modules/customers/i18n/pl.json +1 -9
- package/src/modules/customers/lib/calendar/conflicts.ts +2 -10
- package/src/modules/customers/lib/calendar/editorPayload.ts +3 -4
- package/src/modules/customers/lib/calendar/mapItem.ts +3 -8
- package/src/modules/customers/lib/dealStatus.ts +0 -42
- package/src/modules/customers/lib/findPeopleByAddresses.ts +6 -8
- package/src/modules/customers/lib/personCompanies.ts +1 -136
- package/src/modules/customers/lib/todoCompatibility.ts +1 -19
- package/src/modules/dashboards/i18n/es.json +4 -4
- package/src/modules/dashboards/i18n/pl.json +7 -7
- package/src/modules/dashboards/lib/widgetScope.ts +0 -6
- package/src/modules/data_sync/AGENTS.md +1 -1
- package/src/modules/data_sync/backend/data-sync/page.tsx +1 -4
- package/src/modules/data_sync/lib/adapter.ts +0 -36
- package/src/modules/data_sync/lib/sync-engine.ts +5 -113
- package/src/modules/data_sync/workers/sync-export.ts +0 -4
- package/src/modules/data_sync/workers/sync-import.ts +0 -4
- package/src/modules/devices/AGENTS.md +1 -20
- package/src/modules/devices/acl.ts +1 -9
- package/src/modules/devices/api/admin/devices/[id]/route.ts +34 -5
- package/src/modules/devices/api/admin/devices/route.ts +1 -14
- package/src/modules/devices/api/deviceList.ts +11 -135
- package/src/modules/devices/api/openapi.ts +1 -9
- package/src/modules/devices/api/route.ts +1 -9
- package/src/modules/devices/backend/devices/[id]/page.tsx +32 -18
- package/src/modules/devices/backend/devices/create/page.tsx +1 -17
- package/src/modules/devices/backend/devices/page.tsx +45 -44
- package/src/modules/devices/i18n/de.json +2 -3
- package/src/modules/devices/i18n/en.json +2 -3
- package/src/modules/devices/i18n/es.json +2 -3
- package/src/modules/devices/i18n/ko.json +2 -3
- package/src/modules/devices/i18n/pl.json +2 -3
- package/src/modules/devices/setup.ts +2 -6
- package/src/modules/directory/backend/directory/organizations/page.tsx +1 -3
- package/src/modules/directory/backend/directory/tenants/page.tsx +1 -3
- package/src/modules/directory/di.ts +2 -14
- package/src/modules/directory/utils/organizationScope.ts +15 -4
- package/src/modules/entities/api/records.ts +0 -2
- package/src/modules/entities/backend/entities/user/[entityId]/records/page.tsx +1 -4
- package/src/modules/eudr/api/plots/route.ts +0 -4
- package/src/modules/eudr/backend/eudr/evidence-submissions/[id]/page.meta.ts +2 -0
- package/src/modules/eudr/backend/eudr/evidence-submissions/create/page.meta.ts +1 -0
- package/src/modules/eudr/backend/eudr/evidence-submissions/page.meta.ts +4 -1
- package/src/modules/eudr/backend/eudr/evidence-submissions/page.tsx +0 -4
- package/src/modules/eudr/backend/eudr/page.meta.ts +2 -2
- package/src/modules/eudr/backend/eudr/plots/[id]/page.meta.ts +2 -0
- package/src/modules/eudr/backend/eudr/plots/[id]/page.tsx +8 -2
- package/src/modules/eudr/backend/eudr/plots/create/page.meta.ts +1 -0
- package/src/modules/eudr/backend/eudr/plots/create/page.tsx +8 -2
- package/src/modules/eudr/backend/eudr/plots/page.meta.ts +4 -1
- package/src/modules/eudr/backend/eudr/plots/page.tsx +0 -4
- package/src/modules/eudr/backend/eudr/product-mappings/[id]/page.meta.ts +2 -0
- package/src/modules/eudr/backend/eudr/product-mappings/create/page.meta.ts +1 -0
- package/src/modules/eudr/backend/eudr/product-mappings/page.meta.ts +4 -1
- package/src/modules/eudr/backend/eudr/product-mappings/page.tsx +0 -4
- package/src/modules/eudr/backend/eudr/risk-assessments/[id]/page.meta.ts +2 -0
- package/src/modules/eudr/backend/eudr/risk-assessments/create/page.meta.ts +1 -0
- package/src/modules/eudr/backend/eudr/risk-assessments/page.meta.ts +4 -1
- package/src/modules/eudr/backend/eudr/risk-assessments/page.tsx +0 -4
- package/src/modules/eudr/backend/eudr/statements/[id]/page.meta.ts +2 -0
- package/src/modules/eudr/backend/eudr/statements/[id]/page.tsx +2 -0
- package/src/modules/eudr/backend/eudr/statements/create/page.meta.ts +1 -0
- package/src/modules/eudr/backend/eudr/statements/page.meta.ts +4 -1
- package/src/modules/eudr/backend/eudr/statements/page.tsx +32 -30
- package/src/modules/eudr/commands/statements.ts +7 -2
- package/src/modules/eudr/components/crudErrorI18n.ts +31 -0
- package/src/modules/eudr/components/formConfig.tsx +9 -1
- package/src/modules/eudr/data/validators.ts +1 -16
- package/src/modules/eudr/i18n/de.json +3 -2
- package/src/modules/eudr/i18n/en.json +3 -2
- package/src/modules/eudr/i18n/es.json +3 -2
- package/src/modules/eudr/i18n/ko.json +3 -2
- package/src/modules/eudr/i18n/pl.json +3 -2
- package/src/modules/eudr/lib/statement-lifecycle.ts +8 -0
- package/src/modules/feature_toggles/components/FeatureTogglesTable.tsx +1 -2
- package/src/modules/feature_toggles/components/OverridesTable.tsx +1 -2
- package/src/modules/feature_toggles/defaults.json +8 -0
- package/src/modules/inbox_ops/backend/inbox-ops/log/page.tsx +0 -4
- package/src/modules/inbox_ops/backend/inbox-ops/page.tsx +0 -4
- package/src/modules/inbox_ops/lib/htmlToPlainText.ts +17 -1
- package/src/modules/integrations/api/[id]/credentials/route.ts +4 -6
- package/src/modules/integrations/backend/integrations/[id]/page.tsx +31 -61
- package/src/modules/integrations/backend/integrations/bundle/[id]/page.tsx +9 -44
- package/src/modules/integrations/data/validators.ts +2 -12
- package/src/modules/integrations/i18n/de.json +0 -1
- package/src/modules/integrations/i18n/en.json +0 -1
- package/src/modules/integrations/i18n/es.json +0 -1
- package/src/modules/integrations/i18n/ko.json +0 -1
- package/src/modules/integrations/i18n/pl.json +0 -1
- package/src/modules/integrations/lib/credentials-masking.ts +6 -10
- package/src/modules/messages/api/[id]/route.ts +1 -55
- package/src/modules/messages/api/openapi.ts +0 -20
- package/src/modules/messages/api/route.ts +2 -31
- package/src/modules/messages/components/MessagesInboxPageClient.tsx +16 -9
- package/src/modules/messages/components/inboxFilters.ts +0 -36
- package/src/modules/messages/components/message-detail/hooks/useMessageDetailsConversation.ts +1 -14
- package/src/modules/messages/components/message-detail/panels/MessageHeader.tsx +1 -3
- package/src/modules/messages/components/message-detail/panels/thread-panel.tsx +1 -2
- package/src/modules/messages/components/message-detail/types.ts +0 -3
- package/src/modules/messages/components/messageListLabels.ts +3 -52
- package/src/modules/messages/data/validators.ts +4 -43
- package/src/modules/payment_gateways/api/webhook/[provider]/route.ts +6 -4
- package/src/modules/payment_gateways/backend/payment-gateways/page.tsx +1 -4
- package/src/modules/payment_gateways/lib/webhook-processor.ts +0 -11
- package/src/modules/planner/backend/planner/availability-rulesets/page.tsx +0 -4
- package/src/modules/push_notifications/backend/push_notifications/page.tsx +1 -4
- package/src/modules/push_notifications/backend/push_notifications/send/page.tsx +4 -4
- package/src/modules/query_index/lib/engine.ts +61 -249
- package/src/modules/query_index/lib/search-tokens.ts +3 -135
- package/src/modules/resources/backend/resources/resource-types/page.tsx +1 -4
- package/src/modules/resources/backend/resources/resources/page.tsx +1 -4
- package/src/modules/sales/backend/sales/channels/offers/page.tsx +0 -4
- package/src/modules/sales/backend/sales/channels/page.tsx +0 -4
- package/src/modules/sales/backend/sales/documents/[id]/page.tsx +8 -14
- package/src/modules/sales/commands/documents.ts +0 -93
- package/src/modules/sales/components/PriceWithCurrency.tsx +5 -17
- package/src/modules/sales/components/channels/SalesChannelOffersPanel.tsx +0 -4
- package/src/modules/sales/components/documents/AdjustmentsSection.tsx +5 -6
- package/src/modules/sales/components/documents/ItemsSection.tsx +18 -56
- package/src/modules/sales/components/documents/LineItemDialog.tsx +21 -138
- package/src/modules/sales/components/documents/PaymentsSection.tsx +9 -20
- package/src/modules/sales/components/documents/ReturnsSection.tsx +5 -6
- package/src/modules/sales/components/documents/SalesDocumentsTable.tsx +14 -106
- package/src/modules/sales/components/documents/SalesOrderDraftLines.tsx +5 -6
- package/src/modules/sales/components/documents/ShipmentDialog.tsx +4 -5
- package/src/modules/sales/components/documents/ShipmentsSection.tsx +5 -6
- package/src/modules/sales/components/documents/lineItemUtils.ts +2 -7
- package/src/modules/sales/data/entities.ts +0 -6
- package/src/modules/sales/extension-points.ts +0 -1
- package/src/modules/sales/i18n/de.json +37 -8
- package/src/modules/sales/i18n/en.json +37 -8
- package/src/modules/sales/i18n/es.json +37 -8
- package/src/modules/sales/i18n/ko.json +37 -8
- package/src/modules/sales/i18n/pl.json +37 -8
- package/src/modules/sales/migrations/.snapshot-open-mercato.json +0 -60
- package/src/modules/sales/setup.ts +0 -2
- package/src/modules/sales/widgets/injection/document-history/widget.client.tsx +42 -2
- package/src/modules/sales/widgets/injection/payment-gateway-status-column/widget.ts +1 -9
- package/src/modules/sales/widgets/injection-table.ts +7 -4
- package/src/modules/staff/backend/staff/leave-requests/page.tsx +0 -4
- package/src/modules/staff/backend/staff/my-leave-requests/page.tsx +0 -4
- package/src/modules/staff/backend/staff/team-members/page.tsx +0 -6
- package/src/modules/staff/backend/staff/team-roles/page.tsx +0 -4
- package/src/modules/staff/backend/staff/teams/[id]/edit/page.tsx +0 -4
- package/src/modules/staff/backend/staff/teams/page.tsx +0 -4
- package/src/modules/staff/backend/staff/timesheets/page.tsx +1 -12
- package/src/modules/staff/backend/staff/timesheets/projects/page.tsx +0 -4
- package/src/modules/sync_excel/lib/adapters/customers.ts +0 -5
- package/src/modules/warranty_claims/api/assignees/route.ts +3 -3
- package/src/modules/warranty_claims/api/portal/attachments/route.ts +2 -2
- package/src/modules/warranty_claims/api/portal/claims/route.ts +9 -12
- package/src/modules/warranty_claims/backend/page.tsx +0 -4
- package/src/modules/warranty_claims/backend/warranty_claims/registrations/page.tsx +0 -4
- package/src/modules/warranty_claims/backend/warranty_claims/troubleshooting-guides/page.tsx +0 -4
- package/src/modules/warranty_claims/backend/warranty_claims/vendor-policies/page.tsx +0 -4
- package/src/modules/warranty_claims/frontend/[orgSlug]/portal/claims/page.tsx +0 -4
- package/src/modules/wms/api/warehouses/route.ts +9 -13
- package/src/modules/wms/api/zones/route.ts +0 -16
- package/src/modules/wms/commands/configuration.ts +10 -159
- package/src/modules/wms/commands/inventory-actions.ts +0 -3
- package/src/modules/wms/commands/shared.ts +0 -17
- package/src/modules/wms/components/backend/WmsConfigurationPage.tsx +141 -95
- package/src/modules/wms/components/backend/WmsInventoryConsolePage.tsx +0 -2
- package/src/modules/wms/components/backend/WmsLocationDetailPage.tsx +30 -26
- package/src/modules/wms/components/backend/WmsLotDetailPage.tsx +21 -17
- package/src/modules/wms/components/backend/WmsLotsListPage.tsx +0 -2
- package/src/modules/wms/components/backend/WmsOperationalDashboardPage.tsx +17 -13
- package/src/modules/wms/components/backend/WmsSkuDetailPage.tsx +16 -12
- package/src/modules/wms/components/backend/inventoryMutationLoaders.ts +20 -36
- package/src/modules/wms/i18n/de.json +0 -2
- package/src/modules/wms/i18n/en.json +0 -2
- package/src/modules/wms/i18n/es.json +0 -2
- package/src/modules/wms/i18n/ko.json +0 -2
- package/src/modules/wms/i18n/pl.json +0 -2
- package/src/modules/workflows/backend/definitions/page.tsx +1 -4
- package/src/modules/workflows/backend/events/page.tsx +1 -4
- package/src/modules/workflows/backend/instances/page.tsx +1 -4
- package/src/modules/workflows/backend/tasks/page.tsx +1 -4
- package/src/modules/workflows/lib/activity-executor.ts +0 -9
- package/dist/modules/api_keys/di.js +0 -9
- package/dist/modules/api_keys/di.js.map +0 -7
- package/dist/modules/api_keys/services/principalService.js +0 -31
- package/dist/modules/api_keys/services/principalService.js.map +0 -7
- package/dist/modules/attachments/lib/attachment-service.js +0 -313
- package/dist/modules/attachments/lib/attachment-service.js.map +0 -7
- package/dist/modules/auth/api/reset/validate.js +0 -55
- package/dist/modules/auth/api/reset/validate.js.map +0 -7
- package/dist/modules/auth/commands/acl.js +0 -254
- package/dist/modules/auth/commands/acl.js.map +0 -7
- package/dist/modules/auth/lib/userIdFilter.js +0 -16
- package/dist/modules/auth/lib/userIdFilter.js.map +0 -7
- package/dist/modules/auth/services/principalService.js +0 -200
- package/dist/modules/auth/services/principalService.js.map +0 -7
- package/dist/modules/auth/services/roleOrganizationScope.js +0 -41
- package/dist/modules/auth/services/roleOrganizationScope.js.map +0 -7
- package/dist/modules/communication_channels/lib/outbound-recipient.js +0 -33
- package/dist/modules/communication_channels/lib/outbound-recipient.js.map +0 -7
- package/dist/modules/communication_channels/lib/resolve-channel-type.js +0 -51
- package/dist/modules/communication_channels/lib/resolve-channel-type.js.map +0 -7
- package/dist/modules/customers/backend/customers/deals/pipeline/components/toneClasses.js +0 -18
- package/dist/modules/customers/backend/customers/deals/pipeline/components/toneClasses.js.map +0 -7
- package/dist/modules/customers/lib/calendar/participantIdentity.js +0 -9
- package/dist/modules/customers/lib/calendar/participantIdentity.js.map +0 -7
- package/dist/modules/customers/lib/closureStage.js +0 -45
- package/dist/modules/customers/lib/closureStage.js.map +0 -7
- package/dist/modules/customers/lib/detailReadAccess.js +0 -12
- package/dist/modules/customers/lib/detailReadAccess.js.map +0 -7
- package/dist/modules/data_sync/lib/abandoned-run.js +0 -19
- package/dist/modules/data_sync/lib/abandoned-run.js.map +0 -7
- package/dist/modules/devices/api/deviceSerialization.js +0 -46
- package/dist/modules/devices/api/deviceSerialization.js.map +0 -7
- package/dist/modules/devices/backend/devices/useDeviceUserLabels.js +0 -34
- package/dist/modules/devices/backend/devices/useDeviceUserLabels.js.map +0 -7
- package/dist/modules/devices/backend/devices/userOptions.js +0 -52
- package/dist/modules/devices/backend/devices/userOptions.js.map +0 -7
- package/dist/modules/directory/services/organizationHierarchyService.js +0 -29
- package/dist/modules/directory/services/organizationHierarchyService.js.map +0 -7
- package/dist/modules/directory/services/organizationScopeService.js +0 -56
- package/dist/modules/directory/services/organizationScopeService.js.map +0 -7
- package/dist/modules/integrations/backend/integrations/credential-secret-fields.js +0 -55
- package/dist/modules/integrations/backend/integrations/credential-secret-fields.js.map +0 -7
- package/dist/modules/messages/lib/channel-sender-identity.js +0 -26
- package/dist/modules/messages/lib/channel-sender-identity.js.map +0 -7
- package/dist/modules/messages/lib/composeSourceChannelType.js +0 -41
- package/dist/modules/messages/lib/composeSourceChannelType.js.map +0 -7
- package/dist/modules/query_index/lib/search-entity-policy.js +0 -14
- package/dist/modules/query_index/lib/search-entity-policy.js.map +0 -7
- package/dist/modules/sales/components/documents/lineItemShipmentLock.js +0 -54
- package/dist/modules/sales/components/documents/lineItemShipmentLock.js.map +0 -7
- package/dist/modules/sales/lib/salesChannelsToggleSeed.js +0 -33
- package/dist/modules/sales/lib/salesChannelsToggleSeed.js.map +0 -7
- package/dist/modules/sales/migrations/Migration20260821120000_sales_notes_addresses_context_idx.js +0 -32
- package/dist/modules/sales/migrations/Migration20260821120000_sales_notes_addresses_context_idx.js.map +0 -7
- package/dist/modules/wms/api/warehouseSearch.js +0 -21
- package/dist/modules/wms/api/warehouseSearch.js.map +0 -7
- package/dist/modules/wms/components/backend/WarehouseEditDialog.js +0 -158
- package/dist/modules/wms/components/backend/WarehouseEditDialog.js.map +0 -7
- package/dist/modules/wms/components/backend/warehouseFormOptions.js +0 -66
- package/dist/modules/wms/components/backend/warehouseFormOptions.js.map +0 -7
- package/src/modules/api_keys/di.ts +0 -7
- package/src/modules/api_keys/services/principalService.ts +0 -33
- package/src/modules/attachments/lib/attachment-service.ts +0 -468
- package/src/modules/auth/api/reset/validate.ts +0 -57
- package/src/modules/auth/commands/acl.ts +0 -495
- package/src/modules/auth/lib/userIdFilter.ts +0 -31
- package/src/modules/auth/services/principalService.ts +0 -266
- package/src/modules/auth/services/roleOrganizationScope.ts +0 -70
- package/src/modules/communication_channels/lib/outbound-recipient.ts +0 -71
- package/src/modules/communication_channels/lib/resolve-channel-type.ts +0 -99
- package/src/modules/customers/backend/customers/deals/pipeline/components/toneClasses.ts +0 -21
- package/src/modules/customers/lib/calendar/participantIdentity.ts +0 -17
- package/src/modules/customers/lib/closureStage.ts +0 -76
- package/src/modules/customers/lib/detailReadAccess.ts +0 -35
- package/src/modules/data_sync/lib/abandoned-run.ts +0 -56
- package/src/modules/devices/api/deviceSerialization.ts +0 -50
- package/src/modules/devices/backend/devices/useDeviceUserLabels.ts +0 -45
- package/src/modules/devices/backend/devices/userOptions.ts +0 -99
- package/src/modules/directory/services/organizationHierarchyService.ts +0 -34
- package/src/modules/directory/services/organizationScopeService.ts +0 -85
- package/src/modules/integrations/backend/integrations/credential-secret-fields.ts +0 -84
- package/src/modules/messages/lib/channel-sender-identity.ts +0 -55
- package/src/modules/messages/lib/composeSourceChannelType.ts +0 -95
- package/src/modules/query_index/lib/search-entity-policy.ts +0 -46
- package/src/modules/sales/components/documents/lineItemShipmentLock.ts +0 -74
- package/src/modules/sales/lib/salesChannelsToggleSeed.ts +0 -42
- package/src/modules/sales/migrations/Migration20260821120000_sales_notes_addresses_context_idx.ts +0 -87
- package/src/modules/wms/api/warehouseSearch.ts +0 -23
- package/src/modules/wms/components/backend/WarehouseEditDialog.tsx +0 -216
- package/src/modules/wms/components/backend/warehouseFormOptions.ts +0 -72
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { QueryEngine, QueryOptions, QueryResult, QueryResultMeta, EncryptedSortRowCapWarning,
|
|
1
|
+
import type { QueryEngine, QueryOptions, QueryResult, QueryResultMeta, EncryptedSortRowCapWarning, FilterOp, Filter, QueryCustomFieldSource, PartialIndexWarning, QueryExtensionsConfig, Sort } from '@open-mercato/shared/lib/query/types'
|
|
2
2
|
import { SortDir } from '@open-mercato/shared/lib/query/types'
|
|
3
3
|
import type { EntityId } from '@open-mercato/shared/modules/entities'
|
|
4
4
|
import type { EntityManager } from '@mikro-orm/postgresql'
|
|
@@ -20,8 +20,6 @@ import {
|
|
|
20
20
|
type ResolvedJoin,
|
|
21
21
|
} from '@open-mercato/shared/lib/query/join-utils'
|
|
22
22
|
import { resolveSearchConfig, type SearchConfig } from '@open-mercato/shared/lib/search/config'
|
|
23
|
-
import { isEncryptedLikeField, resolveEncryptedLikeFieldSet } from '@open-mercato/shared/lib/query/engine'
|
|
24
|
-
import { isTenantDataEncryptionEnabled } from '@open-mercato/shared/lib/encryption/toggles'
|
|
25
23
|
import {
|
|
26
24
|
createSearchTokenAvailability,
|
|
27
25
|
isSearchFilterOp,
|
|
@@ -34,7 +32,6 @@ import { tokenizeText } from '@open-mercato/shared/lib/search/tokenize'
|
|
|
34
32
|
import { runBeforeQueryPipeline, runAfterQueryPipeline, type QueryExtensionContext } from '@open-mercato/shared/lib/query/query-extension-runner'
|
|
35
33
|
import { warnOnCiphertextLikeFallback } from '@open-mercato/shared/lib/query/ciphertext-search-warning'
|
|
36
34
|
import { resolveEncryptedSortFields, resolveEncryptedSortMaxRows, sortRowsInMemory } from '@open-mercato/shared/lib/query/encrypted-sort'
|
|
37
|
-
import { resolveListCountCap } from '@open-mercato/shared/lib/query/count-cap'
|
|
38
35
|
import { mapWithConcurrency } from '@open-mercato/shared/lib/query/bounded-decrypt'
|
|
39
36
|
import { createLogger } from '@open-mercato/shared/lib/logger'
|
|
40
37
|
import { parseNumberWithDefault } from '@open-mercato/shared/lib/number'
|
|
@@ -151,25 +148,13 @@ type SearchRuntime = {
|
|
|
151
148
|
organizationScope?: { ids: string[]; includeNull: boolean } | null
|
|
152
149
|
tenantId?: string | null
|
|
153
150
|
searchSources?: SearchTokenSource[]
|
|
154
|
-
/**
|
|
155
|
-
* Base-column fields whose stored value is ciphertext, so a like/ilike on them can only be
|
|
156
|
-
* answered via search tokens. A plaintext column keeps exact SQL ILIKE instead: the token
|
|
157
|
-
* rewrite is approximate -- it splits on non-alphanumerics and drops tokens shorter than
|
|
158
|
-
* minTokenLength, so a document-number search like "ZK 1/2026" degrades to the tokens
|
|
159
|
-
* {202, 2026} and matches every record from that year, and an all-short term like "ZK"
|
|
160
|
-
* produces no tokens and silently drops the predicate. `null`/absent = the encryption
|
|
161
|
-
* service could not answer (or a caller predates this field); keep the old rewrite then,
|
|
162
|
-
* because guessing "plaintext" would turn encrypted-column search into an
|
|
163
|
-
* ILIKE-on-ciphertext that matches nothing.
|
|
164
|
-
*/
|
|
165
|
-
encryptedFields?: Set<string> | null
|
|
166
151
|
/** Per-`query()` alias minter for `search_tokens` subqueries (see #2738). */
|
|
167
152
|
mintAlias: () => string
|
|
168
153
|
}
|
|
169
154
|
|
|
170
155
|
type EncryptionResolver = () => {
|
|
171
156
|
decryptEntityPayload?: (entityId: EntityId, payload: Record<string, unknown>, tenantId?: string | null, organizationId?: string | null) => Promise<Record<string, unknown>>
|
|
172
|
-
getEncryptedFieldNames?: (entityId: EntityId, tenantId?: string | null, organizationId?: string | null
|
|
157
|
+
getEncryptedFieldNames?: (entityId: EntityId, tenantId?: string | null, organizationId?: string | null) => Promise<readonly string[]>
|
|
173
158
|
isEnabled?: () => boolean
|
|
174
159
|
} | null
|
|
175
160
|
|
|
@@ -511,51 +496,6 @@ export class HybridQueryEngine implements QueryEngine {
|
|
|
511
496
|
? await this.searchAvailability().anySourceHasTokens(searchSources, opts.tenantId ?? null, orgScope)
|
|
512
497
|
: false
|
|
513
498
|
const searchRuntime: SearchRuntime = { ...searchRuntimeBase, searchSources, enabled: searchEnabled && hasSearchTokens }
|
|
514
|
-
if (
|
|
515
|
-
searchRuntime.enabled &&
|
|
516
|
-
searchConfig.useIlikeForNonEncryptedFields === true &&
|
|
517
|
-
sourceSearchFilters.some((filter) => !String(filter.field).startsWith('cf:'))
|
|
518
|
-
) {
|
|
519
|
-
// `ignoreRuntimeHealth` asks the on-disk question -- a column holds ciphertext even while
|
|
520
|
-
// the KMS is down -- so an outage keeps encrypted columns on the token path (#4622).
|
|
521
|
-
// `organizationId: null` is deliberate, not an omission: the service then unions in every
|
|
522
|
-
// organization's map (`fetchAllOrganizationFieldNames`), so a field any org encrypts stays
|
|
523
|
-
// on the token path -- a wider set fails safe. Passing the request's org instead would
|
|
524
|
-
// silently break encrypted-column search for orgs without their own map. That union is an
|
|
525
|
-
// UNCACHED `encryption_maps` read, one extra round-trip per searched list request.
|
|
526
|
-
try {
|
|
527
|
-
const encryptionService = this.getEncryptionService()
|
|
528
|
-
const readEncryptedFieldNames = encryptionService?.getEncryptedFieldNames?.bind(encryptionService)
|
|
529
|
-
if (readEncryptedFieldNames) {
|
|
530
|
-
searchRuntime.encryptedFields = await resolveEncryptedLikeFieldSet(
|
|
531
|
-
() => readEncryptedFieldNames(
|
|
532
|
-
entity as EntityId,
|
|
533
|
-
opts.tenantId ?? null,
|
|
534
|
-
null,
|
|
535
|
-
{ ignoreRuntimeHealth: true },
|
|
536
|
-
),
|
|
537
|
-
String(entity),
|
|
538
|
-
opts.tenantId ?? null,
|
|
539
|
-
)
|
|
540
|
-
} else if (isTenantDataEncryptionEnabled()) {
|
|
541
|
-
// Encryption is on but the service is unreachable (a swallowed DI failure looks
|
|
542
|
-
// exactly like "no service"): treat the map as UNKNOWN and keep the token rewrite,
|
|
543
|
-
// rather than guessing "plaintext" and running ILIKE against ciphertext.
|
|
544
|
-
searchRuntime.encryptedFields = null
|
|
545
|
-
} else {
|
|
546
|
-
// Encryption disabled: nothing is ciphertext at rest, exact ILIKE is always right.
|
|
547
|
-
searchRuntime.encryptedFields = new Set()
|
|
548
|
-
}
|
|
549
|
-
} catch (err) {
|
|
550
|
-
// The fallback is safe (the old rewrite-everything behavior), but taking it silently
|
|
551
|
-
// would hide that the gate has stopped working.
|
|
552
|
-
logger.warn('search: encrypted-field map unavailable; keeping the token rewrite for all columns', {
|
|
553
|
-
entity: String(entity),
|
|
554
|
-
error: err instanceof Error ? err.message : String(err),
|
|
555
|
-
})
|
|
556
|
-
searchRuntime.encryptedFields = null
|
|
557
|
-
}
|
|
558
|
-
}
|
|
559
499
|
if (searchFilters.length) {
|
|
560
500
|
this.logSearchDebug('search:init', {
|
|
561
501
|
entity,
|
|
@@ -845,9 +785,10 @@ export class HybridQueryEngine implements QueryEngine {
|
|
|
845
785
|
return next
|
|
846
786
|
}
|
|
847
787
|
|
|
848
|
-
// Also used by the count
|
|
849
|
-
//
|
|
850
|
-
//
|
|
788
|
+
// Also used by the optimized count path, which builds from a bare base table with
|
|
789
|
+
// no index/custom-field joins. Emitting a cf predicate there would reference an
|
|
790
|
+
// alias that query has never joined, so this stays safe only while
|
|
791
|
+
// `canOptimizeCount` is false whenever any cf filter exists (see `hasCustomFieldFilters`).
|
|
851
792
|
const applyOrGroupedBaseFilters = (q: AnyBuilder): AnyBuilder => {
|
|
852
793
|
if (orGroupFilters.length === 0 && orGroupCfFilters.length === 0) return q
|
|
853
794
|
// `BaseFilter` here is just the normalized-leaf shape; the `cf` bucket holds
|
|
@@ -996,101 +937,6 @@ export class HybridQueryEngine implements QueryEngine {
|
|
|
996
937
|
const hasCustomFieldFilters = cfFilters.length > 0
|
|
997
938
|
const canOptimizeCount = !hasCustomFieldFilters && !hasNonBaseSearchSource
|
|
998
939
|
|
|
999
|
-
// ── Count shape (#4552 Phase 2) ─────────────────────────────────
|
|
1000
|
-
// The count query is rebuilt rather than derived from the display shape:
|
|
1001
|
-
// base scope + filters only. Predicates that read the left-joined index
|
|
1002
|
-
// rowset (cf filters, doc filters, or-groups with doc members, token
|
|
1003
|
-
// searches over joined sources) evaluate against the *same* rowset as the
|
|
1004
|
-
// display query, but confined inside a single correlated EXISTS built
|
|
1005
|
-
// from a one-row seed — so the per-base-row rowset is identical, yet a
|
|
1006
|
-
// semi-join cannot multiply base rows. The count therefore needs no
|
|
1007
|
-
// DISTINCT or GROUP BY, and an outer LIMIT actually bounds the scan (no
|
|
1008
|
-
// blocking aggregate between the LIMIT and the scan).
|
|
1009
|
-
const isRowsetDependentFilter = (filter: BaseFilter): boolean => {
|
|
1010
|
-
const baseField = resolveBaseColumn(String(filter.field))
|
|
1011
|
-
if (!baseField) return true
|
|
1012
|
-
// Token search may probe joined sources' record ids, which only exist
|
|
1013
|
-
// on the index rowset.
|
|
1014
|
-
if (
|
|
1015
|
-
(filter.op === 'like' || filter.op === 'ilike') &&
|
|
1016
|
-
searchRuntime.enabled &&
|
|
1017
|
-
typeof filter.value === 'string' &&
|
|
1018
|
-
hasNonBaseSearchSource
|
|
1019
|
-
) return true
|
|
1020
|
-
return false
|
|
1021
|
-
}
|
|
1022
|
-
const rowsetRegularFilters = regularBaseFilters.filter((filter) => isRowsetDependentFilter(filter))
|
|
1023
|
-
const outerRegularFilters = regularBaseFilters.filter((filter) => !isRowsetDependentFilter(filter))
|
|
1024
|
-
// Or-groups are disjuncts of one $or, so they cannot be split between the
|
|
1025
|
-
// outer query and the rowset — one doc-dependent member moves them all in.
|
|
1026
|
-
const orGroupsRowsetDependent =
|
|
1027
|
-
orGroupCfFilters.length > 0 ||
|
|
1028
|
-
orGroupFilters.some((filter) => isRowsetDependentFilter(filter))
|
|
1029
|
-
const hasInnerTypedCfSource = preparedCfSources.some((source) =>
|
|
1030
|
-
((opts.customFieldSources ?? []).find((s) => s && (s.alias ?? undefined) === source.alias)?.join?.type ?? 'left') === 'inner')
|
|
1031
|
-
const needsIndexRowset =
|
|
1032
|
-
hasCustomFieldFilters ||
|
|
1033
|
-
rowsetRegularFilters.length > 0 ||
|
|
1034
|
-
orGroupsRowsetDependent ||
|
|
1035
|
-
hasInnerTypedCfSource
|
|
1036
|
-
|
|
1037
|
-
const applyCountShape = async (q: AnyBuilder): Promise<AnyBuilder> => {
|
|
1038
|
-
let next = applyBaseScope(q)
|
|
1039
|
-
for (const filter of outerRegularFilters) {
|
|
1040
|
-
const baseField = resolveBaseColumn(String(filter.field))
|
|
1041
|
-
if (!baseField) continue
|
|
1042
|
-
next = this.applyColumnFilter(next, qualify(baseField), filter, {
|
|
1043
|
-
...searchRuntime, entity, field: String(filter.field), recordIdColumn: qualify('id'),
|
|
1044
|
-
})
|
|
1045
|
-
}
|
|
1046
|
-
if (!orGroupsRowsetDependent) next = applyOrGroupedBaseFilters(next)
|
|
1047
|
-
if (needsIndexRowset) {
|
|
1048
|
-
// One seed row per base row, then the display query's own join
|
|
1049
|
-
// builders — the rowset inside the EXISTS is the display rowset.
|
|
1050
|
-
// Built from `db` (not the where-callback's expression builder),
|
|
1051
|
-
// matching applyJoinFilters' detached-subquery idiom; correlated
|
|
1052
|
-
// references to the outer base alias resolve at compile time.
|
|
1053
|
-
let rowset: AnyBuilder = db
|
|
1054
|
-
.selectFrom(sql`(select 1)`.as('om_count_seed'))
|
|
1055
|
-
.select(sql<number>`1`.as('one'))
|
|
1056
|
-
rowset = applyEntityIndexesJoin(rowset)
|
|
1057
|
-
rowset = applyCustomFieldSourceJoins(rowset)
|
|
1058
|
-
rowset = applyCfFilters(rowset)
|
|
1059
|
-
for (const filter of rowsetRegularFilters) {
|
|
1060
|
-
const baseField = resolveBaseColumn(String(filter.field))
|
|
1061
|
-
if (!baseField) {
|
|
1062
|
-
rowset = this.applyIndexDocFilterFromAlias(
|
|
1063
|
-
rowset, 'ei', entity, String(filter.field), filter.op, filter.value, qualify('id'), searchRuntime,
|
|
1064
|
-
)
|
|
1065
|
-
continue
|
|
1066
|
-
}
|
|
1067
|
-
rowset = this.applyColumnFilter(rowset, qualify(baseField), filter, {
|
|
1068
|
-
...searchRuntime, entity, field: String(filter.field), recordIdColumn: qualify('id'),
|
|
1069
|
-
})
|
|
1070
|
-
}
|
|
1071
|
-
if (orGroupsRowsetDependent) rowset = applyOrGroupedBaseFilters(rowset)
|
|
1072
|
-
const capturedRowset = rowset
|
|
1073
|
-
next = next.where((eb: any) => eb.exists(capturedRowset))
|
|
1074
|
-
}
|
|
1075
|
-
next = await applyJoinFilters({
|
|
1076
|
-
db,
|
|
1077
|
-
baseTable,
|
|
1078
|
-
builder: next,
|
|
1079
|
-
joinMap,
|
|
1080
|
-
joinFilters,
|
|
1081
|
-
aliasTables,
|
|
1082
|
-
qualifyBase: (column) => qualify(column),
|
|
1083
|
-
applyAliasScope: async (target: any, alias: string) => applyAliasScopes(target as AnyBuilder, alias),
|
|
1084
|
-
applyFilterOp: (target, column, op, value) => applyJoinFilterOpFn(target as AnyBuilder, column, op, value),
|
|
1085
|
-
applyJoinFilterOp: async (target, filter, qualified, join) => {
|
|
1086
|
-
const applied = await applyJoinSearchFilterOp(target as AnyBuilder, filter, qualified, join)
|
|
1087
|
-
return { applied, builder: target }
|
|
1088
|
-
},
|
|
1089
|
-
columnExists: (tbl, column) => this.columnExists(tbl, column),
|
|
1090
|
-
})
|
|
1091
|
-
return next
|
|
1092
|
-
}
|
|
1093
|
-
|
|
1094
940
|
// Selection (for data query)
|
|
1095
941
|
const selectFieldSet = new Set<string>((opts.fields && opts.fields.length) ? opts.fields.map(String) : Array.from(columns.keys()))
|
|
1096
942
|
if (requiresPlaintextSort) {
|
|
@@ -1151,23 +997,33 @@ export class HybridQueryEngine implements QueryEngine {
|
|
|
1151
997
|
const pageSize = opts.page?.pageSize ?? 20
|
|
1152
998
|
const sqlDebugEnabled = this.isSqlDebugEnabled()
|
|
1153
999
|
|
|
1154
|
-
|
|
1000
|
+
let total: number
|
|
1155
1001
|
|
|
1156
|
-
|
|
1157
|
-
|
|
1158
|
-
|
|
1159
|
-
|
|
1160
|
-
|
|
1161
|
-
|
|
1162
|
-
|
|
1163
|
-
|
|
1164
|
-
|
|
1165
|
-
|
|
1166
|
-
|
|
1167
|
-
|
|
1168
|
-
|
|
1169
|
-
|
|
1170
|
-
:
|
|
1002
|
+
if (canOptimizeCount) {
|
|
1003
|
+
// Optimized count: apply only base-scope + regular filters + or-group filters (no index joins).
|
|
1004
|
+
const optimizedRoot = db.selectFrom(`${baseTable} as b` as any)
|
|
1005
|
+
let countCore = applyBaseScope(optimizedRoot)
|
|
1006
|
+
countCore = applyRegularBaseFilters(countCore)
|
|
1007
|
+
countCore = applyOrGroupedBaseFilters(countCore)
|
|
1008
|
+
// joinFilters still need to be re-applied in the optimized path
|
|
1009
|
+
countCore = await applyJoinFilters({
|
|
1010
|
+
db,
|
|
1011
|
+
baseTable,
|
|
1012
|
+
builder: countCore,
|
|
1013
|
+
joinMap,
|
|
1014
|
+
joinFilters,
|
|
1015
|
+
aliasTables,
|
|
1016
|
+
qualifyBase: (column) => qualify(column),
|
|
1017
|
+
applyAliasScope: async (target: any, alias: string) => applyAliasScopes(target as AnyBuilder, alias),
|
|
1018
|
+
applyFilterOp: (target, column, op, value) => applyJoinFilterOpFn(target as AnyBuilder, column, op, value),
|
|
1019
|
+
applyJoinFilterOp: async (target, filter, qualified, join) => {
|
|
1020
|
+
const applied = await applyJoinSearchFilterOp(target as AnyBuilder, filter, qualified, join)
|
|
1021
|
+
return { applied, builder: target }
|
|
1022
|
+
},
|
|
1023
|
+
columnExists: (tbl, column) => this.columnExists(tbl, column),
|
|
1024
|
+
})
|
|
1025
|
+
const sub = countCore.select(sql.ref(qualify('id')).as('id')).groupBy(qualify('id')).as('sq')
|
|
1026
|
+
const countQuery = db.selectFrom(sub as any).select(sql<string>`count(*)`.as('count'))
|
|
1171
1027
|
if (debugEnabled && sqlDebugEnabled) {
|
|
1172
1028
|
const compiled = countQuery.compile()
|
|
1173
1029
|
this.debug('query:sql:count', { entity, sql: compiled.sql, bindings: compiled.parameters })
|
|
@@ -1175,19 +1031,25 @@ export class HybridQueryEngine implements QueryEngine {
|
|
|
1175
1031
|
const countRow = await this.captureSqlTiming(
|
|
1176
1032
|
'query:sql:count', entity,
|
|
1177
1033
|
() => countQuery.executeTakeFirst(),
|
|
1178
|
-
{ optimized:
|
|
1034
|
+
{ optimized: true }, profiler,
|
|
1179
1035
|
)
|
|
1180
|
-
|
|
1181
|
-
|
|
1182
|
-
|
|
1036
|
+
total = this.parseCount(countRow)
|
|
1037
|
+
} else {
|
|
1038
|
+
const countRoot = db.selectFrom(`${baseTable} as b` as any)
|
|
1039
|
+
const countBuilder = (await applyQueryShape(countRoot))
|
|
1040
|
+
.select(sql<string>`count(distinct ${sql.ref(qualify('id'))})`.as('count'))
|
|
1041
|
+
if (debugEnabled && sqlDebugEnabled) {
|
|
1042
|
+
const compiled = countBuilder.compile()
|
|
1043
|
+
this.debug('query:sql:count', { entity, sql: compiled.sql, bindings: compiled.parameters })
|
|
1183
1044
|
}
|
|
1184
|
-
|
|
1045
|
+
const countRow = await this.captureSqlTiming(
|
|
1046
|
+
'query:sql:count', entity,
|
|
1047
|
+
() => countBuilder.executeTakeFirst(),
|
|
1048
|
+
{ optimized: false }, profiler,
|
|
1049
|
+
)
|
|
1050
|
+
total = this.parseCount(countRow)
|
|
1185
1051
|
}
|
|
1186
1052
|
|
|
1187
|
-
const counted = await runBoundedCount(canOptimizeCount)
|
|
1188
|
-
const total: number = counted.total
|
|
1189
|
-
const listCountCapWarning: ListCountCapWarning | undefined = counted.warning
|
|
1190
|
-
|
|
1191
1053
|
const dekKeyCache = new Map<string | null, string | null>()
|
|
1192
1054
|
|
|
1193
1055
|
const decryptRow = async (item: Record<string, unknown>): Promise<Record<string, unknown>> => {
|
|
@@ -1238,29 +1100,24 @@ export class HybridQueryEngine implements QueryEngine {
|
|
|
1238
1100
|
const sortFieldNames = Array.from(new Set(['id', ...scopeFieldNames, ...resolvedSorts.map((s) => String(s.field))]))
|
|
1239
1101
|
phase1 = applySelection(phase1, sortFieldNames)
|
|
1240
1102
|
if (cap !== null) {
|
|
1241
|
-
|
|
1242
|
-
// scan itself, not by comparing against `total` — which may itself be
|
|
1243
|
-
// capped (`OM_LIST_COUNT_CAP`) and would then never exceed the sort cap.
|
|
1244
|
-
phase1 = phase1.limit(cap + 1).orderBy(qualify('id'), 'asc' as any)
|
|
1103
|
+
phase1 = phase1.limit(cap).orderBy(qualify('id'), 'asc' as any)
|
|
1245
1104
|
}
|
|
1246
1105
|
if (debugEnabled && sqlDebugEnabled) {
|
|
1247
1106
|
const compiled = phase1.compile()
|
|
1248
1107
|
this.debug('query:sql:data:phase1', { entity, sql: compiled.sql, bindings: compiled.parameters })
|
|
1249
1108
|
}
|
|
1250
|
-
const
|
|
1109
|
+
const candidateRows = await this.captureSqlTiming(
|
|
1251
1110
|
'query:sql:data:phase1', entity,
|
|
1252
1111
|
() => phase1.execute(),
|
|
1253
1112
|
{ phase: 1 }, profiler,
|
|
1254
1113
|
) as Record<string, unknown>[]
|
|
1255
|
-
const sortTruncated = cap !== null && candidateRowsRaw.length > cap
|
|
1256
|
-
const candidateRows = sortTruncated && cap !== null ? candidateRowsRaw.slice(0, cap) : candidateRowsRaw
|
|
1257
1114
|
const decryptedCandidates = await mapWithConcurrency(candidateRows, DECRYPT_CONCURRENCY, decryptRow)
|
|
1258
1115
|
const orderedCandidates = sortRowsInMemory(decryptedCandidates, resolvedSorts)
|
|
1259
1116
|
const pageIds = orderedCandidates
|
|
1260
1117
|
.slice((page - 1) * pageSize, page * pageSize)
|
|
1261
1118
|
.map((row) => row.id)
|
|
1262
1119
|
|
|
1263
|
-
if (
|
|
1120
|
+
if (cap !== null && total > cap) {
|
|
1264
1121
|
encryptedSortRowCapWarning = {
|
|
1265
1122
|
entity,
|
|
1266
1123
|
sortFields: resolvedSorts.map((s) => String(s.field)),
|
|
@@ -1316,11 +1173,10 @@ export class HybridQueryEngine implements QueryEngine {
|
|
|
1316
1173
|
|
|
1317
1174
|
const typedItems = items as unknown as T[]
|
|
1318
1175
|
let result: QueryResult<T> = { items: typedItems, page, pageSize, total }
|
|
1319
|
-
if (partialIndexWarning || encryptedSortRowCapWarning
|
|
1176
|
+
if (partialIndexWarning || encryptedSortRowCapWarning) {
|
|
1320
1177
|
const meta: QueryResultMeta = {}
|
|
1321
1178
|
if (partialIndexWarning) meta.partialIndexWarning = partialIndexWarning
|
|
1322
1179
|
if (encryptedSortRowCapWarning) meta.encryptedSortRowCapWarning = encryptedSortRowCapWarning
|
|
1323
|
-
if (listCountCapWarning) meta.listCountCapWarning = listCountCapWarning
|
|
1324
1180
|
result.meta = meta
|
|
1325
1181
|
}
|
|
1326
1182
|
|
|
@@ -1887,13 +1743,11 @@ export class HybridQueryEngine implements QueryEngine {
|
|
|
1887
1743
|
return this.buildIndexDocFilterExpression(eb, 'ei', entity, fieldName, filter.op, filter.value, 'b.id', searchRuntime)
|
|
1888
1744
|
}
|
|
1889
1745
|
// For like/ilike with active search-tokens, route through hashed-token EXISTS subquery
|
|
1890
|
-
// so encrypted-at-rest columns can still be searched.
|
|
1891
|
-
// SQL ILIKE -- see SearchRuntime.encryptedFields.
|
|
1746
|
+
// so encrypted-at-rest columns can still be searched.
|
|
1892
1747
|
if (
|
|
1893
1748
|
(filter.op === 'like' || filter.op === 'ilike') &&
|
|
1894
1749
|
searchRuntime?.enabled &&
|
|
1895
|
-
typeof filter.value === 'string'
|
|
1896
|
-
(searchRuntime.encryptedFields == null || isEncryptedLikeField(searchRuntime.encryptedFields, fieldName))
|
|
1750
|
+
typeof filter.value === 'string'
|
|
1897
1751
|
) {
|
|
1898
1752
|
const tokens = tokenizeText(String(filter.value), searchRuntime.config)
|
|
1899
1753
|
if (tokens.hashes.length) {
|
|
@@ -1917,14 +1771,10 @@ export class HybridQueryEngine implements QueryEngine {
|
|
|
1917
1771
|
)
|
|
1918
1772
|
}
|
|
1919
1773
|
}
|
|
1920
|
-
// Tokenizer produced no hashes (e.g. value too short)
|
|
1921
|
-
//
|
|
1922
|
-
//
|
|
1923
|
-
|
|
1924
|
-
// keeps the legacy predicate-skipping `true`.
|
|
1925
|
-
return searchRuntime?.encryptedFields != null && isEncryptedLikeField(searchRuntime.encryptedFields, fieldName)
|
|
1926
|
-
? sql<boolean>`false`
|
|
1927
|
-
: sql<boolean>`true`
|
|
1774
|
+
// Tokenizer produced no hashes (e.g. value too short). Match the regular-base-filter
|
|
1775
|
+
// path's behavior of skipping the predicate (no filter), which is preferable to
|
|
1776
|
+
// silently turning into a plain `ilike` against an encrypted column.
|
|
1777
|
+
return sql<boolean>`true`
|
|
1928
1778
|
}
|
|
1929
1779
|
return this.buildColumnFilterExpression(eb, qualify(baseField), filter.op, filter.value)
|
|
1930
1780
|
}
|
|
@@ -2003,9 +1853,6 @@ export class HybridQueryEngine implements QueryEngine {
|
|
|
2003
1853
|
const hasSearchTokens = searchEnabled && hasSearchFilter(normalizedFilters)
|
|
2004
1854
|
? await this.searchAvailability().hasTokens(entity, opts.tenantId ?? null, orgScope)
|
|
2005
1855
|
: false
|
|
2006
|
-
// `encryptedFields` is deliberately NOT resolved here: custom-entity rows live in the
|
|
2007
|
-
// `entity_indexes` doc store, whose fields the base-column encryption map does not describe,
|
|
2008
|
-
// so the ILIKE gate stays inert on this path and like/ilike keeps its previous semantics.
|
|
2009
1856
|
const searchRuntime: SearchRuntime = {
|
|
2010
1857
|
enabled: searchEnabled && hasSearchTokens,
|
|
2011
1858
|
config: searchConfig,
|
|
@@ -2121,35 +1968,17 @@ export class HybridQueryEngine implements QueryEngine {
|
|
|
2121
1968
|
const page = opts.page?.page ?? 1
|
|
2122
1969
|
const pageSize = opts.page?.pageSize ?? 20
|
|
2123
1970
|
|
|
2124
|
-
// Single-table count: `applyScope` adds only WHERE predicates (cf filters
|
|
2125
|
-
// included — no join), and doc storage holds one row per record within a
|
|
2126
|
-
// scope, so `count(*)` needs no DISTINCT and — when the cap is active — a
|
|
2127
|
-
// LIMIT on the row-producing inner query bounds the scan (#4552 Phase 2).
|
|
2128
|
-
const countCap = resolveListCountCap()
|
|
2129
1971
|
const root = db.selectFrom(`custom_entities_storage as ${alias}`)
|
|
2130
|
-
const
|
|
2131
|
-
const countQuery = countCap !== null
|
|
2132
|
-
? db
|
|
2133
|
-
.selectFrom(countShape.select(sql<number>`1`.as('one')).limit(countCap + 1).as('om_count_probe') as any)
|
|
2134
|
-
.select(sql<string>`count(*)`.as('count'))
|
|
2135
|
-
: countShape.select(sql<string>`count(*)`.as('count'))
|
|
1972
|
+
const countQuery = applyScope(root).select(sql<string>`count(distinct ${sql.ref(`${alias}.entity_id`)})`.as('count'))
|
|
2136
1973
|
const countRow = await countQuery.executeTakeFirst()
|
|
2137
|
-
const
|
|
2138
|
-
let total = probed
|
|
2139
|
-
let listCountCapWarning: ListCountCapWarning | undefined
|
|
2140
|
-
if (countCap !== null && probed > countCap) {
|
|
2141
|
-
total = countCap
|
|
2142
|
-
listCountCapWarning = { entity: entity as EntityId, cap: countCap }
|
|
2143
|
-
}
|
|
1974
|
+
const total = this.parseCount(countRow)
|
|
2144
1975
|
|
|
2145
1976
|
let dataQuery = applyScope(db.selectFrom(`custom_entities_storage as ${alias}`))
|
|
2146
1977
|
dataQuery = applySelection(dataQuery)
|
|
2147
1978
|
dataQuery = applySort(dataQuery)
|
|
2148
1979
|
dataQuery = dataQuery.limit(pageSize).offset((page - 1) * pageSize)
|
|
2149
1980
|
const items = await dataQuery.execute()
|
|
2150
|
-
|
|
2151
|
-
if (listCountCapWarning) result.meta = { listCountCapWarning }
|
|
2152
|
-
return result
|
|
1981
|
+
return { items, page, pageSize, total }
|
|
2153
1982
|
}
|
|
2154
1983
|
|
|
2155
1984
|
private async tableExists(table: string): Promise<boolean> {
|
|
@@ -2555,11 +2384,7 @@ export class HybridQueryEngine implements QueryEngine {
|
|
|
2555
2384
|
if (
|
|
2556
2385
|
(filter.op === 'like' || filter.op === 'ilike') &&
|
|
2557
2386
|
search?.enabled &&
|
|
2558
|
-
typeof filter.value === 'string'
|
|
2559
|
-
// Plaintext base columns keep exact SQL ILIKE -- see SearchRuntime.encryptedFields.
|
|
2560
|
-
// Membership runs across name-shape candidates: maps may declare `displayName` while the
|
|
2561
|
-
// filter carries the column name `display_name`.
|
|
2562
|
-
(search.encryptedFields == null || isEncryptedLikeField(search.encryptedFields, search.field))
|
|
2387
|
+
typeof filter.value === 'string'
|
|
2563
2388
|
) {
|
|
2564
2389
|
const tokens = tokenizeText(String(filter.value), search.config)
|
|
2565
2390
|
const hashes = tokens.hashes
|
|
@@ -2588,23 +2413,10 @@ export class HybridQueryEngine implements QueryEngine {
|
|
|
2588
2413
|
})
|
|
2589
2414
|
return q
|
|
2590
2415
|
}
|
|
2591
|
-
// Hashes exist but no usable search source: same reasoning as the no-hash branch below --
|
|
2592
|
-
// a KNOWN-encrypted column must fail closed rather than drop the predicate (which would
|
|
2593
|
-
// return the full list on exactly the columns ILIKE cannot serve).
|
|
2594
|
-
if (search.encryptedFields != null && isEncryptedLikeField(search.encryptedFields, search.field)) {
|
|
2595
|
-
return q.where(sql<boolean>`false`)
|
|
2596
|
-
}
|
|
2597
2416
|
} else {
|
|
2598
2417
|
this.logSearchDebug('search:skip-empty-hashes', {
|
|
2599
2418
|
entity: search.entity, field: search.field, value: filter.value,
|
|
2600
2419
|
})
|
|
2601
|
-
// A column KNOWN to be encrypted has no way to match the term except the token index:
|
|
2602
|
-
// dropping the predicate would return every row for a term merely too short to tokenize.
|
|
2603
|
-
// Every other case (gate off, custom-entity runtime, resolution failure) keeps the
|
|
2604
|
-
// legacy behavior of skipping the predicate.
|
|
2605
|
-
if (search.encryptedFields != null && isEncryptedLikeField(search.encryptedFields, search.field)) {
|
|
2606
|
-
return q.where(sql<boolean>`false`)
|
|
2607
|
-
}
|
|
2608
2420
|
}
|
|
2609
2421
|
return q
|
|
2610
2422
|
}
|
|
@@ -223,49 +223,6 @@ export async function deleteSearchTokensForRecord(
|
|
|
223
223
|
.execute()
|
|
224
224
|
}
|
|
225
225
|
|
|
226
|
-
// NUL, not a printable separator: a field name may itself contain a space, so `a b` + hash `c`
|
|
227
|
-
// would otherwise sign identically to field `a` + hash `b c`.
|
|
228
|
-
const SIGNATURE_SEPARATOR = String.fromCharCode(0)
|
|
229
|
-
|
|
230
|
-
// Identifies one token row for comparison. `token` is NULL unless `storeRawTokens` is on, and a
|
|
231
|
-
// stored NULL has to sign the same as the `null` a freshly built row carries — otherwise every
|
|
232
|
-
// record compares as changed and the skip never fires.
|
|
233
|
-
function tokenSignature(row: { field?: unknown; token_hash?: unknown; token?: unknown }): string {
|
|
234
|
-
return [
|
|
235
|
-
String(row.field ?? ''),
|
|
236
|
-
String(row.token_hash ?? ''),
|
|
237
|
-
row.token == null ? '' : String(row.token),
|
|
238
|
-
].join(SIGNATURE_SEPARATOR)
|
|
239
|
-
}
|
|
240
|
-
|
|
241
|
-
// Multiplicities, not sets: #4681 reports token rows duplicated by the concurrent-replacement
|
|
242
|
-
// defect, and a set comparison reads such a record as already correct and preserves the duplicates
|
|
243
|
-
// forever. Counting sends it through a full rewrite, which collapses them.
|
|
244
|
-
function tallyEquals(a: Map<string, number> | undefined, b: Map<string, number> | undefined): boolean {
|
|
245
|
-
const left = a ?? new Map<string, number>()
|
|
246
|
-
const right = b ?? new Map<string, number>()
|
|
247
|
-
if (left.size !== right.size) return false
|
|
248
|
-
for (const [key, count] of left.entries()) {
|
|
249
|
-
if (right.get(key) !== count) return false
|
|
250
|
-
}
|
|
251
|
-
return true
|
|
252
|
-
}
|
|
253
|
-
|
|
254
|
-
function tallyTokenRows<TRow extends { field?: unknown; token_hash?: unknown; token?: unknown }>(
|
|
255
|
-
rows: Iterable<TRow>,
|
|
256
|
-
keyOf: (row: TRow) => string
|
|
257
|
-
): Map<string, Map<string, number>> {
|
|
258
|
-
const tallies = new Map<string, Map<string, number>>()
|
|
259
|
-
for (const row of rows) {
|
|
260
|
-
const key = keyOf(row)
|
|
261
|
-
const tally = tallies.get(key) ?? new Map<string, number>()
|
|
262
|
-
const signature = tokenSignature(row)
|
|
263
|
-
tally.set(signature, (tally.get(signature) ?? 0) + 1)
|
|
264
|
-
tallies.set(key, tally)
|
|
265
|
-
}
|
|
266
|
-
return tallies
|
|
267
|
-
}
|
|
268
|
-
|
|
269
226
|
export async function replaceSearchTokensForBatch(
|
|
270
227
|
db: Kysely<any>,
|
|
271
228
|
payloads: Array<BuildTokenOptions & { doc: Record<string, unknown> }>
|
|
@@ -299,95 +256,8 @@ export async function replaceSearchTokensForBatch(
|
|
|
299
256
|
scopeBuckets.set(key, bucket)
|
|
300
257
|
}
|
|
301
258
|
|
|
302
|
-
const recordKeyOf = (row: SearchTokenRow) =>
|
|
303
|
-
`${scopeKey(row.organization_id ?? null, row.tenant_id ?? null)}|${String(row.entity_id)}`
|
|
304
|
-
const builtTally = tallyTokenRows(rows, recordKeyOf)
|
|
305
|
-
|
|
306
|
-
// Read outside the transaction, deliberately. The comparison decides only whether to skip a
|
|
307
|
-
// rewrite, so a concurrent writer costs us at most a rewrite we declined — declined because the
|
|
308
|
-
// table already held exactly the rows this call wanted to write. One ordering is worth naming
|
|
309
|
-
// though: if the read matches and a concurrent writer then commits tokens built from a *staler*
|
|
310
|
-
// doc, the unconditional rewrite this call used to perform would have overwritten them by
|
|
311
|
-
// accident. It no longer does, so those stale rows survive until the record's next write. That
|
|
312
|
-
// is a repair we lose, not a guarantee we break.
|
|
313
|
-
const changedIdsByBucket = new Map<string, Set<string>>()
|
|
314
|
-
for (const [key, bucket] of scopeBuckets.entries()) {
|
|
315
|
-
const ids = Array.from(bucket.ids)
|
|
316
|
-
const builtCountById = new Map<string, number>()
|
|
317
|
-
for (const id of ids) {
|
|
318
|
-
let total = 0
|
|
319
|
-
const tally = builtTally.get(`${key}|${id}`)
|
|
320
|
-
if (tally) for (const count of tally.values()) total += count
|
|
321
|
-
builtCountById.set(id, total)
|
|
322
|
-
}
|
|
323
|
-
|
|
324
|
-
// Count probe first. Its result is one row per record in the batch, so it is bounded by the
|
|
325
|
-
// batch size — unlike a bare row read, which would be bounded only by how many token rows the
|
|
326
|
-
// table already holds for these ids, a quantity this function does not control and (per #4681)
|
|
327
|
-
// has no reason to trust.
|
|
328
|
-
const storedCounts = await db
|
|
329
|
-
.selectFrom('search_tokens' as any)
|
|
330
|
-
.select(['entity_id' as any, sql<number>`count(*)`.as('token_count') as any])
|
|
331
|
-
.where('entity_type' as any, '=', payloads[0].entityType)
|
|
332
|
-
.where(sql<boolean>`organization_id is not distinct from ${bucket.organizationId}`)
|
|
333
|
-
.where(sql<boolean>`tenant_id is not distinct from ${bucket.tenantId}`)
|
|
334
|
-
.where('entity_id' as any, 'in', ids)
|
|
335
|
-
.groupBy('entity_id' as any)
|
|
336
|
-
.execute()
|
|
337
|
-
const storedCountById = new Map<string, number>()
|
|
338
|
-
for (const row of storedCounts as any[]) {
|
|
339
|
-
storedCountById.set(String(row.entity_id), Number(row.token_count))
|
|
340
|
-
}
|
|
341
|
-
|
|
342
|
-
const changed = new Set<string>()
|
|
343
|
-
// A record whose stored row count already differs is changed, whatever the rows say — the
|
|
344
|
-
// duplicate case from #4681 resolves here without ever materializing the duplicated rows.
|
|
345
|
-
const contentCandidates = ids.filter((id) => {
|
|
346
|
-
const builtCount = builtCountById.get(id) ?? 0
|
|
347
|
-
if ((storedCountById.get(id) ?? 0) !== builtCount) {
|
|
348
|
-
changed.add(id)
|
|
349
|
-
return false
|
|
350
|
-
}
|
|
351
|
-
return builtCount > 0
|
|
352
|
-
})
|
|
353
|
-
|
|
354
|
-
if (contentCandidates.length) {
|
|
355
|
-
const rowBudget = contentCandidates.reduce((sum, id) => sum + (builtCountById.get(id) ?? 0), 0)
|
|
356
|
-
const stored = await db
|
|
357
|
-
.selectFrom('search_tokens' as any)
|
|
358
|
-
.select(['entity_id' as any, 'field' as any, 'token_hash' as any, 'token' as any])
|
|
359
|
-
.where('entity_type' as any, '=', payloads[0].entityType)
|
|
360
|
-
.where(sql<boolean>`organization_id is not distinct from ${bucket.organizationId}`)
|
|
361
|
-
.where(sql<boolean>`tenant_id is not distinct from ${bucket.tenantId}`)
|
|
362
|
-
.where('entity_id' as any, 'in', contentCandidates)
|
|
363
|
-
// Counts already match, so this cannot truncate — it bounds the damage if a concurrent
|
|
364
|
-
// writer inserts between the probe and this read. A truncated read compares as changed,
|
|
365
|
-
// which costs a rewrite rather than a wrong skip.
|
|
366
|
-
.limit(rowBudget)
|
|
367
|
-
.execute()
|
|
368
|
-
const storedTally = tallyTokenRows(stored as any[], (row) => String(row.entity_id))
|
|
369
|
-
for (const id of contentCandidates) {
|
|
370
|
-
if (!tallyEquals(builtTally.get(`${key}|${id}`), storedTally.get(id))) changed.add(id)
|
|
371
|
-
}
|
|
372
|
-
}
|
|
373
|
-
changedIdsByBucket.set(key, changed)
|
|
374
|
-
}
|
|
375
|
-
|
|
376
|
-
const changedRecordKeys = new Set<string>()
|
|
377
|
-
for (const [key, changed] of changedIdsByBucket.entries()) {
|
|
378
|
-
for (const id of changed) changedRecordKeys.add(`${key}|${id}`)
|
|
379
|
-
}
|
|
380
|
-
debug('batch.skip', {
|
|
381
|
-
entityType: payloads[0].entityType,
|
|
382
|
-
recordCount: payloads.length,
|
|
383
|
-
changedCount: changedRecordKeys.size,
|
|
384
|
-
})
|
|
385
|
-
if (!changedRecordKeys.size) return
|
|
386
|
-
|
|
387
259
|
await db.transaction().execute(async (trx) => {
|
|
388
|
-
for (const [
|
|
389
|
-
const changed = changedIdsByBucket.get(key)
|
|
390
|
-
if (!changed?.size) continue
|
|
260
|
+
for (const [, bucket] of scopeBuckets.entries()) {
|
|
391
261
|
// Delete by entity_id: a batch replaces all of a record's tokens, and a per-field OR over the
|
|
392
262
|
// whole batch overflows the query compiler's call stack on large batches.
|
|
393
263
|
const deleteQuery = trx
|
|
@@ -395,12 +265,10 @@ export async function replaceSearchTokensForBatch(
|
|
|
395
265
|
.where('entity_type' as any, '=', payloads[0].entityType)
|
|
396
266
|
.where(sql<boolean>`organization_id is not distinct from ${bucket.organizationId}`)
|
|
397
267
|
.where(sql<boolean>`tenant_id is not distinct from ${bucket.tenantId}`)
|
|
398
|
-
.where('entity_id' as any, 'in', Array.from(
|
|
268
|
+
.where('entity_id' as any, 'in', Array.from(bucket.ids))
|
|
399
269
|
await deleteQuery.execute()
|
|
400
270
|
}
|
|
401
|
-
const payloadWithTimestamps = rows
|
|
402
|
-
.filter((row) => changedRecordKeys.has(recordKeyOf(row)))
|
|
403
|
-
.map((row) => ({ ...row, created_at: sql`now()` }))
|
|
271
|
+
const payloadWithTimestamps = rows.map((row) => ({ ...row, created_at: sql`now()` }))
|
|
404
272
|
for (const batch of chunk(payloadWithTimestamps, INSERT_BATCH_SIZE)) {
|
|
405
273
|
await trx.insertInto('search_tokens' as any).values(batch as any).execute()
|
|
406
274
|
}
|