@fayz-ai/admin 0.10.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/LICENSE +21 -0
- package/README.md +44 -0
- package/dist/CommandPalette-2AL327XQ.js +258 -0
- package/dist/CommandPalette-2AL327XQ.js.map +1 -0
- package/dist/ImportWizard-CISHGNQC.js +3 -0
- package/dist/ImportWizard-CISHGNQC.js.map +1 -0
- package/dist/ScheduleEditor-BSFF7LME.js +1040 -0
- package/dist/ScheduleEditor-BSFF7LME.js.map +1 -0
- package/dist/SubscriptionPage-NLZAZO4P.js +7 -0
- package/dist/SubscriptionPage-NLZAZO4P.js.map +1 -0
- package/dist/access/context.d.ts +47 -0
- package/dist/access/context.d.ts.map +1 -0
- package/dist/access/headless.d.ts +21 -0
- package/dist/access/headless.d.ts.map +1 -0
- package/dist/access/index.d.ts +12 -0
- package/dist/access/index.d.ts.map +1 -0
- package/dist/access/limits-registry.d.ts +33 -0
- package/dist/access/limits-registry.d.ts.map +1 -0
- package/dist/access/module-nav.d.ts +15 -0
- package/dist/access/module-nav.d.ts.map +1 -0
- package/dist/access/resolver.d.ts +2 -0
- package/dist/access/resolver.d.ts.map +1 -0
- package/dist/access/types.d.ts +43 -0
- package/dist/access/types.d.ts.map +1 -0
- package/dist/access/upgrade-modal-store.d.ts +23 -0
- package/dist/access/upgrade-modal-store.d.ts.map +1 -0
- package/dist/app/AdminShell.d.ts +65 -0
- package/dist/app/AdminShell.d.ts.map +1 -0
- package/dist/app/LoginPage.d.ts +3 -0
- package/dist/app/LoginPage.d.ts.map +1 -0
- package/dist/app/admin-app.d.ts +23 -0
- package/dist/app/admin-app.d.ts.map +1 -0
- package/dist/app/config.d.ts +277 -0
- package/dist/app/config.d.ts.map +1 -0
- package/dist/app/core-entities.d.ts +25 -0
- package/dist/app/core-entities.d.ts.map +1 -0
- package/dist/app/derive-contract.d.ts +8 -0
- package/dist/app/derive-contract.d.ts.map +1 -0
- package/dist/app/nav-contributions.store.d.ts +17 -0
- package/dist/app/nav-contributions.store.d.ts.map +1 -0
- package/dist/app/routing.d.ts +10 -0
- package/dist/app/routing.d.ts.map +1 -0
- package/dist/app/scaffold.d.ts +17 -0
- package/dist/app/scaffold.d.ts.map +1 -0
- package/dist/billing/index.d.ts +5 -0
- package/dist/billing/index.d.ts.map +1 -0
- package/dist/billing/index.js +3 -0
- package/dist/billing/index.js.map +1 -0
- package/dist/billing/plan-badge.d.ts +17 -0
- package/dist/billing/plan-badge.d.ts.map +1 -0
- package/dist/billing/store.d.ts +40 -0
- package/dist/billing/store.d.ts.map +1 -0
- package/dist/chunk-5O2UJAQ7.js +534 -0
- package/dist/chunk-5O2UJAQ7.js.map +1 -0
- package/dist/chunk-PNAJODZM.js +315 -0
- package/dist/chunk-PNAJODZM.js.map +1 -0
- package/dist/chunk-RKXZ7RUG.js +20 -0
- package/dist/chunk-RKXZ7RUG.js.map +1 -0
- package/dist/chunk-TNTZHUL6.js +817 -0
- package/dist/chunk-TNTZHUL6.js.map +1 -0
- package/dist/chunk-UMRN6427.js +510 -0
- package/dist/chunk-UMRN6427.js.map +1 -0
- package/dist/chunk-VN5NTK26.js +36 -0
- package/dist/chunk-VN5NTK26.js.map +1 -0
- package/dist/chunk-VTEP2AQX.js +101 -0
- package/dist/chunk-VTEP2AQX.js.map +1 -0
- package/dist/chunk-YUHCC7JY.js +11 -0
- package/dist/chunk-YUHCC7JY.js.map +1 -0
- package/dist/components/RightRail.d.ts +8 -0
- package/dist/components/RightRail.d.ts.map +1 -0
- package/dist/components/auth/CenteredLogin.d.ts +13 -0
- package/dist/components/auth/CenteredLogin.d.ts.map +1 -0
- package/dist/components/auth/LoginForm.d.ts +12 -0
- package/dist/components/auth/LoginForm.d.ts.map +1 -0
- package/dist/components/auth/LoginPage.d.ts +15 -0
- package/dist/components/auth/LoginPage.d.ts.map +1 -0
- package/dist/components/auth/OAuthButtons.d.ts +10 -0
- package/dist/components/auth/OAuthButtons.d.ts.map +1 -0
- package/dist/components/auth/ProtectedRoute.d.ts +11 -0
- package/dist/components/auth/ProtectedRoute.d.ts.map +1 -0
- package/dist/components/auth/RecoveryForm.d.ts +9 -0
- package/dist/components/auth/RecoveryForm.d.ts.map +1 -0
- package/dist/components/auth/SignupForm.d.ts +10 -0
- package/dist/components/auth/SignupForm.d.ts.map +1 -0
- package/dist/components/auth/SplitLogin.d.ts +14 -0
- package/dist/components/auth/SplitLogin.d.ts.map +1 -0
- package/dist/components/auth/index.d.ts +7 -0
- package/dist/components/auth/index.d.ts.map +1 -0
- package/dist/components/billing/InvoiceList.d.ts +9 -0
- package/dist/components/billing/InvoiceList.d.ts.map +1 -0
- package/dist/components/billing/PlanSelector.d.ts +13 -0
- package/dist/components/billing/PlanSelector.d.ts.map +1 -0
- package/dist/components/billing/SoftLimitBanner.d.ts +5 -0
- package/dist/components/billing/SoftLimitBanner.d.ts.map +1 -0
- package/dist/components/billing/SubscriptionCard.d.ts +12 -0
- package/dist/components/billing/SubscriptionCard.d.ts.map +1 -0
- package/dist/components/billing/SubscriptionPage.d.ts +5 -0
- package/dist/components/billing/SubscriptionPage.d.ts.map +1 -0
- package/dist/components/billing/UpgradeModal.d.ts +3 -0
- package/dist/components/billing/UpgradeModal.d.ts.map +1 -0
- package/dist/components/billing/UpgradeOverlay.d.ts +15 -0
- package/dist/components/billing/UpgradeOverlay.d.ts.map +1 -0
- package/dist/components/billing/UpgradePrompt.d.ts +10 -0
- package/dist/components/billing/UpgradePrompt.d.ts.map +1 -0
- package/dist/components/billing/access-contract.d.ts +18 -0
- package/dist/components/billing/access-contract.d.ts.map +1 -0
- package/dist/components/billing/gates.d.ts +14 -0
- package/dist/components/billing/gates.d.ts.map +1 -0
- package/dist/components/billing/index.d.ts +15 -0
- package/dist/components/billing/index.d.ts.map +1 -0
- package/dist/components/billing/plan-feature.d.ts +11 -0
- package/dist/components/billing/plan-feature.d.ts.map +1 -0
- package/dist/components/chat/ChatAttachments.d.ts +23 -0
- package/dist/components/chat/ChatAttachments.d.ts.map +1 -0
- package/dist/components/chat/ChatComposer.d.ts +21 -0
- package/dist/components/chat/ChatComposer.d.ts.map +1 -0
- package/dist/components/chat/ChatConversation.d.ts +20 -0
- package/dist/components/chat/ChatConversation.d.ts.map +1 -0
- package/dist/components/chat/ChatFab.d.ts +17 -0
- package/dist/components/chat/ChatFab.d.ts.map +1 -0
- package/dist/components/chat/ChatHistory.d.ts +16 -0
- package/dist/components/chat/ChatHistory.d.ts.map +1 -0
- package/dist/components/chat/ChatMessages.d.ts +16 -0
- package/dist/components/chat/ChatMessages.d.ts.map +1 -0
- package/dist/components/chat/ChatSuggestions.d.ts +17 -0
- package/dist/components/chat/ChatSuggestions.d.ts.map +1 -0
- package/dist/components/chat/ConfirmActionCard.d.ts +19 -0
- package/dist/components/chat/ConfirmActionCard.d.ts.map +1 -0
- package/dist/components/chat/RecordChip.d.ts +12 -0
- package/dist/components/chat/RecordChip.d.ts.map +1 -0
- package/dist/components/chat/index.d.ts +4 -0
- package/dist/components/chat/index.d.ts.map +1 -0
- package/dist/components/chat/markdown.d.ts +5 -0
- package/dist/components/chat/markdown.d.ts.map +1 -0
- package/dist/components/connect/AddConnectorPanel.d.ts +32 -0
- package/dist/components/connect/AddConnectorPanel.d.ts.map +1 -0
- package/dist/components/connect/ConnectConsentPage.d.ts +12 -0
- package/dist/components/connect/ConnectConsentPage.d.ts.map +1 -0
- package/dist/components/connect/ConnectorDetail.d.ts +29 -0
- package/dist/components/connect/ConnectorDetail.d.ts.map +1 -0
- package/dist/components/connect/ConnectorMark.d.ts +20 -0
- package/dist/components/connect/ConnectorMark.d.ts.map +1 -0
- package/dist/components/connect/ConnectorRow.d.ts +33 -0
- package/dist/components/connect/ConnectorRow.d.ts.map +1 -0
- package/dist/components/connect/ConnectorsPanel.d.ts +40 -0
- package/dist/components/connect/ConnectorsPanel.d.ts.map +1 -0
- package/dist/components/connect/ConnectorsTab.d.ts +16 -0
- package/dist/components/connect/ConnectorsTab.d.ts.map +1 -0
- package/dist/components/connect/client-marks.d.ts +31 -0
- package/dist/components/connect/client-marks.d.ts.map +1 -0
- package/dist/components/connect/index.d.ts +12 -0
- package/dist/components/connect/index.d.ts.map +1 -0
- package/dist/components/connect/model.d.ts +151 -0
- package/dist/components/connect/model.d.ts.map +1 -0
- package/dist/components/connect/useConnectors.d.ts +24 -0
- package/dist/components/connect/useConnectors.d.ts.map +1 -0
- package/dist/components/layout/BottomNav.d.ts +24 -0
- package/dist/components/layout/BottomNav.d.ts.map +1 -0
- package/dist/components/layout/CommandPalette.d.ts +23 -0
- package/dist/components/layout/CommandPalette.d.ts.map +1 -0
- package/dist/components/layout/LocationSwitchOverlay.d.ts +3 -0
- package/dist/components/layout/LocationSwitchOverlay.d.ts.map +1 -0
- package/dist/components/layout/MockModeBanner.d.ts +3 -0
- package/dist/components/layout/MockModeBanner.d.ts.map +1 -0
- package/dist/components/layout/PrintChrome.d.ts +10 -0
- package/dist/components/layout/PrintChrome.d.ts.map +1 -0
- package/dist/components/layout/index.d.ts +6 -0
- package/dist/components/layout/index.d.ts.map +1 -0
- package/dist/components/notes/NotesPanel.d.ts +13 -0
- package/dist/components/notes/NotesPanel.d.ts.map +1 -0
- package/dist/components/notifications/ChangelogFeed.d.ts +8 -0
- package/dist/components/notifications/ChangelogFeed.d.ts.map +1 -0
- package/dist/components/notifications/NotificationBell.d.ts +9 -0
- package/dist/components/notifications/NotificationBell.d.ts.map +1 -0
- package/dist/components/notifications/NotificationInbox.d.ts +13 -0
- package/dist/components/notifications/NotificationInbox.d.ts.map +1 -0
- package/dist/components/notifications/ToastProvider.d.ts +2 -0
- package/dist/components/notifications/ToastProvider.d.ts.map +1 -0
- package/dist/components/notifications/index.d.ts +5 -0
- package/dist/components/notifications/index.d.ts.map +1 -0
- package/dist/components/organization/InviteMemberDialog.d.ts +10 -0
- package/dist/components/organization/InviteMemberDialog.d.ts.map +1 -0
- package/dist/components/organization/OrgInitializer.d.ts +7 -0
- package/dist/components/organization/OrgInitializer.d.ts.map +1 -0
- package/dist/components/organization/OrgSwitcher.d.ts +7 -0
- package/dist/components/organization/OrgSwitcher.d.ts.map +1 -0
- package/dist/components/organization/PermissionMatrixEditor.d.ts +22 -0
- package/dist/components/organization/PermissionMatrixEditor.d.ts.map +1 -0
- package/dist/components/organization/PermissionProfilesTab.d.ts +3 -0
- package/dist/components/organization/PermissionProfilesTab.d.ts.map +1 -0
- package/dist/components/organization/TeamTab.d.ts +3 -0
- package/dist/components/organization/TeamTab.d.ts.map +1 -0
- package/dist/components/organization/TenantOnboarding.d.ts +9 -0
- package/dist/components/organization/TenantOnboarding.d.ts.map +1 -0
- package/dist/components/organization/index.d.ts +7 -0
- package/dist/components/organization/index.d.ts.map +1 -0
- package/dist/components/plugins/ConnectorsHub.d.ts +5 -0
- package/dist/components/plugins/ConnectorsHub.d.ts.map +1 -0
- package/dist/components/plugins/PluginSettingsPanel.d.ts +28 -0
- package/dist/components/plugins/PluginSettingsPanel.d.ts.map +1 -0
- package/dist/components/right-rail.d.ts +58 -0
- package/dist/components/right-rail.d.ts.map +1 -0
- package/dist/components/settings/BrandingSettings.d.ts +12 -0
- package/dist/components/settings/BrandingSettings.d.ts.map +1 -0
- package/dist/components/settings/CompanySettings.d.ts +13 -0
- package/dist/components/settings/CompanySettings.d.ts.map +1 -0
- package/dist/components/settings/ConnectedBrandingSettings.d.ts +2 -0
- package/dist/components/settings/ConnectedBrandingSettings.d.ts.map +1 -0
- package/dist/components/settings/ConnectedCompanySettings.d.ts +2 -0
- package/dist/components/settings/ConnectedCompanySettings.d.ts.map +1 -0
- package/dist/components/settings/ConnectedFieldRulesSettings.d.ts +2 -0
- package/dist/components/settings/ConnectedFieldRulesSettings.d.ts.map +1 -0
- package/dist/components/settings/ConnectedSecuritySettings.d.ts +2 -0
- package/dist/components/settings/ConnectedSecuritySettings.d.ts.map +1 -0
- package/dist/components/settings/ConnectedUserProfile.d.ts +3 -0
- package/dist/components/settings/ConnectedUserProfile.d.ts.map +1 -0
- package/dist/components/settings/FieldRulesSettings.d.ts +11 -0
- package/dist/components/settings/FieldRulesSettings.d.ts.map +1 -0
- package/dist/components/settings/HolidaysSettings.d.ts +21 -0
- package/dist/components/settings/HolidaysSettings.d.ts.map +1 -0
- package/dist/components/settings/LocationsCrudPage.d.ts +6 -0
- package/dist/components/settings/LocationsCrudPage.d.ts.map +1 -0
- package/dist/components/settings/LocationsOverview.d.ts +19 -0
- package/dist/components/settings/LocationsOverview.d.ts.map +1 -0
- package/dist/components/settings/SecuritySettings.d.ts +17 -0
- package/dist/components/settings/SecuritySettings.d.ts.map +1 -0
- package/dist/components/settings/SettingsPage.d.ts +46 -0
- package/dist/components/settings/SettingsPage.d.ts.map +1 -0
- package/dist/components/settings/UserProfile.d.ts +12 -0
- package/dist/components/settings/UserProfile.d.ts.map +1 -0
- package/dist/components/settings/index.d.ts +11 -0
- package/dist/components/settings/index.d.ts.map +1 -0
- package/dist/components/shared/ContactPicker.d.ts +92 -0
- package/dist/components/shared/ContactPicker.d.ts.map +1 -0
- package/dist/components/shared/PersonLink.d.ts +29 -0
- package/dist/components/shared/PersonLink.d.ts.map +1 -0
- package/dist/components/shared/create-person.d.ts +20 -0
- package/dist/components/shared/create-person.d.ts.map +1 -0
- package/dist/crud/CrudCardGrid.d.ts +13 -0
- package/dist/crud/CrudCardGrid.d.ts.map +1 -0
- package/dist/crud/CrudDetailPage.d.ts +23 -0
- package/dist/crud/CrudDetailPage.d.ts.map +1 -0
- package/dist/crud/CrudFormPage.d.ts +18 -0
- package/dist/crud/CrudFormPage.d.ts.map +1 -0
- package/dist/crud/CrudListView.d.ts +92 -0
- package/dist/crud/CrudListView.d.ts.map +1 -0
- package/dist/crud/CrudPage.d.ts +27 -0
- package/dist/crud/CrudPage.d.ts.map +1 -0
- package/dist/crud/CrudSkeletons.d.ts +21 -0
- package/dist/crud/CrudSkeletons.d.ts.map +1 -0
- package/dist/crud/DeleteConfirmDialog.d.ts +11 -0
- package/dist/crud/DeleteConfirmDialog.d.ts.map +1 -0
- package/dist/crud/EntityOverview.d.ts +14 -0
- package/dist/crud/EntityOverview.d.ts.map +1 -0
- package/dist/crud/ImportWizard.d.ts +18 -0
- package/dist/crud/ImportWizard.d.ts.map +1 -0
- package/dist/crud/archetype-lookup.d.ts +30 -0
- package/dist/crud/archetype-lookup.d.ts.map +1 -0
- package/dist/crud/archetypes/ActiveToggle.d.ts +8 -0
- package/dist/crud/archetypes/ActiveToggle.d.ts.map +1 -0
- package/dist/crud/archetypes/AddressesTab.d.ts +21 -0
- package/dist/crud/archetypes/AddressesTab.d.ts.map +1 -0
- package/dist/crud/archetypes/ArchetypeStatusBar.d.ts +11 -0
- package/dist/crud/archetypes/ArchetypeStatusBar.d.ts.map +1 -0
- package/dist/crud/archetypes/BlockSettingsPopover.d.ts +15 -0
- package/dist/crud/archetypes/BlockSettingsPopover.d.ts.map +1 -0
- package/dist/crud/archetypes/ClientOrdersTab.d.ts +18 -0
- package/dist/crud/archetypes/ClientOrdersTab.d.ts.map +1 -0
- package/dist/crud/archetypes/EntityLink.d.ts +32 -0
- package/dist/crud/archetypes/EntityLink.d.ts.map +1 -0
- package/dist/crud/archetypes/LocationDetailTabs.d.ts +11 -0
- package/dist/crud/archetypes/LocationDetailTabs.d.ts.map +1 -0
- package/dist/crud/archetypes/LocationFormLayout.d.ts +12 -0
- package/dist/crud/archetypes/LocationFormLayout.d.ts.map +1 -0
- package/dist/crud/archetypes/OrderDetailView.d.ts +115 -0
- package/dist/crud/archetypes/OrderDetailView.d.ts.map +1 -0
- package/dist/crud/archetypes/OrderFormView.d.ts +112 -0
- package/dist/crud/archetypes/OrderFormView.d.ts.map +1 -0
- package/dist/crud/archetypes/OrderListView.d.ts +36 -0
- package/dist/crud/archetypes/OrderListView.d.ts.map +1 -0
- package/dist/crud/archetypes/PersonDetailTabs.d.ts +35 -0
- package/dist/crud/archetypes/PersonDetailTabs.d.ts.map +1 -0
- package/dist/crud/archetypes/PersonFormLayout.d.ts +13 -0
- package/dist/crud/archetypes/PersonFormLayout.d.ts.map +1 -0
- package/dist/crud/archetypes/PersonPicker.d.ts +23 -0
- package/dist/crud/archetypes/PersonPicker.d.ts.map +1 -0
- package/dist/crud/archetypes/ProductDetailTabs.d.ts +11 -0
- package/dist/crud/archetypes/ProductDetailTabs.d.ts.map +1 -0
- package/dist/crud/archetypes/ProductFormLayout.d.ts +12 -0
- package/dist/crud/archetypes/ProductFormLayout.d.ts.map +1 -0
- package/dist/crud/archetypes/ScheduleEditor.d.ts +7 -0
- package/dist/crud/archetypes/ScheduleEditor.d.ts.map +1 -0
- package/dist/crud/archetypes/ServiceDetailTabs.d.ts +10 -0
- package/dist/crud/archetypes/ServiceDetailTabs.d.ts.map +1 -0
- package/dist/crud/archetypes/ServiceFormLayout.d.ts +12 -0
- package/dist/crud/archetypes/ServiceFormLayout.d.ts.map +1 -0
- package/dist/crud/archetypes/SubjectDetailTabs.d.ts +12 -0
- package/dist/crud/archetypes/SubjectDetailTabs.d.ts.map +1 -0
- package/dist/crud/archetypes/SubjectFormLayout.d.ts +14 -0
- package/dist/crud/archetypes/SubjectFormLayout.d.ts.map +1 -0
- package/dist/crud/createCrudPage.d.ts +34 -0
- package/dist/crud/createCrudPage.d.ts.map +1 -0
- package/dist/crud/csv-export.d.ts +3 -0
- package/dist/crud/csv-export.d.ts.map +1 -0
- package/dist/crud/fieldToColumn.d.ts +14 -0
- package/dist/crud/fieldToColumn.d.ts.map +1 -0
- package/dist/crud/index.d.ts +16 -0
- package/dist/crud/index.d.ts.map +1 -0
- package/dist/crud/placeholder.d.ts +7 -0
- package/dist/crud/placeholder.d.ts.map +1 -0
- package/dist/crud/relation-field.d.ts +28 -0
- package/dist/crud/relation-field.d.ts.map +1 -0
- package/dist/data/client.d.ts +14 -0
- package/dist/data/client.d.ts.map +1 -0
- package/dist/db.cjs +14 -0
- package/dist/db.cjs.map +1 -0
- package/dist/db.d.ts +2 -0
- package/dist/db.d.ts.map +1 -0
- package/dist/db.js +3 -0
- package/dist/db.js.map +1 -0
- package/dist/hooks/index.d.ts +20 -0
- package/dist/hooks/index.d.ts.map +1 -0
- package/dist/hooks/useAITools.d.ts +23 -0
- package/dist/hooks/useAITools.d.ts.map +1 -0
- package/dist/hooks/useAgentSurface.d.ts +15 -0
- package/dist/hooks/useAgentSurface.d.ts.map +1 -0
- package/dist/hooks/useAuth.d.ts +16 -0
- package/dist/hooks/useAuth.d.ts.map +1 -0
- package/dist/hooks/useChat.d.ts +38 -0
- package/dist/hooks/useChat.d.ts.map +1 -0
- package/dist/hooks/useDictation.d.ts +31 -0
- package/dist/hooks/useDictation.d.ts.map +1 -0
- package/dist/hooks/useFieldRules.d.ts +6 -0
- package/dist/hooks/useFieldRules.d.ts.map +1 -0
- package/dist/hooks/useFormatters.d.ts +7 -0
- package/dist/hooks/useFormatters.d.ts.map +1 -0
- package/dist/hooks/useGlobalSearch.d.ts +10 -0
- package/dist/hooks/useGlobalSearch.d.ts.map +1 -0
- package/dist/hooks/useLayout.d.ts +16 -0
- package/dist/hooks/useLayout.d.ts.map +1 -0
- package/dist/hooks/useMicLevels.d.ts +10 -0
- package/dist/hooks/useMicLevels.d.ts.map +1 -0
- package/dist/hooks/useModuleNavigation.d.ts +27 -0
- package/dist/hooks/useModuleNavigation.d.ts.map +1 -0
- package/dist/hooks/useNotifications.d.ts +11 -0
- package/dist/hooks/useNotifications.d.ts.map +1 -0
- package/dist/hooks/usePluginPrefs.d.ts +23 -0
- package/dist/hooks/usePluginPrefs.d.ts.map +1 -0
- package/dist/hooks/usePlugins.d.ts +5 -0
- package/dist/hooks/usePlugins.d.ts.map +1 -0
- package/dist/hooks/useSystemPermission.d.ts +3 -0
- package/dist/hooks/useSystemPermission.d.ts.map +1 -0
- package/dist/hooks/useTenant.d.ts +23 -0
- package/dist/hooks/useTenant.d.ts.map +1 -0
- package/dist/hooks/useTenantPluginSettings.d.ts +12 -0
- package/dist/hooks/useTenantPluginSettings.d.ts.map +1 -0
- package/dist/hooks/useTenantPlugins.d.ts +10 -0
- package/dist/hooks/useTenantPlugins.d.ts.map +1 -0
- package/dist/hooks/useTranslation.d.ts +5 -0
- package/dist/hooks/useTranslation.d.ts.map +1 -0
- package/dist/index.d.ts +93 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +17207 -0
- package/dist/index.js.map +1 -0
- package/dist/lib/agent-approvals.d.ts +27 -0
- package/dist/lib/agent-approvals.d.ts.map +1 -0
- package/dist/lib/agent-surface.d.ts +78 -0
- package/dist/lib/agent-surface.d.ts.map +1 -0
- package/dist/lib/ai-tool-handlers.d.ts +154 -0
- package/dist/lib/ai-tool-handlers.d.ts.map +1 -0
- package/dist/lib/apply-field-rules.d.ts +4 -0
- package/dist/lib/apply-field-rules.d.ts.map +1 -0
- package/dist/lib/assistant-delegation.d.ts +5 -0
- package/dist/lib/assistant-delegation.d.ts.map +1 -0
- package/dist/lib/assistant-feature.d.ts +8 -0
- package/dist/lib/assistant-feature.d.ts.map +1 -0
- package/dist/lib/attachments.d.ts +95 -0
- package/dist/lib/attachments.d.ts.map +1 -0
- package/dist/lib/auth-context.d.ts +5 -0
- package/dist/lib/auth-context.d.ts.map +1 -0
- package/dist/lib/cache.d.ts +18 -0
- package/dist/lib/cache.d.ts.map +1 -0
- package/dist/lib/cn.d.ts +2 -0
- package/dist/lib/cn.d.ts.map +1 -0
- package/dist/lib/core-ai-tools.d.ts +49 -0
- package/dist/lib/core-ai-tools.d.ts.map +1 -0
- package/dist/lib/create-client-orders-provider.d.ts +3 -0
- package/dist/lib/create-client-orders-provider.d.ts.map +1 -0
- package/dist/lib/csv.d.ts +14 -0
- package/dist/lib/csv.d.ts.map +1 -0
- package/dist/lib/currency.d.ts +7 -0
- package/dist/lib/currency.d.ts.map +1 -0
- package/dist/lib/dedup.d.ts +2 -0
- package/dist/lib/dedup.d.ts.map +1 -0
- package/dist/lib/entity-registry.d.ts +19 -0
- package/dist/lib/entity-registry.d.ts.map +1 -0
- package/dist/lib/entity-routes.d.ts +48 -0
- package/dist/lib/entity-routes.d.ts.map +1 -0
- package/dist/lib/fayz-agent.d.ts +23 -0
- package/dist/lib/fayz-agent.d.ts.map +1 -0
- package/dist/lib/format.d.ts +7 -0
- package/dist/lib/format.d.ts.map +1 -0
- package/dist/lib/locale-config.d.ts +8 -0
- package/dist/lib/locale-config.d.ts.map +1 -0
- package/dist/lib/notes-tasks-bridge.d.ts +28 -0
- package/dist/lib/notes-tasks-bridge.d.ts.map +1 -0
- package/dist/lib/org-context.d.ts +5 -0
- package/dist/lib/org-context.d.ts.map +1 -0
- package/dist/lib/plugins.d.ts +2 -0
- package/dist/lib/plugins.d.ts.map +1 -0
- package/dist/lib/record-refs.d.ts +31 -0
- package/dist/lib/record-refs.d.ts.map +1 -0
- package/dist/lib/router.d.ts +15 -0
- package/dist/lib/router.d.ts.map +1 -0
- package/dist/lib/schedule-config.d.ts +32 -0
- package/dist/lib/schedule-config.d.ts.map +1 -0
- package/dist/lib/schedule-service.d.ts +76 -0
- package/dist/lib/schedule-service.d.ts.map +1 -0
- package/dist/lib/search-targets.d.ts +12 -0
- package/dist/lib/search-targets.d.ts.map +1 -0
- package/dist/lib/speech.d.ts +36 -0
- package/dist/lib/speech.d.ts.map +1 -0
- package/dist/lib/supabase.d.ts +10 -0
- package/dist/lib/supabase.d.ts.map +1 -0
- package/dist/org/adapters/mock.d.ts +4 -0
- package/dist/org/adapters/mock.d.ts.map +1 -0
- package/dist/org/adapters/supabase.d.ts +33 -0
- package/dist/org/adapters/supabase.d.ts.map +1 -0
- package/dist/org/cache.d.ts +29 -0
- package/dist/org/cache.d.ts.map +1 -0
- package/dist/org/context.d.ts +36 -0
- package/dist/org/context.d.ts.map +1 -0
- package/dist/org/index.d.ts +10 -0
- package/dist/org/index.d.ts.map +1 -0
- package/dist/org/index.js +5 -0
- package/dist/org/index.js.map +1 -0
- package/dist/org/store.d.ts +20 -0
- package/dist/org/store.d.ts.map +1 -0
- package/dist/org/team-rows.d.ts +45 -0
- package/dist/org/team-rows.d.ts.map +1 -0
- package/dist/permissions/PermissionGate.d.ts +12 -0
- package/dist/permissions/PermissionGate.d.ts.map +1 -0
- package/dist/permissions/context.d.ts +39 -0
- package/dist/permissions/context.d.ts.map +1 -0
- package/dist/permissions/index.d.ts +5 -0
- package/dist/permissions/index.d.ts.map +1 -0
- package/dist/permissions/index.js +3 -0
- package/dist/permissions/index.js.map +1 -0
- package/dist/permissions/roles.d.ts +7 -0
- package/dist/permissions/roles.d.ts.map +1 -0
- package/dist/permissions/store.d.ts +21 -0
- package/dist/permissions/store.d.ts.map +1 -0
- package/dist/plugins/ModuleActionBar.d.ts +27 -0
- package/dist/plugins/ModuleActionBar.d.ts.map +1 -0
- package/dist/plugins/PluginRegistryManager.d.ts +13 -0
- package/dist/plugins/PluginRegistryManager.d.ts.map +1 -0
- package/dist/plugins/QuickActionsButton.d.ts +12 -0
- package/dist/plugins/QuickActionsButton.d.ts.map +1 -0
- package/dist/plugins/SettingsGroup.d.ts +25 -0
- package/dist/plugins/SettingsGroup.d.ts.map +1 -0
- package/dist/plugins/WidgetSlot.d.ts +8 -0
- package/dist/plugins/WidgetSlot.d.ts.map +1 -0
- package/dist/plugins/createPluginContext.d.ts +28 -0
- package/dist/plugins/createPluginContext.d.ts.map +1 -0
- package/dist/plugins/createViewRouter.d.ts +38 -0
- package/dist/plugins/createViewRouter.d.ts.map +1 -0
- package/dist/projects/ProjectsSettings.d.ts +3 -0
- package/dist/projects/ProjectsSettings.d.ts.map +1 -0
- package/dist/projects/SeuSiteWidget.d.ts +7 -0
- package/dist/projects/SeuSiteWidget.d.ts.map +1 -0
- package/dist/projects/provider.d.ts +8 -0
- package/dist/projects/provider.d.ts.map +1 -0
- package/dist/projects/store.d.ts +16 -0
- package/dist/projects/store.d.ts.map +1 -0
- package/dist/projects/types.d.ts +46 -0
- package/dist/projects/types.d.ts.map +1 -0
- package/dist/stores/auth.store.d.ts +12 -0
- package/dist/stores/auth.store.d.ts.map +1 -0
- package/dist/stores/billing.store.d.ts +2 -0
- package/dist/stores/billing.store.d.ts.map +1 -0
- package/dist/stores/chat.store.d.ts +208 -0
- package/dist/stores/chat.store.d.ts.map +1 -0
- package/dist/stores/createCrudStore.d.ts +54 -0
- package/dist/stores/createCrudStore.d.ts.map +1 -0
- package/dist/stores/index.d.ts +13 -0
- package/dist/stores/index.d.ts.map +1 -0
- package/dist/stores/invite.store.d.ts +11 -0
- package/dist/stores/invite.store.d.ts.map +1 -0
- package/dist/stores/layout.store.d.ts +2 -0
- package/dist/stores/layout.store.d.ts.map +1 -0
- package/dist/stores/locale.store.d.ts +17 -0
- package/dist/stores/locale.store.d.ts.map +1 -0
- package/dist/stores/location.store.d.ts +20 -0
- package/dist/stores/location.store.d.ts.map +1 -0
- package/dist/stores/notifications.store.d.ts +12 -0
- package/dist/stores/notifications.store.d.ts.map +1 -0
- package/dist/stores/organization.store.d.ts +2 -0
- package/dist/stores/organization.store.d.ts.map +1 -0
- package/dist/stores/permissions.store.d.ts +2 -0
- package/dist/stores/permissions.store.d.ts.map +1 -0
- package/dist/stores/plugin.store.d.ts +24 -0
- package/dist/stores/plugin.store.d.ts.map +1 -0
- package/dist/stores/tenant.store.d.ts +11 -0
- package/dist/stores/tenant.store.d.ts.map +1 -0
- package/dist/stores/theme.store.d.ts +17 -0
- package/dist/stores/theme.store.d.ts.map +1 -0
- package/dist/theme/dark.d.ts +3 -0
- package/dist/theme/dark.d.ts.map +1 -0
- package/dist/theme/index.d.ts +8 -0
- package/dist/theme/index.d.ts.map +1 -0
- package/dist/theme/light.d.ts +3 -0
- package/dist/theme/light.d.ts.map +1 -0
- package/dist/theme/tailwind-preset.d.ts +4 -0
- package/dist/theme/tailwind-preset.d.ts.map +1 -0
- package/dist/theme/tokens.d.ts +119 -0
- package/dist/theme/tokens.d.ts.map +1 -0
- package/dist/theme/utils.d.ts +31 -0
- package/dist/theme/utils.d.ts.map +1 -0
- package/dist/types/auth-adapter.d.ts +14 -0
- package/dist/types/auth-adapter.d.ts.map +1 -0
- package/dist/types/auth.d.ts +34 -0
- package/dist/types/auth.d.ts.map +1 -0
- package/dist/types/billing.d.ts +81 -0
- package/dist/types/billing.d.ts.map +1 -0
- package/dist/types/client-orders.d.ts +47 -0
- package/dist/types/client-orders.d.ts.map +1 -0
- package/dist/types/crud.d.ts +137 -0
- package/dist/types/crud.d.ts.map +1 -0
- package/dist/types/entities.d.ts +150 -0
- package/dist/types/entities.d.ts.map +1 -0
- package/dist/types/entity-lookup.d.ts +18 -0
- package/dist/types/entity-lookup.d.ts.map +1 -0
- package/dist/types/index.d.ts +17 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/integrations.d.ts +48 -0
- package/dist/types/integrations.d.ts.map +1 -0
- package/dist/types/invite.d.ts +23 -0
- package/dist/types/invite.d.ts.map +1 -0
- package/dist/types/layout.d.ts +26 -0
- package/dist/types/layout.d.ts.map +1 -0
- package/dist/types/notifications.d.ts +31 -0
- package/dist/types/notifications.d.ts.map +1 -0
- package/dist/types/org-adapter.d.ts +92 -0
- package/dist/types/org-adapter.d.ts.map +1 -0
- package/dist/types/permissions.d.ts +39 -0
- package/dist/types/permissions.d.ts.map +1 -0
- package/dist/types/platform.d.ts +25 -0
- package/dist/types/platform.d.ts.map +1 -0
- package/dist/types/plugins.d.ts +269 -0
- package/dist/types/plugins.d.ts.map +1 -0
- package/dist/types/tenant.d.ts +74 -0
- package/dist/types/tenant.d.ts.map +1 -0
- package/dist/ui.d.ts +2 -0
- package/dist/ui.d.ts.map +1 -0
- package/dist/ui.js +3 -0
- package/dist/ui.js.map +1 -0
- package/package.json +94 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/lib/agent-approvals.ts","../src/lib/record-refs.ts","../src/lib/attachments.ts","../src/stores/chat.store.ts","../src/components/right-rail.tsx","../src/app/core-entities.ts","../src/lib/core-ai-tools.ts","../src/hooks/useSystemPermission.ts","../src/lib/agent-surface.ts","../src/hooks/useAITools.ts","../src/lib/dedup.ts","../src/app/routing.tsx","../src/lib/entity-routes.ts","../src/lib/ai-tool-handlers.ts","../src/lib/fayz-agent.ts","../src/lib/speech.ts","../src/hooks/useChat.ts","../src/components/chat/ChatFab.tsx","../src/components/chat/ChatSuggestions.tsx","../src/components/connect/client-marks.ts","../src/components/connect/ConnectorMark.tsx","../src/components/connect/model.ts","../src/components/connect/ConnectorRow.tsx","../src/components/connect/ConnectorDetail.tsx","../src/components/connect/useConnectors.ts","../src/components/connect/ConnectorsPanel.tsx","../src/hooks/useDictation.ts","../src/hooks/useMicLevels.ts","../src/components/chat/ChatAttachments.tsx","../src/components/chat/ChatComposer.tsx","../src/components/chat/markdown.tsx","../src/components/chat/RecordChip.tsx","../src/components/chat/ChatMessages.tsx","../src/components/chat/ConfirmActionCard.tsx","../src/components/billing/UpgradePrompt.tsx","../src/components/billing/UpgradeOverlay.tsx","../src/lib/assistant-feature.ts","../src/components/chat/ChatConversation.tsx","../src/lib/assistant-delegation.ts","../src/lib/notes-tasks-bridge.ts","../src/components/notes/NotesPanel.tsx","../src/theme/light.ts","../src/theme/dark.ts","../src/theme/utils.ts","../src/stores/theme.store.ts","../src/stores/locale.store.ts","../src/lib/search-targets.ts","../src/hooks/useGlobalSearch.ts","../src/plugins/WidgetSlot.tsx","../src/app/nav-contributions.store.ts","../src/projects/provider.ts","../src/projects/store.ts","../src/projects/SeuSiteWidget.tsx","../src/components/RightRail.tsx","../src/stores/notifications.store.ts","../src/lib/supabase.ts","../src/hooks/useNotifications.ts","../src/components/notifications/ChangelogFeed.tsx","../src/components/notifications/NotificationInbox.tsx","../src/components/connect/ConnectConsentPage.tsx","../src/components/connect/AddConnectorPanel.tsx","../src/components/connect/ConnectorsTab.tsx","../src/lib/locale-config.ts","../src/components/settings/CompanySettings.tsx","../src/components/settings/ConnectedCompanySettings.tsx","../src/components/settings/UserProfile.tsx","../src/components/settings/ConnectedUserProfile.tsx","../src/components/settings/SecuritySettings.tsx","../src/stores/auth.store.ts","../src/lib/auth-context.ts","../src/components/settings/ConnectedSecuritySettings.tsx","../src/components/settings/BrandingSettings.tsx","../src/components/settings/ConnectedBrandingSettings.tsx","../src/projects/ProjectsSettings.tsx","../src/components/settings/SettingsPage.tsx","../src/stores/invite.store.ts","../src/components/organization/InviteMemberDialog.tsx","../src/components/organization/TeamTab.tsx","../src/components/organization/PermissionMatrixEditor.tsx","../src/components/organization/PermissionProfilesTab.tsx","../src/crud/archetypes/ActiveToggle.tsx","../src/crud/archetypes/PersonFormLayout.tsx","../src/crud/archetypes/ProductFormLayout.tsx","../src/crud/archetypes/ServiceFormLayout.tsx","../src/crud/archetypes/LocationFormLayout.tsx","../src/crud/archetypes/PersonPicker.tsx","../src/crud/archetypes/SubjectFormLayout.tsx","../src/crud/relation-field.tsx","../src/crud/CrudFormPage.tsx","../src/crud/CrudSkeletons.tsx","../src/crud/fieldToColumn.tsx","../src/crud/CrudCardGrid.tsx","../src/permissions/PermissionGate.tsx","../src/components/billing/gates.tsx","../src/crud/CrudListView.tsx","../src/crud/archetypes/AddressesTab.tsx","../src/crud/archetypes/PersonDetailTabs.tsx","../src/crud/archetypes/ProductDetailTabs.tsx","../src/crud/archetypes/ServiceDetailTabs.tsx","../src/crud/archetypes/LocationDetailTabs.tsx","../src/crud/archetypes/EntityLink.tsx","../src/crud/archetypes/SubjectDetailTabs.tsx","../src/crud/CrudDetailPage.tsx","../src/crud/DeleteConfirmDialog.tsx","../src/crud/csv-export.ts","../src/lib/apply-field-rules.ts","../src/hooks/useFieldRules.ts","../src/crud/CrudPage.tsx","../src/stores/createCrudStore.ts","../src/crud/createCrudPage.tsx","../src/components/settings/LocationsCrudPage.ts","../src/components/settings/FieldRulesSettings.tsx","../src/lib/entity-registry.ts","../src/components/settings/ConnectedFieldRulesSettings.tsx","../src/components/billing/UpgradeModal.tsx","../src/components/billing/SoftLimitBanner.tsx","../src/app/AdminShell.tsx","../src/app/admin-app.tsx","../src/app/derive-contract.ts","../src/app/scaffold.tsx","../src/crud/archetypes/ClientOrdersTab.tsx","../src/crud/archetypes/OrderDetailView.tsx","../src/crud/archetypes/OrderFormView.tsx","../src/crud/archetypes/OrderListView.tsx","../src/lib/create-client-orders-provider.ts","../src/crud/archetype-lookup.ts","../src/crud/placeholder.ts","../src/plugins/SettingsGroup.tsx","../src/plugins/QuickActionsButton.tsx","../src/plugins/ModuleActionBar.tsx","../src/plugins/createPluginContext.tsx","../src/plugins/createViewRouter.tsx","../src/lib/currency.ts","../src/plugins/PluginRegistryManager.tsx","../src/hooks/useModuleNavigation.ts","../src/components/shared/PersonLink.tsx","../src/components/shared/create-person.ts","../src/components/shared/ContactPicker.tsx","../src/hooks/usePluginPrefs.ts","../src/hooks/useTenantPluginSettings.ts","../src/hooks/useAgentSurface.ts","../src/components/plugins/ConnectorsHub.tsx","../src/components/plugins/PluginSettingsPanel.tsx","../src/index.ts"],"names":["create","React","entries","registry","listeners","React2","getAllEntities","React3","resolved","profileHasSystemPermission","tenantId","useTranslation","useAuthStore","useMemo","useCallback","emitDataChanged","t","content","React4","cn","jsxs","jsx","Sparkles","X","React5","InfinityIcon","ArrowUpRight","RefreshCw","Plug","usePluginRuntimeOptional","session","Fragment","React10","React11","FileIcon","React12","Loader2","React13","React14","ChevronRight","Paperclip","React15","Check","React16","Button","React17","React18","adapter","storageKey","createStore","key","React19","ArrowLeft","Pencil","Trash2","Search","Square","STORAGE_KEY","useRef","getWidgetsForZone","resolvePluginComponent","React20","getSupabaseClientOptional","getActiveTenantId","KIND_ICON","React21","fallback","ExternalLink","React22","_getOpt","useEffect","React23","TYPE_ICONS","Info","CheckCircle2","AlertTriangle","AlertCircle","TYPE_COLORS","React24","Skeleton","Plus","React28","Card","Input","React29","CardHeader","CardTitle","CardDescription","CardContent","CardFooter","Save","React30","React31","ShieldCheck","initialState","React32","Upload","currentSettings","Globe","Store","LayoutTemplate","React33","PenSquare","React34","useOrgAdapterOptional","React35","Modal","ModalContent","ModalHeader","ModalTitle","ModalDescription","Select","SelectTrigger","SelectValue","SelectContent","SelectItem","React36","UserPlus","Avatar","AvatarImage","AvatarFallback","Dropdown","DropdownTrigger","DropdownContent","DropdownItem","Clock","React37","Badge","React38","Shield","Eye","renderField","User","SKIP_FIELDS","FieldItem","IDENTITY_FIELDS","PRICING_FIELDS","CONTACT_FIELDS","ADDRESS_FIELDS","useState","Checkbox","guardLimit","toast","useSaveBar","useBackHandler","formatCurrencyLocale","formatDate","formatDateLocale","formatDateTimeLocale","formatValue","formatCurrency","getLucideIcon","Package","ArrowDown","ArrowUp","DropdownLabel","DropdownSeparator","db","MapPin","Star","ModalFooter","usePluginsOptional","FileText","ComingSoon","CalendarDays","Tag","BarChart3","PhoneLink","LucideIcons","SubpageHeader","ImportWizard","deriveEntityKey","emit","resolveDataProvider","ChevronDown","React50","ChevronsUpDown","Crown","React51","Building2","SettingsIcon","Users","usePluginRuntime","useLayoutStore","React53","resolvePluginRuntime","PluginRuntimeProvider","refs","React54","navigator","React56","lookup","CurrencyInput","PageHeader","React57","HeaderTabs","DataTable","ToggleRow","ICON_MAP","useStore","useZustandStore","formatCurrencyFromContext","UUID_RE","PersonLink","Popover","PopoverTrigger","PopoverContent","Mail","STORAGE_PREFIX","React64","RegistryCrudView","Settings","ChevronLeft","coreRenderApp"],"mappings":"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","file":"index.js","sourcesContent":["import { useAuthStore } from '@fayz-ai/auth'\nimport { useOrganizationStore } from '../stores/organization.store'\n\n// ---------------------------------------------------------------------------\n// Auto-approval — the assistant's \"don't ask me again\", modelled on Claude\n// Code's allowlist.\n//\n// Confirming every single write is the right default (an agent write is still\n// a write), but a manager who books twenty appointments an hour answers the\n// same card twenty times. So the card offers a third answer: approve, and\n// remember this ONE kind of action.\n//\n// Two grades, on purpose:\n// • persisted — additive writes (create/update). Survive reloads, scoped to\n// org + user, revocable from the assistant's tools panel.\n// • session — destructive writes (delete/cancel). Never persisted: a\n// misheard voice command must not be able to erase data on a\n// rule the user granted last month and forgot.\n// ---------------------------------------------------------------------------\n\nconst STORAGE_PREFIX = 'fayz.agent.auto-approve.v1'\n\nexport interface AutoApprovalRule {\n /** `toolName` or `toolName:scope` — what the decision is remembered against. */\n key: string\n toolName: string\n /** Entity the rule is limited to, so \"always create clients\" never becomes\n * \"always create anything\". */\n scope?: string\n /** Human label for the revoke list (\"Criar Cliente\"). */\n label: string\n createdAt: string\n}\n\n/** Writes that remove or void data. Their grants never outlive the tab. */\nconst DESTRUCTIVE = /(delete|destroy|remove|cancel|archive|refund|void)/i\n\nexport function isDestructiveTool(toolName: string): boolean {\n return DESTRUCTIVE.test(toolName)\n}\n\nexport function approvalKey(toolName: string, scope?: string): string {\n return scope ? `${toolName}:${scope}` : toolName\n}\n\nfunction storageKey(): string | null {\n const orgId = useOrganizationStore.getState().currentOrg?.id\n const userId = useAuthStore.getState().user?.id\n // No identity yet → nothing is remembered. Anonymous grants would follow the\n // browser, not the person, and leak across tenants on a shared machine.\n if (!orgId || !userId) return null\n return `${STORAGE_PREFIX}:${orgId}:${userId}`\n}\n\nfunction read(): AutoApprovalRule[] {\n const key = storageKey()\n if (!key || typeof localStorage === 'undefined') return []\n try {\n const raw = localStorage.getItem(key)\n const parsed = raw ? (JSON.parse(raw) as unknown) : []\n return Array.isArray(parsed) ? (parsed as AutoApprovalRule[]).filter((r) => r && r.key) : []\n } catch {\n return []\n }\n}\n\nfunction write(rules: AutoApprovalRule[]): void {\n const key = storageKey()\n if (!key || typeof localStorage === 'undefined') return\n try {\n localStorage.setItem(key, JSON.stringify(rules))\n } catch {\n // Private mode / quota — the grant simply stays session-scoped.\n }\n}\n\n/** Grants that die with the tab (destructive tools, and private-mode fallback). */\nconst sessionGrants = new Set<string>()\n\nconst listeners = new Set<() => void>()\n\nfunction notify(): void {\n for (const listener of Array.from(listeners)) listener()\n}\n\n/** Re-render the revoke list when a grant is added or removed. */\nexport function subscribeAutoApprovals(listener: () => void): () => void {\n listeners.add(listener)\n return () => listeners.delete(listener)\n}\n\nexport function listAutoApprovals(): AutoApprovalRule[] {\n return read()\n}\n\nexport function isAutoApproved(toolName: string, scope?: string): boolean {\n const key = approvalKey(toolName, scope)\n if (sessionGrants.has(key)) return true\n if (isDestructiveTool(toolName)) return false\n return read().some((rule) => rule.key === key)\n}\n\nexport function grantAutoApproval(input: {\n toolName: string\n scope?: string\n label: string\n /** Force session-only. Destructive tools are session-only regardless. */\n session?: boolean\n}): void {\n const key = approvalKey(input.toolName, input.scope)\n if (input.session || isDestructiveTool(input.toolName)) {\n sessionGrants.add(key)\n notify()\n return\n }\n const rules = read().filter((rule) => rule.key !== key)\n rules.push({\n key,\n toolName: input.toolName,\n scope: input.scope,\n label: input.label,\n createdAt: new Date().toISOString(),\n })\n write(rules)\n notify()\n}\n\nexport function revokeAutoApproval(key: string): void {\n sessionGrants.delete(key)\n write(read().filter((rule) => rule.key !== key))\n notify()\n}\n\nexport function revokeAllAutoApprovals(): void {\n sessionGrants.clear()\n write([])\n notify()\n}\n","import type { ChatRecordLink } from '../stores/chat.store'\n\n/** Index of every record seen this conversation, so a confirmation card can\n * show \"Zeilma Cunha\" for an id the model passed. Never fetches — the label\n * already came back with the tool result that produced the id. */\n\nconst MAX_ENTRIES = 300\n\nconst refs = new Map<string, ChatRecordLink>()\n\n/** Fields a row uses to call itself something, best first. */\nconst LABEL_FIELDS = [\n 'name',\n 'full_name',\n 'fullName',\n 'title',\n 'label',\n 'client_name',\n 'customer_name',\n 'service_name',\n 'display_name',\n 'email',\n]\n\nconst UUID = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i\n\n/** True for the shape the model passes around as `client_id`, `service_id`, … */\nexport function looksLikeRecordId(value: unknown): value is string {\n return typeof value === 'string' && UUID.test(value)\n}\n\nfunction bestLabel(row: Record<string, unknown>, ref: Record<string, unknown>): string | null {\n if (typeof ref.label === 'string' && ref.label.trim()) return ref.label.trim()\n for (const field of LABEL_FIELDS) {\n const value = row[field]\n if (typeof value === 'string' && value.trim()) return value.trim()\n }\n return null\n}\n\nfunction remember(link: ChatRecordLink): void {\n const existing = refs.get(link.id)\n // Never downgrade — losing the archetype or the entity key turns a working\n // link into plain text.\n const merged: ChatRecordLink = {\n ...link,\n ...(!link.archetype && existing?.archetype\n ? { archetype: existing.archetype, ...(existing.kind ? { kind: existing.kind } : {}) }\n : {}),\n ...(!link.entityKey && existing?.entityKey ? { entityKey: existing.entityKey } : {}),\n }\n // Re-insert to move it to the end: eviction drops the least recently used.\n refs.delete(link.id)\n refs.set(link.id, merged)\n while (refs.size > MAX_ENTRIES) {\n const oldest = refs.keys().next().value\n if (oldest === undefined) break\n refs.delete(oldest)\n }\n}\n\n/** Walk a tool result and index every `{ ref }` in it, whatever shape the tool\n * answers in. */\nexport function rememberRecordRefs(content: string): void {\n let parsed: unknown\n try {\n parsed = JSON.parse(content)\n } catch {\n return // non-JSON tool result — nothing to index\n }\n walk(parsed, 0)\n}\n\nfunction walk(node: unknown, depth: number): void {\n if (depth > 6 || !node || typeof node !== 'object') return\n if (Array.isArray(node)) {\n for (const item of node) walk(item, depth + 1)\n return\n }\n const row = node as Record<string, unknown>\n const ref = row.ref\n if (ref && typeof ref === 'object' && !Array.isArray(ref)) {\n const r = ref as Record<string, unknown>\n const id = typeof r.id === 'string' ? r.id : null\n if (id) {\n const [archetype, kind] = String(r.archetype ?? '').split(':')\n const label = bestLabel(row, r)\n if (label) {\n remember({\n id,\n label,\n ...(archetype ? { archetype } : {}),\n ...(kind ? { kind } : {}),\n ...(typeof r.entityKey === 'string' ? { entityKey: r.entityKey } : {}),\n })\n }\n }\n } else if (looksLikeRecordId(row.id)) {\n // No ref: entities without an archetype still have an id and a name. No\n // archetype means no route, so the chip renders as plain text.\n const label = bestLabel(row, {})\n if (label) remember({ id: row.id, label })\n }\n for (const value of Object.values(row)) walk(value, depth + 1)\n}\n\n/**\n * Index what the SURFACE put in front of the model this turn.\n *\n * The ref index used to learn only from tool results, but the request also\n * carries the open screen (agent-surface snapshot) and the current route — both\n * of which name a record id. So the client would hand the model an id and then\n * refuse it: asked \"me fale sobre este lead\" on a lead page, the model called\n * openRecord with the id from the context and got back \"that id was not seen in\n * this conversation\". The system contradicting itself is worse than not\n * offering the id at all.\n */\nexport function rememberSurfaceRefs(snapshot: unknown): void {\n if (!snapshot) return\n const list = Array.isArray(snapshot) ? snapshot : [snapshot]\n for (const entry of list) {\n if (!entry || typeof entry !== 'object') continue\n const record = (entry as { record?: unknown }).record\n if (record && typeof record === 'object') {\n const r = record as { id?: unknown; entity?: unknown; label?: unknown; summary?: unknown }\n if (looksLikeRecordId(r.id)) {\n const label =\n (typeof r.label === 'string' && r.label.trim()) ||\n bestLabel((r.summary as Record<string, unknown>) ?? {}, {})\n if (label) {\n remember({\n id: r.id,\n label,\n ...(typeof r.entity === 'string' ? { entityKey: r.entity } : {}),\n })\n }\n }\n }\n // The rest of the snapshot is arbitrary surface state — the same walker\n // that reads tool results finds any {ref} or {id,name} rows inside it.\n walk(entry, 0)\n }\n}\n\n/** Null means \"show the raw value\" — never a guessed name. */\nexport function lookupRecordRef(id: unknown): ChatRecordLink | null {\n if (!looksLikeRecordId(id)) return null\n return refs.get(id) ?? null\n}\n\n/** A new thread starts with no memory of the old one's records. */\nexport function clearRecordRefs(): void {\n refs.clear()\n}\n\n/**\n * The records a reply is ABOUT — write results always, single-match reads too.\n * Narrower than the index above on purpose: everything gets remembered, only\n * these earn a goto button.\n */\nexport function extractRecordLinks(content: string): ChatRecordLink[] {\n let parsed: Record<string, unknown>\n try {\n parsed = JSON.parse(content) as Record<string, unknown>\n } catch {\n return []\n }\n const links: ChatRecordLink[] = []\n const push = (ref: unknown, fallbackLabel?: unknown) => {\n if (!ref || typeof ref !== 'object') return\n const r = ref as { id?: string; label?: string; archetype?: string; entityKey?: string; path?: string }\n if (!r.id) return\n const [archetype, kind] = (r.archetype ?? '').split(':')\n links.push({\n id: r.id,\n label: String(r.label ?? fallbackLabel ?? 'registro'),\n ...(archetype ? { archetype } : {}),\n ...(kind ? { kind } : {}),\n ...(r.entityKey ? { entityKey: r.entityKey } : {}),\n // A destination the route map cannot derive (a settings tab) — the only\n // way a non-record result gets a working button.\n ...(typeof r.path === 'string' && r.path.startsWith('/') ? { path: r.path } : {}),\n })\n }\n const record = parsed.record as Record<string, unknown> | undefined\n push(parsed.ref, record?.name)\n push(record?.ref, record?.client_name ?? record?.service_name)\n const singleFrom = (rows: unknown) => {\n if (Array.isArray(rows) && rows.length === 1) {\n const row = rows[0] as Record<string, unknown>\n push(row.ref, row.name)\n }\n }\n singleFrom(parsed.records)\n for (const m of Array.isArray(parsed.matches) ? parsed.matches : []) {\n singleFrom((m as Record<string, unknown>).records)\n }\n return links\n}\n\n/** Same id twice is the same button. */\nexport function dedupeLinks(links: ChatRecordLink[]): ChatRecordLink[] {\n const seen = new Map<string, ChatRecordLink>()\n for (const l of links) if (!seen.has(l.id)) seen.set(l.id, l)\n return Array.from(seen.values()).slice(0, 3)\n}\n","/**\n * Attachments for the assistant, parsed in the browser.\n *\n * The bytes NEVER leave this module. A spreadsheet of clients or patients is\n * personal data (LGPD) — shipping it to a model provider to \"have a look\" is\n * not a technical shortcut, it is a disclosure. So the file stays in the tab\n * and only a DIGEST travels: the shape (sheets, headers, row count, inferred\n * column types) plus a handful of sample rows. The model sees the FORM, never\n * the data set.\n *\n * Everything here is therefore bounded on purpose: a 50k-row file and a 50-row\n * file produce digests of roughly the same size.\n */\n\nexport type AttachmentKind = 'spreadsheet' | 'csv' | 'text' | 'image' | 'pdf' | 'binary'\n\nexport type AttachmentColumnType =\n | 'text'\n | 'number'\n | 'date'\n | 'boolean'\n | 'email'\n | 'phone'\n\nexport interface AttachmentColumn {\n name: string\n type: AttachmentColumnType\n /** Detected literal shape ('dd/mm/yyyy', 'yyyy-mm-dd', '1.234,56'), when known. */\n format?: string\n /** Why this column is not the type it looks like — ambiguity, mixed values. */\n note?: string\n}\n\nexport interface AttachmentSheet {\n name: string\n headers: string[]\n /** Data rows, header excluded. Absent when only the head of the file was read. */\n rowCount?: number\n sample: string[][]\n columnTypes: AttachmentColumn[]\n}\n\nexport interface AttachmentDigest {\n id: string\n name: string\n mime: string\n size: number\n kind: AttachmentKind\n /** Spreadsheets with more than one tab. Single-tab files use the flat fields. */\n sheets?: AttachmentSheet[]\n headers?: string[]\n rowCount?: number\n sample?: string[][]\n columnTypes?: AttachmentColumn[]\n /** Head of a text/markdown file. */\n preview?: string\n /** Everything the reader had to guess at, truncate or give up on. */\n warnings?: string[]\n /** Set when the file could not be opened at all — the chip says what to do\n * instead of pretending a shapeless digest is a reading. */\n unreadable?: 'spreadsheet'\n}\n\n// Digest budget. These caps are what keeps a 50k-row file cheap to describe.\nconst SAMPLE_ROWS = 5\n/** Rows read for type inference — beyond this the extra evidence is noise. */\nconst SCAN_ROWS = 200\nconst MAX_HEADERS = 50\nconst MAX_CELL_CHARS = 120\nconst MAX_SHEETS = 8\nconst PREVIEW_CHARS = 2000\n/** Above this we read only the head, so a 200MB export cannot freeze the tab. */\nconst FULL_READ_LIMIT = 8 * 1024 * 1024\nconst HEAD_SLICE = 512 * 1024\n\n// ---------------------------------------------------------------------------\n// Registry — the only place the bytes live\n// ---------------------------------------------------------------------------\n\ninterface RegistryEntry {\n file: File\n parsed?: AttachmentDigest\n}\n\nconst registry = new Map<string, RegistryEntry>()\nlet seq = 0\n\n/** Park a file and get the handle everything else refers to it by. */\nexport function registerAttachment(file: File): string {\n const id = `att-${Date.now().toString(36)}-${(seq++).toString(36)}`\n registry.set(id, { file })\n return id\n}\n\nexport function getAttachmentFile(id: string): File | undefined {\n return registry.get(id)?.file\n}\n\nexport function getAttachmentDigest(id: string): AttachmentDigest | undefined {\n return registry.get(id)?.parsed\n}\n\n/** Drop the bytes. Called on chip removal and whenever the thread is cleared. */\nexport function releaseAttachment(id: string): void {\n registry.delete(id)\n}\n\nexport function clearAttachmentRegistry(): void {\n registry.clear()\n}\n\n/**\n * The file a tool call is about, resolved the way the MODEL can name it.\n *\n * The prompt shows attachments by filename, never by handle, so a tool that\n * demanded the registry id would be asking for something the model was never\n * told. Name match first, then the most recent readable file — a turn almost\n * always has exactly one.\n */\nexport function resolveAttachmentDigest(name?: string): AttachmentDigest | undefined {\n const readable = [...registry.values()]\n .map((e) => e.parsed)\n .filter((d): d is AttachmentDigest => !!d?.headers?.length)\n // A NAMED file that does not match is an error, never the latest one: falling\n // back there would map a different file than the one the user meant.\n if (name?.trim()) {\n const wanted = name.trim().toLowerCase()\n return readable.find((d) => d.name.toLowerCase() === wanted)\n }\n return readable[readable.length - 1]\n}\n\n/**\n * Every row of an attached delimited file, as objects keyed by header.\n *\n * The digest carries five sample rows — enough to map, useless to import. This\n * re-reads the bytes still parked in the registry, so the full set never had to\n * travel anywhere: it goes browser -> database, and the model never sees a row.\n */\nexport async function readAllRows(digest: AttachmentDigest): Promise<Array<Record<string, string>>> {\n const entry = [...registry.values()].find((e) => e.parsed === digest)\n if (!entry) throw new Error('The file is no longer available in this conversation.')\n if (digest.kind !== 'csv') {\n throw new Error('Only CSV files can be read in full here. Ask the user to save the sheet as CSV.')\n }\n const text = await entry.file.text()\n const delimiter = detectDelimiter(text, /\\.tsv$/i.test(entry.file.name) ? '\\t' : undefined)\n const { rows } = parseDelimited(text, delimiter)\n if (!rows.length) return []\n const headers = rows[0].map((h) => h.trim())\n return rows.slice(1)\n .filter((row) => row.some((cell) => cell.trim()))\n .map((row) => {\n const record: Record<string, string> = {}\n headers.forEach((header, i) => {\n if (header) record[header] = (row[i] ?? '').trim()\n })\n return record\n })\n}\n\n/** Every readable file currently in play, for an error that can name them. */\nexport function listAttachmentNames(): string[] {\n return [...registry.values()]\n .map((e) => e.parsed)\n .filter((d): d is AttachmentDigest => !!d?.headers?.length)\n .map((d) => d.name)\n}\n\n// ---------------------------------------------------------------------------\n// Parsing\n// ---------------------------------------------------------------------------\n\nconst SPREADSHEET_EXT = /\\.(xlsx|xlsm|xls)$/i\nconst CSV_EXT = /\\.(csv|tsv)$/i\nconst TEXT_EXT = /\\.(txt|md|markdown|json|log)$/i\n\nexport function detectKind(file: File): AttachmentKind {\n const name = file.name\n const mime = file.type || ''\n if (SPREADSHEET_EXT.test(name) || mime.includes('spreadsheetml') || mime === 'application/vnd.ms-excel') {\n return 'spreadsheet'\n }\n if (CSV_EXT.test(name) || mime === 'text/csv' || mime === 'text/tab-separated-values') return 'csv'\n if (mime.startsWith('image/')) return 'image'\n if (mime === 'application/pdf' || /\\.pdf$/i.test(name)) return 'pdf'\n if (TEXT_EXT.test(name) || mime.startsWith('text/') || mime === 'application/json') return 'text'\n return 'binary'\n}\n\n/**\n * Read a file into its digest. Registers the bytes when no id is supplied, so\n * a caller that wants to show a \"parsing\" chip first can register up front and\n * pass the id back in.\n */\nexport async function parseAttachment(file: File, id?: string): Promise<AttachmentDigest> {\n const attachmentId = id ?? registerAttachment(file)\n const base: AttachmentDigest = {\n id: attachmentId,\n name: file.name,\n mime: file.type || 'application/octet-stream',\n size: file.size,\n kind: detectKind(file),\n }\n\n let digest = base\n switch (base.kind) {\n case 'csv':\n digest = await parseDelimitedFile(file, base)\n break\n case 'spreadsheet':\n digest = await parseSpreadsheetFile(file, base)\n break\n case 'text':\n digest = await parseTextFile(file, base)\n break\n // Images and PDFs carry meaning in pixels, not in columns. Phase 1 declares\n // them and stops there — reading them is a different road (vision/OCR).\n default:\n break\n }\n\n const entry = registry.get(attachmentId)\n if (entry) entry.parsed = digest\n return digest\n}\n\nasync function readTextBounded(file: File): Promise<{ text: string; partial: boolean }> {\n if (file.size <= FULL_READ_LIMIT) return { text: await file.text(), partial: false }\n return { text: await file.slice(0, HEAD_SLICE).text(), partial: true }\n}\n\nasync function parseTextFile(file: File, base: AttachmentDigest): Promise<AttachmentDigest> {\n const { text } = await readTextBounded(file)\n const preview = text.slice(0, PREVIEW_CHARS)\n return {\n ...base,\n preview,\n ...(text.length > PREVIEW_CHARS\n ? { warnings: [`preview truncated to ${PREVIEW_CHARS} characters`] }\n : {}),\n }\n}\n\nasync function parseDelimitedFile(file: File, base: AttachmentDigest): Promise<AttachmentDigest> {\n const { text, partial } = await readTextBounded(file)\n const warnings: string[] = []\n if (partial) {\n // The tail was never read, so any row count would be a guess.\n warnings.push('file too large — only the first rows were read, row count unknown')\n }\n const delimiter = detectDelimiter(text, /\\.tsv$/i.test(file.name) ? '\\t' : undefined)\n const sheet = buildSheet(file.name.replace(CSV_EXT, ''), parseDelimited(text, delimiter), warnings)\n if (partial) delete sheet.rowCount\n return {\n ...base,\n headers: sheet.headers,\n ...(sheet.rowCount === undefined ? {} : { rowCount: sheet.rowCount }),\n sample: sheet.sample,\n columnTypes: sheet.columnTypes,\n ...(warnings.length ? { warnings } : {}),\n }\n}\n\n/**\n * xlsx is an optional peer — the same posture plugin-reports takes for export.\n * `new Function` keeps the specifier opaque so Vite does not try to resolve it\n * at build time in an app that never installed it.\n */\nconst loadModule = (name: string) => new Function('m', 'return import(m)')(name) as Promise<any>\n\nasync function parseSpreadsheetFile(file: File, base: AttachmentDigest): Promise<AttachmentDigest> {\n let XLSX: any\n try {\n XLSX = await loadModule('xlsx')\n } catch {\n // Deliberate, not a missing install: reading Excel means parsing hostile\n // binary with a library the registry stopped updating in 2022, and CSV\n // costs the user one \"save as\". Phrase it for the PERSON — this text is\n // the chip AND what the model repeats back.\n return {\n ...base,\n unreadable: 'spreadsheet',\n warnings: [\n 'Excel files are not read here. Ask the user to save the sheet as CSV (File > Save as > CSV) and attach it again — CSV is read in full.',\n ],\n }\n }\n\n const warnings: string[] = []\n let book: any\n try {\n book = XLSX.read(await file.arrayBuffer(), { type: 'array' })\n } catch {\n return { ...base, warnings: ['could not read this spreadsheet — the file may be corrupted'] }\n }\n\n const names: string[] = book.SheetNames ?? []\n const sheets: AttachmentSheet[] = []\n for (const name of names.slice(0, MAX_SHEETS)) {\n const ws = book.Sheets?.[name]\n if (!ws) continue\n // raw:false gives the displayed text, which is what a person reading the\n // file would see — and what the column inference below is written against.\n const raw: unknown[][] = XLSX.utils.sheet_to_json(ws, { header: 1, raw: false, defval: '' })\n const rows = raw.slice(0, SCAN_ROWS).map((row) => row.map((cell) => String(cell ?? '')))\n sheets.push(buildSheet(name, { rows, count: raw.length }, warnings))\n }\n if (names.length > MAX_SHEETS) {\n warnings.push(`${names.length - MAX_SHEETS} additional sheet(s) not described`)\n }\n\n const only = sheets.length === 1 ? sheets[0] : undefined\n return {\n ...base,\n ...(only\n ? {\n headers: only.headers,\n ...(only.rowCount === undefined ? {} : { rowCount: only.rowCount }),\n sample: only.sample,\n columnTypes: only.columnTypes,\n }\n : { sheets }),\n ...(warnings.length ? { warnings } : {}),\n }\n}\n\n// ---------------------------------------------------------------------------\n// Delimited text\n// ---------------------------------------------------------------------------\n\n/** Excel in pt-BR writes `;` — guessing `,` there yields one giant column. */\nfunction detectDelimiter(text: string, forced?: string): string {\n if (forced) return forced\n const firstLine = text.slice(0, 4000).split(/\\r?\\n/)[0] ?? ''\n let best = ','\n let bestCount = 0\n for (const candidate of [',', ';', '\\t', '|']) {\n const count = countOutsideQuotes(firstLine, candidate)\n if (count > bestCount) {\n best = candidate\n bestCount = count\n }\n }\n return best\n}\n\nfunction countOutsideQuotes(line: string, char: string): number {\n let inQuotes = false\n let count = 0\n for (let i = 0; i < line.length; i++) {\n const c = line[i]\n if (c === '\"') inQuotes = !inQuotes\n else if (!inQuotes && c === char) count++\n }\n return count\n}\n\n/**\n * Records are counted to the end of the text but only the first `SCAN_ROWS`\n * are kept — the count is the fact worth reporting, the rows are not.\n */\nexport function parseDelimited(text: string, delimiter: string): { rows: string[][]; count: number } {\n const rows: string[][] = []\n let count = 0\n let row: string[] = []\n let field = ''\n let inQuotes = false\n\n const endField = () => {\n row.push(field)\n field = ''\n }\n const endRow = () => {\n endField()\n count++\n if (rows.length < SCAN_ROWS) rows.push(row)\n row = []\n }\n\n const source = text.charCodeAt(0) === 0xfeff ? text.slice(1) : text\n for (let i = 0; i < source.length; i++) {\n const c = source[i]\n if (inQuotes) {\n if (c === '\"') {\n if (source[i + 1] === '\"') {\n field += '\"'\n i++\n } else inQuotes = false\n } else field += c\n continue\n }\n if (c === '\"' && field === '') inQuotes = true\n else if (c === delimiter) endField()\n else if (c === '\\n') endRow()\n else if (c === '\\r') continue\n else field += c\n }\n // A trailing newline is not a record.\n if (field !== '' || row.length) endRow()\n return { rows, count }\n}\n\nfunction buildSheet(\n name: string,\n parsed: { rows: string[][]; count: number },\n warnings: string[],\n): AttachmentSheet {\n const [rawHeader = [], ...body] = parsed.rows\n const headers = rawHeader.slice(0, MAX_HEADERS).map((h, i) => truncateCell(h).trim() || `col_${i + 1}`)\n if (rawHeader.length > MAX_HEADERS) {\n warnings.push(`${name}: ${rawHeader.length - MAX_HEADERS} column(s) beyond the first ${MAX_HEADERS} not described`)\n }\n\n const sample = body.slice(0, SAMPLE_ROWS).map((row) => headers.map((_, i) => truncateCell(row[i] ?? '')))\n const columnTypes = headers.map((header, i) =>\n inferColumn(header, body.map((row) => row[i] ?? ''), name, warnings),\n )\n\n return { name, headers, rowCount: Math.max(0, parsed.count - 1), sample, columnTypes }\n}\n\nfunction truncateCell(value: string): string {\n const text = String(value ?? '')\n return text.length > MAX_CELL_CHARS ? `${text.slice(0, MAX_CELL_CHARS)}…` : text\n}\n\n// ---------------------------------------------------------------------------\n// Column inference — pt-BR literate\n// ---------------------------------------------------------------------------\n\nconst SLASH_DATE = /^(\\d{1,2})[/.-](\\d{1,2})[/.-](\\d{2,4})$/\nconst ISO_DATE = /^\\d{4}-\\d{2}-\\d{2}([T ]\\d{2}:\\d{2}(:\\d{2})?)?/\nconst EMAIL = /^[^\\s@]+@[^\\s@]+\\.[^\\s@]{2,}$/\nconst MASKED_PHONE = /^\\+?[\\d\\s().-]{8,20}$/\nconst BOOLEANS = new Set(['sim', 'não', 'nao', 'true', 'false', 'yes', 'no', 'verdadeiro', 'falso'])\n\nexport function inferColumn(\n name: string,\n values: string[],\n sheetName = '',\n warnings: string[] = [],\n): AttachmentColumn {\n const filled = values\n .slice(0, SCAN_ROWS)\n .map((v) => String(v ?? '').trim())\n .filter((v) => v !== '')\n if (!filled.length) return { name, type: 'text' }\n\n if (filled.every((v) => BOOLEANS.has(v.toLowerCase()))) return { name, type: 'boolean' }\n if (filled.every((v) => EMAIL.test(v))) return { name, type: 'email' }\n\n const dates = inferDates(filled)\n if (dates) {\n if (dates.ambiguous) {\n const note =\n dates.reason === 'conflict'\n ? 'mixed dd/mm and mm/dd rows — read as text'\n : 'day/month order cannot be told apart (all values ≤ 12) — read as text'\n warnings.push(`${sheetName ? `${sheetName}: ` : ''}column \"${name}\": ${note}`)\n return { name, type: 'text', note }\n }\n return { name, type: 'date', format: dates.format }\n }\n\n // Identifiers before numbers. A real export writes phones and documents as\n // bare digits — \"21964445090\", \"07872499711\" — and reading those as numbers\n // is not a cosmetic slip: it drops the leading zero of a CPF and offers the\n // model a quantity to average. Digits nobody would do arithmetic on are not\n // numbers, and the header usually says which.\n const identifier = inferIdentifier(name, filled)\n if (identifier) return identifier\n\n const numbers = inferNumbers(filled)\n if (numbers) {\n return {\n name,\n type: 'number',\n ...(numbers.format ? { format: numbers.format } : {}),\n ...(numbers.note ? { note: numbers.note } : {}),\n }\n }\n\n // Masked phones: a bare integer column already went through inferIdentifier.\n if (filled.every((v) => MASKED_PHONE.test(v) && /[\\s().+-]/.test(v) && digitsOf(v).length >= 8)) {\n return { name, type: 'phone' }\n }\n\n return { name, type: 'text' }\n}\n\nfunction digitsOf(value: string): string {\n return value.replace(/\\D/g, '')\n}\n\n/**\n * `03/04/2026` is 3 April in pt-BR and 4 March in en-US, and nothing in the\n * cell says which. A column only becomes a date when some row settles it — a\n * day past 12 in one position or the other. Otherwise it stays text and says\n * so, because a silently wrong date is worse than an unparsed one.\n */\nfunction inferDates(\n values: string[],\n): { format: string; ambiguous: false } | { ambiguous: true; reason: 'conflict' | 'undecidable' } | null {\n if (values.every((v) => ISO_DATE.test(v))) return { format: 'yyyy-mm-dd', ambiguous: false }\n if (!values.every((v) => SLASH_DATE.test(v))) return null\n\n let dayFirst = false\n let monthFirst = false\n for (const value of values) {\n const match = SLASH_DATE.exec(value)!\n const a = Number(match[1])\n const b = Number(match[2])\n if (a > 12 && b <= 12) dayFirst = true\n if (b > 12 && a <= 12) monthFirst = true\n if (a > 31 || b > 31) return null\n }\n if (dayFirst && monthFirst) return { ambiguous: true, reason: 'conflict' }\n if (dayFirst) return { format: 'dd/mm/yyyy', ambiguous: false }\n if (monthFirst) return { format: 'mm/dd/yyyy', ambiguous: false }\n return { ambiguous: true, reason: 'undecidable' }\n}\n\nconst BR_DECIMAL = /^-?\\d{1,3}(\\.\\d{3})*,\\d+$|^-?\\d+,\\d+$/\nconst US_DECIMAL = /^-?\\d{1,3}(,\\d{3})*\\.\\d+$|^-?\\d+\\.\\d+$/\nconst PLAIN_INT = /^-?\\d+$/\n/** `1.234` is 1234 in pt-BR and 1.234 in en-US — a separator, or a decimal. */\nconst DOTTED_GROUP = /^-?\\d{1,3}(\\.\\d{3})+$/\n\nconst PHONE_HEADER = /(celular|telefone|fone|whats|tel\\b|mobile|phone)/i\nconst DOCUMENT_HEADER = /(cpf|cnpj|\\brg\\b|documento|\\bdoc\\b|inscri|matr[ií]cula|identificador|c[oó]digo)/i\nconst CEP_HEADER = /(cep|zip|postal)/i\n\n/**\n * A digit-only column that is an identifier, not a quantity. Recognised by what\n * the header calls it, or by a leading zero — no quantity ever starts with one.\n */\nfunction inferIdentifier(name: string, values: string[]): AttachmentColumn | null {\n const bareDigits = values.every((v) => /^\\d+$/.test(v))\n if (!bareDigits) return null\n const lengths = values.map((v) => v.length)\n const hasLeadingZero = values.some((v) => v.length > 1 && v.startsWith('0'))\n\n if (PHONE_HEADER.test(name) && lengths.every((n) => n >= 8 && n <= 15)) {\n return { name, type: 'phone', note: 'digits only, no mask' }\n }\n if (DOCUMENT_HEADER.test(name) || CEP_HEADER.test(name)) {\n return {\n name,\n type: 'text',\n note: 'identifier, not a quantity — keep it as text so leading zeros survive',\n }\n }\n if (hasLeadingZero) {\n return { name, type: 'text', note: 'leading zeros — read as text, not a number' }\n }\n return null\n}\n\nfunction inferNumbers(values: string[]): { format?: string; note?: string } | null {\n const stripped = values.map((v) => v.replace(/[R$€£%\\s ]/g, ''))\n let br = false\n let us = false\n let dotted = false\n for (const value of stripped) {\n if (BR_DECIMAL.test(value)) br = true\n else if (DOTTED_GROUP.test(value)) dotted = true\n else if (US_DECIMAL.test(value)) us = true\n else if (!PLAIN_INT.test(value)) return null\n }\n if (br && us) return { note: 'mixed decimal separators (, and .)' }\n if (br) return { format: '1.234,56' }\n if (us) return { format: '1,234.56' }\n if (dotted) return { note: 'dots could be thousand separators or decimals' }\n return {}\n}\n\n// ---------------------------------------------------------------------------\n// Display helpers\n// ---------------------------------------------------------------------------\n\nexport function formatBytes(bytes: number): string {\n if (bytes < 1024) return `${bytes} B`\n if (bytes < 1024 * 1024) return `${Math.round(bytes / 1024)} KB`\n return `${(bytes / (1024 * 1024)).toFixed(1)} MB`\n}\n","import { create } from 'zustand'\nimport { isAutoApproved, isDestructiveTool } from '../lib/agent-approvals'\nimport { clearRecordRefs } from '../lib/record-refs'\nimport {\n clearAttachmentRegistry,\n detectKind,\n parseAttachment,\n registerAttachment,\n releaseAttachment,\n type AttachmentDigest,\n type AttachmentKind,\n} from '../lib/attachments'\n\n/** A record the reply concerns — rendered as a \"goto\" button under the\n * bubble. Semantic ref only (id + archetype/kind); the SURFACE resolves the\n * URL against its own route map (agents.md: a missing link is correct, an\n * invented one is a dead end). */\nexport interface ChatRecordLink {\n id: string\n label: string\n archetype?: string\n kind?: string\n /** The route a non-archetype entity has — without it a product resolves to\n * nothing and the goto button silently disappears. */\n entityKey?: string\n /** An explicit destination, for what the entity route map cannot resolve: a\n * settings tab, a plugin screen. Wins over the archetype lookup. */\n path?: string\n}\n\nexport interface ChatToolCall {\n name: string\n /** Pretty-printed arguments (may be empty). */\n args: string\n /** Result content, truncated for display. */\n result?: string\n /** The write ran without asking because a standing grant covered it — the\n * trace says so, so an auto-approved action is never a silent one. */\n autoApproved?: boolean\n /** The user (or a guard) turned this call down. */\n declined?: boolean\n}\n\nexport interface ChatMessage {\n id: string\n role: 'user' | 'assistant'\n content: string\n timestamp: string\n /** Tool calls this assistant reply made, accumulated across rounds —\n * rendered as an expandable trace under the bubble. */\n toolCalls?: ChatToolCall[]\n /** Records to offer as navigation buttons under the reply. */\n links?: ChatRecordLink[]\n /** Files sent with this turn. Name and shape only — the bytes stayed here. */\n attachments?: Array<{ name: string; kind: AttachmentKind; rowCount?: number }>\n}\n\n/**\n * A write the agent wants to perform, parked until the human decides. The turn\n * loop awaits the promise this action's resolver settles — the chat composer\n * stays frozen behind the card, mirroring the broker's PENDING_CONFIRMATION\n * step for server-plane tools.\n */\nexport interface PendingAgentAction {\n id: string\n toolName: string\n /** Human title when the caller has one. A tool's `description` is written\n * for the model and must never be used here. */\n title?: string\n params: Record<string, unknown>\n /** 'client' = executed locally after approval; 'server' = approval is sent\n * back to the broker as confirmAction. */\n plane: 'client' | 'server'\n /**\n * A PARTIAL write: only the fields present are changing, and a blank one means\n * \"leave it as it is\". Set on updates, where the record already satisfies its\n * own required fields — an update of a product's cost asked for the name\n * again, blocked on it, and would have written back every declared default\n * along the way.\n */\n partial?: boolean\n /** Entity this write targets. Auto-approval is remembered per tool+scope, so\n * \"always create clients\" never becomes \"always create anything\". */\n scope?: string\n /** Human label for the remembered rule (\"Criar Cliente\"). */\n scopeLabel?: string\n /** Removes or voids data — grants for it never outlive the tab. */\n destructive?: boolean\n /** This action is decided EVERY time: no \"always allow\" button, and a\n * standing grant from an earlier turn does not cover it. For writes whose\n * blast radius is other people's access, not one record. */\n noAutoApproval?: boolean\n /** The target entity's declared fields, so the card can let the user correct\n * what the model guessed and fill what it left out. */\n fields?: PendingActionField[]\n}\n\nexport interface PendingActionField {\n key: string\n label?: string\n /** The entity's own `FieldType` — the card renders the matching control. */\n type?: string\n required?: boolean\n options?: Array<{ value: string; label?: string }>\n placeholder?: string\n hint?: string\n min?: number\n max?: number\n /** The entity's declared default, seeded into the card when the model left the\n * field out — so a boolean like `active` shows on without anyone typing it. */\n default?: unknown\n /** Shown, never edited: computed values, relations needing an option load,\n * and anything the database fills in on its own. */\n readOnly?: boolean\n}\n\n/**\n * A file the user dropped on the composer, waiting for the next turn. The\n * BYTES are not here — they stay in the attachments registry and never leave\n * the browser; what travels with the turn is `digest`.\n */\nexport interface ChatAttachment {\n id: string\n name: string\n size: number\n mime: string\n kind: AttachmentKind\n status: 'parsing' | 'ready' | 'error'\n digest?: AttachmentDigest\n /** i18n suffix under `chat.attachments.error.*` — the chip says what failed. */\n error?: string\n}\n\n/** Beyond this the turn is an import job, not a question. */\nconst MAX_ATTACHMENTS = 5\nconst MAX_ATTACHMENT_BYTES = 25 * 1024 * 1024\n\n/** What the card sends back: the decision, plus the values as edited. */\nexport interface PendingActionResult {\n approved: boolean\n values?: Record<string, unknown>\n}\n\ninterface ChatState {\n messages: ChatMessage[]\n isOpen: boolean\n isStreaming: boolean\n setOpen: (open: boolean) => void\n toggleOpen: () => void\n addMessage: (message: ChatMessage) => void\n updateLastAssistant: (content: string) => void\n setStreaming: (streaming: boolean) => void\n setConversationId: (id: string | null) => void\n reset: () => void\n /**\n * Server-side thread id when talking to a Fayz agent. History lives in Fayz,\n * so subsequent turns only send the new message plus this id.\n */\n conversationId: string | null\n /** The write awaiting human confirmation (renders the ConfirmActionCard). */\n pendingAction: PendingAgentAction | null\n /** Park an action + register its decision resolver. Resolves immediately\n * when a standing auto-approval already covers it. */\n requestConfirmation: (action: PendingAgentAction) => Promise<PendingActionResult>\n /** Card buttons: settle the parked action, carrying the edited values. */\n resolvePendingAction: (approved: boolean, values?: Record<string, unknown>) => void\n /** Tool names auto-approved during the turn being rendered — the trace marks\n * them so the user can see what ran unattended. */\n autoApprovedTools: string[]\n /** Speak short confirmations back. Persisted per browser. */\n voiceReplies: boolean\n setVoiceReplies: (enabled: boolean) => void\n /** Text handed to the composer for the user to check, edit and send. A\n * suggestion fills the field; it never sends on the user's behalf. */\n draft: string\n setDraft: (text: string) => void\n /** Files staged for the next turn, each with its parse state. */\n attachments: ChatAttachment[]\n /** Stage files: registers the bytes locally, then parses each into a digest. */\n addAttachments: (files: File[]) => Promise<void>\n removeAttachment: (id: string) => void\n clearAttachments: () => void\n /** Hand the turn its digests and unstage everything (bytes included). */\n consumePendingAttachments: () => AttachmentDigest[]\n /** Explicit delegation (\"resolver com IA\"): the user already said go, so the\n * conversation sends this as soon as it can. Distinct from `draft`, which\n * never sends on the user's behalf. */\n queuedPrompt: string | null\n queuePrompt: (text: string) => void\n consumeQueuedPrompt: () => string | null\n /** Suggestions panel is pinned open by the user (works mid-conversation). */\n suggestionsOpen: boolean\n setSuggestionsOpen: (open: boolean) => void\n /** \"Talk\" was tapped outside the panel — the composer starts listening as\n * soon as it mounts, so one tap goes from anywhere to speaking. */\n voiceStartRequested: boolean\n requestVoiceStart: () => void\n consumeVoiceStart: () => void\n /** Tool names executing right now — rendered as live activity chips. */\n activeTools: string[]\n setActiveTools: (names: string[]) => void\n /** Record the tool calls an assistant reply made (expandable per-message trace). */\n appendToolCallsToLastAssistant: (calls: ChatToolCall[]) => void\n /** Attach goto-record buttons to the reply (deduped by id, capped). */\n appendLinksToLastAssistant: (links: ChatRecordLink[]) => void\n /** The signed-in user's threads (history drawer). */\n conversations: Array<{ id: string; title: string | null; updatedAt: string }>\n /** First fetch settled — before this the panel shows a skeleton, not \"empty\". */\n conversationsLoaded: boolean\n setConversations: (rows: Array<{ id: string; title: string | null; updatedAt: string }>) => void\n /** Replace the transcript wholesale (resuming a past conversation). */\n setMessages: (messages: ChatMessage[]) => void\n}\n\n// Module-level so the resolver never round-trips through React state.\nlet pendingResolver: ((result: PendingActionResult) => void) | null = null\n\nconst VOICE_REPLIES_KEY = 'fayz.agent.voice-replies'\n\nfunction readVoiceRepliesPref(): boolean {\n if (typeof localStorage === 'undefined') return false\n try {\n return localStorage.getItem(VOICE_REPLIES_KEY) === '1'\n } catch {\n return false\n }\n}\n\nexport const useChatStore = create<ChatState>((set, get) => ({\n messages: [],\n isOpen: false,\n isStreaming: false,\n conversationId: null,\n\n setOpen: (open) => set({ isOpen: open }),\n toggleOpen: () => set((s) => ({ isOpen: !s.isOpen })),\n\n addMessage: (message) =>\n set((s) => ({ messages: [...s.messages, message] })),\n\n updateLastAssistant: (content) =>\n set((s) => {\n const msgs = [...s.messages]\n const lastIdx = msgs.length - 1\n if (lastIdx >= 0 && msgs[lastIdx].role === 'assistant') {\n msgs[lastIdx] = { ...msgs[lastIdx], content }\n }\n return { messages: msgs }\n }),\n\n setStreaming: (isStreaming) => set({ isStreaming }),\n setConversationId: (conversationId) => set({ conversationId }),\n reset: () => {\n pendingResolver?.({ approved: false })\n pendingResolver = null\n clearRecordRefs()\n // The bytes belong to the thread that staged them — a new conversation\n // must not inherit someone's client list.\n clearAttachmentRegistry()\n set({\n messages: [],\n isStreaming: false,\n conversationId: null,\n pendingAction: null,\n activeTools: [],\n autoApprovedTools: [],\n attachments: [],\n // suggestionsOpen is a standing preference, not thread state.\n })\n },\n\n pendingAction: null,\n autoApprovedTools: [],\n requestConfirmation: (action) => {\n const destructive = action.destructive ?? isDestructiveTool(action.toolName)\n // Standing grant covers this exact tool+scope: run it, but record it so\n // the transcript still shows the write happened and on whose authority.\n if (!action.noAutoApproval && isAutoApproved(action.toolName, action.scope)) {\n set((s) => ({\n autoApprovedTools: s.autoApprovedTools.includes(action.toolName)\n ? s.autoApprovedTools\n : [...s.autoApprovedTools, action.toolName],\n }))\n return Promise.resolve({ approved: true })\n }\n // A newer request supersedes an unanswered one (treated as declined).\n pendingResolver?.({ approved: false })\n return new Promise<PendingActionResult>((resolve) => {\n pendingResolver = resolve\n set({ pendingAction: { ...action, destructive } })\n })\n },\n resolvePendingAction: (approved, values) => {\n const resolve = pendingResolver\n pendingResolver = null\n set({ pendingAction: null })\n resolve?.({ approved, values })\n },\n\n voiceReplies: readVoiceRepliesPref(),\n setVoiceReplies: (enabled) => {\n try {\n localStorage?.setItem(VOICE_REPLIES_KEY, enabled ? '1' : '0')\n } catch {\n /* preference stays session-only */\n }\n set({ voiceReplies: enabled })\n },\n draft: '',\n setDraft: (draft) => set({ draft }),\n\n attachments: [],\n addAttachments: async (files) => {\n const room = MAX_ATTACHMENTS - get().attachments.length\n if (room <= 0) return\n const staged = files.slice(0, room).map((file) => ({\n file,\n attachment: {\n id: registerAttachment(file),\n name: file.name,\n size: file.size,\n mime: file.type || 'application/octet-stream',\n kind: detectKind(file),\n status: file.size > MAX_ATTACHMENT_BYTES ? 'error' : 'parsing',\n ...(file.size > MAX_ATTACHMENT_BYTES ? { error: 'tooLarge' } : {}),\n } as ChatAttachment,\n }))\n if (!staged.length) return\n set((s) => ({ attachments: [...s.attachments, ...staged.map((e) => e.attachment)] }))\n\n const settle = (id: string, patch: Partial<ChatAttachment>) =>\n set((s) => ({\n attachments: s.attachments.map((a) => (a.id === id ? { ...a, ...patch } : a)),\n }))\n\n await Promise.all(\n staged.map(async ({ file, attachment }) => {\n if (attachment.status === 'error') return\n try {\n settle(attachment.id, { status: 'ready', digest: await parseAttachment(file, attachment.id) })\n } catch {\n settle(attachment.id, { status: 'error', error: 'unreadable' })\n }\n }),\n )\n },\n removeAttachment: (id) => {\n releaseAttachment(id)\n set((s) => ({ attachments: s.attachments.filter((a) => a.id !== id) }))\n },\n clearAttachments: () => {\n for (const attachment of get().attachments) releaseAttachment(attachment.id)\n set({ attachments: [] })\n },\n // Sending clears the CHIPS, never the registry. The file is what the rest of\n // the conversation is about: released here, \"ta certo isso ai\" two turns later\n // reached proposeImport as \"there is no readable file attached\". The registry\n // is emptied when the thread is — reset() and setMessages() do it.\n consumePendingAttachments: () => {\n const staged = get().attachments\n if (!staged.length) return []\n const digests = staged.flatMap((a) => (a.status === 'ready' && a.digest ? [a.digest] : []))\n set({ attachments: [] })\n return digests\n },\n\n queuedPrompt: null,\n queuePrompt: (queuedPrompt) => set({ queuedPrompt, isOpen: true }),\n consumeQueuedPrompt: () => {\n const prompt = get().queuedPrompt\n if (prompt) set({ queuedPrompt: null })\n return prompt\n },\n // Open to begin with; collapsing sticks for the session.\n suggestionsOpen: true,\n setSuggestionsOpen: (suggestionsOpen) => set({ suggestionsOpen }),\n voiceStartRequested: false,\n requestVoiceStart: () => set({ isOpen: true, voiceStartRequested: true }),\n consumeVoiceStart: () => set({ voiceStartRequested: false }),\n\n activeTools: [],\n setActiveTools: (activeTools) => set({ activeTools }),\n appendToolCallsToLastAssistant: (calls) =>\n set((s) => {\n if (!calls.length) return s\n const msgs = [...s.messages]\n const lastIdx = msgs.length - 1\n if (lastIdx >= 0 && msgs[lastIdx].role === 'assistant') {\n msgs[lastIdx] = { ...msgs[lastIdx], toolCalls: [...(msgs[lastIdx].toolCalls ?? []), ...calls] }\n }\n return { messages: msgs }\n }),\n appendLinksToLastAssistant: (links) =>\n set((s) => {\n if (!links.length) return s\n const msgs = [...s.messages]\n const lastIdx = msgs.length - 1\n if (lastIdx >= 0 && msgs[lastIdx].role === 'assistant') {\n const seen = new Map((msgs[lastIdx].links ?? []).map((l) => [l.id, l]))\n for (const l of links) if (!seen.has(l.id)) seen.set(l.id, l)\n msgs[lastIdx] = { ...msgs[lastIdx], links: Array.from(seen.values()).slice(0, 3) }\n }\n return { messages: msgs }\n }),\n conversations: [],\n conversationsLoaded: false,\n setConversations: (conversations) => set({ conversations, conversationsLoaded: true }),\n setMessages: (messages) => {\n // Resuming another thread — whatever was staged for the abandoned one goes.\n clearAttachmentRegistry()\n set({ messages, attachments: [] })\n },\n}))\n","import * as React from 'react'\nimport { create } from 'zustand'\n\n/** The shell's companion column: one open state, one active tab, and a\n * registry anything can put a panel in. */\n\nexport interface RightRailPanelDef {\n id: string\n label: string\n icon?: React.ComponentType<{ className?: string }>\n /** Lower sorts first. Default 100. */\n order?: number\n /** Count chip on the tab. Hidden when count is 0. `destructive` renders the\n * attention red (open tasks); default is the neutral muted chip. */\n badge?: { count: number; tone?: 'neutral' | 'destructive' }\n /** Mounted only while active. Must carry its own providers — the rail\n * renders it far from where it was registered. */\n Component: React.ComponentType\n}\n\ninterface RightRailState {\n /** A shell able to render the rail is mounted. Contributors read this to\n * decide between the rail and their own fallback surface. */\n mounted: boolean\n setMounted: (mounted: boolean) => void\n open: boolean\n /** Panel id currently showing. Meaningless while `open` is false. */\n active: string | null\n panels: RightRailPanelDef[]\n openPanel: (id: string) => void\n close: () => void\n /** Same tab closes, a different tab switches. */\n togglePanel: (id: string) => void\n registerPanel: (panel: RightRailPanelDef) => void\n unregisterPanel: (id: string) => void\n /** Badge-only update. Separate from `registerPanel` on purpose: a badge\n * ticking is NOT a lifecycle event, and routing it through\n * unregister+register took the active panel down with it (see\n * `useRightRailPanel`). */\n updateBadge: (id: string, badge: RightRailPanelDef['badge']) => void\n /** Distance (px) from the viewport's right edge to the open column's left\n * edge — MEASURED from the rendered card, so clamps and drags are included.\n * The FAB reads it to stay anchored to the CONTENT's bottom-right corner. */\n width: number\n setWidth: (width: number) => void\n}\n\nexport const useRightRailStore = create<RightRailState>((set) => ({\n mounted: false,\n setMounted: (mounted) => set({ mounted }),\n open: false,\n active: null,\n panels: [],\n\n openPanel: (id) => set({ open: true, active: id }),\n close: () => set({ open: false }),\n togglePanel: (id) =>\n set((s) => (s.open && s.active === id ? { open: false } : { open: true, active: id })),\n\n registerPanel: (panel) =>\n set((s) => {\n const rest = s.panels.filter((p) => p.id !== panel.id)\n const panels = [...rest, panel].sort((a, b) => (a.order ?? 100) - (b.order ?? 100))\n // First to arrive becomes the default tab.\n return { panels, active: s.active ?? panel.id }\n }),\n\n unregisterPanel: (id) =>\n set((s) => {\n const panels = s.panels.filter((p) => p.id !== id)\n const active = s.active === id ? (panels[0]?.id ?? null) : s.active\n return { panels, active, open: active ? s.open : false }\n }),\n\n updateBadge: (id, badge) =>\n set((s) => {\n const current = s.panels.find((p) => p.id === id)\n if (!current) return s\n if (current.badge?.count === badge?.count && current.badge?.tone === badge?.tone) return s\n return { panels: s.panels.map((p) => (p.id === id ? { ...p, badge } : p)) }\n }),\n\n width: readRightRailWidth(),\n setWidth: (width) => set({ width }),\n}))\n\n/** Register a panel while the caller is mounted. `Component` must be\n * referentially stable or the panel remounts on every parent render. */\nexport function useRightRailPanel(panel: RightRailPanelDef | null): void {\n const register = useRightRailStore((s) => s.registerPanel)\n const unregister = useRightRailStore((s) => s.unregisterPanel)\n const updateBadge = useRightRailStore((s) => s.updateBadge)\n const id = panel?.id\n const label = panel?.label\n const order = panel?.order\n const Component = panel?.Component\n const icon = panel?.icon\n const badgeCount = panel?.badge?.count\n const badgeTone = panel?.badge?.tone\n\n // Lifecycle ONLY. The badge deliberately stays out of these deps: it changes\n // while the panel is open and in use (the chat's unread count ticks on every\n // streamed turn), and the cleanup here unregisters — which moves `active` to\n // the next panel, or closes the rail outright when this was the only one.\n // The chat was flipping to the Tasks tab, or vanishing mid-answer, for\n // exactly that reason.\n React.useEffect(() => {\n if (!id || !Component) return\n register({ id, label: label ?? id, order, Component, icon })\n return () => unregister(id)\n }, [id, label, order, Component, icon, register, unregister])\n\n React.useEffect(() => {\n if (!id) return\n updateBadge(id, badgeCount !== undefined ? { count: badgeCount, tone: badgeTone } : undefined)\n }, [id, badgeCount, badgeTone, updateBadge])\n}\n\n/** No panels registered means no column and no divider. */\nexport function useHasRightRail(): boolean {\n return useRightRailStore((s) => s.panels.length > 0)\n}\n\nconst WIDTH_KEY = 'fayz.shell.right-rail.width'\n\n/** The user's dragged width, remembered per browser. */\nexport function readRightRailWidth(fallback = 380): number {\n try {\n const stored = Number(localStorage?.getItem(WIDTH_KEY))\n return Number.isFinite(stored) && stored > 0 ? stored : fallback\n } catch {\n return fallback\n }\n}\n\nexport function writeRightRailWidth(width: number): void {\n try {\n localStorage?.setItem(WIDTH_KEY, String(Math.round(width)))\n } catch {\n /* preference stays session-only */\n }\n}\n","import type { EntityDef } from '@fayz-ai/core'\n\n// ---------------------------------------------------------------------------\n// CORE_QUERY_ENTITIES — spine tables the agent may read and write even though\n// no app declares a CRUD page for them.\n//\n// The data primitives (createRecord / updateRecord / searchRecords / queryData)\n// build their entity enum from three sources: the app's registered CRUD\n// entities, plugin registries, and plugin `queryEntities`. A spine table that\n// lives inside a DETAIL TAB rather than on a page of its own belongs to none of\n// them — so the agent could not see it, and would answer \"esses campos não\n// estão disponíveis\" to a request the UI handles fine.\n//\n// These are declared here, merged in by deriveAgentContract and useAITools, so\n// EVERY app gets them without editing a single app config. They intentionally\n// produce NO route and NO nav item: the surface for an address is the person's\n// Endereços tab, not a top-level page.\n// ---------------------------------------------------------------------------\n\n/** public.addresses — @fayz-ai/db spine migration 017_core_addresses. */\nconst addressEntity: EntityDef = {\n name: 'Address',\n namePlural: 'Addresses',\n icon: 'MapPin',\n data: {\n table: 'addresses',\n tenantScoped: true,\n tenantIdColumn: 'tenant_id',\n searchColumns: ['label', 'street', 'district', 'city', 'postal_code', 'recipient'],\n },\n fields: [\n // owner_id/owner_type are how an address attaches to its person. They are\n // required and described rather than hidden: the agent reaches this table\n // from a record it already has in hand (\"adiciona o endereço X pra ele\"),\n // so the id it must pass is the one it just searched for or created.\n {\n key: 'owner_id',\n label: 'Owner record id',\n type: 'text',\n required: true,\n hint: 'Id of the person (client, contact, supplier, staff…) this address belongs to.',\n },\n {\n key: 'owner_type',\n label: 'Owner kind',\n type: 'select',\n options: ['person', 'location', 'tenant'],\n hint: \"Defaults to 'person'. Only set it for an address that belongs to a business location or to the tenant itself.\",\n },\n { key: 'label', label: 'Label', type: 'text', searchable: true, hint: 'Casa, Trabalho, Depósito…' },\n {\n key: 'kind',\n label: 'Use',\n type: 'select',\n options: ['both', 'shipping', 'billing'],\n hint: \"Defaults to 'both'.\",\n },\n { key: 'postal_code', label: 'Postal code', type: 'text', required: true, searchable: true, hint: 'CEP.' },\n { key: 'street', label: 'Street', type: 'text', required: true, searchable: true },\n { key: 'number', label: 'Number', type: 'text' },\n { key: 'complement', label: 'Complement', type: 'text' },\n { key: 'district', label: 'District', type: 'text', searchable: true, hint: 'Bairro.' },\n { key: 'city', label: 'City', type: 'text', required: true, searchable: true },\n { key: 'state', label: 'State', type: 'text', required: true, hint: 'Two-letter UF.' },\n { key: 'country', label: 'Country', type: 'text', hint: \"Defaults to 'BR'.\" },\n { key: 'recipient', label: 'Recipient', type: 'text', searchable: true, hint: 'Who receives, if not the owner.' },\n { key: 'phone', label: 'Phone', type: 'text' },\n {\n key: 'is_default',\n label: 'Default address',\n type: 'boolean',\n hint: 'Only one default per owner and kind — clear the previous one before setting this.',\n },\n ],\n}\n\nexport interface CoreQueryEntity {\n key: string\n entity: EntityDef\n writable?: boolean\n /**\n * How this entity attaches to another record — appended to the descriptions\n * of the data primitives that can act on it. These entities do NOT stand\n * alone, and nothing in a flat enum of ~37 keys conveys that.\n *\n * Both directions matter, and each fails differently without it. On WRITE the\n * model reaches for `updateRecord` on the parent, is told the fields do not\n * exist, and then gives up or buries the data in a free-text column. On READ\n * it searches the parent, finds no address on it, and confidently answers\n * \"this contact has no address registered\" — a falsehood, since the row is\n * one filtered query away.\n *\n * Stated here rather than inferred at failure time on purpose: guessing the\n * intended entity from rejected FIELD NAMES points \"add an address to this\n * contact\" at the business-locations table, which declares the same columns.\n */\n agentHint?: string\n}\n\nexport const CORE_QUERY_ENTITIES: CoreQueryEntity[] = [\n {\n key: 'address',\n entity: addressEntity,\n writable: true,\n agentHint:\n '`address` holds the street address of a PERSON (client, contact, supplier, staff). A person record has NO street/city/postal_code fields of its own. ' +\n \"To read where someone lives, search `address` with filters {\\\"owner_id\\\": <the person's id>} — a person with no address field is not a person without an address. \" +\n \"To record one, create an `address` with owner_id set to the person's id. Never write an address into a notes field.\",\n },\n]\n","import type { PluginAITool, PluginRegistryDef } from '../types/plugins'\nimport type { EntityDef, FeatureDeclaration, PermissionProfile } from '@fayz-ai/core'\nimport { getAllEntities, type RegisteredEntity } from '@fayz-ai/core'\nimport { CORE_QUERY_ENTITIES } from '../app/core-entities'\n\n/**\n * Core SaaS-level AI tools — always available, no plugin required.\n */\nexport const coreAITools: PluginAITool[] = [\n {\n id: 'core.business-summary',\n name: 'getBusinessSummary',\n description: 'Returns a summary of the current business: name, plan, vertical, team size, and key metrics.',\n icon: 'Building2',\n mode: 'read',\n parameters: { type: 'object', properties: {}, required: [] },\n category: 'Core',\n suggestions: [\n { label: \"How's my business doing today?\" },\n ],\n },\n {\n id: 'core.team-members',\n name: 'getTeamMembers',\n description: \"Lists the WORKSPACE TEAM exactly as the Team screen shows it: the people who staff this business. Each row carries `kind` (what they do here — teacher, staff…), `accessRole` (their permission role, null when they have no login) and `hasLogin`. Answer headcount questions from this — never report the number of logins as the size of the team.\",\n icon: 'Users',\n mode: 'read',\n parameters: {\n type: 'object',\n properties: {\n role: {\n type: 'string',\n description: 'Optional filter, matched against either the person kind (teacher, staff…) or the access role (owner, admin, manager, viewer).',\n },\n },\n },\n permission: { feature: 'team', action: 'read' },\n category: 'Core',\n suggestions: [\n { label: 'Who is on my team?' },\n ],\n },\n {\n id: 'core.navigate',\n name: 'navigateTo',\n description:\n 'Opens one of the app\\'s PAGES (Agenda, Clients, Financial…). Takes a page name, never a person or a record — to open a specific record use openRecord.',\n icon: 'Compass',\n mode: 'read',\n parameters: {\n type: 'object',\n properties: {\n page: { type: 'string', description: 'Name of the page, as listed in the app pages' },\n },\n required: ['page'],\n },\n category: 'Core',\n },\n {\n id: 'core.open-record',\n name: 'openRecord',\n description:\n 'Opens the detail page of a record already returned by a tool in THIS conversation. Takes that record\\'s id — never a name.',\n icon: 'ExternalLink',\n mode: 'read',\n parameters: {\n type: 'object',\n properties: {\n id: { type: 'string', description: 'Record id from an earlier tool result' },\n },\n required: ['id'],\n },\n category: 'Core',\n },\n]\n\n/**\n * Builds the LLM-facing function name for a registry tool.\n *\n * Derived from the registry id, never from the entity's display label: the\n * label is translated, so a pt-BR app would mint `listCategoriasdeServiço` —\n * which both violates the provider's `^[a-zA-Z0-9_-]+$` function-name rule and\n * renames the tool whenever the user switches locale. The id is a stable ASCII\n * slug. The human plural still drives the description, which is what the model\n * actually reads to decide when to call it.\n */\nfunction pascalCase(value: string): string {\n // Transliterate diacritics BEFORE splitting: splitting on [^a-zA-Z0-9]\n // treated an accent as a word boundary and dropped it mid-word — \"Serviço\"\n // became \"ServiO\" and \"Preço de Serviço\" became \"PreODeServiO\", which both\n // renames tools per locale and can trip the broker's ^[a-zA-Z0-9_-]+$ rule.\n return value\n .normalize('NFD')\n .replace(/[\\u0300-\\u036f]/g, '')\n .split(/[^a-zA-Z0-9]+/)\n .filter(Boolean)\n .map((s) => s.charAt(0).toUpperCase() + s.slice(1))\n .join('')\n}\n\nexport function registryToolName(pluginId: string, registryId: string): string {\n // Namespaced by plugin because registry ids only need to be unique within\n // their own plugin — `crm` and `inventory` can both ship a `tags` registry,\n // and two tools sharing a function name is ambiguous to the model.\n return `list${pascalCase(pluginId)}${pascalCase(registryId)}`\n}\n\n/**\n * Auto-generates read tools from plugin registry definitions.\n * Each registry gets a basic \"list\" tool so plugins get AI capabilities for free.\n */\nexport function generateRegistryTools(pluginId: string, registries: PluginRegistryDef[]): PluginAITool[] {\n return registries\n .filter((r) => !r.readOnly)\n .map((registry) => {\n const plural = registry.entity.namePlural ?? `${registry.entity.name}s`\n return {\n id: `${pluginId}.list-${registry.id}`,\n name: registryToolName(pluginId, registry.id),\n description: `Lists all ${plural.toLowerCase()} for the current business.`,\n icon: registry.icon ?? registry.entity.icon,\n mode: 'read' as const,\n parameters: {\n type: 'object' as const,\n properties: {\n search: { type: 'string' as const, description: 'Search text' },\n },\n },\n category: pluginId.charAt(0).toUpperCase() + pluginId.slice(1),\n }\n })\n}\n\n/**\n * Formats a tool as a function signature: e.g. \"getRevenue(period?)\"\n */\nexport function formatToolSignature(tool: PluginAITool): string {\n const params = tool.parameters?.properties\n ? Object.entries(tool.parameters.properties)\n .map(([key]) => tool.parameters?.required?.includes(key) ? key : `${key}?`)\n .join(', ')\n : ''\n return `${tool.name}(${params})`\n}\n\nexport function entityToolName(entityKey: string): string {\n return `search${pascalCase(entityKey)}`\n}\n\n/**\n * Auto-generates a search tool for every entity the app exposes as a CRUD page.\n *\n * Registries cover a plugin's auxiliary tables; these are the entities the\n * business actually talks about — clients, appointments, services. Deriving\n * them from the entity registry is what makes the agent useful in a new vertical\n * without anyone hand-writing tools: whatever the app declares, the agent can\n * read.\n */\n/**\n * The TWO generic data primitives that replace the per-entity/per-registry\n * generated tools (43 searches → 2 tools): the model picks the TARGET as a\n * parameter (closed enum), and the executor checks the target entity's OWN\n * read permission at call time — one tool, per-user access preserved.\n */\n/**\n * Sentences describing entities that ATTACH to another record instead of\n * standing alone. Appended to createRecord's description so the relationship is\n * stated once, up front, rather than discovered through a failed write.\n * Only entities actually present in this app's catalog are mentioned.\n */\nfunction attachedRecordGuidance(writableKeys: string[]): string {\n const hints = CORE_QUERY_ENTITIES\n .filter((q) => q.agentHint && writableKeys.includes(q.key))\n .map((q) => q.agentHint as string)\n return hints.length ? ` Records that attach to another record: ${hints.join(' ')}` : ''\n}\n\n/**\n * The writable fields of every entity the agent may create, as\n * `key: field, field*, …` with `*` marking required.\n *\n * Shipped WITH the tool instead of discovered by failing: without it the model\n * guesses column names, gets `unknown_field`, and burns a round trip per\n * mistake — and the user watches a red step go by before anything happens.\n */\nfunction fieldCatalogue(\n entries: Array<{ key: string; fields: Array<{ key: string; required?: boolean }> }>,\n): string {\n const lines = entries\n .filter((e) => e.fields.length > 0)\n .map((e) => {\n const names = e.fields.slice(0, 24).map((f) => (f.required ? `${f.key}*` : f.key))\n return `${e.key}: ${names.join(', ')}`\n })\n if (!lines.length) return ''\n return `\\n\\nFields by entity (* = required, send nothing else):\\n${lines.join('\\n')}`\n}\n\nexport function buildDataPrimitiveTools(input: {\n entities: RegisteredEntity[]\n registries: Map<string, PluginRegistryDef[]>\n queryEntities?: Array<{ key: string; entity: EntityDef; writable?: boolean }>\n}): PluginAITool[] {\n const options: Array<{ key: string; label: string }> = []\n const schema: Array<{ key: string; fields: Array<{ key: string; required?: boolean }> }> = []\n for (const e of input.entities) {\n if (e.entityDef && !e.entityDef.agentHidden) {\n options.push({ key: e.entityKey, label: e.labelPlural })\n schema.push({ key: e.entityKey, fields: e.entityDef.fields ?? [] })\n }\n }\n for (const [pluginId, defs] of input.registries) {\n for (const registry of defs) {\n if (registry.readOnly) continue\n const key = `${pluginId}:${registry.id}`\n options.push({ key, label: registry.entity.namePlural ?? registry.entity.name })\n schema.push({ key, fields: registry.entity.fields ?? [] })\n }\n }\n // Read-models are readable; base-table ones may opt into writes.\n const writableKeys = options.map((o) => o.key)\n // CORE_QUERY_ENTITIES is merged HERE, not at each call site: the primitives\n // are built from three different places (deriveAgentContract, useAITools and\n // the conversational e2e harness), and a spine entity added to only some of\n // them is a catalog that disagrees with itself.\n for (const q of [...(input.queryEntities ?? []), ...CORE_QUERY_ENTITIES]) {\n options.push({ key: q.key, label: q.entity.namePlural ?? q.entity.name })\n if (q.writable) writableKeys.push(q.key)\n }\n if (!options.length) return []\n const keys = options.map((o) => o.key)\n const catalogLine = options.map((o) => `${o.key} (${o.label.toLowerCase()})`).join(', ')\n\n return [\n {\n id: 'data.find-anything',\n name: 'findAnything',\n description:\n 'Global search (like the app command center): looks a name/text up across ALL record types the user may see at once and returns grouped matches. Use this FIRST whenever you do not know what kind of record a name refers to (\"quem é X?\", \"o que é Y?\") — then drill down with searchRecords.' +\n ' It matches TEXT INSIDE each record, so records attached to a person are never returned by that person\\'s name — reaching them takes a second searchRecords call filtered by owner_id.' +\n attachedRecordGuidance(keys),\n icon: 'Command',\n mode: 'read',\n parameters: {\n type: 'object',\n properties: {\n search: { type: 'string', description: 'Name or text to look up everywhere.' },\n },\n required: ['search'],\n },\n category: 'Data',\n suggestions: [{ label: 'Quem é …?' }],\n },\n ...(writableKeys.length\n ? [\n {\n id: 'data.create-record',\n name: 'createRecord',\n description:\n 'Creates ONE new record of an entity (client, service, supplier, …). ALWAYS search first to avoid duplicates. Use ONLY the fields listed below for that entity. ' +\n 'Do NOT interview the user field-by-field. Ask in chat only for required (*) fields you genuinely cannot infer, and call this tool the moment you have them — omit every optional field you were not given (its default applies; a boolean status like active defaults to on/true). ' +\n 'The confirmation this opens is an EDITABLE FORM, not a yes/no receipt: the user reviews, fills and corrects anything there — including optionals — before it is written. Opening that form fast beats collecting everything in chat.' +\n attachedRecordGuidance(writableKeys) +\n fieldCatalogue(schema.filter((e) => writableKeys.includes(e.key))),\n icon: 'Plus',\n mode: 'persist' as const,\n // The handler orchestrates its own guard chain (permission → plan\n // cap → confirmation → create) because the target is dynamic.\n requiresConfirmation: false,\n parameters: {\n type: 'object' as const,\n properties: {\n entity: { type: 'string' as const, description: 'Which entity to create', enum: writableKeys },\n values: { type: 'object' as const, description: 'Field values for the new record, e.g. {\"name\":\"…\",\"phone\":\"…\"}' },\n },\n required: ['entity', 'values'],\n },\n category: 'Data',\n } satisfies PluginAITool,\n ]\n : []),\n ...(writableKeys.length\n ? [\n {\n id: 'data.update-record',\n name: 'updateRecord',\n description:\n 'Updates fields on an EXISTING record (add an email, fix a phone, change a name…). Use the record id already known from this conversation or from a search. Only send the fields being changed, and only fields listed below for that entity. The user confirms before anything is written.' +\n fieldCatalogue(schema.filter((e) => writableKeys.includes(e.key))),\n icon: 'Pencil',\n mode: 'persist' as const,\n requiresConfirmation: false,\n parameters: {\n type: 'object' as const,\n properties: {\n entity: { type: 'string' as const, description: 'Which entity the record belongs to', enum: writableKeys },\n id: { type: 'string' as const, description: 'Id of the record to update' },\n values: { type: 'object' as const, description: 'Only the fields to change, e.g. {\"email\":\"…\"}' },\n },\n required: ['entity', 'id', 'values'],\n },\n category: 'Data',\n } satisfies PluginAITool,\n ]\n : []),\n {\n id: 'data.search-records',\n name: 'searchRecords',\n description:\n `Searches or lists records of ONE entity and returns matching rows with their fields. Use \\`search\\` for names/text and \\`filters\\` for exact field values (e.g. {\"status\":\"open\"}) — never put a status word in search.` +\n ' For ANY date or period question (\"hoje\", \"amanhã\", \"esta semana\"), use `dateField` + `from`/`to` — NOT `filters`. Plain dates (YYYY-MM-DD) are read as whole days in the business timezone, so `from` and `to` both being today is exactly \"today\".' +\n ` Entities: ${catalogLine}.${attachedRecordGuidance(keys)}`,\n icon: 'Search',\n mode: 'read',\n parameters: {\n type: 'object',\n properties: {\n entity: { type: 'string', description: 'Which entity to search', enum: keys },\n search: { type: 'string', description: 'Name or text to match. Omit to list recent records.' },\n filters: { type: 'object', description: 'Optional exact-value filters {field: value}, e.g. {\"status\":\"open\"}. Do not use for dates.' },\n dateField: { type: 'string', description: \"Date field the from/to window applies to (e.g. startsAt for agenda; default 'createdAt').\" },\n from: { type: 'string', description: 'Start of the window: YYYY-MM-DD (whole local day) or ISO datetime.' },\n to: { type: 'string', description: 'End of the window: YYYY-MM-DD (whole local day, inclusive) or ISO datetime.' },\n orderBy: { type: 'string', description: 'Field to sort by (e.g. startsAt for \"next/upcoming\" questions).' },\n direction: { type: 'string', description: 'Sort direction', enum: ['asc', 'desc'] },\n },\n required: ['entity'],\n },\n category: 'Data',\n },\n ...(writableKeys.length\n ? [\n {\n id: 'data.propose-import',\n name: 'proposeImport',\n description:\n 'Proposes how the columns of an ATTACHED spreadsheet/CSV map to the fields of one entity, and opens the mapping for the user to review and correct. ' +\n 'Use this the moment a file is attached and the user talks about importing — it is the ONLY way to answer that, and it replaces writing the mapping out as text. ' +\n 'Send one entry per column you can map; columns you leave out are shown as unmapped for the user to fill in. ' +\n 'Field names come from the entity field list in createRecord. When it comes back ok, call commitImport with the same mapping — that is what actually writes the rows.' +\n ` Entities: ${catalogLine}.`,\n icon: 'ArrowRightLeft',\n mode: 'read' as const,\n category: 'Data',\n parameters: {\n type: 'object' as const,\n properties: {\n entity: { type: 'string' as const, description: 'Which entity the rows would become', enum: writableKeys },\n mapping: {\n type: 'object' as const,\n description:\n 'Column name from the file → field name in the app, e.g. {\"Nome\":\"name\",\"Celular\":\"phone\"}. Leave a column out when no field fits.',\n },\n file: { type: 'string' as const, description: 'File name, when more than one is attached.' },\n },\n required: ['entity', 'mapping'],\n },\n } satisfies PluginAITool,\n {\n id: 'data.commit-import',\n name: 'commitImport',\n description:\n 'WRITES the rows of an attached file as records, using a mapping the user already confirmed through proposeImport. ' +\n 'Call it only after proposeImport came back ok, and pass the SAME mapping it returned. The user confirms the row count before anything is written. ' +\n 'Never call this to \"check\" anything — it creates records.' +\n ` Entities: ${catalogLine}.`,\n icon: 'Upload',\n mode: 'persist' as const,\n requiresConfirmation: false,\n category: 'Data',\n parameters: {\n type: 'object' as const,\n properties: {\n entity: { type: 'string' as const, description: 'Which entity the rows become', enum: writableKeys },\n mapping: {\n type: 'object' as const,\n description: 'The confirmed mapping from proposeImport: file column -> app field.',\n },\n file: { type: 'string' as const, description: 'File name, when more than one is attached.' },\n },\n required: ['entity', 'mapping'],\n },\n } satisfies PluginAITool,\n ]\n : []),\n {\n id: 'data.query-data',\n name: 'queryData',\n description: `Aggregates over ONE entity: count, sum or avg of a field, with optional date range, equality filters and a group-by. Use for analytical questions (revenue this week, new clients this month, busiest professional). Entities: ${catalogLine}.`,\n icon: 'Sigma',\n mode: 'read',\n parameters: {\n type: 'object',\n properties: {\n entity: { type: 'string', description: 'Which entity to aggregate', enum: keys },\n metric: { type: 'string', description: 'Aggregation', enum: ['count', 'sum', 'avg'] },\n field: { type: 'string', description: 'Field to sum/avg (record field name). Ignored for count.' },\n dateField: { type: 'string', description: \"Date field to range-filter (default 'createdAt'; use startsAt for agenda questions).\" },\n from: { type: 'string', description: 'Lower bound (inclusive): YYYY-MM-DD (whole local day) or ISO datetime.' },\n to: { type: 'string', description: 'Upper bound (inclusive): YYYY-MM-DD (whole local day) or ISO datetime.' },\n groupBy: { type: 'string', description: 'Optional field to group results by.' },\n filters: { type: 'object', description: 'Optional equality filters {field: value}.' },\n },\n required: ['entity', 'metric'],\n },\n category: 'Data',\n },\n ]\n}\n\n/**\n * The action vocabulary a profile can grant. Same four the permission matrix\n * renders — a role built in chat and a role built on the screen must be the\n * same kind of object, or the matrix would show a grant it cannot express.\n */\nexport const PROFILE_ACTIONS = ['read', 'create', 'edit', 'delete'] as const\n\n/** Beyond this the catalog costs more in tokens than the choice is worth. */\nconst MAX_FEATURES = 80\n\n/**\n * The access-profile tool, built from the features the app actually declares.\n *\n * Written as ONE tool that takes the whole grant map rather than a\n * create-then-add-permission sequence: asked to describe access in prose,\n * gpt-4o-mini writes a plausible-sounding paragraph and stops — the schema is\n * what makes it commit to real feature ids, and what lets the executor reject\n * the ones it invented.\n *\n * What it CANNOT do is deliberate: the four actions here never include\n * `manage_roles`, the grant that confers `manage_permissions`. A profile minted\n * from chat can therefore never hand out permissions itself.\n */\nexport function buildPermissionTools(\n features: FeatureDeclaration[],\n profiles: PermissionProfile[] = [],\n): PluginAITool[] {\n const usable = features.filter((f) => f.id && f.label).slice(0, MAX_FEATURES)\n if (!usable.length) return []\n\n const catalog = usable\n .map((f) => `${f.id} (${f.label}${f.group && f.group !== f.label ? ` — ${f.group}` : ''})`)\n .join('; ')\n\n // Only custom profiles are editable. System roles are app-defined and static\n // — the screen makes you duplicate one to change it, and so does the agent.\n const editable = profiles.filter((p) => !p.isSystem)\n\n return [\n {\n id: 'core.create-permission-profile',\n name: 'createPermissionProfile',\n description:\n 'Creates an ACCESS PROFILE (permission role) that people on the team can then be assigned to — \"um perfil para Marketing\", \"um acesso só de leitura para o estagiário\". ' +\n 'YOU choose which areas the role needs from the catalog below and which actions on each: pick the smallest set that lets that role do its job, and grant `delete` only when the user asked for it. ' +\n 'Use the exact ids from the catalog — an id that is not in it is rejected. ' +\n 'After it comes back ok, tell the user in plain language what the profile can and cannot reach, using the labels — not the ids.' +\n `\\n\\nAreas (id (label — group)): ${catalog}` +\n `\\nActions on each area: ${PROFILE_ACTIONS.join(', ')}.`,\n icon: 'ShieldCheck',\n mode: 'persist',\n // Own guard chain: system permission → validation → confirmation → write.\n requiresConfirmation: false,\n parameters: {\n type: 'object',\n properties: {\n name: { type: 'string', description: 'Name of the profile, e.g. \"Marketing\".' },\n description: { type: 'string', description: 'One line on what this role is for.' },\n grants: {\n type: 'object',\n description:\n 'Area id → actions, e.g. {\"crm.leads\":[\"read\",\"create\",\"edit\"],\"agenda\":[\"read\"]}. Leave an area out entirely when the role should not reach it.',\n },\n },\n required: ['name', 'grants'],\n },\n category: 'Core',\n suggestions: [{ label: 'Cria um perfil de acesso para Marketing' }],\n },\n ...(editable.length\n ? [\n {\n id: 'core.update-permission-profile',\n name: 'updatePermissionProfile',\n description:\n 'Changes an access profile that ALREADY exists — \"dá edição em cursos para o Marketing\", \"deixa o estagiário só com leitura\", \"renomeia para Growth\". ' +\n 'This is the ONLY way to change a profile: never reach for a record tool, a profile is not a record. ' +\n 'Grants MERGE by area: an area you send replaces that area\\'s actions, an area you leave out keeps what it had, and an area only goes away when you name it in `revoke`. ' +\n 'So \"só leitura em cursos\" is grants {courses:[\"read\"]}, and \"tira o financeiro\" is revoke [\"financial\"]. ' +\n 'YOU decide which areas and actions that means — ask the user only when the areas themselves are ambiguous, never to have them dictate the action lists.' +\n `\\n\\nProfiles you can change (id — name): ${editable.map((p) => `${p.id} — ${p.name}`).join('; ')}` +\n `\\nAreas (id (label — group)): ${catalog}` +\n `\\nActions on each area: ${PROFILE_ACTIONS.join(', ')}.`,\n icon: 'ShieldCheck',\n mode: 'persist' as const,\n requiresConfirmation: false,\n parameters: {\n type: 'object' as const,\n properties: {\n id: { type: 'string' as const, description: 'Id of the profile to change, from the list above.', enum: editable.map((p) => p.id) },\n name: { type: 'string' as const, description: 'New name, only when renaming.' },\n description: { type: 'string' as const, description: 'New one-line description, only when changing it.' },\n grants: {\n type: 'object' as const,\n description:\n 'Areas to set, e.g. {\"courses\":[\"read\",\"edit\"]}. Replaces the actions of the areas named here and leaves every other area alone.',\n },\n revoke: {\n type: 'array' as const,\n items: { type: 'string' as const },\n description: 'Area ids the profile should lose entirely.',\n },\n },\n required: ['id'],\n },\n category: 'Core',\n } satisfies PluginAITool,\n ]\n : []),\n ]\n}\n\nexport function generateEntityTools(entities: RegisteredEntity[] = getAllEntities()): PluginAITool[] {\n return entities\n .filter((e) => !!e.entityDef)\n .map((entity) => ({\n id: `entity.${entity.entityKey}`,\n name: entityToolName(entity.entityKey),\n description: `Searches ${entity.labelPlural.toLowerCase()} and returns matching records with their fields. Use this to answer questions about a specific ${entity.label.toLowerCase()} or to count them.`,\n icon: entity.icon,\n mode: 'read' as const,\n parameters: {\n type: 'object' as const,\n properties: {\n search: {\n type: 'string' as const,\n description: `Name or text to match. Omit to list recent ${entity.labelPlural.toLowerCase()}.`,\n },\n },\n },\n category: 'Data',\n }))\n}\n","import { useCallback } from 'react'\nimport type { SystemPermission } from '@fayz-ai/core'\nimport { profileHasSystemPermission } from '@fayz-ai/core/access'\nimport { usePermissionsStore } from '../permissions'\n\n// ---------------------------------------------------------------------------\n// useSystemPermission — native replacement for the org-management (system)\n// permission check that used to live in the legacy hooks/usePermission.\n// The decision itself lives in core/access (one implementation for browser,\n// headless and the agent executor); this is the React binding to the effective\n// profile. Grants-based feature checks stay with usePermission(Optional).\n// ---------------------------------------------------------------------------\n\nexport function useSystemPermission(): (perm: SystemPermission) => boolean {\n const currentProfile = usePermissionsStore((s) => s.currentProfile)\n return useCallback(\n (perm: SystemPermission) => profileHasSystemPermission(currentProfile, perm),\n [currentProfile],\n )\n}\n","import type { PluginAITool } from '../types/plugins'\n\n/**\n * Agent Surface Contract — how the screen the user is looking at RIGHT NOW\n * contributes to the assistant.\n *\n * The FAB's base capabilities (data primitives, navigation) are global. But a\n * live, interactive surface — the form builder, a calendar, a reconciliation\n * ledger — has TWO things the global catalog can't express:\n *\n * 1. State that only exists on screen (an unsaved form draft), which the model\n * must SEE to help with, and\n * 2. Tools that act on that live state (add a field to the draft the user is\n * watching), which only make sense while the surface is mounted.\n *\n * A surface publishes both by calling `useAgentSurface(...)` on mount and\n * withdrawing them on unmount. This module is the registry the shell reads:\n * `useAITools` merges the tools, `useChat` folds the snapshot + instructions\n * into the request, and the executors ride the normal client-plane handler map.\n *\n * This is the scalable seam: forms is the first consumer; agenda, financial and\n * marketing adopt the same contract without touching the shell again.\n */\nexport interface AgentSurfaceSnapshot {\n /** One line naming what's on screen, e.g. 'Form builder — \"Anamnese\"'. */\n title?: string\n /** Structured state the model should reason over (the form draft, filters…). */\n state?: Record<string, unknown>\n /** The record this surface is centered on, when it is a detail page. */\n record?: { entity: string; id: string; label?: string; summary?: Record<string, unknown> }\n}\n\nexport interface AgentSurfaceTool {\n /** Declared tool shape (name, description, params) — same as a plugin aiTool. */\n tool: PluginAITool\n /** Client-plane executor that mutates the live surface. Read fresh each call. */\n execute: (args: Record<string, unknown>) => unknown | Promise<unknown>\n}\n\nexport interface AgentSurfaceContribution {\n /** Stable id for this surface instance, e.g. 'custom_forms.builder'. */\n id: string\n /** Plugin that owns the surface, used for tool ranking. */\n pluginId?: string\n /** Snapshot of what's on screen. Called fresh at send time — never cached. */\n describe?: () => AgentSurfaceSnapshot\n /** Guidance appended to the request ONLY while this surface is mounted. */\n instructions?: string\n /** Tools available only while this surface is mounted. */\n tools?: AgentSurfaceTool[]\n}\n\n/** Registry entry keeps a getter, not the value, so closures stay fresh across\n * re-renders without re-registering on every render. */\ninterface SurfaceEntry {\n id: string\n get: () => AgentSurfaceContribution\n}\n\nlet entries: SurfaceEntry[] = []\nlet version = 0\nconst listeners = new Set<() => void>()\n\nfunction emit(): void {\n version++\n for (const l of listeners) l()\n}\n\n/** Add or replace a surface (by id). Called on mount. */\nexport function registerSurface(entry: SurfaceEntry): void {\n entries = [...entries.filter((e) => e.id !== entry.id), entry]\n emit()\n}\n\n/** Remove a surface. Called on unmount. */\nexport function unregisterSurface(id: string): void {\n const next = entries.filter((e) => e.id !== id)\n if (next.length === entries.length) return\n entries = next\n emit()\n}\n\n/** useSyncExternalStore subscription — fires only on mount/unmount, not on the\n * per-render state changes inside a surface. */\nexport function subscribeSurfaces(cb: () => void): () => void {\n listeners.add(cb)\n return () => listeners.delete(cb)\n}\n\n/** Version counter for useSyncExternalStore; bumps when the set of surfaces\n * changes so `useAITools` recomputes its catalog. */\nexport function getSurfaceVersion(): number {\n return version\n}\n\n/** Flat list of tool declarations across every mounted surface (for the catalog). */\nexport function getSurfaceTools(): PluginAITool[] {\n return entries.flatMap((e) => e.get().tools?.map((t) => t.tool) ?? [])\n}\n\n/** Snapshot + instructions from every mounted surface, read at send time. */\nexport function getActiveSurfaceContext(): {\n snapshot: AgentSurfaceSnapshot[]\n instructions: string[]\n} {\n const snapshot: AgentSurfaceSnapshot[] = []\n const instructions: string[] = []\n for (const e of entries) {\n const c = e.get()\n if (c.describe) {\n try {\n snapshot.push(c.describe())\n } catch {\n // A surface mid-transition must never break a turn.\n }\n }\n if (c.instructions) instructions.push(c.instructions)\n }\n return { snapshot, instructions }\n}\n","import * as React from 'react'\nimport { usePluginRuntimeOptional } from '../lib/plugins'\nimport { useAccessOptional } from '../access/context'\nimport { getAllEntities } from '@fayz-ai/core'\nimport { coreAITools, buildDataPrimitiveTools, buildPermissionTools, formatToolSignature } from '../lib/core-ai-tools'\nimport { usePermissionsStore } from '../permissions'\nimport { useSystemPermission } from './useSystemPermission'\nimport { subscribeSurfaces, getSurfaceVersion, getSurfaceTools } from '../lib/agent-surface'\nimport type { PluginAITool, AIToolSuggestion } from '../types/plugins'\n\nexport interface ResolvedSuggestion extends AIToolSuggestion {\n toolId: string\n category: string\n}\n\nexport interface ResolvedToolEntry {\n tool: PluginAITool\n signature: string\n}\n\nexport interface ResolvedToolGroup {\n category: string\n tools: ResolvedToolEntry[]\n}\n\n/**\n * Detects which plugin \"owns\" the current page based on route matching.\n * Returns the plugin ID or null for non-plugin pages (e.g. settings/general, dashboard).\n */\nfunction detectActivePluginId(runtime: ReturnType<typeof usePluginRuntimeOptional>): string | null {\n if (!runtime) return null\n const path = runtime.context.currentPath\n\n // Check each active plugin's routes for a match\n for (const plugin of runtime.activePlugins) {\n for (const route of plugin.routes) {\n if (path === route.path || path.startsWith(`${route.path}/`)) {\n return plugin.id\n }\n }\n }\n\n // Also match settings sub-pages: /settings/financial → financial\n const settingsMatch = path.match(/^\\/settings\\/([^/]+)/)\n if (settingsMatch) {\n const tabId = settingsMatch[1]\n if (runtime.activePlugins.some((p) => p.id === tabId)) {\n return tabId\n }\n }\n\n return null\n}\n\nexport function useAITools(): {\n tools: PluginAITool[]\n /** Plugin owning the current route, or null on non-plugin pages. */\n activePluginId: string | null\n suggestions: ResolvedSuggestion[]\n /** Suggestions from the currently active plugin only (empty on non-plugin pages) */\n contextualSuggestions: ResolvedSuggestion[]\n toolGroups: ResolvedToolGroup[]\n} {\n const runtime = usePluginRuntimeOptional()\n const access = useAccessOptional()\n // Recompute the catalog when a surface mounts/unmounts (not on its per-render\n // state changes — the version bumps only on membership changes).\n const surfaceVersion = React.useSyncExternalStore(subscribeSurfaces, getSurfaceVersion, getSurfaceVersion)\n // Access-profile tools are declared from the app's OWN feature catalog, so\n // the model can only ever offer areas this app actually has.\n const features = usePermissionsStore((s) => s.features)\n // The profiles are part of the catalog too: the update tool can only offer\n // ids that exist, so a profile created mid-conversation has to reach the next\n // turn's declaration.\n const profiles = usePermissionsStore((s) => s.profiles)\n const hasSystem = useSystemPermission()\n const canManagePermissions = hasSystem('manage_permissions')\n\n return React.useMemo(() => {\n const hasPermission = runtime?.context.hasPermission\n const can = access.can\n const verticalId = runtime?.context.tenant?.verticalId\n const activePluginId = detectActivePluginId(runtime)\n\n // Collect all tools: core + the TWO data primitives (searchRecords/\n // queryData over every CRUD entity and plugin registry — the target is a\n // parameter, its read permission checked per call) + plugin-declared.\n const allTools: PluginAITool[] = [\n ...coreAITools,\n ...buildDataPrimitiveTools({\n entities: getAllEntities(),\n registries: runtime?.registries ?? new Map(),\n queryEntities: runtime?.activePlugins.flatMap((p) => p.queryEntities ?? []) ?? [],\n }),\n ]\n // Gated by the SYSTEM permission, not by `tool.permission` (that axis is\n // feature grants, which have no entry for permissions themselves): someone\n // who cannot open the Permissions tab must not be offered the tool either.\n if (canManagePermissions) allTools.push(...buildPermissionTools(features, profiles))\n if (runtime) allTools.push(...runtime.aiTools)\n // Tools published by the surface the user is looking at right now. They rank\n // first (their id shares the active plugin's prefix) so the cap never drops\n // them, and disappear the moment that surface unmounts.\n allTools.push(...getSurfaceTools())\n\n // Filter by role × plan. UX only — the REAL authorization runs server-side\n // (broker catalog filter) and in the guarded executor (checkAccess/\n // guardLimit); hiding here just keeps the visible catalog honest. Falls\n // back to the runtime's role-only check when no AccessProvider is mounted.\n const tools = allTools.filter((tool) => {\n if (!tool.permission) return true\n if (can) return can(tool.permission.feature, tool.permission.action).allowed\n if (!hasPermission) return true\n return hasPermission(tool.permission)\n })\n\n // Flatten suggestions, filter by vertical\n const allSuggestions: ResolvedSuggestion[] = []\n for (const tool of tools) {\n if (!tool.suggestions) continue\n for (const suggestion of tool.suggestions) {\n if (suggestion.verticalId && suggestion.verticalId !== verticalId) continue\n allSuggestions.push({\n ...suggestion,\n toolId: tool.id,\n category: tool.category ?? 'General',\n })\n }\n }\n\n // Prioritize suggestions from the active plugin's context\n const contextualSuggestions = activePluginId\n ? allSuggestions.filter((s) => s.toolId.startsWith(`${activePluginId}.`))\n : []\n let suggestions: ResolvedSuggestion[]\n if (activePluginId) {\n const others = allSuggestions.filter((s) => !s.toolId.startsWith(`${activePluginId}.`))\n suggestions = [...contextualSuggestions, ...others]\n } else {\n suggestions = allSuggestions\n }\n\n // Group tools by category with signatures\n const groupMap = new Map<string, ResolvedToolEntry[]>()\n for (const tool of tools) {\n const cat = tool.category ?? 'General'\n if (!groupMap.has(cat)) groupMap.set(cat, [])\n groupMap.get(cat)!.push({\n tool,\n signature: formatToolSignature(tool),\n })\n }\n\n // Core first, then alphabetical\n const toolGroups: ResolvedToolGroup[] = []\n if (groupMap.has('Core')) {\n toolGroups.push({ category: 'Core', tools: groupMap.get('Core')! })\n groupMap.delete('Core')\n }\n for (const [category, groupTools] of [...groupMap.entries()].sort(([a], [b]) => a.localeCompare(b))) {\n toolGroups.push({ category, tools: groupTools })\n }\n\n return { tools, activePluginId, suggestions, contextualSuggestions, toolGroups }\n }, [runtime, access.can, surfaceVersion, features, profiles, canManagePermissions])\n}\n","/**\n * Request deduplication — prevents duplicate in-flight requests with the same key.\n * If a request with the same key is already in-flight, returns the existing promise.\n */\nconst inflight = new Map<string, Promise<any>>()\n\nexport function dedup<T>(key: string, fn: () => Promise<T>): Promise<T> {\n const existing = inflight.get(key)\n if (existing) return existing as Promise<T>\n\n const promise = fn().finally(() => {\n inflight.delete(key)\n })\n\n inflight.set(key, promise)\n return promise\n}\n","import * as React from 'react'\nimport { hashRouterAdapter } from '@fayz-ai/core'\n\n// ---------------------------------------------------------------------------\n// Admin hash router — the same lightweight approach the storefront uses. The\n// admin shell collects routes from the plugin runtime + manifest pages and\n// switches on the current hash path. Deliberately not react-router: an SDK\n// shell shipping a router creates singleton hazards under source-alias dev.\n// ---------------------------------------------------------------------------\n\nconst adapter = hashRouterAdapter()\n\nexport function normalizeAdminPath(path: string): string {\n const clean = `/${path}`.replace(/\\/+/g, '/')\n return clean.length > 1 ? clean.replace(/\\/+$/, '') : clean\n}\n\nexport function navigateTo(to: string): void {\n adapter.navigate(normalizeAdminPath(to))\n}\n\nexport function useAdminPath(): string {\n const [path, setPath] = React.useState(() => normalizeAdminPath(adapter.getCurrentPath() || '/'))\n React.useEffect(() => {\n return adapter.onPathChange((p) => {\n setPath(normalizeAdminPath(p || '/'))\n if (typeof window !== 'undefined') window.scrollTo(0, 0)\n })\n }, [])\n return path\n}\n\n/** Match '/courses/:id' against '/courses/abc' → { id: 'abc' }; supports a\n * trailing '/*' wildcard (matches the base and any deeper path). */\nexport function matchRoute(pattern: string, path: string): Record<string, string> | null {\n const cleanPath = (path.split('?')[0] ?? '').replace(/\\/+$/, '') || '/'\n if (pattern.endsWith('/*')) {\n const base = pattern.slice(0, -2)\n if (cleanPath === base || cleanPath.startsWith(`${base}/`)) return {}\n return null\n }\n const patternParts = pattern.split('/').filter(Boolean)\n const pathParts = cleanPath.split('/').filter(Boolean)\n if (patternParts.length !== pathParts.length) return null\n const params: Record<string, string> = {}\n for (let i = 0; i < patternParts.length; i++) {\n const pat = patternParts[i]!\n const part = pathParts[i]!\n if (pat.startsWith(':')) params[pat.slice(1)] = decodeURIComponent(part)\n else if (pat !== part) return null\n }\n return params\n}\n\n/** Score a route pattern for specificity so the most specific match wins\n * (static segments beat params; longer beats shorter; wildcard loses). */\nexport function routeScore(pattern: string): number {\n const isWildcard = pattern.endsWith('/*')\n const routePattern = isWildcard ? pattern.slice(0, -2) : pattern\n const parts = routePattern.split('/').filter(Boolean)\n let score = parts.length * 10\n for (const p of parts) if (!p.startsWith(':')) score += 5\n if (isWildcard) score -= 1\n return score\n}\n","/**\n * Global entity route registry.\n *\n * Populated once during buildNavigation() with mappings from\n * \"archetype:kind\" (e.g. \"person:staff\") to the registered route path\n * (e.g. \"/registry/staff\"). Used by PersonLink, command palette, and\n * any component that needs to resolve an entity detail URL.\n *\n * An entry records whether the route can take an id: a CRUD page owns\n * `/path/:id`, a hand-built page (the agenda) only has its list.\n */\n\nimport { navigateTo } from '../app/routing'\n\nexport interface EntityRouteEntry {\n path: string\n /** The route renders `${path}/${id}` as a detail view. */\n detail: boolean\n}\n\nlet routeMap = new Map<string, EntityRouteEntry>()\n\n/** Replace the entity route map (called once at app init by buildNavigation).\n * Accepts the legacy `Map<string, string>` shape (all detail-capable). */\nexport function setEntityRouteMap(map: Map<string, EntityRouteEntry | string>): void {\n const next = new Map<string, EntityRouteEntry>()\n for (const [key, value] of map) {\n next.set(key, typeof value === 'string' ? { path: value, detail: true } : value)\n }\n routeMap = next\n}\n\nfunction lookup(archetype?: string, kind?: string, entityKey?: string): EntityRouteEntry | null {\n if (archetype && kind) {\n const specific = routeMap.get(`${archetype}:${kind}`)\n if (specific) return specific\n }\n if (archetype) {\n const general = routeMap.get(archetype)\n if (general) return general\n }\n // The only route a non-archetype entity has — without it a plugin registry\n // is findable by search and unopenable.\n if (entityKey) {\n const byKey = routeMap.get(entityKey)\n if (byKey) return byKey\n }\n return null\n}\n\n/**\n * Resolve the route path for an entity given its archetype and kind.\n * Returns the registered path (e.g. \"/registry/staff\") or null if not found.\n *\n * Tries \"archetype:kind\", then \"archetype\", then the entity key.\n */\nexport function resolveEntityRoute(archetype?: string, kind?: string, entityKey?: string): string | null {\n return lookup(archetype, kind, entityKey)?.path ?? null\n}\n\n/** Whether the resolved route can show a single record, or only its list. */\nexport function entityRouteHasDetail(archetype?: string, kind?: string, entityKey?: string): boolean {\n return lookup(archetype, kind, entityKey)?.detail ?? false\n}\n\n/**\n * Build a full URL path for an entity detail page.\n * Returns e.g. \"/registry/staff/uuid\" or \"/registry/staff/uuid/schedule\".\n * Falls back to \"/kind/uuid\" if no route registered.\n *\n * A list-only route (a plugin page that shows these records but has no detail\n * view) returns the bare path — appending an id there is a dead end.\n */\nexport function resolveEntityHref(id: string, archetype?: string, kind?: string, tab?: string, entityKey?: string): string {\n const entry = lookup(archetype, kind, entityKey)\n if (entry && !entry.detail) return entry.path\n\n let href: string\n if (entry) {\n href = `${entry.path}/${id}`\n } else if (kind) {\n const plural = kind.endsWith('s') ? kind : kind + 's'\n href = `/${plural}/${id}`\n } else {\n href = `/${id}`\n }\n if (tab) href += `/${tab}`\n return href\n}\n\n/** The href form — hash-prefixed, because the admin is a hash router. Use this\n * for links, `openEntity` for clicks. */\nexport function resolveEntityAnchor(\n id: string,\n archetype?: string,\n kind?: string,\n tab?: string,\n entityKey?: string,\n): string {\n return `#${resolveEntityHref(id, archetype, kind, tab, entityKey)}`\n}\n\n/**\n * Resolve a record's URL and go there — the only way a surface should open one.\n * `resolveEntityHref` returns a plain admin path, and handing that to a generic\n * router adapter assigns `location.href`: a full page load to a URL the app does\n * not serve. The palette and the chat chips both got that wrong independently.\n */\nexport function openEntity(\n id: string,\n archetype?: string,\n kind?: string,\n tab?: string,\n entityKey?: string,\n): void {\n navigateTo(resolveEntityHref(id, archetype, kind, tab, entityKey))\n}\n","import {\n resolveDataProvider,\n getSupabaseClientOptional,\n getActiveTenantId,\n emitDataChanged,\n bulkCreate,\n parseRangeFilter,\n isFilterObject,\n matchesRange,\n type RangeFilter,\n} from '@fayz-ai/core'\nimport { profileHasSystemPermission } from '@fayz-ai/core/access'\nimport { checkAccess, guardLimit } from '../access/headless'\n// The store itself, not the permissions barrel — the executor has no business\n// pulling the React context in behind it.\nimport { usePermissionsStore } from '../permissions/store'\nimport { PROFILE_ACTIONS } from './core-ai-tools'\nimport { lookupRecordRef } from './record-refs'\nimport { openEntity, resolveEntityRoute } from './entity-routes'\nimport { invalidateLimit } from '../access/limits-registry'\nimport { deriveEntityKey } from '@fayz-ai/core'\nimport { CORE_QUERY_ENTITIES } from '../app/core-entities'\nimport { resolveAttachmentDigest, listAttachmentNames, readAllRows } from './attachments'\nimport {\n useChatStore,\n type PendingAgentAction,\n type PendingActionField,\n type PendingActionResult,\n} from '../stores/chat.store'\n\n/** Chat-store confirmation gate, callable from any handler. */\nfunction requestChatConfirmation(action: PendingAgentAction): Promise<PendingActionResult> {\n return useChatStore.getState().requestConfirmation(action)\n}\n\n/** Columns the database owns. Offering them as inputs invites someone to\n * hand-type a `created_at`. */\nconst SYSTEM_FIELD_KEYS = new Set([\n 'id', 'tenant_id', 'tenantId', 'created_at', 'createdAt', 'updated_at', 'updatedAt',\n 'deleted_at', 'deletedAt', 'created_by', 'createdBy',\n])\n\nfunction normaliseOptions(raw: unknown): Array<{ value: string; label?: string }> | undefined {\n if (!Array.isArray(raw)) return undefined\n const out: Array<{ value: string; label?: string }> = []\n for (const o of raw) {\n if (typeof o === 'string') out.push({ value: o })\n else if (o && typeof o === 'object' && typeof (o as { value?: unknown }).value === 'string') {\n const rec = o as { value: string; label?: unknown }\n out.push({ value: rec.value, label: typeof rec.label === 'string' ? rec.label : undefined })\n }\n }\n return out.length ? out : undefined\n}\n\n/** The entity's fields as the card needs them. Anything the app already hides\n * from its own forms (`showInForm: false`) is hidden here too — the assistant\n * is not a back door around the app's own idea of what a person edits. */\nfunction cardFields(entity: { fields?: Array<Record<string, unknown>> }): PendingActionField[] {\n return (entity.fields ?? [])\n .filter((f) => f.showInForm !== false && !SYSTEM_FIELD_KEYS.has(String(f.key)))\n .map((f) => {\n const type = typeof f.type === 'string' ? f.type : undefined\n return {\n key: String(f.key),\n label: typeof f.label === 'string' ? f.label : undefined,\n type,\n required: f.required === true,\n options: normaliseOptions(f.options),\n placeholder: typeof f.placeholder === 'string' ? f.placeholder : undefined,\n hint: typeof f.hint === 'string' ? f.hint : undefined,\n min: typeof f.min === 'number' ? f.min : undefined,\n max: typeof f.max === 'number' ? f.max : undefined,\n default: f.defaultValue,\n // A computed value has no input, and a relation needs its option list\n // loaded from a table — neither is something to type into a chat card.\n readOnly: type === 'computed' || type === 'relation' || !!f.relation,\n }\n })\n}\nimport type {\n EntityDef,\n OrgMember,\n Organization,\n PermissionAction,\n PermissionProfile,\n TeamPerson,\n} from '@fayz-ai/core'\nimport type { PluginAITool, PluginRegistryDef } from '../types/plugins'\n\n/**\n * Client-plane execution for the AI tool catalog.\n *\n * `useAITools()` declares *what* the surface can do — it is the catalog the\n * model reasons over. This module is *how*: the browser runs the call against\n * the session that is already open (org store, data providers, router) and\n * hands a serialized result back to the agent.\n *\n * The split matters because Fayz never holds the surface's data credentials.\n * The agent broker forwards the catalog, decides which tool to call, and\n * returns the call for the surface to execute — the same contract a\n * server-side channel (WhatsApp, email) satisfies with a server-side executor.\n *\n * **A capability is only advertised if it can run.** A declared tool with no\n * executor is a promise to the model the surface cannot keep: it burns\n * reasoning rounds retrying, then apologises. `buildAgentToolset` is the gate —\n * everything it returns has a resolvable executor.\n */\n\n/** An entity the executor can read through its own data provider. */\nexport interface DataToolTarget {\n label: string\n entity: EntityDef\n mockData?: Array<{ id: string }>\n /** Read-model (view/ledger): searchable/queryable but never writable. */\n readOnly?: boolean\n}\n\nexport interface AIToolExecutionContext {\n currentOrg: Organization | null\n members: OrgMember[]\n /**\n * Person-first team resolver — the same source the Team screen renders\n * (people of the configured `team.personKinds`, each with an OPTIONAL access\n * overlay). Absent when the app runs in legacy membership-only mode, in\n * which case `members` is the whole team.\n */\n loadTeam?: () => Promise<TeamPerson[]>\n currentPath: string\n /** Pages the surface exposes, used to resolve navigation requests. */\n routes: Array<{ path: string; label?: string }>\n navigate: (path: string) => void\n /**\n * Data-backed tools, keyed by the LLM-facing tool name. These execute\n * generically through the entity's own data provider, so every registry and\n * every CRUD entity the app declares is readable without a hand-written\n * handler — which is what lets a new vertical work on day one.\n */\n dataTools: Map<string, DataToolTarget>\n /**\n * The WRITE tools the agent can actually run this turn — what a refusal is\n * allowed to point at, with the action each performs. Read tools and\n * declared-but-unexecutable ones are excluded on purpose (\"use listLeads\" for\n * an update is worse advice than none), and the action matters just as much:\n * pointed at `updateLead` for a CREATE, the model called it with\n * `lead_id: \"N/A\"`.\n */\n writeTools?: Array<{ name: string; action?: string }>\n /**\n * Org-management writes the agent can perform — today only access profiles.\n * Narrowed to what is actually called: handing the executor the whole adapter\n * would let a future tool remove members from a chat turn.\n */\n orgAdapter?: {\n createProfile: (\n orgId: string,\n profile: Omit<PermissionProfile, 'id' | 'isSystem'>,\n ) => Promise<PermissionProfile>\n updateProfile?: (\n orgId: string,\n profileId: string,\n data: Partial<PermissionProfile>,\n ) => Promise<PermissionProfile>\n listProfiles?: (orgId: string) => Promise<PermissionProfile[]>\n } | null\n}\n\nexport type AIToolHandler = (\n args: Record<string, unknown>,\n context: AIToolExecutionContext,\n) => unknown | Promise<unknown>\n\nconst handlers = new Map<string, AIToolHandler>()\n\n/**\n * Register an executor for a tool, keyed by the tool's `name` (the identifier\n * the model calls, e.g. `getTeamMembers`). Plugins and apps call this to make\n * their declared `aiTools` actually runnable.\n */\nexport function registerAIToolHandler(name: string, handler: AIToolHandler): void {\n handlers.set(name, handler)\n}\n\nexport function registerAIToolHandlers(map: Record<string, AIToolHandler>): void {\n for (const [name, handler] of Object.entries(map)) registerAIToolHandler(name, handler)\n}\n\n/**\n * Remove an executor. Surface-scoped tools (a form builder's field ops) live\n * only while their screen is mounted; unregistering on unmount stops the model\n * from calling a tool whose live target no longer exists.\n */\nexport function unregisterAIToolHandler(name: string): void {\n handlers.delete(name)\n}\n\nexport function hasAIToolHandler(name: string): boolean {\n return handlers.has(name)\n}\n\n/** Rows returned per data call — enough to answer, cheap in tokens. */\nconst REGISTRY_PAGE_SIZE = 20\n\n/** A narrowed window (date range / filters) is answered from the whole set,\n * not from the first page — \"quantos atendimentos esta semana\" must not\n * depend on where the row happened to land in the default order. */\nconst FILTERED_PAGE_SIZE = 200\n\n/**\n * The agent never reads through the shared TTL cache.\n *\n * That cache is only invalidated by writes that pass through it, so an\n * appointment booked on the agenda screen (its own provider) left the\n * assistant answering from a snapshot up to a minute old — it reported \"nenhum\n * compromisso hoje\" over a booking made seconds earlier.\n */\nconst FRESH = { cache: false } as const\n\n/**\n * Interpret a date bound the way the user meant it.\n *\n * A bare `2026-07-27` means the BUSINESS day, not the UTC day: parsed as\n * \"2026-07-27T00:00:00\" it resolves in the surface's own timezone, which is\n * the business timezone. Sent as `...Z` instead, a 21h appointment in BRT\n * lands on the next UTC day and disappears from \"hoje\".\n */\nfunction localDayBound(value: string, edge: 'start' | 'end'): string {\n const dateOnly = /^\\d{4}-\\d{2}-\\d{2}$/.test(value.trim())\n if (!dateOnly) return value\n const time = edge === 'start' ? '00:00:00.000' : '23:59:59.999'\n const parsed = new Date(`${value.trim()}T${time}`)\n return Number.isNaN(parsed.getTime()) ? value : parsed.toISOString()\n}\n\n/** Build the provider-side range a `from`/`to` pair asks for. */\nfunction dateRangeFilter(args: Record<string, unknown>): { field: string; range: RangeFilter } | null {\n const from = typeof args.from === 'string' && args.from.trim() ? args.from.trim() : undefined\n const to = typeof args.to === 'string' && args.to.trim() ? args.to.trim() : undefined\n if (!from && !to) return null\n const field = typeof args.dateField === 'string' && args.dateField.trim()\n ? args.dateField.trim()\n : 'createdAt'\n const range: RangeFilter = {}\n if (from) range.gte = localDayBound(from, 'start')\n if (to) range.lte = localDayBound(to, 'end')\n return { field, range }\n}\n\n/** Beyond this the catalog costs more in tokens than it buys in capability. */\nconst MAX_TOOLS_PER_TURN = 24\n\nexport interface AIToolExecutionResult {\n ok: boolean\n /** JSON-serialized payload handed back to the agent. */\n content: string\n}\n\nfunction errorResult(error: string, message: string): AIToolExecutionResult {\n return { ok: false, content: JSON.stringify({ error, message }) }\n}\n\n/** The documented contract: every returned record carries a semantic ref\n * {id, resource, archetype} the surface can resolve to ITS OWN route — never\n * a URL (agents.md: presentation stays client knowledge). */\nfunction attachRefs(\n entity: EntityDef,\n rows: Array<Record<string, unknown>>,\n): Array<Record<string, unknown>> {\n const archetype = entity.data?.archetype\n if (!archetype) return rows\n const kind = entity.data?.archetypeKind\n const entityKey = deriveEntityKey(entity)\n return rows.map((r) =>\n r.id\n ? {\n ...r,\n ref: {\n id: r.id,\n resource: entity.data?.table,\n archetype: kind ? `${archetype}:${kind}` : archetype,\n entityKey,\n },\n }\n : r,\n )\n}\n\nfunction rowContainsText(row: Record<string, unknown>, needle: string): boolean {\n const n = needle.toLowerCase()\n return Object.values(row).some((v) => typeof v === 'string' && v.toLowerCase().includes(n))\n}\n\nconst UUID_RE = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i\n\nasync function executeDataTool(\n target: DataToolTarget,\n args: Record<string, unknown>,\n): Promise<unknown> {\n const provider = resolveDataProvider(\n target.entity as EntityDef<{ id: string }>,\n target.mockData,\n FRESH,\n )\n const search = typeof args.search === 'string' && args.search.trim() ? args.search.trim() : undefined\n\n // A model that just opened a record searches for it by the id it saw. Text\n // search can never match that: the id column is a uuid, and every searchable\n // column is text, so the term matches nothing at best — and on an entity\n // whose search list includes a non-text column, Postgres rejects the whole\n // `ilike` clause and the lookup fails outright. Resolve the id directly.\n // The returned row is verified against the id asked for, so a provider that\n // ignores `filters` cannot pass a recent record off as the match.\n if (search && UUID_RE.test(search)) {\n try {\n const byId = await provider.list({ filters: { id: search }, pageSize: 1 })\n const row = (byId.data as Array<Record<string, unknown>>)[0]\n if (row && String(row.id) === search) {\n return {\n entity: target.label,\n search,\n total: 1,\n truncated: false,\n records: attachRefs(target.entity, [row]),\n }\n }\n } catch {\n // Fall through to the text search: an id lookup that errors is not worse\n // than the behaviour that shipped before it existed.\n }\n }\n\n // A date range goes to the DATABASE. Filtering it in memory only ever saw\n // one page, so \"o que tem hoje\" over a busy agenda answered from whichever\n // rows the default order happened to put first.\n const dateRange = dateRangeFilter(args)\n const result = await provider.list({\n search,\n pageSize: dateRange ? FILTERED_PAGE_SIZE : REGISTRY_PAGE_SIZE,\n ...(dateRange ? { filters: { [dateRange.field]: dateRange.range } } : {}),\n ...(typeof args.orderBy === 'string'\n ? { sortBy: args.orderBy, sortDir: args.direction === 'asc' ? 'asc' : 'desc' }\n : {}),\n })\n // Honesty guard: a provider with no searchable columns quietly IGNORES\n // `search` and returns recent rows — which the model then presents as the\n // thing it looked for (\"REC-00012 vale R$6000\" when no row matched at all).\n // If nothing in the returned rows contains the text, say so explicitly.\n let rows = result.data as Array<Record<string, unknown>>\n let total = result.total\n // Mock/legacy providers ignore `filters`. Re-apply the range here so a\n // provider that cannot narrow never hands back rows OUTSIDE the window the\n // user asked about.\n if (dateRange && rows.length) {\n const key = resolveFieldKey(rows[0], dateRange.field)\n if (!key) {\n return {\n error: 'unknown_field',\n message: `dateField \"${dateRange.field}\" does not exist on ${target.label}. Use one of the available fields and retry.`,\n availableFields: Object.keys(rows[0]),\n }\n }\n const narrowed = rows.filter((r) => matchesRange(r[key], dateRange.range))\n if (narrowed.length !== rows.length) total = narrowed.length\n rows = narrowed\n }\n const unmatched = !!search && rows.length > 0 && !rows.some((r) => rowContainsText(r, search))\n return {\n entity: target.label,\n ...(search ? { search } : {}),\n ...(dateRange ? { dateRange: { field: dateRange.field, ...dateRange.range } } : {}),\n total,\n // Truthful cap: the model is told the list was trimmed so it can say so\n // rather than presenting one page as the whole set.\n truncated: total > rows.length,\n records: attachRefs(target.entity, rows),\n ...(unmatched\n ? {\n warning:\n 'None of these rows contain the search text — they are RECENT records, not matches. Do NOT present them as the searched item; say it was not found or try another entity.',\n }\n : {}),\n }\n}\n\n/**\n * A read-only target is a DEAD END for the generic primitives, and a dead end\n * is where models improvise: asked to move an appointment, one answered the\n * `read_only` refusal by booking a SECOND appointment and leaving the first\n * standing. So the refusal names the dedicated tool for that entity when the\n * turn was offered one, and forbids the substitution outright.\n */\nfunction readOnlyRefusal(\n ctx: AIToolExecutionContext,\n target: DataToolTarget,\n verb: 'created' | 'updated',\n): { error: string; message: string; useInstead?: string[] } {\n const noun = target.entity.name.replace(/\\s+/g, '').toLowerCase()\n const plural = target.label.replace(/\\s+/g, '').toLowerCase()\n const wantedAction = verb === 'created' ? 'create' : 'edit'\n const candidates = (ctx.writeTools ?? [])\n .filter(({ name, action }) => {\n const n = name.toLowerCase()\n if (n === 'createrecord' || n === 'updaterecord') return false\n if (!n.includes(noun) && !n.includes(plural)) return false\n // Declared action wins; fall back to the verb the name starts with, for\n // tools that never declared a permission.\n if (action) return action === wantedAction\n return wantedAction === 'create' ? /^(create|add|new)/.test(n) : /^(update|edit|set|change|move)/.test(n)\n })\n .map((t) => t.name)\n return {\n error: 'read_only',\n message:\n `${target.label} is a read-only view — records cannot be ${verb} through this tool.` +\n (candidates.length\n ? ` Use ${candidates.join(' or ')} instead.`\n : ` This app has no tool that can change a ${target.entity.name.toLowerCase()}. Tell the user plainly that you cannot, and where in the app they can do it themselves.`) +\n ' Do NOT substitute a create: making a new record instead of changing the existing one leaves the original in place and duplicates it.',\n ...(candidates.length ? { useInstead: candidates } : {}),\n }\n}\n\n/** Tolerant field resolution: exact key, then camelCase, then snake_case. */\nfunction resolveFieldKey(row: Record<string, unknown>, name: string): string | null {\n if (name in row) return name\n const camel = name.replace(/_([a-z])/g, (_, c: string) => c.toUpperCase())\n if (camel in row) return camel\n const snake = name.replace(/[A-Z]/g, (c) => '_' + c.toLowerCase())\n if (snake in row) return snake\n return null\n}\n\n/**\n * Resolve ONE filter entry against a sample row.\n *\n * Returns a predicate, or an error the model can act on. The failure mode this\n * replaces was silent: a filter value the grammar did not recognise was\n * stringified and compared for equality, so `{$gte, $lt}` matched zero rows and\n * came back as a confident \"não há compromissos hoje\".\n */\nfunction resolveFilter(\n sample: Record<string, unknown>,\n label: string,\n name: string,\n value: unknown,\n): { key: string; test: (row: Record<string, unknown>) => boolean } | { error: string; message: string; availableFields?: string[] } {\n const key = resolveFieldKey(sample, name)\n if (!key) {\n return {\n error: 'unknown_field',\n message: `Filter field \"${name}\" does not exist on ${label}. Use one of the available fields and retry.`,\n availableFields: Object.keys(sample),\n }\n }\n const range = parseRangeFilter(value)\n if (range) return { key, test: (row) => matchesRange(row[key], range) }\n if (isFilterObject(value)) {\n return {\n error: 'invalid_filter',\n message:\n `Filter \"${name}\" is an object with no recognised bound. For a range use {\"from\":…,\"to\":…} ` +\n '(also accepted: gte/lte/gt/lt). For a date or period, prefer the from/to parameters of this tool instead of filters.',\n }\n }\n return { key, test: (row) => String(row[key] ?? '') === String(value) }\n}\n\nexport async function executeAITool(\n name: string,\n args: Record<string, unknown>,\n context: AIToolExecutionContext,\n): Promise<AIToolExecutionResult> {\n const handler = handlers.get(name)\n const dataTarget = context.dataTools.get(name)\n\n if (!handler && !dataTarget) {\n return errorResult(\n 'not_executable',\n `The tool \"${name}\" is not available here. Do not retry it — tell the user what you cannot do, or use a different tool.`,\n )\n }\n\n try {\n const result = handler\n ? await handler(args, context)\n : await executeDataTool(dataTarget!, args)\n return { ok: true, content: JSON.stringify(result ?? { ok: true }) }\n } catch (error) {\n return errorResult('execution_failed', describeThrown(error))\n }\n}\n\n/**\n * What actually failed, in words the model can act on.\n *\n * PostgREST rejections are plain objects ({code, message, hint, details}), not\n * Errors — so `error instanceof Error ? … : 'Unknown error'` reported every\n * database failure as \"Unknown error\". The model cannot correct a call it is\n * told nothing about, and neither can whoever reads the transcript: an `ilike`\n * against an integer column (42883) looked exactly like a network drop.\n */\nfunction describeThrown(error: unknown): string {\n if (error instanceof Error) return error.message\n if (error && typeof error === 'object') {\n const e = error as { message?: unknown; hint?: unknown; code?: unknown }\n const parts = [\n typeof e.message === 'string' ? e.message : null,\n typeof e.hint === 'string' ? e.hint : null,\n typeof e.code === 'string' ? `(${e.code})` : null,\n ].filter(Boolean)\n if (parts.length) return parts.join(' ')\n }\n return typeof error === 'string' && error ? error : 'Unknown error'\n}\n\n/**\n * Index everything readable by the tool name its generator mints, so the\n * executor can find the entity behind a call. Covers plugin registries and the\n * app's own CRUD entities.\n */\nexport function buildDataToolIndex(input: {\n registries: Map<string, PluginRegistryDef[]>\n entities: Array<{ entityKey: string; labelPlural: string; entityDef?: EntityDef; mockData?: Array<{ id: string }> }>\n registryToolName: (pluginId: string, registryId: string) => string\n entityToolName: (entityKey: string) => string\n queryEntities?: Array<{ key: string; entity: EntityDef; writable?: boolean }>\n}): Map<string, DataToolTarget> {\n const index = new Map<string, DataToolTarget>()\n\n for (const [pluginId, defs] of input.registries) {\n for (const registry of defs) {\n if (registry.readOnly) continue\n const target = {\n label: registry.entity.namePlural ?? registry.entity.name,\n entity: registry.entity as EntityDef,\n mockData: registry.mockData as Array<{ id: string }> | undefined,\n }\n index.set(input.registryToolName(pluginId, registry.id), target)\n // Key-indexed twin: the data primitives (searchRecords/queryData) receive\n // the TARGET as an argument instead of minting one tool per entity.\n index.set(`key:${pluginId}:${registry.id}`, target)\n }\n }\n\n for (const entity of input.entities) {\n if (!entity.entityDef || entity.entityDef.agentHidden) continue\n const target = {\n label: entity.labelPlural,\n entity: entity.entityDef,\n mockData: entity.mockData,\n }\n index.set(input.entityToolName(entity.entityKey), target)\n index.set(`key:${entity.entityKey}`, target)\n }\n\n // CORE_QUERY_ENTITIES merged here — same reason buildDataPrimitiveTools does\n // it: this index and that catalog MUST agree, or the model is offered an\n // entity the executor then rejects as unknown.\n for (const q of [...(input.queryEntities ?? []), ...CORE_QUERY_ENTITIES]) {\n index.set(`key:${q.key}`, {\n label: q.entity.namePlural ?? q.entity.name,\n entity: q.entity,\n readOnly: !q.writable,\n })\n }\n\n return index\n}\n\n// ---------------------------------------------------------------------------\n// Generic data primitives — ONE search + ONE aggregate over ANY entity. The\n// target's own read permission (EntityDef.permission) is checked per call, so\n// consolidating the catalog never widens access: the same role×plan engine\n// that gated the per-entity tools gates the parameterized target.\n// ---------------------------------------------------------------------------\n\nfunction resolveKeyedTarget(\n ctx: AIToolExecutionContext,\n args: Record<string, unknown>,\n): { target: DataToolTarget } | { error: unknown } {\n const key = typeof args.entity === 'string' ? args.entity : ''\n const target = ctx.dataTools.get(`key:${key}`)\n if (!target) {\n return {\n error: {\n error: 'unknown_entity',\n message: `No entity \"${key}\" is available. Use one of the keys listed in the tool description.`,\n },\n }\n }\n const permission = target.entity.permission\n if (permission) {\n const access = checkAccess(permission.feature, permission.action)\n if (!access.allowed) return { error: access }\n }\n return { target }\n}\n\n/** Field names are equal ignoring case and word separators, so a model sending\n * `postalCode` matches a `postal_code` column and vice versa. */\nfunction sameField(a: string, b: string): boolean {\n const norm = (s: string) => s.replace(/[_-]/g, '').toLowerCase()\n return norm(a) === norm(b)\n}\n\n/**\n * Match a call's `values` against the target entity's declared fields,\n * tolerating a snake_case/camelCase mismatch either way.\n *\n * Deliberately does NOT try to guess which other entity the caller \"meant\".\n * Scoring candidates by how many of the rejected field names they declare was\n * tried and is actively harmful here: for {address, city, postalCode, state,\n * country} the salon app's `location` and `local-de-atendimento` both score 5\n * against `address`'s 4, so \"add an address to this contact\" would be redirected\n * into creating a business LOCATION. Field names alone cannot tell a child\n * record from an unrelated table that happens to describe a place; the guidance\n * that does work is declared up front, in the tool description.\n */\nfunction matchDeclaredFields(\n target: DataToolTarget,\n values: Record<string, unknown>,\n): { clean: Record<string, unknown> } | { error: Record<string, unknown> } {\n const declaredKeys = (target.entity.fields ?? []).map((f) => f.key)\n const clean: Record<string, unknown> = {}\n const unknown: string[] = []\n for (const [k, v] of Object.entries(values)) {\n const match = declaredKeys.find((d) => sameField(d, k)) ?? null\n if (match) clean[match] = v\n else unknown.push(k)\n }\n if (!unknown.length) return { clean }\n\n return {\n error: {\n error: 'unknown_field',\n message: `Unknown field(s) ${unknown.join(', ')} for ${target.label}. Use only the available fields and retry.`,\n availableFields: declaredKeys,\n },\n }\n}\n\n/**\n * For every PERSON matched by a global search, pull the records that hang off\n * it (today: addresses) and return them grouped by entity key. Returns null\n * when nothing is attached, so the payload stays quiet in the common case.\n */\nasync function resolveAttachedRecords(\n ctx: AIToolExecutionContext,\n matches: Array<{ key: string; records: unknown[] }>,\n): Promise<Record<string, unknown[]> | null> {\n const ownerIds = new Set<string>()\n for (const m of matches) {\n const target = ctx.dataTools.get(`key:${m.key}`)\n if (target?.entity.data?.archetype !== 'person') continue\n for (const r of m.records) {\n const id = (r as { id?: unknown }).id\n if (typeof id === 'string') ownerIds.add(id)\n }\n }\n if (!ownerIds.size) return null\n\n const out: Record<string, unknown[]> = {}\n for (const q of CORE_QUERY_ENTITIES) {\n const target = ctx.dataTools.get(`key:${q.key}`)\n if (!target) continue\n const permission = target.entity.permission\n if (permission && !checkAccess(permission.feature, permission.action).allowed) continue\n try {\n const provider = resolveDataProvider(target.entity as EntityDef<{ id: string }>, target.mockData)\n const result = await provider.list({ pageSize: 50 })\n const rows = (result.data as Array<Record<string, unknown>>).filter((row) => {\n const owner = row.ownerId ?? row.owner_id\n return typeof owner === 'string' && ownerIds.has(owner)\n })\n if (rows.length) out[q.key] = rows\n } catch {\n // An attachment lookup must never sink the search it decorates.\n }\n }\n return Object.keys(out).length ? out : null\n}\n\nregisterAIToolHandler('findAnything', async (args, ctx) => {\n const search = typeof args.search === 'string' ? args.search.trim() : ''\n if (!search) return { error: 'missing_search', message: 'Provide the name or text to look up.' }\n\n // Deduped key-indexed targets, permission-filtered PER TARGET (the palette\n // semantics: what you cannot see is not searched), person-archetypes first —\n // \"quem é X?\" is a person question far more often than not.\n const seen = new Set<DataToolTarget>()\n const candidates: Array<{ key: string; target: DataToolTarget }> = []\n for (const [key, target] of ctx.dataTools) {\n if (!key.startsWith('key:') || seen.has(target)) continue\n seen.add(target)\n candidates.push({ key: key.slice(4), target })\n }\n let skippedForPermission = 0\n const allowed = candidates.filter(({ target }) => {\n const permission = target.entity.permission\n if (!permission) return true\n if (checkAccess(permission.feature, permission.action).allowed) return true\n skippedForPermission += 1\n return false\n })\n allowed.sort((a, b) => {\n const ap = a.target.entity.data?.archetype === 'person' ? 0 : 1\n const bp = b.target.entity.data?.archetype === 'person' ? 0 : 1\n return ap - bp || a.key.localeCompare(b.key)\n })\n\n const MAX_TARGETS = 20\n const searched = allowed.slice(0, MAX_TARGETS)\n const settled = await Promise.allSettled(\n searched.map(async ({ key, target }) => {\n const provider = resolveDataProvider(\n target.entity as EntityDef<{ id: string }>,\n target.mockData,\n )\n const result = await provider.list({ search, pageSize: 5 })\n return {\n key,\n label: target.label,\n total: result.total,\n records: attachRefs(target.entity, result.data as Array<Record<string, unknown>>),\n }\n }),\n )\n const matches = settled\n .filter((r) => r.status === 'fulfilled' && r.value.records.length > 0)\n .map((r) => (r as PromiseFulfilledResult<{ key: string; label: string; total: number; records: unknown[] }>).value)\n\n // Attached records travel WITH their owner. A person's address lives in its\n // own table keyed by owner_id, so a text search for \"Doguez\" can never return\n // it — and telling the model to make a second, filtered call is a hope, not a\n // mechanism: it answers \"this contact has no address registered\" instead,\n // which is false. Resolving them here makes the answer correct by\n // construction. One extra query, only when a person actually matched.\n const attached = await resolveAttachedRecords(ctx, matches)\n\n return {\n query: search,\n matches,\n ...(attached ? { attached } : {}),\n searchedEntities: searched.length,\n ...(allowed.length > MAX_TARGETS ? { targetsTruncated: true } : {}),\n ...(skippedForPermission ? { skippedForPermission } : {}),\n ...(matches.length === 0\n ? { hint: 'No records matched anywhere the user can see. Say so — do not retry other search tools with the same text.' }\n : {}),\n }\n})\n\nregisterAIToolHandler('createRecord', async (args, ctx) => {\n const resolved = resolveKeyedTarget(ctx, args)\n if ('error' in resolved) return resolved.error\n const { target } = resolved\n if (target.readOnly) return readOnlyRefusal(ctx, target, 'created')\n\n // Guard chain, in the broker's order: role×plan for CREATE → plan cap →\n // field validation → human confirmation → write → invalidate the count.\n const permission = target.entity.permission\n if (permission) {\n const access = checkAccess(permission.feature, 'create')\n if (!access.allowed) return access\n }\n if (target.entity.limitKey) {\n const limit = await guardLimit(target.entity.limitKey)\n if (!limit.allowed) return limit\n }\n\n const values = (args.values ?? {}) as Record<string, unknown>\n const declared = target.entity.fields ?? []\n const matched = matchDeclaredFields(target, values)\n if ('error' in matched) return matched.error\n const { clean } = matched\n const isEmpty = (v: unknown) => v === undefined || v === null || v === ''\n const missingRequired = declared.filter((f) => f.required && isEmpty(clean[f.key]))\n // A required field the CARD can't collect — a relation/computed the model must\n // resolve to an id first — still bounces back so the model can search for it.\n // But a plain required field the user can just TYPE (name, phone…) is not a\n // reason to interrogate them turn-by-turn: open the form and let them fill it\n // there, alongside everything else.\n const mustResolveFirst = missingRequired.filter(\n (f) => f.type === 'computed' || f.type === 'relation' || !!f.relation || f.showInForm === false,\n )\n if (mustResolveFirst.length) {\n return {\n error: 'missing_required',\n message: `Missing required field(s) that must be resolved to a record first: ${mustResolveFirst\n .map((f) => f.key)\n .join(', ')}. Look them up (search for the referenced record), then retry.`,\n availableFields: declared.map((f) => f.key),\n }\n }\n\n // Duplicate guard: same-name record already existing comes back as a\n // structured warning FIRST — the model confirms intent with the user and\n // retries with allowDuplicate:true only if they really want a second one.\n const dupName = typeof clean.name === 'string' ? clean.name.trim() : ''\n if (dupName && args.allowDuplicate !== true) {\n const provider0 = resolveDataProvider(\n target.entity as EntityDef<{ id: string }>,\n target.mockData,\n )\n const existing = await provider0.list({ search: dupName, pageSize: 3 })\n const dupes = (existing.data as Array<Record<string, unknown>>).filter(\n (r) => String(r.name ?? '').trim().toLowerCase() === dupName.toLowerCase(),\n )\n if (dupes.length) {\n return {\n error: 'possible_duplicate',\n message: `A ${target.entity.name} named \"${dupName}\" already exists. If the user wants to CHANGE that existing record, use updateRecord with its id; only retry createRecord with allowDuplicate:true if they explicitly want a second one.`,\n matches: dupes,\n }\n }\n }\n\n const decision = await requestChatConfirmation({\n id: `create-${Date.now()}`,\n toolName: 'createRecord',\n title: `Criar ${target.entity.name}`,\n params: clean,\n plane: 'client',\n // Scoped grant: \"always create clients\", never \"always create anything\".\n scope: typeof args.entity === 'string' ? args.entity : undefined,\n scopeLabel: `Criar ${target.entity.name}`,\n fields: cardFields(target.entity as never),\n })\n const approved = decision.approved\n // The card is the last word: whatever the user corrected there is what gets\n // written, not what the model guessed.\n if (decision.values) {\n for (const key of Object.keys(clean)) delete clean[key]\n Object.assign(clean, decision.values)\n }\n if (!approved) return { ok: false, cancelled: true, reason: 'user_declined' }\n\n // The card blocks confirm while a required field is empty, so this is only a\n // backstop — never write a record the entity would reject.\n const stillMissing = declared.filter((f) => f.required && isEmpty(clean[f.key])).map((f) => f.key)\n if (stillMissing.length) {\n return {\n error: 'missing_required',\n message: `Still missing required field(s): ${stillMissing.join(', ')}. Ask the user for them, then retry.`,\n availableFields: declared.map((f) => f.key),\n }\n }\n\n const provider = resolveDataProvider(\n target.entity as EntityDef<{ id: string }>,\n target.mockData,\n )\n const record = await provider.create(clean as never)\n if (target.entity.limitKey) invalidateLimit(target.entity.limitKey)\n // The list behind the chat is showing this table right now — tell it.\n emitDataChanged({\n table: target.entity.data?.table,\n entityKey: typeof args.entity === 'string' ? args.entity : undefined,\n archetype: target.entity.data?.archetype,\n op: 'create',\n id: (record as { id?: string }).id,\n source: 'agent',\n })\n return {\n ok: true,\n record,\n ref: {\n id: (record as { id?: string }).id,\n label: String((record as Record<string, unknown>).name ?? target.entity.name),\n resource: target.entity.data?.table,\n archetype: target.entity.data?.archetype\n ? `${target.entity.data.archetype}${target.entity.data.archetypeKind ? ':' + target.entity.data.archetypeKind : ''}`\n : undefined,\n entityKey: deriveEntityKey(target.entity),\n },\n }\n})\n\nregisterAIToolHandler('updateRecord', async (args, ctx) => {\n const resolved = resolveKeyedTarget(ctx, args)\n if ('error' in resolved) return resolved.error\n const { target } = resolved\n if (target.readOnly) return readOnlyRefusal(ctx, target, 'updated')\n const id = typeof args.id === 'string' ? args.id : ''\n if (!id) return { error: 'missing_id', message: 'Provide the id of the record to update (from this conversation or a search).' }\n\n // Same guard chain as createRecord, with the EDIT action; updates never\n // consume plan caps.\n const permission = target.entity.permission\n if (permission) {\n const access = checkAccess(permission.feature, 'edit')\n if (!access.allowed) return access\n }\n\n const values = (args.values ?? {}) as Record<string, unknown>\n const matched = matchDeclaredFields(target, values)\n if ('error' in matched) return matched.error\n const { clean } = matched\n if (!Object.keys(clean).length) {\n return { error: 'empty_update', message: 'No valid fields to change were provided.' }\n }\n\n const decision = await requestChatConfirmation({\n id: `update-${Date.now()}`,\n toolName: 'updateRecord',\n title: `Atualizar ${target.entity.name}`,\n params: { id, ...clean },\n plane: 'client',\n scope: typeof args.entity === 'string' ? args.entity : undefined,\n scopeLabel: `Atualizar ${target.entity.name}`,\n fields: cardFields(target.entity as never),\n partial: true,\n })\n if (!decision.approved) return { ok: false, cancelled: true, reason: 'user_declined' }\n if (decision.values) {\n for (const key of Object.keys(clean)) delete clean[key]\n for (const [k, v] of Object.entries(decision.values)) if (k !== 'id') clean[k] = v\n }\n\n const provider = resolveDataProvider(\n target.entity as EntityDef<{ id: string }>,\n target.mockData,\n )\n const record = await provider.update(id, clean as never)\n emitDataChanged({\n table: target.entity.data?.table,\n entityKey: typeof args.entity === 'string' ? args.entity : undefined,\n archetype: target.entity.data?.archetype,\n op: 'update',\n id,\n source: 'agent',\n })\n return {\n ok: true,\n record,\n ref: {\n id,\n label: String((record as Record<string, unknown>).name ?? target.entity.name),\n resource: target.entity.data?.table,\n archetype: target.entity.data?.archetype\n ? `${target.entity.data.archetype}${target.entity.data.archetypeKind ? ':' + target.entity.data.archetypeKind : ''}`\n : undefined,\n entityKey: deriveEntityKey(target.entity),\n },\n }\n})\n\nregisterAIToolHandler('searchRecords', async (args, ctx) => {\n const resolved = resolveKeyedTarget(ctx, args)\n if ('error' in resolved) return resolved.error\n const base = (await executeDataTool(resolved.target, args)) as {\n records: Array<Record<string, unknown>>\n [k: string]: unknown\n }\n if ('error' in base) return base\n const filters = (args.filters ?? {}) as Record<string, unknown>\n const keys = Object.keys(filters)\n if (!keys.length) return base\n let rows = base.records\n for (const k of keys) {\n const sample = rows[0] ?? base.records[0]\n if (!sample) break\n const f = resolveFilter(sample, resolved.target.label, k, filters[k])\n if ('error' in f) return f\n rows = rows.filter(f.test)\n }\n return {\n ...base,\n records: rows,\n filtered: keys,\n total: rows.length,\n // A filter that empties a non-empty page is ambiguous — \"no record matches\"\n // and \"the filter was wrong\" look identical to the model, and it picks the\n // first. Name the difference so it can retry instead of asserting absence.\n ...(rows.length === 0 && base.records.length > 0\n ? {\n warning:\n `${base.records.length} record(s) were read but the filters ${JSON.stringify(filters)} excluded all of them. ` +\n 'Check the filter values against the fields on those records before telling the user nothing exists.',\n }\n : {}),\n }\n})\n\n/**\n * Turn an attached file's columns into a mapping the user can correct.\n *\n * Written as a TOOL, not as prose, on purpose. Asked to write the mapping out\n * as text, gpt-4o-mini emitted three lines of eighteen (copied from the\n * example), then one, then stopped to \"continue with the next columns\". A\n * mapping is structured data: the schema constrains the model's output, and the\n * confirmation card — which already renders a field list with selects — turns\n * the result into a form instead of a paragraph.\n */\nregisterAIToolHandler('proposeImport', async (args, ctx) => {\n const resolved = resolveKeyedTarget(ctx, args)\n if ('error' in resolved) return resolved.error\n const { target } = resolved\n\n const fileName = typeof args.file === 'string' ? args.file : undefined\n const digest = resolveAttachmentDigest(fileName)\n if (!digest) {\n const names = listAttachmentNames()\n return {\n error: 'no_file',\n message: names.length\n ? `No readable file called \"${fileName ?? ''}\". Attached right now: ${names.join(', ')}.`\n : 'There is no readable file attached to this conversation. Ask the user to attach a CSV.',\n }\n }\n\n const headers = (digest.headers ?? []).filter((h) => h.trim())\n const fields = (target.entity.fields ?? []).filter(\n (f) => f.showInForm !== false && !SYSTEM_FIELD_KEYS.has(String(f.key)),\n )\n const fieldKeys = new Set(fields.map((f) => String(f.key)))\n\n // The model's proposal is a suggestion, not an instruction: a column it\n // invented or a field that does not exist would otherwise reach the card as\n // an option nobody can act on.\n const proposed = (args.mapping ?? {}) as Record<string, unknown>\n const accepted: Record<string, unknown> = {}\n const rejected: string[] = []\n for (const [column, field] of Object.entries(proposed)) {\n if (!headers.includes(column)) {\n rejected.push(`column \"${column}\" is not in the file`)\n continue\n }\n if (typeof field !== 'string' || !fieldKeys.has(field)) {\n rejected.push(`\"${column}\" → \"${String(field)}\" is not a field of ${target.label}`)\n continue\n }\n accepted[column] = field\n }\n\n const options = [\n ...fields.map((f) => ({ value: String(f.key), label: (f.label as string) ?? String(f.key) })),\n ]\n const decision = await requestChatConfirmation({\n id: `import-${digest.name}`,\n toolName: 'proposeImport',\n title: `${digest.name} → ${target.label}`,\n params: accepted,\n plane: 'client',\n scope: typeof args.entity === 'string' ? args.entity : undefined,\n scopeLabel: `Importar para ${target.label}`,\n // One row per column of the FILE, so a column the model skipped is visibly\n // unmapped instead of silently absent.\n fields: headers.map((header) => ({\n key: header,\n label: header,\n options,\n hint: digest.columnTypes?.find((c) => c.name === header)?.note,\n })),\n partial: true,\n })\n if (!decision.approved) return { ok: false, cancelled: true, reason: 'user_declined' }\n\n const mapping = (decision.values ?? accepted) as Record<string, string>\n const mapped = Object.keys(mapping).length\n return {\n ok: true,\n file: digest.name,\n entity: target.label,\n rows: digest.rowCount,\n mapping,\n unmapped: headers.filter((h) => !mapping[h]),\n ...(rejected.length ? { ignoredFromYourProposal: rejected } : {}),\n nextStep: 'commitImport',\n message:\n `The user confirmed the mapping: ${mapped} of ${headers.length} columns are mapped for ${digest.rowCount ?? '?'} rows. ` +\n 'NOW CALL commitImport with this exact mapping to write the rows — that is the next and final step, and the user is waiting for it. ' +\n 'Do not announce it, do not ask again, and do not repeat the mapping back line by line.',\n }\n})\n\n/**\n * Write the file's rows. The end of the import path, and the only step that\n * touches the database.\n *\n * Three things it does that a loop over createRecord would not:\n * the plan cap is consulted ONCE for the whole batch (asking 900 times is 900\n * round-trips and 900 chances to half-import); every row carries an\n * `importBatchId` so \"desfaz essa importação\" is one delete instead of a\n * support ticket; and failures come back with their row number rather than\n * aborting the other 898.\n */\nregisterAIToolHandler('commitImport', async (args, ctx) => {\n const resolved = resolveKeyedTarget(ctx, args)\n if ('error' in resolved) return resolved.error\n const { target } = resolved\n\n const digest = resolveAttachmentDigest(typeof args.file === 'string' ? args.file : undefined)\n if (!digest) {\n return {\n error: 'no_file',\n message: 'The file is no longer in this conversation. Ask the user to attach it again.',\n }\n }\n\n const mapping = (args.mapping ?? {}) as Record<string, string>\n const columns = Object.keys(mapping).filter((c) => typeof mapping[c] === 'string' && mapping[c])\n if (!columns.length) {\n return {\n error: 'empty_mapping',\n message: 'No column is mapped. Run proposeImport first and pass the mapping it returns.',\n }\n }\n\n const permission = target.entity.permission\n if (permission) {\n const access = checkAccess(permission.feature, 'create')\n if (!access.allowed) return access\n }\n\n let rows: Array<Record<string, string>>\n try {\n rows = await readAllRows(digest)\n } catch (error) {\n return { error: 'unreadable', message: error instanceof Error ? error.message : 'Could not read the file.' }\n }\n\n const records = rows\n .map((row) => {\n const record: Record<string, unknown> = {}\n for (const column of columns) {\n const value = row[column]\n if (value !== undefined && value !== '') record[mapping[column]] = value\n }\n return record\n })\n .filter((r) => Object.keys(r).length)\n\n if (!records.length) {\n return { error: 'no_rows', message: 'Every row is empty under this mapping. Check the column names.' }\n }\n\n // ONE cap check for the batch. Per-row would be N round-trips and would leave\n // a half-import behind when it trips in the middle.\n if (target.entity.limitKey) {\n const limit = await guardLimit(target.entity.limitKey, records.length)\n if (!limit.allowed) return limit\n }\n\n const decision = await requestChatConfirmation({\n id: `commit-${digest.name}`,\n toolName: 'commitImport',\n title: `Importar ${records.length} × ${target.entity.name}`,\n params: {\n arquivo: digest.name,\n registros: records.length,\n campos: columns.map((c) => `${c} → ${mapping[c]}`).join(', '),\n },\n plane: 'client',\n scope: typeof args.entity === 'string' ? args.entity : undefined,\n scopeLabel: `Importar ${target.label}`,\n })\n if (!decision.approved) return { ok: false, cancelled: true, reason: 'user_declined' }\n\n // Stamped only where there is a column to hold it — an entity without one\n // would reject every row over an unknown column, which is a far worse\n // outcome than not being able to undo.\n const batchId = `imp-${Date.now().toString(36)}`\n const canStamp = (target.entity.fields ?? []).some((f) => String(f.key) === 'importBatchId')\n const provider = resolveDataProvider(target.entity as EntityDef<{ id: string }>, target.mockData, FRESH)\n const result = await bulkCreate(\n provider,\n (canStamp ? records.map((r) => ({ ...r, importBatchId: batchId })) : records) as never,\n { chunkSize: 200 },\n )\n\n emitDataChanged({\n table: target.entity.data?.table,\n entityKey: typeof args.entity === 'string' ? args.entity : undefined,\n archetype: target.entity.data?.archetype,\n op: 'create',\n source: 'agent',\n })\n if (target.entity.limitKey) invalidateLimit(target.entity.limitKey)\n\n return {\n ok: result.created > 0,\n ...(canStamp ? { batchId } : {}),\n created: result.created,\n failed: result.failed.length,\n // Row numbers, not row contents — the model never needs the data, and a\n // failure list of 200 rows would swamp the turn.\n firstErrors: result.failed.slice(0, 5).map((f) => ({ row: f.index + 2, reason: f.message })),\n message:\n `${result.created} of ${records.length} rows were created` +\n (result.failed.length\n ? `. ${result.failed.length} failed — tell the user which rows and why, and offer to fix and retry those.`\n : '. Tell the user it is done.'),\n }\n})\n\nregisterAIToolHandler('queryData', async (args, ctx) => {\n const resolved = resolveKeyedTarget(ctx, args)\n if ('error' in resolved) return resolved.error\n const { target } = resolved\n\n const metric = args.metric === 'sum' || args.metric === 'avg' ? args.metric : 'count'\n let field = typeof args.field === 'string' ? args.field : undefined\n if (metric !== 'count' && !field) {\n return { error: 'missing_field', message: `metric \"${metric}\" needs a \"field\" to aggregate.` }\n }\n\n const provider = resolveDataProvider(\n target.entity as EntityDef<{ id: string }>,\n target.mockData,\n FRESH,\n )\n // The date range is pushed to the provider so the 1000-row window applies to\n // the PERIOD asked about, not to the table as a whole — a sum over \"this\n // week\" must not be capped by rows outside it. `sampled` still reports a\n // window that truncated. The S4 server-plane executor replaces this with SQL.\n const dateRange = dateRangeFilter(args)\n const page = await provider.list({\n pageSize: 1000,\n ...(dateRange ? { filters: { [dateRange.field]: dateRange.range } } : {}),\n })\n let rows = page.data as Array<Record<string, unknown>>\n\n // Field references FAIL LOUD: a typo'd/unknown field must never silently\n // filter everything to zero (\"Não há agendamentos\" over a wrong key). The\n // error carries the row's real keys so the model self-corrects next round.\n const sampleRow = rows[0]\n const availableFields = sampleRow ? Object.keys(sampleRow) : []\n const requireField = (name: string): string | { error: string; message: string; availableFields: string[] } => {\n if (!sampleRow) return name\n const resolved = resolveFieldKey(sampleRow, name)\n if (resolved) return resolved\n return {\n error: 'unknown_field',\n message: `Field \\\"${name}\\\" does not exist on ${target.label}. Use one of the available fields and retry.`,\n availableFields,\n }\n }\n\n // Re-applied here too: a provider that ignored `filters` would otherwise\n // aggregate the whole table under a period label.\n if (dateRange) {\n const resolved = requireField(dateRange.field)\n if (typeof resolved !== 'string') return resolved\n rows = rows.filter((r) => matchesRange(r[resolved], dateRange.range))\n }\n\n const filters = (args.filters ?? {}) as Record<string, unknown>\n for (const [k, v] of Object.entries(filters)) {\n if (!sampleRow) break\n const f = resolveFilter(sampleRow, target.label, k, v)\n if ('error' in f) return f\n rows = rows.filter(f.test)\n }\n\n const aggregate = (subset: Array<Record<string, unknown>>) => {\n if (metric === 'count') return subset.length\n const values = subset\n .map((r) => Number(r[field!]))\n .filter((n) => !Number.isNaN(n))\n const sum = values.reduce((a, b) => a + b, 0)\n if (metric === 'sum') return Math.round(sum * 100) / 100\n return values.length ? Math.round((sum / values.length) * 100) / 100 : 0\n }\n\n if (field && rows[0]) {\n const resolved = resolveFieldKey(rows[0], field)\n if (!resolved) {\n return {\n error: 'unknown_field',\n message: `Field \"${field}\" does not exist on ${target.label}. Use one of the available fields and retry.`,\n availableFields,\n }\n }\n field = resolved\n }\n let groupBy = typeof args.groupBy === 'string' ? args.groupBy : undefined\n if (groupBy && rows[0]) {\n const resolved = resolveFieldKey(rows[0], groupBy)\n if (!resolved) {\n return {\n error: 'unknown_field',\n message: `Field \"${groupBy}\" does not exist on ${target.label}. Use one of the available fields and retry.`,\n availableFields,\n }\n }\n groupBy = resolved\n }\n const sampled = page.total > page.data.length\n if (groupBy) {\n const groups = new Map<string, Array<Record<string, unknown>>>()\n for (const r of rows) {\n const g = String(r[groupBy] ?? '—')\n if (!groups.has(g)) groups.set(g, [])\n groups.get(g)!.push(r)\n }\n // A group key like professionalId is opaque to the user — attach the\n // sibling display field (professionalName) when the rows carry one.\n const labelKey = groupBy.endsWith('Id')\n ? resolveFieldKey(rows[0] ?? {}, groupBy.slice(0, -2) + 'Name')\n : null\n return {\n entity: target.label,\n metric,\n ...(field ? { field } : {}),\n groupBy,\n groups: Array.from(groups.entries())\n .map(([group, subset]) => ({\n group,\n ...(labelKey && subset[0] ? { label: subset[0][labelKey] } : {}),\n value: aggregate(subset),\n rows: subset.length,\n }))\n .sort((a, b) => Number(b.value) - Number(a.value)),\n matchedRows: rows.length,\n sampled,\n }\n }\n return {\n entity: target.label,\n metric,\n ...(field ? { field } : {}),\n value: aggregate(rows),\n matchedRows: rows.length,\n sampled,\n }\n})\n\nexport interface AgentTool {\n name: string\n description: string\n parameters?: Record<string, unknown>\n}\n\nexport interface BuildToolsetOptions {\n dataTools: Map<string, DataToolTarget>\n /** Plugin owning the current route; its tools rank ahead of the rest. */\n activePluginId?: string | null\n maxTools?: number\n}\n\n/**\n * Shape the declared catalog into the toolset sent to the agent.\n *\n * Two filters, both load-bearing:\n *\n * 1. *Executable only.* An advertised tool with no executor is worse than a\n * missing one — the model spends rounds on it and then apologises.\n * 2. *Contextual.* A mature app declares ~40 tools; sending all of them every\n * turn costs input tokens on every request and degrades which tool the model\n * picks. Tools owned by the plugin the user is currently looking at come\n * first, then the rest, capped.\n */\nexport function buildAgentToolset(\n tools: PluginAITool[],\n { dataTools, activePluginId, maxTools = MAX_TOOLS_PER_TURN }: BuildToolsetOptions,\n): AgentTool[] {\n const executable = tools.filter(\n (t) =>\n handlers.has(t.name) ||\n dataTools.has(t.name) ||\n (t.execution?.plane === 'server' && t.execution.kind === 'rpc'),\n )\n\n const ranked = activePluginId\n ? [\n ...executable.filter((t) => t.id.startsWith(`${activePluginId}.`)),\n ...executable.filter((t) => !t.id.startsWith(`${activePluginId}.`)),\n ]\n : executable\n\n return ranked.slice(0, maxTools).map((tool) => ({\n name: tool.name,\n description: tool.description,\n parameters: tool.parameters as Record<string, unknown> | undefined,\n }))\n}\n\n// ---------------------------------------------------------------------------\n// Core handlers — the executable counterpart of `coreAITools`.\n// ---------------------------------------------------------------------------\n\n/**\n * The team, as the Team screen defines it.\n *\n * Person-first apps (`team.personKinds` configured) staff their workspace with\n * PEOPLE — a teacher or stylist is on the team whether or not they ever log in;\n * `tenant_members` is just the access overlay on top. Reading memberships alone\n * answered \"who is on my team?\" with the single owner row while the Team screen\n * listed six, so the tool now resolves the same source the screen renders and\n * only falls back to memberships in legacy mode.\n */\nasync function resolveTeamRows(ctx: AIToolExecutionContext): Promise<\n Array<{ name: string | null; kind?: string; email: string | null; accessRole: string | null; hasLogin: boolean }>\n> {\n if (ctx.loadTeam) {\n const team = await ctx.loadTeam()\n return team.map((p) => ({\n name: p.name ?? null,\n kind: p.kind,\n email: p.email ?? null,\n accessRole: p.membership?.profileName ?? null,\n hasLogin: !!p.membership,\n }))\n }\n // Legacy: every team member IS a membership row. `profileName` is the RBAC\n // role, never the person's name — reporting it as `name` is what made the\n // assistant answer \"one person, with the role of Owner\".\n return ctx.members.map((m) => ({\n name: m.user?.fullName ?? null,\n email: m.user?.email ?? null,\n accessRole: m.profileName ?? null,\n hasLogin: true,\n }))\n}\n\nregisterAIToolHandler('getBusinessSummary', async (_args, ctx) => {\n if (!ctx.currentOrg) return { error: 'no_active_business' }\n const org = ctx.currentOrg as Organization & { plan?: string; verticalId?: string }\n return {\n name: org.name,\n slug: org.slug,\n plan: org.plan ?? null,\n vertical: org.verticalId ?? null,\n teamSize: (await resolveTeamRows(ctx)).length,\n createdAt: org.createdAt ?? null,\n }\n})\n\nregisterAIToolHandler('getTeamMembers', async (args, ctx) => {\n const filter = typeof args.role === 'string' ? args.role.trim().toLowerCase() : undefined\n const rows = await resolveTeamRows(ctx)\n // One filter, two vocabularies: users say \"os professores\" (the person kind)\n // and \"os admins\" (the access role) with the same word shape.\n const members = filter\n ? rows.filter(\n (r) =>\n String(r.kind ?? '').toLowerCase() === filter ||\n String(r.accessRole ?? '').toLowerCase() === filter,\n )\n : rows\n return { total: members.length, members }\n})\n\nregisterAIToolHandler('navigateTo', (args, ctx) => {\n const query = typeof args.page === 'string' ? args.page.trim().toLowerCase() : ''\n if (!query) return { error: 'missing_page' }\n\n // Substring matching sent \"vai pra pagina dela\" to the Painel and then\n // REPORTED SUCCESS. A wrong page announced as done is worse than no page, so\n // a loose match now fails and hands back the list to choose from.\n const match =\n ctx.routes.find((r) => r.path.toLowerCase() === query || r.path.toLowerCase() === `/${query}`) ??\n ctx.routes.find((r) => (r.label ?? '').toLowerCase() === query) ??\n ctx.routes.find((r) => {\n const label = (r.label ?? '').toLowerCase()\n return !!label && (label.startsWith(query) || query.startsWith(label))\n })\n\n if (!match) {\n return {\n error: 'page_not_found',\n message: 'No page matches that. If the user meant a specific record, look it up and call openRecord with its id.',\n availablePages: ctx.routes.map((r) => r.label ?? r.path),\n }\n }\n\n ctx.navigate(match.path)\n return { navigatedTo: match.path, label: match.label ?? match.path }\n})\n\nregisterAIToolHandler('openRecord', async (args, ctx) => {\n const id = typeof args.id === 'string' ? args.id.trim() : ''\n if (!id) return { error: 'missing_id', message: 'Provide the record id returned by an earlier tool.' }\n\n // The record is ALREADY on screen — the model read its id off the route it\n // was given. Navigating there is a no-op, and calling it an error made the\n // model spend a round recovering from something that had already succeeded.\n if (ctx.currentPath.includes(id)) {\n return {\n alreadyOpen: true,\n message:\n 'This record is already the page the user is looking at — nothing to navigate. To talk about it, read it with searchRecords filtered by this id.',\n }\n }\n\n const ref = lookupRecordRef(id)\n if (!ref) {\n return {\n error: 'unknown_record',\n message: 'That id was not seen in this conversation. Search for the record first, then call openRecord with the id from the result.',\n }\n }\n if (!resolveEntityRoute(ref.archetype, ref.kind, ref.entityKey)) {\n return { error: 'no_page_for_record', message: `This app has no page for ${ref.label}.` }\n }\n openEntity(id, ref.archetype, ref.kind, undefined, ref.entityKey)\n return { opened: ref.label, ref: { id, label: ref.label, archetype: ref.archetype } }\n})\n\n\n/**\n * Access profiles: the agent picks the grants, the human approves the shape.\n *\n * Every other write here targets ONE record; this one decides what a whole\n * group of people can reach from now on, so the guards are tighter — the model\n * cannot grant an area the app never declared, cannot invent an action, and the\n * card never offers \"always allow\": a standing grant on THIS tool would let a\n * later turn mint access unattended.\n */\n/**\n * The grant map the model proposed, reduced to what this app can actually\n * express. Anything invented is dropped and REPORTED, never silently ignored: a\n * profile that quietly grants less than the reply promised is a security\n * statement that turned out to be false.\n */\nfunction validateGrants(\n features: Array<{ id: string }>,\n raw: unknown,\n): { grants: Record<string, PermissionAction[]>; rejected: string[] } {\n const known = new Set(features.map((f) => f.id))\n const grants: Record<string, PermissionAction[]> = {}\n const rejected: string[] = []\n const isAction = (a: string): a is PermissionAction => (PROFILE_ACTIONS as readonly string[]).includes(a)\n\n for (const [featureId, value] of Object.entries((raw ?? {}) as Record<string, unknown>)) {\n if (!known.has(featureId)) {\n rejected.push(`${featureId}: not an area of this app`)\n continue\n }\n const asked = (Array.isArray(value) ? value : [value]).map((a) => String(a).trim().toLowerCase())\n const unknown = asked.filter((a) => !isAction(a))\n if (unknown.length) rejected.push(`${featureId}: unknown action(s) ${unknown.join(', ')}`)\n const actions = asked.filter(isAction)\n if (actions.length) grants[featureId] = actions\n }\n return { grants, rejected }\n}\n\nregisterAIToolHandler('createPermissionProfile', async (args, ctx) => {\n const profile = usePermissionsStore.getState().currentProfile\n if (!profileHasSystemPermission(profile, 'manage_permissions')) {\n return {\n error: 'forbidden',\n message: 'This user cannot manage permissions. Say so — do not try another tool.',\n }\n }\n if (!ctx.orgAdapter?.createProfile || !ctx.currentOrg) {\n return {\n error: 'not_executable',\n message: 'This app has no permission-profile store wired. Tell the user to create the profile in Settings → Permissions.',\n }\n }\n\n const name = typeof args.name === 'string' ? args.name.trim() : ''\n if (!name) return { error: 'missing_name', message: 'Give the profile a name.' }\n\n const features = usePermissionsStore.getState().features\n const byId = new Map(features.map((f) => [f.id, f]))\n const { grants, rejected } = validateGrants(features, args.grants)\n\n if (!Object.keys(grants).length) {\n return {\n error: 'empty_grants',\n message: `No valid area was granted. Use the ids from the tool's area list and the actions ${PROFILE_ACTIONS.join('/')}.`,\n ...(rejected.length ? { rejected } : {}),\n availableAreas: features.map((f) => f.id),\n }\n }\n\n const existing = usePermissionsStore.getState().profiles\n const clash = existing.find((p) => p.name.trim().toLowerCase() === name.toLowerCase())\n if (clash) {\n return {\n error: 'name_taken',\n message: `A profile named \"${clash.name}\" already exists. Ask the user for a different name, or whether they meant to change that one (which happens in Settings → Permissions).`,\n }\n }\n\n // The summary the user actually reads. Labels, never ids — \"Leads\" is what\n // the permission screen calls it; \"crm.leads\" is what the database does.\n const summary = describeGrants(grants, byId)\n\n const decision = await requestChatConfirmation({\n id: `permission-profile-${Date.now()}`,\n toolName: 'createPermissionProfile',\n title: `Criar perfil de acesso: ${name}`,\n params: {\n nome: name,\n ...(typeof args.description === 'string' && args.description.trim()\n ? { descrição: args.description.trim() }\n : {}),\n acessos: summary,\n },\n plane: 'client',\n noAutoApproval: true,\n })\n if (!decision.approved) return { ok: false, cancelled: true, reason: 'user_declined' }\n\n const finalName = typeof decision.values?.nome === 'string' && decision.values.nome.trim()\n ? decision.values.nome.trim()\n : name\n const finalDescription = typeof decision.values?.['descrição'] === 'string'\n ? (decision.values['descrição'] as string).trim() || undefined\n : typeof args.description === 'string' && args.description.trim()\n ? args.description.trim()\n : undefined\n\n let created: { id: string; name: string }\n try {\n created = await ctx.orgAdapter.createProfile(ctx.currentOrg.id, {\n name: finalName,\n description: finalDescription,\n grants,\n })\n } catch (error) {\n return {\n error: 'create_failed',\n message: `The profile could not be saved: ${describeThrown(error)}. Report this to the user — do not retry.`,\n }\n }\n\n // The permissions screen reads from the store, and the user is about to open\n // it from the link in this very reply.\n if (ctx.orgAdapter.listProfiles) {\n try {\n usePermissionsStore.getState().setProfiles(await ctx.orgAdapter.listProfiles(ctx.currentOrg.id))\n } catch {\n // A stale list is a refresh away; the profile itself is already written.\n }\n }\n\n return {\n ok: true,\n profile: { id: created.id, name: created.name },\n grants: summary,\n ...(rejected.length ? { rejectedFromYourProposal: rejected } : {}),\n message:\n 'Profile created. Summarise for the user WHAT IT CAN REACH using the labels in `grants`, then say the profile is assigned to people on the Team screen. The link to review it is already in the reply.',\n ref: { id: created.id, label: created.name, path: PERMISSIONS_PATH },\n }\n})\n\n/**\n * Changing an existing profile.\n *\n * Grants MERGE by area rather than replacing the whole map: asked to \"dá edição\n * em cursos\", the model sends the one area it is changing, and a replace would\n * have stripped every other area the profile had — access silently lost by a\n * request that only meant to add. Losing an area takes naming it in `revoke`,\n * and the card shows every difference either way.\n */\nregisterAIToolHandler('updatePermissionProfile', async (args, ctx) => {\n const actor = usePermissionsStore.getState().currentProfile\n if (!profileHasSystemPermission(actor, 'manage_permissions')) {\n return {\n error: 'forbidden',\n message: 'This user cannot manage permissions. Say so — do not try another tool.',\n }\n }\n if (!ctx.orgAdapter?.updateProfile || !ctx.currentOrg) {\n return {\n error: 'not_executable',\n message: 'This app cannot change profiles from here. Tell the user to edit it in Settings → Permissions.',\n }\n }\n\n const id = typeof args.id === 'string' ? args.id.trim() : ''\n const { features, profiles } = usePermissionsStore.getState()\n const target = profiles.find((p) => p.id === id)\n if (!target) {\n return {\n error: 'unknown_profile',\n message: `No profile with id \"${id}\". Existing: ${profiles.map((p) => `${p.id} (${p.name})`).join(', ')}.`,\n }\n }\n if (target.isSystem) {\n return {\n error: 'system_profile',\n message: `\"${target.name}\" is a built-in role and cannot be changed. Offer to create a new profile based on it instead (createPermissionProfile).`,\n }\n }\n\n const byId = new Map(features.map((f) => [f.id, f]))\n const { grants: setAreas, rejected } = validateGrants(features, args.grants)\n const revoke = (Array.isArray(args.revoke) ? args.revoke : [])\n .map((a) => String(a).trim())\n .filter(Boolean)\n\n const before = target.grants ?? {}\n const next: Record<string, PermissionAction[]> = { ...before, ...setAreas }\n for (const area of revoke) {\n if (!(area in next)) rejected.push(`${area}: was not granted, nothing to revoke`)\n delete next[area]\n }\n\n const rename = typeof args.name === 'string' && args.name.trim() && args.name.trim() !== target.name\n ? args.name.trim()\n : undefined\n const redescribe = typeof args.description === 'string' && args.description.trim() !== (target.description ?? '')\n ? args.description.trim()\n : undefined\n\n const same = (a?: PermissionAction[], b?: PermissionAction[]) =>\n !!a && !!b && a.length === b.length && a.every((x) => b.includes(x))\n const untouched = Object.keys(next).length === Object.keys(before).length &&\n Object.keys(next).every((k) => same(next[k], before[k]))\n if (untouched && !rename && redescribe === undefined) {\n return {\n error: 'no_change',\n message: 'That would leave the profile exactly as it is. Tell the user what it already has instead of writing it again.',\n current: describeGrants(before, byId),\n ...(rejected.length ? { rejectedFromYourProposal: rejected } : {}),\n }\n }\n\n // Every difference on one card: what it gains, what changes, what it loses.\n const rows: Array<{ label: string; type: string }> = []\n for (const area of Object.keys(next)) {\n const label = byId.get(area)?.label ?? area\n const now = (next[area] ?? []).map((a) => ACTION_LABELS[a] ?? a).join(', ')\n if (!(area in before)) rows.push({ label, type: `${now} (novo)` })\n else if (!same(next[area], before[area])) {\n const was = (before[area] ?? []).map((a) => ACTION_LABELS[a] ?? a).join(', ')\n rows.push({ label, type: `${now} (antes: ${was})` })\n } else rows.push({ label, type: now })\n }\n for (const area of Object.keys(before)) {\n if (!(area in next)) rows.push({ label: byId.get(area)?.label ?? area, type: 'REMOVIDO' })\n }\n\n const decision = await requestChatConfirmation({\n id: `permission-profile-update-${Date.now()}`,\n toolName: 'updatePermissionProfile',\n title: `Alterar perfil de acesso: ${rename ?? target.name}`,\n params: {\n perfil: target.name,\n ...(rename ? { 'novo nome': rename } : {}),\n ...(redescribe !== undefined ? { descrição: redescribe } : {}),\n acessos: rows,\n },\n plane: 'client',\n noAutoApproval: true,\n })\n if (!decision.approved) return { ok: false, cancelled: true, reason: 'user_declined' }\n\n const finalName = typeof decision.values?.['novo nome'] === 'string' && decision.values['novo nome']\n ? (decision.values['novo nome'] as string).trim()\n : rename\n\n try {\n await ctx.orgAdapter.updateProfile(ctx.currentOrg.id, target.id, {\n ...(finalName ? { name: finalName } : {}),\n ...(redescribe !== undefined ? { description: redescribe || undefined } : {}),\n grants: next,\n })\n } catch (error) {\n return {\n error: 'update_failed',\n message: `The profile could not be saved: ${describeThrown(error)}. Report this to the user — do not retry.`,\n }\n }\n\n if (ctx.orgAdapter.listProfiles) {\n try {\n usePermissionsStore.getState().setProfiles(await ctx.orgAdapter.listProfiles(ctx.currentOrg.id))\n } catch {\n // A stale list is a refresh away; the change itself is already written.\n }\n }\n\n return {\n ok: true,\n profile: { id: target.id, name: finalName ?? target.name },\n grants: describeGrants(next, byId),\n ...(rejected.length ? { rejectedFromYourProposal: rejected } : {}),\n message:\n 'Profile updated. Tell the user WHAT CHANGED and what the profile can reach now, using the labels in `grants` — not the ids. The link to review it is already in the reply.',\n ref: { id: target.id, label: finalName ?? target.name, path: PERMISSIONS_PATH },\n }\n})\n\n/** A grant map in the reader's language: labels and verbs, never ids. */\nfunction describeGrants(\n grants: Record<string, PermissionAction[]>,\n byId: Map<string, { label: string }>,\n): Array<{ label: string; type: string }> {\n return Object.entries(grants).map(([featureId, actions]) => ({\n label: byId.get(featureId)?.label ?? featureId,\n type: actions.map((a) => ACTION_LABELS[a] ?? a).join(', '),\n }))\n}\n\n/** Where the profile can be reviewed and fine-tuned (AdminShell settings tab). */\nconst PERMISSIONS_PATH = '/settings/permissions'\n\n/** The four grants, in the reader's language. */\nconst ACTION_LABELS: Record<string, string> = {\n read: 'ver',\n create: 'criar',\n edit: 'editar',\n delete: 'excluir',\n}\n\n/**\n * Client-plane execution of an RPC-bound tool (`execution: {kind:'rpc'}`):\n * calls the pool function as the signed-in user. The actor is the SESSION\n * user — spine 016 makes the RPC reject any other p_actor for JWT callers, so\n * this path cannot borrow someone else's role. Structured denials pass through\n * to the model (conversational paywall); S4 moves this server-side untouched.\n */\nexport async function executeRpcTool(\n rpcName: string,\n args: Record<string, unknown>,\n userId: string | undefined,\n): Promise<AIToolExecutionResult> {\n const supabase = getSupabaseClientOptional() as {\n rpc?: (fn: string, params: Record<string, unknown>) => Promise<{ data: unknown; error: { message: string } | null }>\n } | null\n const tenantId = getActiveTenantId()\n if (!supabase?.rpc || !tenantId || !userId) {\n return errorResult('not_executable', 'No authenticated session/tenant available for this action.')\n }\n const { data, error } = await supabase.rpc(rpcName, {\n p_tenant_id: tenantId,\n p_actor_user_id: userId,\n p_payload: args,\n })\n if (error) return errorResult('execution_failed', error.message)\n return { ok: true, content: JSON.stringify(data ?? { ok: true }) }\n}\n","import { createFayzAgentClient, type FayzAgentClient } from '@fayz-ai/sdk/agent'\n\n/**\n * Resolves the connection to the project's Fayz agent.\n *\n * The container writes `VITE_FAYZ_PROJECT_ID`, `VITE_FAYZ_API_BASE_URL` and\n * `VITE_FAYZ_AGENT_KEY` into every preview's `.env`, so enabling an agent in\n * Fayz is enough to light up the app's assistant — no app-side config edit and\n * no key to copy. `chat.agent` overrides are for self-hosted deployments where\n * the app is built outside a Fayz container.\n */\n\nexport interface FayzAgentConnectionConfig {\n projectId?: string\n apiBaseUrl?: string\n publishableKey?: string\n}\n\nexport interface ResolvedFayzAgentConnection {\n projectId: string\n apiBaseUrl: string\n publishableKey: string\n}\n\nfunction env(key: string): string | undefined {\n const value = (import.meta.env as Record<string, string | undefined>)[key]\n return typeof value === 'string' && value.trim() ? value.trim() : undefined\n}\n\nexport function resolveFayzAgentConnection(\n override?: FayzAgentConnectionConfig | false,\n): ResolvedFayzAgentConnection | null {\n if (override === false) return null\n\n const projectId = override?.projectId ?? env('VITE_FAYZ_PROJECT_ID')\n const apiBaseUrl = override?.apiBaseUrl ?? env('VITE_FAYZ_API_BASE_URL')\n const publishableKey = override?.publishableKey ?? env('VITE_FAYZ_AGENT_KEY')\n\n if (!projectId || !apiBaseUrl || !publishableKey) return null\n return { projectId, apiBaseUrl, publishableKey }\n}\n\nlet cached: { key: string; client: FayzAgentClient } | null = null\n\nexport function getFayzAgentClient(connection: ResolvedFayzAgentConnection): FayzAgentClient {\n const key = `${connection.apiBaseUrl}|${connection.projectId}|${connection.publishableKey}`\n if (cached?.key === key) return cached.client\n\n const client = createFayzAgentClient({\n baseUrl: connection.apiBaseUrl,\n projectId: connection.projectId,\n publishableKey: connection.publishableKey,\n })\n cached = { key, client }\n return client\n}\n","// ---------------------------------------------------------------------------\n// Speech — the assistant's ears and mouth.\n//\n// Two transports for dictation, one seam:\n// • `transcribeEndpoint` set → record with MediaRecorder, POST the clip,\n// read back `{ text }`. That is where Whisper (or any STT service) plugs\n// in without touching a single component.\n// • nothing set → the browser's own SpeechRecognition. Zero\n// infrastructure, streams interim words as the user speaks, and is enough\n// for \"agenda a Maria amanhã às 10\".\n//\n// Output is the platform speechSynthesis voice: instant, free, offline, and\n// interruptible — the right fit for the short confirmations the assistant\n// speaks back (\"Agendamento criado\"). A neural-TTS endpoint can replace\n// `speak()` later behind the same call.\n// ---------------------------------------------------------------------------\n\nexport interface SpeechRecognitionAlternativeLike {\n transcript: string\n}\ninterface SpeechRecognitionResultLike {\n isFinal: boolean\n 0: SpeechRecognitionAlternativeLike\n length: number\n}\ninterface SpeechRecognitionEventLike {\n resultIndex: number\n results: { length: number; [index: number]: SpeechRecognitionResultLike }\n}\ninterface SpeechRecognitionLike {\n lang: string\n continuous: boolean\n interimResults: boolean\n maxAlternatives: number\n start(): void\n stop(): void\n abort(): void\n onresult: ((event: SpeechRecognitionEventLike) => void) | null\n onerror: ((event: { error: string }) => void) | null\n onend: (() => void) | null\n onstart: (() => void) | null\n}\ntype SpeechRecognitionCtor = new () => SpeechRecognitionLike\n\nfunction recognitionCtor(): SpeechRecognitionCtor | null {\n if (typeof window === 'undefined') return null\n const w = window as unknown as {\n SpeechRecognition?: SpeechRecognitionCtor\n webkitSpeechRecognition?: SpeechRecognitionCtor\n }\n return w.SpeechRecognition ?? w.webkitSpeechRecognition ?? null\n}\n\n/** Dictation is possible here — native recognition or a recordable mic. */\nexport function isDictationSupported(hasEndpoint: boolean): boolean {\n if (typeof window === 'undefined') return false\n if (hasEndpoint) {\n return (\n typeof MediaRecorder !== 'undefined' &&\n !!navigator.mediaDevices?.getUserMedia\n )\n }\n return !!recognitionCtor()\n}\n\nexport interface DictationCallbacks {\n /** Words so far — the composer shows them live so the user sees it working. */\n onInterim?: (text: string) => void\n /** Settled transcript. Empty string means \"heard nothing\". */\n onFinal: (text: string) => void\n onError: (code: 'denied' | 'unsupported' | 'network' | 'no-speech' | 'failed') => void\n}\n\nexport interface DictationSession {\n /** Finish and transcribe what was captured. */\n stop: () => void\n /** Throw the capture away — no transcript, no send. */\n cancel: () => void\n}\n\nfunction mapRecognitionError(code: string): 'denied' | 'network' | 'no-speech' | 'failed' {\n if (code === 'not-allowed' || code === 'service-not-allowed') return 'denied'\n if (code === 'network') return 'network'\n if (code === 'no-speech') return 'no-speech'\n return 'failed'\n}\n\n/** Browser-native dictation with live interim results. */\nfunction startNativeDictation(locale: string, cb: DictationCallbacks): DictationSession {\n const Ctor = recognitionCtor()\n if (!Ctor) {\n cb.onError('unsupported')\n return { stop: () => {}, cancel: () => {} }\n }\n const recognition = new Ctor()\n recognition.lang = locale\n // `continuous` keeps the session open through natural pauses; the user (or\n // the browser's own silence timeout) ends it.\n recognition.continuous = true\n recognition.interimResults = true\n recognition.maxAlternatives = 1\n\n let settled = false\n let finalText = ''\n let cancelled = false\n\n recognition.onresult = (event) => {\n let interim = ''\n for (let i = event.resultIndex; i < event.results.length; i++) {\n const result = event.results[i]\n const text = result[0]?.transcript ?? ''\n if (result.isFinal) finalText += text\n else interim += text\n }\n cb.onInterim?.((finalText + interim).trim())\n }\n recognition.onerror = (event) => {\n if (cancelled || settled) return\n // \"no-speech\" after real words is just the closing silence, not a failure.\n if (event.error === 'no-speech' && finalText.trim()) return\n settled = true\n cb.onError(mapRecognitionError(event.error))\n }\n recognition.onend = () => {\n if (cancelled || settled) return\n settled = true\n cb.onFinal(finalText.trim())\n }\n\n try {\n recognition.start()\n } catch {\n settled = true\n cb.onError('failed')\n }\n\n return {\n stop: () => recognition.stop(),\n cancel: () => {\n cancelled = true\n recognition.abort()\n },\n }\n}\n\n/** Record → POST the clip → read `{ text }`. The Whisper seam. */\nfunction startRecordedDictation(\n endpoint: string,\n locale: string,\n cb: DictationCallbacks,\n): DictationSession {\n let recorder: MediaRecorder | null = null\n let stream: MediaStream | null = null\n let cancelled = false\n const chunks: BlobPart[] = []\n\n const release = () => stream?.getTracks().forEach((track) => track.stop())\n\n void navigator.mediaDevices\n .getUserMedia({ audio: true })\n .then((granted) => {\n if (cancelled) {\n granted.getTracks().forEach((track) => track.stop())\n return\n }\n stream = granted\n recorder = new MediaRecorder(granted)\n recorder.ondataavailable = (event) => {\n if (event.data.size > 0) chunks.push(event.data)\n }\n recorder.onstop = async () => {\n release()\n if (cancelled) return\n const blob = new Blob(chunks, { type: recorder?.mimeType || 'audio/webm' })\n if (!blob.size) return cb.onFinal('')\n try {\n const form = new FormData()\n form.append('file', blob, 'speech.webm')\n form.append('language', locale.slice(0, 2))\n const response = await fetch(endpoint, { method: 'POST', body: form })\n if (!response.ok) return cb.onError('failed')\n const data = (await response.json()) as { text?: string }\n cb.onFinal((data.text ?? '').trim())\n } catch {\n cb.onError('network')\n }\n }\n recorder.start()\n })\n .catch(() => cb.onError('denied'))\n\n return {\n stop: () => {\n if (recorder?.state === 'recording') recorder.stop()\n else release()\n },\n cancel: () => {\n cancelled = true\n if (recorder?.state === 'recording') recorder.stop()\n release()\n },\n }\n}\n\nexport function startDictation(\n options: { locale: string; transcribeEndpoint?: string },\n cb: DictationCallbacks,\n): DictationSession {\n return options.transcribeEndpoint\n ? startRecordedDictation(options.transcribeEndpoint, options.locale, cb)\n : startNativeDictation(options.locale, cb)\n}\n\n// --- Output -----------------------------------------------------------------\n\nexport function isSpeechOutputSupported(): boolean {\n return typeof window !== 'undefined' && 'speechSynthesis' in window\n}\n\n/**\n * What gets SPOKEN is not what gets rendered. Markdown, ids, tables and long\n * explanations are unbearable out loud, so the voice reads the first couple of\n * sentences of plain prose and stops — the screen still holds the full answer.\n */\nexport function spokenForm(markdown: string, maxChars = 240): string {\n const plain = markdown\n .replace(/```[\\s\\S]*?```/g, ' ')\n .replace(/`([^`]+)`/g, '$1')\n .replace(/!\\[[^\\]]*\\]\\([^)]*\\)/g, ' ')\n .replace(/\\[([^\\]]+)\\]\\([^)]*\\)/g, '$1')\n .replace(/^\\s*[-*+]\\s+/gm, '')\n .replace(/^#{1,6}\\s+/gm, '')\n .replace(/\\|/g, ' ')\n .replace(/[*_~>#]/g, '')\n .replace(/\\s+/g, ' ')\n .trim()\n if (plain.length <= maxChars) return plain\n const sentences = plain.match(/[^.!?]+[.!?]?/g) ?? [plain]\n let out = ''\n for (const sentence of sentences) {\n if ((out + sentence).length > maxChars) break\n out += sentence\n }\n return (out || plain.slice(0, maxChars)).trim()\n}\n\nfunction pickVoice(locale: string): SpeechSynthesisVoice | undefined {\n const voices = window.speechSynthesis.getVoices()\n if (!voices.length) return undefined\n const lower = locale.toLowerCase()\n const lang = lower.slice(0, 2)\n return (\n voices.find((v) => v.lang.toLowerCase() === lower && v.localService) ??\n voices.find((v) => v.lang.toLowerCase() === lower) ??\n voices.find((v) => v.lang.toLowerCase().startsWith(lang)) ??\n undefined\n )\n}\n\nexport function stopSpeaking(): void {\n if (isSpeechOutputSupported()) window.speechSynthesis.cancel()\n}\n\n/** Speak a reply. Any utterance in flight is cut off — the newest answer wins. */\nexport function speak(text: string, options: { locale: string; onEnd?: () => void } = { locale: 'pt-BR' }): void {\n if (!isSpeechOutputSupported()) return\n const content = text.trim()\n if (!content) return\n window.speechSynthesis.cancel()\n const utterance = new SpeechSynthesisUtterance(content)\n utterance.lang = options.locale\n const voice = pickVoice(options.locale)\n if (voice) utterance.voice = voice\n utterance.rate = 1.05\n utterance.onend = () => options.onEnd?.()\n utterance.onerror = () => options.onEnd?.()\n window.speechSynthesis.speak(utterance)\n}\n","import { useCallback, useMemo } from 'react'\nimport { useChatStore, type ChatMessage, type ChatRecordLink } from '../stores/chat.store'\nimport { useOrganizationStore } from '../stores/organization.store'\n// The REAL auth store — @fayz-ai/auth is what AuthProvider hydrates (and the\n// same specifier AdminShell uses). stores/auth.store is a legacy shim\n// nothing fills; reading it here sent EVERY turn anonymous, which an INTERNAL\n// channel rejects with AGENT_IDENTITY_REQUIRED (documented gotcha in\n// fayz/docs/architecture/platform/agents.md — the fix had only landed in the\n// retired -qa checkout).\nimport { useAuthStore } from '@fayz-ai/auth'\nimport { usePluginRuntimeOptional } from '../lib/plugins'\n// Native org adapter (same import TeamTab uses) — the shell context is\n// un-provided, so the assistant reads the team through the native one.\nimport { useOrgAdapterOptional as useNativeOrgAdapter } from '../org'\nimport type { OrgAdapter } from '../types/org-adapter'\nimport { dedup } from '../lib/dedup'\n// The admin's own hash-router helper — `lib/router`'s default adapter\n// assigns window.location.href, which sent the agent to /agenda instead of\n// #/agenda and reloaded the app onto a path the server does not serve.\nimport { navigateTo } from '../app/routing'\nimport { useTranslation } from './useTranslation'\nimport { useAITools } from './useAITools'\nimport {\n buildAgentToolset,\n buildDataToolIndex,\n executeAITool,\n executeRpcTool,\n type AIToolExecutionContext,\n} from '../lib/ai-tool-handlers'\nimport { entityToolName, registryToolName } from '../lib/core-ai-tools'\nimport { getActiveSurfaceContext } from '../lib/agent-surface'\nimport { emitDataChanged, getAllEntities, useManifest, type PluginAITool } from '@fayz-ai/core'\nimport { checkAccess, guardLimit } from '../access/headless'\nimport { invalidateLimit } from '../access/limits-registry'\nimport {\n getFayzAgentClient,\n resolveFayzAgentConnection,\n type FayzAgentConnectionConfig,\n} from '../lib/fayz-agent'\nimport { rememberRecordRefs, rememberSurfaceRefs, extractRecordLinks, dedupeLinks } from '../lib/record-refs'\nimport type { AgentAttachmentDigest, FayzAgentToolResult } from '@fayz-ai/sdk/agent'\nimport { speak, spokenForm, stopSpeaking } from '../lib/speech'\n\n/**\n * Caps how many times the model may call tools before it must answer in prose.\n * Each round is a network turn, so a runaway loop is both slow and expensive.\n */\nconst MAX_TOOL_ROUNDS = 4\n\n/**\n * Read the finished reply out loud, when the user asked for a talking\n * assistant. Only the first sentences (`spokenForm`) — a spoken table is\n * unbearable, and the screen still holds the full answer.\n */\nfunction speakLastReply(): void {\n const state = useChatStore.getState()\n if (!state.voiceReplies) return\n const last = state.messages[state.messages.length - 1]\n if (last?.role !== 'assistant' || !last.content) return\n speak(spokenForm(last.content), {\n locale: typeof navigator !== 'undefined' ? navigator.language || 'pt-BR' : 'pt-BR',\n })\n}\n\ninterface UseChatOptions {\n /** Bring-your-own backend. Takes precedence over the Fayz agent connection. */\n apiEndpoint?: string\n systemPrompt?: string\n /** Fayz agent overrides; defaults to the env the container injects. */\n agent?: FayzAgentConnectionConfig | false\n}\n\nexport function useChat(options?: UseChatOptions) {\n const store = useChatStore()\n const runtime = usePluginRuntimeOptional()\n const { t } = useTranslation()\n const { tools, activePluginId } = useAITools()\n const currentOrg = useOrganizationStore((s) => s.currentOrg)\n const members = useOrganizationStore((s) => s.members)\n const teamPersonKinds = useOrganizationStore((s) => s.teamPersonKinds)\n const user = useAuthStore((s) => s.user)\n const orgAdapter = useNativeOrgAdapter() as unknown as OrgAdapter | null\n\n // Person-first team resolver for `getTeamMembers`. Fetched on demand (the\n // chat is reachable without ever opening the Team screen) and deduped with\n // that screen's own load, so asking the assistant costs no extra round-trip.\n const loadTeam = useMemo(() => {\n if (!currentOrg || !teamPersonKinds.length || typeof orgAdapter?.listTeam !== 'function') return undefined\n return () => dedup('team:people:' + currentOrg.id, () => orgAdapter.listTeam!(currentOrg.id, teamPersonKinds))\n }, [orgAdapter, currentOrg?.id, teamPersonKinds.join(',')])\n\n // The project's Fayz agent, resolved from the env the container injects. An\n // app-supplied apiEndpoint wins — that is an explicit opt-out.\n const connection = useMemo(\n () => (options?.apiEndpoint ? null : resolveFayzAgentConnection(options?.agent)),\n [options?.apiEndpoint, options?.agent],\n )\n\n // The assistant is only \"real\" when something backs it. Without a backend we\n // never fake a canned demo reply — the panel disables free-text input and, if\n // a suggestion chip is clicked anyway, we answer with a clear notice.\n const isConfigured = !!connection || !!options?.apiEndpoint\n\n /**\n * Run the agent turn loop against the project's Fayz agent.\n *\n * This is the follow-up the transport-only version of this hook described:\n * the tool catalog plugins declare (useAITools) is already JSON-Schema shaped,\n * so it forwards verbatim. Execution stays *client-plane* — the browser runs\n * each call against the session that is already open and hands results back —\n * because that is the only side that can touch the running UI (navigateTo) or\n * the tenant's own data session, and it keeps Fayz free of app credentials.\n * Server-plane tools (AgentTool grants) execute inside Fayz and never surface\n * here.\n */\n const manifest = useManifest()\n const serverPlane = manifest?.agent?.executionPlane === 'server'\n\n /**\n * Client-plane guard around a persist tool, mirroring the broker's\n * server-plane order: role→plan (checkAccess) → cap (guardLimit) → human\n * confirmation → execute → invalidate the consumed limit. A denial comes\n * back to the model as the structured AgentDenial, so the paywall/permission\n * explanation happens IN the conversation — never a silent failure\n * (docs/saas/ENTITLEMENTS.md § agentes).\n */\n const executeGuarded = useCallback(\n async (\n call: { id: string; name: string; arguments: Record<string, unknown> },\n def: PluginAITool | undefined,\n toolContext: AIToolExecutionContext,\n ): Promise<string> => {\n if (def?.mode === 'persist') {\n if (def.permission) {\n const access = checkAccess(def.permission.feature, def.permission.action)\n if (!access.allowed) return JSON.stringify(access)\n }\n if (def.limitKey) {\n const limit = await guardLimit(def.limitKey)\n if (!limit.allowed) return JSON.stringify(limit)\n }\n if (def.requiresConfirmation !== false) {\n const decision = await useChatStore.getState().requestConfirmation({\n id: call.id,\n toolName: call.name,\n // No title: `def.description` is written for the model.\n params: call.arguments,\n plane: 'client',\n })\n if (!decision.approved) {\n return JSON.stringify({ ok: false, cancelled: true, reason: 'user_declined' })\n }\n // The card can correct what the model sent; execute what the user saw.\n if (decision.values) call = { ...call, arguments: decision.values }\n }\n }\n const exec = def?.execution\n const rpcName = exec && exec.plane === 'server' && exec.kind === 'rpc' ? exec.rpc : null\n const result = rpcName\n ? await executeRpcTool(rpcName, call.arguments, useAuthStore.getState().user?.id)\n : await executeAITool(call.name, call.arguments, toolContext)\n if (def?.mode === 'persist' && result.ok) {\n if (def.limitKey) invalidateLimit(def.limitKey)\n // A plugin write (an RPC booking, a status change) — the executor knows\n // no table, so this is an unattributed change: every mounted list\n // refreshes rather than none of them. createRecord/updateRecord emit\n // their own precise event and this one is coalesced with it.\n emitDataChanged({ op: 'unknown', source: 'agent' })\n }\n return result.content\n },\n [],\n )\n\n const runFayzAgentTurn = useCallback(\n async (\n content: string,\n activeConnection: NonNullable<typeof connection>,\n attachments?: AgentAttachmentDigest[],\n ) => {\n const dataTools = buildDataToolIndex({\n registries: runtime?.registries ?? new Map(),\n entities: getAllEntities(),\n registryToolName,\n entityToolName,\n queryEntities: runtime?.activePlugins.flatMap((p) => p.queryEntities ?? []) ?? [],\n })\n // Server-plane flip (manifest agent.executionPlane): data/RPC tools stop\n // shipping from the surface — the broker executes them from the synced\n // contract; only genuinely client-plane tools still go up per request.\n const clientTools = serverPlane\n ? tools.filter((t) => t.execution?.plane !== 'server')\n : tools\n const toolset = buildAgentToolset(clientTools, { dataTools, activePluginId })\n const toolByName = new Map(tools.map((t) => [t.name, t]))\n\n const toolContext: AIToolExecutionContext = {\n currentOrg,\n members,\n loadTeam,\n currentPath: runtime?.context.currentPath ?? '/',\n routes: (runtime?.navigation ?? []).map((n) => ({ path: n.route, label: n.label })),\n navigate: navigateTo,\n dataTools,\n orgAdapter,\n // What a refusal may point AT when a generic primitive is the wrong door\n // (a read-only view rejecting updateRecord). Offered THIS turn and able\n // to write — pointing an update at a read tool (\"use listLeads\") is\n // worse advice than admitting there is no way to do it.\n writeTools: toolset\n .map((t) => toolByName.get(t.name))\n .filter((d): d is PluginAITool => d?.mode === 'persist')\n .map((d) => ({ name: d.name, action: d.permission?.action })),\n }\n\n const client = getFayzAgentClient(activeConnection)\n // Small models are bad at weekday math — \"próxima segunda\" booked a\n // Friday. Hand them the next 7 dates, solved.\n const upcoming = Array.from({ length: 7 }, (_, i) => {\n const d = new Date(Date.now() + (i + 1) * 86400e3)\n return `${d.toLocaleDateString('pt-BR', { weekday: 'long' })}=${d.toISOString().slice(0, 10)}`\n }).join(', ')\n // Identical repeated calls burn rounds without new information — cut the\n // loop with an explicit steering result instead of re-executing.\n const seenCalls = new Map<string, string>()\n // Index every ref seen (the card resolves ids from it) and link the ones\n // the reply is about.\n const collectRecordLinks = (content: string) => {\n rememberRecordRefs(content)\n const links = extractRecordLinks(content)\n if (links.length) useChatStore.getState().appendLinksToLastAssistant(links)\n }\n let toolResults: FayzAgentToolResult[] | undefined\n let confirmAction: { id: string; approved: boolean } | undefined\n let message: string | undefined = content\n // Only the opening round carries them — the tool rounds that follow are\n // the same turn, and resending the digests would just re-describe them.\n let turnAttachments = attachments?.length ? attachments : undefined\n\n for (let round = 0; round <= MAX_TOOL_ROUNDS; round++) {\n // Streaming: each delta fills the SAME optimistic assistant bubble in\n // place (updateLastAssistant is id-stable). Falls back to the JSON\n // round-trip transparently when the broker doesn't stream yet.\n const response = await client.chatStream({\n message,\n toolResults,\n confirmAction,\n // Attribution: an INTERNAL channel rejects turns with no identity, and\n // without this every conversation lands in the owner's dashboard as\n // \"Anonymous\" even though a signed-in user sent it.\n externalUserId: user?.id,\n externalUserName: user?.fullName || user?.email,\n conversationId: useChatStore.getState().conversationId ?? undefined,\n tools: toolset,\n ...(turnAttachments ? { attachments: turnAttachments } : {}),\n context: {\n // Temporal grounding. Without an explicit clock the model resolves\n // \"tomorrow\" against its training cutoff — it booked an appointment\n // in 2023 before this was sent. The browser is the only side that\n // knows the user's actual zone.\n // Weekday spelled out: small models booked \"próxima segunda\" on a\n // Friday because nothing said what weekday `now` is.\n now: `${new Date().toISOString()} (${new Date().toLocaleDateString('pt-BR', { weekday: 'long' })})`,\n timeZone: Intl.DateTimeFormat().resolvedOptions().timeZone,\n locale: typeof navigator !== 'undefined' ? navigator.language : undefined,\n currentPath: toolContext.currentPath,\n // What this app actually contains. Derived from the live navigation\n // rather than written into each agent, so an assistant knows its own\n // product on day one in any vertical — and can answer \"where do I\n // add a professional?\" instead of guessing at a generic answer.\n pages: toolContext.routes.map((r) => r.label ?? r.path).join(', '),\n upcomingDates: upcoming,\n toolHints:\n 'When an id (client, service, record) was already returned by a tool earlier in THIS conversation, REUSE that id directly — do not search for it again.',\n timeNote:\n 'Datetimes in tool results are UTC unless the field is *_local. The business timezone is the timeZone above — ALWAYS convert to it before telling the user a time.',\n businessName: currentOrg?.name,\n userName: user?.fullName || user?.email,\n // Screen context: what the user is looking at right now — the route,\n // plus whatever the mounted surface published (a form draft, the\n // open record). Structured under `surface`, AND folded into the\n // guidance text so it reaches the model through the one channel we\n // know the broker templates today.\n ...(() => {\n const { snapshot, instructions } = getActiveSurfaceContext()\n // Anything the snapshot names is an id the model may legitimately\n // act on — index it before it goes up, or openRecord rejects the\n // very id this request handed over.\n rememberSurfaceRefs(snapshot)\n const guidance = [\n options?.systemPrompt,\n ...instructions,\n snapshot.length\n ? `Tela aberta agora (JSON):\\n${JSON.stringify(snapshot.length === 1 ? snapshot[0] : snapshot)}`\n : undefined,\n ]\n .filter(Boolean)\n .join('\\n\\n')\n return {\n ...(guidance ? { appGuidance: guidance } : {}),\n ...(snapshot.length ? { surface: snapshot.length === 1 ? snapshot[0] : snapshot } : {}),\n }\n })(),\n },\n }, {\n onDelta: (accumulated) => useChatStore.getState().updateLastAssistant(accumulated),\n })\n turnAttachments = undefined\n store.setConversationId(response.conversationId)\n\n if (response.content) store.updateLastAssistant(response.content)\n\n // Server-parked write: the broker executed nothing and is waiting for a\n // human decision. Surface the card, send the decision back, continue.\n if (response.pendingAction) {\n const decision = await useChatStore.getState().requestConfirmation({\n id: response.pendingAction.id,\n toolName: response.pendingAction.toolName,\n title: response.pendingAction.title ?? response.pendingAction.toolName,\n params: response.pendingAction.params ?? {},\n plane: 'server',\n })\n confirmAction = { id: response.pendingAction.id, approved: decision.approved }\n message = undefined\n toolResults = undefined\n continue\n }\n confirmAction = undefined\n\n if (response.toolCalls.length === 0) return\n\n // Last allowed round still asked for tools — stop looping and let\n // whatever prose came back stand.\n if (round === MAX_TOOL_ROUNDS) {\n if (!response.content) {\n store.updateLastAssistant('That took too many steps. Could you narrow the question?')\n }\n return\n }\n\n // Live activity: surface WHICH tools are running while they run — the\n // agent's work should be visible, not a silent pause.\n useChatStore.getState().setActiveTools(response.toolCalls.map((c) => c.name))\n try {\n toolResults = await Promise.all(\n response.toolCalls.map(async (call) => {\n const content = await executeGuarded(call, toolByName.get(call.name), toolContext)\n collectRecordLinks(content)\n return { toolCallId: call.id, content }\n }),\n )\n // Persistent, expandable trace: name + args + (truncated) result per\n // call, attached to the reply being built. Auto-approved and declined\n // writes are flagged — an unattended write must still be visible.\n const autoApproved = new Set(useChatStore.getState().autoApprovedTools)\n useChatStore.getState().appendToolCallsToLastAssistant(\n response.toolCalls.map((call, i) => {\n const content = toolResults?.[i]?.content ?? ''\n return {\n name: call.name,\n args: Object.keys(call.arguments ?? {}).length\n ? JSON.stringify(call.arguments, null, 1)\n : '',\n result: content.slice(0, 2000),\n autoApproved: autoApproved.has(call.name),\n declined: content.includes('\"user_declined\"'),\n }\n }),\n )\n } finally {\n useChatStore.getState().setActiveTools([])\n }\n message = undefined\n }\n },\n [store, tools, serverPlane, executeGuarded, activePluginId, runtime, currentOrg, members, loadTeam, orgAdapter, user, options?.systemPrompt],\n )\n\n const sendMessage = useCallback(\n async (content: string) => {\n // Barge-in: the moment the user talks (or types) again, the assistant\n // stops talking. Nothing is more irritating than a voice that keeps\n // reading an answer you already moved past.\n stopSpeaking()\n // Staged files become part of THIS turn and are unstaged here — including\n // their bytes, which are dropped from the registry without ever having\n // been read by anything but this browser.\n const attachments = useChatStore.getState().consumePendingAttachments()\n if (!content.trim() && !attachments.length) return\n\n const userMsg: ChatMessage = {\n id: `msg-${Date.now()}`,\n role: 'user',\n content,\n timestamp: new Date().toISOString(),\n ...(attachments.length\n ? {\n attachments: attachments.map((a) => ({\n name: a.name,\n kind: a.kind,\n ...(a.rowCount === undefined ? {} : { rowCount: a.rowCount }),\n })),\n }\n : {}),\n }\n store.addMessage(userMsg)\n\n // Attaching a file with nothing typed is a real request (\"importa isso\n // aí\"). The turn still needs words, so name the files — the digests are\n // what the agent will actually read once the broker consumes them.\n const outgoing =\n content.trim() ||\n t('chat.attachments.messageOnly', { files: attachments.map((a) => a.name).join(', ') })\n\n if (!isConfigured) {\n // Honest non-configured state — no fake \"demo response\".\n store.addMessage({\n id: `msg-${Date.now() + 1}`,\n role: 'assistant',\n content: t('chat.notConfigured'),\n timestamp: new Date().toISOString(),\n })\n return\n }\n\n const assistantMsg: ChatMessage = {\n id: `msg-${Date.now() + 1}`,\n role: 'assistant',\n content: '',\n timestamp: new Date().toISOString(),\n }\n store.addMessage(assistantMsg)\n store.setStreaming(true)\n\n try {\n if (connection) {\n await runFayzAgentTurn(outgoing, connection, attachments)\n return\n }\n\n const response = await fetch(options!.apiEndpoint!, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({\n messages: [\n ...(options?.systemPrompt\n ? [{ role: 'system', content: options.systemPrompt }]\n : []),\n ...store.messages.map((m) => ({ role: m.role, content: m.content })),\n { role: 'user', content: outgoing },\n ],\n }),\n })\n\n if (!response.ok) {\n store.updateLastAssistant('Sorry, something went wrong. Please try again.')\n return\n }\n\n const data = await response.json()\n const text = data.choices?.[0]?.message?.content ?? data.content ?? 'No response.'\n store.updateLastAssistant(text)\n } catch {\n store.updateLastAssistant('Sorry, I could not connect. Please try again later.')\n } finally {\n store.setStreaming(false)\n speakLastReply()\n }\n },\n [\n store,\n isConfigured,\n connection,\n runFayzAgentTurn,\n options?.apiEndpoint,\n options?.systemPrompt,\n t,\n ],\n )\n\n /** Refresh the signed-in user's thread list (history drawer). */\n const loadConversations = useCallback(async () => {\n if (!connection) return\n try {\n const rows = await getFayzAgentClient(connection).listConversations(user?.id)\n useChatStore.getState().setConversations(rows)\n } catch {\n // History is an enhancement — a failed load never breaks the chat. But\n // the first failure must still settle the skeleton into \"no history\".\n const s = useChatStore.getState()\n if (!s.conversationsLoaded) s.setConversations([])\n }\n }, [connection, user?.id])\n\n /** Resume a past thread: hydrate its transcript + continue under its id. */\n const resumeConversation = useCallback(\n async (conversationId: string) => {\n if (!connection) return\n try {\n const detail = await getFayzAgentClient(connection).getConversation(conversationId, user?.id)\n const messages: ChatMessage[] = detail.messages\n .filter((m) => m.role === 'USER' || m.role === 'ASSISTANT' || m.role === 'user' || m.role === 'assistant')\n .map((m) => {\n const calls = m.toolCalls ?? []\n // Re-index the records this turn touched: a resumed thread has to\n // resolve its own goto chips and name ids on a confirmation card,\n // exactly as it did live.\n const links: ChatRecordLink[] = []\n for (const call of calls) {\n if (!call.result) continue\n rememberRecordRefs(call.result)\n links.push(...extractRecordLinks(call.result))\n }\n return {\n id: m.id,\n role: m.role.toLowerCase() === 'user' ? ('user' as const) : ('assistant' as const),\n content: m.content,\n timestamp: m.createdAt,\n ...(calls.length\n ? {\n toolCalls: calls.map((call) => ({\n name: call.name,\n args: Object.keys(call.arguments ?? {}).length\n ? JSON.stringify(call.arguments, null, 1)\n : '',\n result: (call.result ?? '').slice(0, 2000),\n declined: (call.result ?? '').includes('\"user_declined\"'),\n })),\n }\n : {}),\n ...(links.length ? { links: dedupeLinks(links) } : {}),\n ...(m.attachments?.length\n ? {\n attachments: m.attachments.map((a) => ({\n name: a.name,\n kind: a.kind,\n ...(a.rowCount !== undefined ? { rowCount: a.rowCount } : {}),\n })),\n }\n : {}),\n }\n })\n const s = useChatStore.getState()\n s.setMessages(messages)\n s.setConversationId(detail.id)\n } catch {\n // Thread gone (archived / another device cleaned it) — start fresh.\n useChatStore.getState().reset()\n }\n },\n [connection, user?.id],\n )\n\n /** Fresh thread: clear the transcript, next turn creates a new conversation. */\n const startNewConversation = useCallback(() => {\n store.reset()\n }, [store])\n\n return {\n messages: store.messages,\n isOpen: store.isOpen,\n isStreaming: store.isStreaming,\n /** True when a real backend is wired — the project's Fayz agent or a custom endpoint. */\n isConfigured,\n sendMessage,\n toggleOpen: store.toggleOpen,\n setOpen: store.setOpen,\n reset: store.reset,\n /** Write awaiting human confirmation (render the ConfirmActionCard; the\n * composer should stay disabled while set). */\n pendingAction: store.pendingAction,\n /** Card decision: true executes/approves, false declines. */\n resolvePendingAction: store.resolvePendingAction,\n /** Tool names executing right now (live activity chips). */\n activeTools: store.activeTools,\n /** History drawer data + actions. */\n conversations: store.conversations,\n loadConversations,\n resumeConversation,\n startNewConversation,\n }\n}\n","import * as React from 'react'\nimport { Sparkles, X } from 'lucide-react'\nimport { cn } from '../../lib/cn'\nimport { useChatStore } from '../../stores/chat.store'\nimport { useOrganizationStore } from '../../stores/organization.store'\nimport { useRightRailStore } from '../right-rail'\n\n/** Distância do FAB até a borda direita (px). Os 16 do padrão deixavam o\n * círculo encostado na moldura do conteúdo em layouts com `contentFrame`; os\n * 5 extras dão o respiro que separa o botão da borda. */\nconst FAB_MARGIN_RIGHT = 21\nimport { useAITools, type ResolvedSuggestion } from '../../hooks/useAITools'\nimport { useChat } from '../../hooks/useChat'\nimport { useTranslation } from '../../hooks/useTranslation'\nimport type { FayzAgentConnectionConfig } from '../../lib/fayz-agent'\nimport type { ChatVoiceConfig } from '../../app/config'\n\ninterface ChatFabProps {\n className?: string\n apiEndpoint?: string\n systemPrompt?: string\n agent?: FayzAgentConnectionConfig | false\n voice?: ChatVoiceConfig\n /** Also render on phones. An app with a bottom bar owns that entry point\n * (and that corner of the screen); an app without one has no other way in,\n * which quietly made the assistant desktop-only. */\n mobile?: boolean\n}\n\n// --- Teaser budget ----------------------------------------------------------\n// The pill used to fire on every route change, forever. A hint that always\n// appears stops being a hint and becomes noise — so it gets a session budget,\n// never repeats a suggestion, and a dismiss silences it for good. The panel's\n// own Sparkles button is how suggestions come back, on demand.\nconst TEASER_MAX_PER_SESSION = 2\nconst KEY_DISMISSED = 'fayz.agent.teaser.dismissed'\nconst KEY_SHOWN = 'fayz.agent.teaser.shown'\nconst KEY_SEEN = 'fayz.agent.teaser.seen'\n\nfunction session(): Storage | null {\n try {\n return typeof sessionStorage === 'undefined' ? null : sessionStorage\n } catch {\n return null\n }\n}\nfunction teaserDismissed(): boolean {\n return session()?.getItem(KEY_DISMISSED) === '1'\n}\nfunction teaserShownCount(): number {\n return Number(session()?.getItem(KEY_SHOWN) ?? '0') || 0\n}\nfunction teaserSeen(): string[] {\n try {\n return JSON.parse(session()?.getItem(KEY_SEEN) ?? '[]') as string[]\n } catch {\n return []\n }\n}\nfunction recordTeaser(label: string): void {\n const store = session()\n if (!store) return\n store.setItem(KEY_SHOWN, String(teaserShownCount() + 1))\n store.setItem(KEY_SEEN, JSON.stringify([...teaserSeen(), label].slice(-12)))\n}\n\nfunction prefersReducedMotion(): boolean {\n return (\n typeof window !== 'undefined' &&\n !!window.matchMedia?.('(prefers-reduced-motion: reduce)').matches\n )\n}\n\nfunction TypewriterText({ text, speed = 26, onDone }: { text: string; speed?: number; onDone?: () => void }) {\n const [displayed, setDisplayed] = React.useState('')\n const indexRef = React.useRef(0)\n\n React.useEffect(() => {\n // Reduced motion: the point is the words, not the typing.\n if (prefersReducedMotion()) {\n setDisplayed(text)\n onDone?.()\n return\n }\n setDisplayed('')\n indexRef.current = 0\n const interval = setInterval(() => {\n indexRef.current++\n if (indexRef.current > text.length) {\n clearInterval(interval)\n onDone?.()\n return\n }\n setDisplayed(text.slice(0, indexRef.current))\n }, speed)\n return () => clearInterval(interval)\n }, [text, speed])\n\n return (\n <span>\n {displayed}\n {displayed.length < text.length && (\n <span className=\"ml-0.5 -mb-px inline-block h-3 w-[2px] bg-current/60 motion-safe:animate-pulse\" />\n )}\n </span>\n )\n}\n\n/** Injected once — the pill grows out of the FAB circle and shrinks back into it. */\nconst STYLE_ID = 'chat-fab-anims'\nfunction ensureStyles() {\n if (typeof document === 'undefined') return\n if (document.getElementById(STYLE_ID)) return\n const style = document.createElement('style')\n style.id = STYLE_ID\n style.textContent = `\n @keyframes fabPillGrow {\n 0% { max-width: 3rem; opacity: 0.6; }\n 40% { opacity: 1; }\n 100% { max-width: 22rem; opacity: 1; }\n }\n @keyframes fabPillShrink {\n 0% { max-width: 22rem; opacity: 1; }\n 60% { opacity: 0.6; }\n 100% { max-width: 3rem; opacity: 0; }\n }\n @keyframes fabHalo {\n 0%, 100% { transform: scale(1); opacity: 0.45; }\n 50% { transform: scale(1.35); opacity: 0; }\n }\n @keyframes fabEnter {\n 0% { transform: scale(0.2); opacity: 0; }\n 55% { transform: scale(1.14); opacity: 1; }\n 75% { transform: scale(0.94); }\n 100% { transform: scale(1); opacity: 1; }\n }\n @keyframes fabEnterIcon {\n 0% { transform: rotate(-90deg) scale(0.3); opacity: 0; }\n 60% { transform: rotate(14deg) scale(1.2); opacity: 1; }\n 100% { transform: rotate(0deg) scale(1); opacity: 1; }\n }\n @keyframes fabEnterRing {\n 0% { transform: scale(0.6); opacity: 0.5; }\n 100% { transform: scale(2.2); opacity: 0; }\n }\n `\n document.head.appendChild(style)\n}\n\nexport function ChatFab({ className, apiEndpoint, systemPrompt, agent, voice, mobile }: ChatFabProps) {\n const { isOpen, setOpen } = useChatStore()\n const isStreaming = useChatStore((s) => s.isStreaming)\n // The rail may be open on ANY tab (chat, tasks, notes) — the FAB minimizes\n // the whole container, not just its own conversation.\n const railOpen = useRightRailStore((s) => s.open)\n const closeRail = useRightRailStore((s) => s.close)\n const railWidth = useRightRailStore((s) => s.width)\n const expanded = isOpen || railOpen\n const hasMessages = useChatStore((s) => s.messages.length > 0)\n const currentOrg = useOrganizationStore((s) => s.currentOrg)\n const { contextualSuggestions } = useAITools()\n const { sendMessage } = useChat({ apiEndpoint, systemPrompt, agent })\n const { t } = useTranslation()\n\n const [phase, setPhase] = React.useState<'idle' | 'expanding' | 'typing' | 'visible' | 'collapsing'>('idle')\n const [activeSuggestion, setActiveSuggestion] = React.useState<ResolvedSuggestion | null>(null)\n const timersRef = React.useRef<ReturnType<typeof setTimeout>[]>([])\n const prevSuggestionRef = React.useRef<string | null>(null)\n\n React.useEffect(ensureStyles, [])\n\n const clearTimers = () => { timersRef.current.forEach(clearTimeout); timersRef.current = [] }\n const addTimer = (fn: () => void, ms: number) => { timersRef.current.push(setTimeout(fn, ms)) }\n\n const topSuggestion = contextualSuggestions[0] ?? null\n const topLabel = topSuggestion?.label ?? null\n\n // Budget check runs on every candidate: once the user has talked to the\n // assistant this session, the assistant stops advertising itself.\n const teaserAllowed =\n !hasMessages && !teaserDismissed() && teaserShownCount() < TEASER_MAX_PER_SESSION\n\n React.useEffect(() => {\n if (expanded || !topSuggestion || !topLabel || !teaserAllowed || teaserSeen().includes(topLabel)) {\n if (phase !== 'idle') { clearTimers(); setPhase('collapsing'); addTimer(() => setPhase('idle'), 450) }\n prevSuggestionRef.current = null\n return\n }\n if (prevSuggestionRef.current === topLabel) return\n prevSuggestionRef.current = topLabel\n clearTimers()\n\n const startExpand = () => {\n recordTeaser(topLabel)\n setActiveSuggestion(topSuggestion)\n setPhase('expanding')\n // Start typing while the pill is still growing\n addTimer(() => setPhase('typing'), 350)\n }\n\n if (phase !== 'idle') {\n setPhase('collapsing')\n addTimer(startExpand, 500)\n } else {\n addTimer(startExpand, 800)\n }\n\n addTimer(() => {\n setPhase('collapsing')\n addTimer(() => setPhase('idle'), 450)\n }, 9000)\n\n return clearTimers\n }, [topLabel, expanded, teaserAllowed])\n\n React.useEffect(() => {\n if (expanded && phase !== 'idle') { clearTimers(); setPhase('idle') }\n }, [expanded])\n\n // Entrance choreography. The component mounts long before the org resolves\n // (it renders null until then), so the pop-in is keyed to the moment the FAB\n // actually becomes visible — not to React mount time.\n const [entrance, setEntrance] = React.useState<'pending' | 'playing' | 'done'>('pending')\n React.useEffect(() => {\n if (!currentOrg || entrance !== 'pending') return\n if (prefersReducedMotion()) { setEntrance('done'); return }\n setEntrance('playing')\n const timer = setTimeout(() => setEntrance('done'), 1600)\n return () => clearTimeout(timer)\n }, [currentOrg, entrance])\n const entering = entrance === 'playing' && !expanded\n\n if (!currentOrg) return null\n\n // Resolve translated label for a suggestion (same logic as ChatSuggestions)\n const resolveLabel = (s: ResolvedSuggestion, index: number) => {\n const key = `chat.suggestion.${s.toolId}.${index}`\n const translated = t(key)\n return translated === key ? s.label : translated\n }\n\n const activeLabel = activeSuggestion ? resolveLabel(activeSuggestion, 0) : ''\n\n const handleSuggestionClick = () => {\n if (!activeSuggestion) return\n clearTimers()\n setPhase('idle')\n setOpen(true)\n setTimeout(() => { sendMessage(activeSuggestion.prompt ?? activeLabel) }, 150)\n }\n\n const dismissTeaser = (event: React.MouseEvent) => {\n event.stopPropagation()\n session()?.setItem(KEY_DISMISSED, '1')\n clearTimers()\n setPhase('collapsing')\n addTimer(() => setPhase('idle'), 400)\n }\n\n const showPill = phase === 'expanding' || phase === 'typing' || phase === 'visible'\n\n\n return (\n <div\n className={cn(\n 'fixed z-50 md:block md:bottom-4',\n // Anchored to the CONTENT, not the screen: with the rail open the FAB\n // slides left and keeps its bottom-right spot relative to the app —\n // outside the column — gliding in step with the aside's width tween.\n 'motion-safe:transition-[right] motion-safe:duration-200 motion-safe:ease-out',\n // On a phone the open panel is full-screen and carries its own close\n // button — a floating FAB there only lands on top of the composer.\n mobile && !expanded\n ? 'block bottom-[calc(1rem+env(safe-area-inset-bottom))]'\n : 'hidden bottom-4',\n className,\n )}\n style={{ right: railOpen ? railWidth + FAB_MARGIN_RIGHT : FAB_MARGIN_RIGHT }}\n >\n {/* Suggestion teaser — grows out of the FAB circle */}\n {(showPill || phase === 'collapsing') && !expanded && (\n <div\n className={cn(\n 'absolute bottom-0 right-0 flex items-center overflow-hidden rounded-full shadow-lg',\n // Same fill as the FAB: the pill is the FAB stretching out, not a\n // second black object parked next to a purple one. Reserving\n // exactly the circle's width also closes the dead gap the dismiss\n // button used to float in.\n 'bg-primary text-primary-foreground',\n )}\n style={{\n paddingRight: '3rem',\n height: '3rem',\n animation: showPill\n ? 'fabPillGrow 650ms cubic-bezier(0.22, 1, 0.36, 1) forwards'\n : 'fabPillShrink 400ms cubic-bezier(0.55, 0, 1, 0.45) forwards',\n }}\n >\n <button\n onClick={handleSuggestionClick}\n className=\"flex min-w-0 flex-1 flex-col items-start justify-center py-1 pl-5 pr-1 text-left transition-opacity hover:opacity-90\"\n >\n <span className=\"text-[7px] font-semibold uppercase tracking-widest opacity-50\">\n {t('chat.fab.tryIt')}\n </span>\n <span\n className={cn(\n 'min-h-[1.15em] whitespace-nowrap text-[13px] font-medium transition-opacity',\n phase === 'expanding' ? 'opacity-0 duration-200' : 'opacity-100 duration-300',\n )}\n >\n {phase === 'typing' && activeSuggestion ? (\n <TypewriterText text={`\"${activeLabel}\"`} onDone={() => setPhase('visible')} />\n ) : phase === 'visible' && activeSuggestion ? (\n `\"${activeLabel}\"`\n ) : (\n ' '\n )}\n </span>\n </button>\n <button\n onClick={dismissTeaser}\n aria-label={t('chat.fab.dismiss')}\n title={t('chat.fab.dismiss')}\n className=\"mr-1.5 inline-flex h-6 w-6 shrink-0 items-center justify-center rounded-full opacity-50 transition-opacity hover:bg-black/10 hover:opacity-100\"\n >\n <X className=\"h-3 w-3\" />\n </button>\n </div>\n )}\n\n {/* FAB circle. Expanded = the rail is open (any tab): same floating\n circle, same corner — it just minimizes the whole container now. */}\n <button\n onClick={() => {\n if (expanded) {\n closeRail()\n setOpen(false)\n } else {\n setOpen(true)\n }\n }}\n className={cn(\n 'relative z-10 flex h-12 w-12 items-center justify-center transition-all duration-200',\n 'focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2',\n 'rounded-full bg-primary text-primary-foreground shadow-lg hover:scale-105 hover:shadow-xl',\n )}\n aria-label={expanded ? t('chat.fab.close') : t('chat.fab.open')}\n aria-expanded={expanded}\n style={entering ? { animation: 'fabEnter 600ms cubic-bezier(0.34, 1.56, 0.64, 1) both' } : undefined}\n >\n {/* Arrival ripples — two rings announce the assistant, then never again. */}\n {entering && (\n <>\n <span\n aria-hidden\n className=\"absolute inset-0 rounded-full bg-primary/40\"\n style={{ animation: 'fabEnterRing 900ms ease-out 250ms both' }}\n />\n <span\n aria-hidden\n className=\"absolute inset-0 rounded-full bg-primary/25\"\n style={{ animation: 'fabEnterRing 1100ms ease-out 450ms both' }}\n />\n </>\n )}\n {/* Working in the background — the halo is the only thing that says so\n while the panel is shut. */}\n {isStreaming && !expanded && (\n <span\n aria-hidden\n className=\"absolute inset-0 rounded-full bg-primary motion-safe:[animation:fabHalo_1.8s_ease-out_infinite]\"\n />\n )}\n {expanded ? (\n <X className=\"h-4 w-4\" />\n ) : (\n <Sparkles\n className=\"relative h-5 w-5\"\n style={entering ? { animation: 'fabEnterIcon 700ms cubic-bezier(0.34, 1.56, 0.64, 1) 120ms both' } : undefined}\n />\n )}\n </button>\n </div>\n )\n}\n","import * as React from 'react'\nimport { ArrowUpRight, BookOpen, Infinity as InfinityIcon, Pencil, Sparkles, Trash2, X } from 'lucide-react'\nimport { cn } from '../../lib/cn'\nimport { useTranslation } from '../../hooks/useTranslation'\nimport {\n listAutoApprovals,\n revokeAllAutoApprovals,\n revokeAutoApproval,\n subscribeAutoApprovals,\n type AutoApprovalRule,\n} from '../../lib/agent-approvals'\nimport type { ResolvedSuggestion, ResolvedToolGroup } from '../../hooks/useAITools'\n\ninterface ChatSuggestionsProps {\n suggestions: ResolvedSuggestion[]\n onSelect: (suggestion: ResolvedSuggestion) => void\n /** Rendered mid-conversation (user asked for them) — offer a way back. */\n onDismiss?: () => void\n compact?: boolean\n}\n\nconst MAX_SUGGESTIONS = 5\n\nexport function ChatSuggestions({ suggestions, onSelect, onDismiss, compact }: ChatSuggestionsProps) {\n const { t } = useTranslation()\n const visible = suggestions.slice(0, compact ? 3 : MAX_SUGGESTIONS)\n if (!visible.length) return null\n\n return (\n <div\n className={cn(\n 'flex flex-col gap-1 px-3 motion-safe:animate-slide-in-from-bottom',\n compact ? 'pb-2 pt-1' : 'py-2',\n )}\n >\n <div className=\"flex items-center gap-1.5 px-0.5 pb-1\">\n <Sparkles className=\"h-3 w-3 text-primary/70\" />\n <span className=\"text-[11px] font-medium text-muted-foreground\">{t('chat.tryAsking')}</span>\n {onDismiss && (\n <button\n type=\"button\"\n onClick={onDismiss}\n aria-label={t('chat.suggestions.hide')}\n className=\"ml-auto -mr-1 rounded-md p-1 text-muted-foreground/60 transition-colors hover:bg-muted hover:text-foreground\"\n >\n <X className=\"h-3 w-3\" />\n </button>\n )}\n </div>\n {visible.map((suggestion, i) => {\n const labelKey = `chat.suggestion.${suggestion.toolId}.${i}`\n const translated = t(labelKey)\n const label = translated === labelKey ? suggestion.label : translated\n return (\n <button\n key={`${suggestion.toolId}-${i}`}\n onClick={() => onSelect(suggestion)}\n className={cn(\n 'group flex items-center gap-2 rounded-xl border border-border/60 bg-muted/50 px-3 py-2 text-left',\n 'text-[12.5px] leading-snug text-muted-foreground shadow-sm transition-all duration-200',\n 'hover:border-primary/40 hover:bg-primary/[0.04] hover:text-foreground',\n 'focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring',\n )}\n >\n <span className=\"min-w-0 flex-1 truncate\">{label}</span>\n <ArrowUpRight className=\"h-3.5 w-3.5 shrink-0 text-muted-foreground/40 transition-colors group-hover:text-primary\" />\n </button>\n )\n })}\n </div>\n )\n}\n\n// --- Tools panel (shown via the header button) ------------------------------\n\ninterface ChatToolsPanelProps {\n toolGroups: ResolvedToolGroup[]\n onClose: () => void\n}\n\nexport function ChatToolsPanel({ toolGroups, onClose }: ChatToolsPanelProps) {\n const { t } = useTranslation()\n const totalTools = toolGroups.reduce((sum, g) => sum + g.tools.length, 0)\n\n return (\n <div className=\"min-h-0 flex-1 overflow-y-auto\">\n <div className=\"sticky top-0 z-10 flex items-center justify-between border-b border-border/40 bg-card/95 px-4 py-2 backdrop-blur\">\n <span className=\"text-[11px] font-semibold text-foreground\">\n {t('chat.toolsAvailable', { count: totalTools })}\n </span>\n <button\n onClick={onClose}\n className=\"rounded-md px-1.5 py-0.5 text-[11px] text-muted-foreground transition-colors hover:bg-muted hover:text-foreground\"\n >\n {t('common.done')}\n </button>\n </div>\n\n <AutoApprovalsSection />\n\n <div className=\"flex flex-col gap-3 px-3 pb-4 pt-2\">\n {toolGroups.map((group) => (\n <div key={group.category} className=\"flex flex-col gap-0.5\">\n <span className=\"px-1 text-[10px] font-semibold uppercase tracking-wider text-muted-foreground/50\">\n {group.category}\n </span>\n {group.tools.map(({ tool, signature }) => {\n const ModeIcon = tool.mode === 'persist' ? Pencil : BookOpen\n return (\n <div\n key={tool.id}\n className=\"flex items-start gap-1.5 rounded-md px-2 py-1 transition-colors hover:bg-muted/50\"\n title={tool.description}\n >\n <ModeIcon\n className={cn(\n 'mt-0.5 h-3 w-3 shrink-0',\n tool.mode === 'persist' ? 'text-primary/50' : 'text-muted-foreground/40',\n )}\n />\n <div className=\"min-w-0\">\n <code className=\"text-[11px] font-mono text-muted-foreground\">{signature}</code>\n {tool.description && (\n <p className=\"truncate text-[10px] leading-tight text-muted-foreground/40\">\n {tool.description}\n </p>\n )}\n </div>\n </div>\n )\n })}\n </div>\n ))}\n </div>\n </div>\n )\n}\n\n/**\n * Where \"always allow\" goes to be taken back. A standing permission the user\n * cannot find and revoke is not a permission — it is a surprise.\n */\nfunction AutoApprovalsSection() {\n const { t } = useTranslation()\n const [rules, setRules] = React.useState<AutoApprovalRule[]>(() => listAutoApprovals())\n\n React.useEffect(() => subscribeAutoApprovals(() => setRules(listAutoApprovals())), [])\n\n if (!rules.length) return null\n\n return (\n <div className=\"border-b border-border/40 px-3 py-2.5\">\n <div className=\"flex items-center gap-1.5 px-1 pb-1.5\">\n <InfinityIcon className=\"h-3 w-3 text-primary/70\" />\n <span className=\"text-[10px] font-semibold uppercase tracking-wider text-muted-foreground\">\n {t('chat.autoApprovals.title')}\n </span>\n <button\n type=\"button\"\n onClick={() => revokeAllAutoApprovals()}\n className=\"ml-auto rounded-md px-1.5 py-0.5 text-[10px] text-muted-foreground transition-colors hover:bg-muted hover:text-destructive\"\n >\n {t('chat.autoApprovals.revokeAll')}\n </button>\n </div>\n <div className=\"flex flex-col gap-0.5\">\n {rules.map((rule) => (\n <div\n key={rule.key}\n className=\"flex items-center gap-2 rounded-md bg-muted/40 px-2 py-1\"\n >\n <span className=\"min-w-0 flex-1 truncate text-[11.5px] text-foreground\">{rule.label}</span>\n <button\n type=\"button\"\n onClick={() => revokeAutoApproval(rule.key)}\n aria-label={t('chat.autoApprovals.revoke')}\n title={t('chat.autoApprovals.revoke')}\n className=\"rounded p-1 text-muted-foreground/60 transition-colors hover:bg-destructive/10 hover:text-destructive\"\n >\n <Trash2 className=\"h-3 w-3\" />\n </button>\n </div>\n ))}\n </div>\n </div>\n )\n}\n","/**\n * Marks for clients the product recognises.\n *\n * Two ways to match, and they are not equally trustworthy:\n *\n * - **by origin** — the `client_id` is a URL whose metadata document we\n * fetched from that very origin (CIMD). The origin is the one part of an\n * identity nobody can simply type.\n * - **by name** — self-declared. A client that registers itself (DCR, which\n * is what the Claude Code CLI does today) types its own `client_name`.\n *\n * Name matching is enabled deliberately, so a recognised product looks like\n * itself instead of a grey initial. The tradeoff is real and is handled in the\n * screen rather than here: a client whose identity was not attested still\n * carries the line \"nome informado pelo próprio aplicativo\" next to its name,\n * so the mark never stands in for verification. Tightening this to\n * origin-only is a one-line change — drop `nameMatches` from the resolver.\n *\n * Inlined as data URIs so the asset cannot fail to load on an app served from\n * anywhere, and so a consent screen never fetches from a third-party origin.\n */\nexport const KNOWN_CLIENT_MARKS: Record<string, string> = {\n 'https://claude.ai': 'data:image/png;base64,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',\n 'https://www.claude.ai': 'data:image/png;base64,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',\n}\n\n/** Name fragments that identify a product, lowercased. */\nconst NAME_MATCHES: Array<{ match: RegExp; origin: string }> = [\n { match: /\\bclaude\\b/i, origin: 'https://claude.ai' },\n]\n\nfunction nameMatches(clientName: string | undefined): string | null {\n if (!clientName) return null\n const hit = NAME_MATCHES.find((n) => n.match.test(clientName))\n return hit ? KNOWN_CLIENT_MARKS[hit.origin] ?? null : null\n}\n\n/**\n * The mark to show for a client, or null.\n *\n * An attested origin wins; a recognised name is the fallback. The caller is\n * responsible for still telling the user when the identity was self-declared —\n * the mark is decoration, not evidence.\n */\nexport function knownClientMark(\n clientWebsite: string | undefined,\n verified: boolean,\n clientName?: string,\n): string | null {\n if (verified && clientWebsite) {\n try {\n const byOrigin = KNOWN_CLIENT_MARKS[new URL(clientWebsite).origin]\n if (byOrigin) return byOrigin\n } catch {\n // fall through to the name\n }\n }\n return nameMatches(clientName)\n}\n","import React from 'react'\nimport { Plug, Sparkles } from 'lucide-react'\nimport { ICON_MAP } from '@fayz-ai/ui'\nimport { knownClientMark } from './client-marks'\nimport type { UnifiedConnector } from './model'\n\n/**\n * The face of a connector, resolved the same way everywhere it appears.\n *\n * The built-in assistant wears the FAB's own look — theme colour and the same\n * wand — because it IS that assistant, and a different avatar would read as a\n * different thing. Everything else prefers its product mark: a connection the\n * user approved next to a logo should not turn into a grey initial once it is\n * in the list.\n *\n * Marks are tried in order and a failure just advances to the next candidate,\n * so a column of broken-image glyphs — which reads as the feature being broken\n * rather than one asset being unreachable — never happens.\n */\nexport function ConnectorMark({\n connector,\n size = 'md',\n}: {\n connector: UnifiedConnector\n size?: 'sm' | 'md'\n}) {\n const candidates = React.useMemo(() => markCandidates(connector), [connector.logoUrl, connector.name])\n const [attempt, setAttempt] = React.useState(0)\n\n // A different connector in the same slot starts its own attempt sequence.\n React.useEffect(() => setAttempt(0), [connector.id])\n\n const box = size === 'sm' ? 'h-9 w-9' : 'h-10 w-10'\n const glyph = size === 'sm' ? 'h-4 w-4' : 'h-5 w-5'\n\n if (connector.builtIn) {\n return (\n <div className={`flex ${box} shrink-0 items-center justify-center rounded-full bg-primary text-primary-foreground shadow-sm`}>\n <Sparkles className={glyph} />\n </div>\n )\n }\n\n const mark = candidates[attempt]\n if (mark) {\n // No frame and no padding: these marks are square brand tiles that already\n // carry their own background, and a border around one is a frame around a\n // frame — it reads as a white gap rather than as a card.\n return (\n <div className={`${box} shrink-0 overflow-hidden rounded-lg`}>\n <img\n key={mark}\n src={mark}\n alt=\"\"\n className=\"h-full w-full object-cover\"\n onError={() => setAttempt((a) => a + 1)}\n />\n </div>\n )\n }\n\n const Icon = connector.icon ? (ICON_MAP[connector.icon] ?? Plug) : Plug\n return (\n <div className={`flex ${box} shrink-0 items-center justify-center rounded-lg border border-border bg-muted`}>\n <Icon className={`${glyph} text-muted-foreground`} />\n </div>\n )\n}\n\n/**\n * Where a mark can come from, best first.\n *\n * The app's own `/integrations/<file>` comes before the catalogue's absolute\n * URL on purpose: the catalogue serves its icons from the Fayz frontend, which\n * an app on another domain — or a dev machine without that frontend running —\n * may not reach, while every generated app ships the same files in `public/`.\n */\nfunction markCandidates(connector: UnifiedConnector): string[] {\n const out: string[] = []\n const raw = connector.logoUrl\n if (raw) {\n const path = assetPath(raw)\n if (path && typeof window !== 'undefined' && !raw.startsWith(window.location.origin)) out.push(path)\n out.push(raw)\n }\n const known = knownClientMark(connector.clientWebsite, connector.identityVerified === true, connector.name)\n if (known) out.push(known)\n return out\n}\n\n/** The `/integrations/foo.webp` part of a catalogue icon URL, if it is one. */\nfunction assetPath(url: string): string | null {\n if (url.startsWith('/')) return url\n if (url.startsWith('data:')) return null\n try {\n const { pathname } = new URL(url)\n return pathname.startsWith('/integrations/') ? pathname : null\n } catch {\n return null\n }\n}\n","import type { ConnectorDefinition, ConnectorPlane, ConnectorDirection, ConnectorAgentTool } from '@fayz-ai/core'\nimport { connectorPlanes, preferredPlane, connectorDirection } from '@fayz-ai/core'\n\n/**\n * One list, one noun.\n *\n * A \"conector\" and an \"integração\" were the same thing described from two\n * screens: the plugin's Integrações tab knew how to authorize a provider, and\n * Settings → Conectores knew what had been granted. Neither could answer the\n * question the person running the business actually asks — *o que está ligado\n * no meu negócio, e quem consegue fazer o quê?* — because each held half the\n * answer.\n *\n * So both surfaces now project onto this one view model. Four facets tell the\n * rows apart, and none of them justifies a second screen:\n *\n * - `direction` — quem alcança quem (o Claude lê minha agenda ↔ minha agenda\n * vai pro Google)\n * - `plane` — como a integração é honrada: entregue ao assistente (agêntica)\n * ou espelhada por uma esteira (sync)\n * - `hostPluginId` — qual plugin hospeda o conector (agenda, financeiro)\n * - `state` — o quanto dessa jornada já aconteceu\n */\n\nexport type { ConnectorPlane, ConnectorDirection, ConnectorAgentTool }\n\n/**\n * How far along the journey a connector is. The distinction between `ready`,\n * `catalog` and `soon` is the one worth being strict about: collapsing them is\n * how a catalogue turns into a promise, because only `ready` has somewhere real\n * to send the user.\n */\nexport type ConnectorState =\n /** Live — granted (inbound) or authorized (outbound). */\n | 'connected'\n /** Installed in this app: a plugin here contributes it, so it can be connected now. */\n | 'ready'\n /** The platform has it built, but this app lacks the plugin that hosts it. */\n | 'catalog'\n /** A catalogue entry with nothing behind it yet. */\n | 'soon'\n\nexport interface UnifiedConnector {\n /** Stable row key — connector id, catalog slug, or grant id. */\n id: string\n /** Catalog slug / connector id, used to match the three sources together. */\n slug: string\n name: string\n description?: string\n direction: ConnectorDirection\n /** Planes this connector can be honoured on. */\n planes: ConnectorPlane[]\n /** The plane it is running on right now (only meaningful when connected). */\n activePlane?: ConnectorPlane\n state: ConnectorState\n hostPluginId?: string\n category?: string\n /** Lucide icon name (installed connectors). */\n icon?: string\n /** Brand mark from the catalogue or the granting client. */\n logoUrl?: string\n /** Canonical entities the connector touches. */\n entities?: string[]\n /** How many record types it reaches, when the source only counts them. */\n entityCount?: number\n /** Tools the assistant gains — declared (outbound) or granted (inbound). */\n agentTools?: ConnectorAgentTool[]\n detail?: string\n docsUrl?: string\n\n // --- inbound grant extras (an external agent holding access to this org) ---\n builtIn?: boolean\n revocable?: boolean\n readOnly?: boolean\n scopes?: string[]\n grantedByMe?: boolean\n identityVerified?: boolean\n clientWebsite?: string\n createdAt?: string | null\n lastUsedAt?: string | null\n /** Runtime facts about a granted assistant (model, execution plane). */\n agentConfig?: AgentGrant['config']\n\n /** The live definition, when this app actually has the connector installed. */\n definition?: ConnectorDefinition\n}\n\n/** An inbound grant as the agent connections API returns it. */\nexport interface AgentGrant {\n id: string\n direction: 'inbound' | 'outbound'\n kind: string\n builtIn?: boolean\n revocable?: boolean\n clientName: string\n clientWebsite?: string\n clientLogoUri?: string\n identityVerified?: boolean\n description?: string | null\n enabled?: boolean\n scopes: string[]\n readOnly: boolean\n grantedByMe: boolean\n createdAt: string | null\n lastUsedAt: string | null\n config?: {\n model?: string | null\n channel?: { status: string; audience: string } | null\n executionPlane?: string\n }\n capabilities?: { entities: number; tools: string[] }\n}\n\n/** A row of the Fayz connector directory. */\nexport interface CatalogConnector {\n slug: string\n name: string\n description?: string\n category?: string\n enabled?: boolean\n logoUrl?: string\n iconUrl?: string\n /** Planes the platform declares for this provider, when it knows. */\n planes?: ConnectorPlane[]\n}\n\nexport const CATEGORY_LABELS: Record<string, string> = {\n scheduling: 'Agenda',\n payments: 'Pagamentos',\n ecommerce: 'Loja',\n messaging: 'Mensagens',\n analytics: 'Análise',\n database: 'Dados',\n ai: 'IA',\n automation: 'Automação',\n}\n\n/** The four the product leads with; the rest follow, in catalogue order. */\nexport const FEATURED = ['google-calendar', 'stripe', 'shopify', 'whatsapp']\n\n/** An installed connector plus the status the hub already resolved for it. */\nexport interface InstalledConnector {\n definition: ConnectorDefinition\n connected?: boolean\n detail?: string\n /** Plane reported by `getStatus()`; falls back to the preferred one. */\n plane?: ConnectorPlane\n}\n\nfunction fromInstalled(entry: InstalledConnector, catalog?: CatalogConnector): UnifiedConnector {\n const def = entry.definition\n const planes = connectorPlanes(def)\n return {\n id: def.id,\n slug: def.id,\n name: def.name,\n // The catalogue's copy wins: it is served in the user's locale, while a\n // definition carries whatever language its plugin author wrote it in.\n description: catalog?.description ?? def.description,\n direction: connectorDirection(def),\n planes,\n activePlane: entry.connected ? (entry.plane ?? preferredPlane(def)) : undefined,\n state: entry.connected ? 'connected' : 'ready',\n hostPluginId: def.hostPluginId,\n category: def.category ?? catalog?.category,\n icon: def.icon,\n logoUrl: def.logoUrl ?? catalog?.logoUrl ?? catalog?.iconUrl,\n entities: def.entities,\n agentTools: def.agentTools,\n detail: entry.detail,\n docsUrl: def.docsUrl,\n definition: def,\n }\n}\n\n/**\n * An inbound grant is agentic by construction: nothing was copied anywhere, an\n * assistant was handed tools over MCP. That is the same shape as an outbound\n * connector resolved on the agentic plane, which is exactly why they share a\n * list — `direction` is what tells them apart, not a separate page.\n */\nfunction fromGrant(grant: AgentGrant): UnifiedConnector {\n const tools = grant.capabilities?.tools ?? []\n return {\n id: grant.id,\n slug: grant.kind || grant.id,\n name: grant.clientName,\n description: grant.description ?? undefined,\n direction: grant.direction,\n planes: ['agentic'],\n activePlane: 'agentic',\n state: 'connected',\n logoUrl: grant.clientLogoUri,\n agentTools: tools.map((name) => ({ name })),\n entityCount: grant.capabilities?.entities,\n builtIn: grant.builtIn,\n revocable: grant.revocable,\n readOnly: grant.readOnly,\n scopes: grant.scopes,\n grantedByMe: grant.grantedByMe,\n identityVerified: grant.identityVerified,\n clientWebsite: grant.clientWebsite,\n createdAt: grant.createdAt,\n lastUsedAt: grant.lastUsedAt,\n agentConfig: grant.config,\n }\n}\n\nfunction fromCatalog(entry: CatalogConnector): UnifiedConnector {\n return {\n id: `catalog:${entry.slug}`,\n slug: entry.slug,\n name: entry.name,\n description: entry.description,\n direction: 'outbound',\n // The platform declares planes when it knows them. When it doesn't, saying\n // nothing beats guessing: the plane is decided by how the connector is\n // implemented, and a badge here would be a claim the catalogue can't back.\n planes: entry.planes ?? [],\n state: entry.enabled ? 'catalog' : 'soon',\n category: entry.category,\n logoUrl: entry.logoUrl ?? entry.iconUrl,\n }\n}\n\n/**\n * Merge the three sources into the single list both surfaces render.\n *\n * Installed connectors win over their catalogue twin — the catalogue only\n * lends them a brand mark — because the installed one is the copy with real\n * verbs behind it.\n */\nexport function buildConnectorList(input: {\n installed?: InstalledConnector[]\n grants?: AgentGrant[]\n catalog?: CatalogConnector[]\n}): UnifiedConnector[] {\n const catalogBySlug = new Map((input.catalog ?? []).map((c) => [c.slug, c]))\n const installed = (input.installed ?? []).map((e) => fromInstalled(e, catalogBySlug.get(e.definition.id)))\n const installedSlugs = new Set(installed.map((c) => c.slug))\n const grants = (input.grants ?? []).map(fromGrant)\n const rest = (input.catalog ?? []).filter((c) => !installedSlugs.has(c.slug)).map(fromCatalog)\n return sortConnectors([...grants, ...installed, ...rest])\n}\n\nconst STATE_RANK: Record<ConnectorState, number> = { connected: 0, ready: 1, catalog: 2, soon: 3 }\n\n/** Connected first, then what can be connected here, then the catalogue. */\nexport function sortConnectors(list: UnifiedConnector[]): UnifiedConnector[] {\n return [...list].sort((a, b) => {\n const byState = STATE_RANK[a.state] - STATE_RANK[b.state]\n if (byState !== 0) return byState\n const featured = (c: UnifiedConnector) => {\n const i = FEATURED.indexOf(c.slug)\n return i >= 0 ? i : FEATURED.length\n }\n const byFeatured = featured(a) - featured(b)\n if (byFeatured !== 0) return byFeatured\n return a.name.localeCompare(b.name)\n })\n}\n\nexport type ConnectorFilter = 'all' | 'connected' | 'agentic' | 'sync' | 'inbound' | 'outbound'\n\nexport function filterConnectors(\n list: UnifiedConnector[],\n filter: ConnectorFilter,\n query = '',\n): UnifiedConnector[] {\n const q = query.trim().toLowerCase()\n return list.filter((c) => {\n if (q && !`${c.name} ${c.slug} ${c.description ?? ''}`.toLowerCase().includes(q)) return false\n switch (filter) {\n case 'connected':\n return c.state === 'connected'\n case 'agentic':\n return c.planes.includes('agentic')\n case 'sync':\n return c.planes.includes('sync')\n case 'inbound':\n return c.direction === 'inbound'\n case 'outbound':\n return c.direction === 'outbound'\n default:\n return true\n }\n })\n}\n\n/** Deep link to where a connector is actually configured. */\nexport function connectorRoute(connector: UnifiedConnector): string {\n return connector.hostPluginId\n ? `/settings/${connector.hostPluginId}/_integrations`\n : '/settings/connectors'\n}\n","import React from 'react'\nimport { Sparkles, RefreshCw, ArrowDownLeft, ArrowUpRight, ChevronRight } from 'lucide-react'\nimport { useTranslation } from '../../hooks/useTranslation'\nimport { ConnectorMark } from './ConnectorMark'\nimport type { ConnectorPlane, ConnectorState, UnifiedConnector } from './model'\nimport { CATEGORY_LABELS } from './model'\n\n/**\n * How a connector is honoured, as a badge.\n *\n * Two planes, and the difference is the whole point of merging the screens: the\n * agentic one hands tools to the assistant and copies nothing; the sync one\n * keeps a mirror inside the app. The user does not need the words \"MCP\" or\n * \"webhook\" to make that choice — they need to know whether there will be a\n * copy of their data and whether it can go stale.\n */\nexport function PlaneBadge({ plane, active }: { plane: ConnectorPlane; active?: boolean }) {\n const { t } = useTranslation()\n const Icon = plane === 'agentic' ? Sparkles : RefreshCw\n return (\n <span\n className={\n 'inline-flex items-center gap-1 rounded-full px-2 py-0.5 text-[11px] ' +\n (active\n ? plane === 'agentic'\n ? 'bg-primary/10 text-primary'\n : 'bg-muted text-foreground'\n : 'border border-border text-muted-foreground')\n }\n >\n <Icon className=\"h-3 w-3\" />\n {t(`connectors.plane.${plane}`)}\n </span>\n )\n}\n\nexport function DirectionBadge({ direction }: { direction: 'inbound' | 'outbound' }) {\n const { t } = useTranslation()\n const Icon = direction === 'inbound' ? ArrowDownLeft : ArrowUpRight\n return (\n <span className=\"inline-flex items-center gap-1 rounded-full border border-border px-2 py-0.5 text-[11px] text-muted-foreground\">\n <Icon className=\"h-3 w-3\" />\n {t(`connectors.direction.${direction}`)}\n </span>\n )\n}\n\nconst STATE_TONE: Record<ConnectorState, string> = {\n connected: 'text-success',\n ready: 'text-foreground',\n catalog: 'text-muted-foreground',\n soon: 'text-muted-foreground',\n}\n\nexport function StateChip({ state }: { state: ConnectorState }) {\n const { t } = useTranslation()\n return <span className={`text-[11px] ${STATE_TONE[state]}`}>{t(`connectors.state.${state}`)}</span>\n}\n\n/**\n * One row of the unified list — inbound grant, installed connector or catalogue\n * entry, all the same shape. The row is the entry point of the journey: it says\n * what the thing is and how far along it is, and opening it is what explains\n * the rest.\n */\nexport function ConnectorRow({\n connector,\n onOpen,\n showHost = true,\n}: {\n connector: UnifiedConnector\n onOpen: (connector: UnifiedConnector) => void\n showHost?: boolean\n}) {\n const { t } = useTranslation()\n const category = connector.category ? (CATEGORY_LABELS[connector.category] ?? connector.category) : null\n // Once connected, only the live plane is worth showing — the alternatives are\n // a decision already made, and repeating them here reads as unfinished setup.\n const planes = connector.activePlane ? [connector.activePlane] : connector.planes\n\n return (\n <li>\n <button\n onClick={() => onOpen(connector)}\n className=\"flex w-full items-start gap-4 p-4 text-left transition-colors hover:bg-muted/40\"\n >\n <ConnectorMark connector={connector} />\n <div className=\"min-w-0 flex-1\">\n <div className=\"flex flex-wrap items-center gap-2\">\n <span className=\"font-medium text-foreground\">{connector.name}</span>\n {connector.builtIn && (\n <span className=\"rounded-full bg-primary/10 px-2 py-0.5 text-[11px] font-medium text-primary\">\n {t('connectors.builtIn')}\n </span>\n )}\n {planes.map((p) => (\n <PlaneBadge key={p} plane={p} active={!!connector.activePlane} />\n ))}\n <DirectionBadge direction={connector.direction} />\n {showHost && connector.hostPluginId && (\n <span className=\"rounded-full border border-border px-2 py-0.5 text-[11px] text-muted-foreground\">\n {connector.hostPluginId}\n </span>\n )}\n {!connector.hostPluginId && category && (\n <span className=\"rounded-full border border-border px-2 py-0.5 text-[11px] text-muted-foreground\">\n {category}\n </span>\n )}\n </div>\n {connector.description && (\n <p className=\"mt-0.5 line-clamp-1 text-xs text-muted-foreground\">{connector.description}</p>\n )}\n {connector.state === 'connected' && !connector.description && connector.detail && (\n <p className=\"mt-0.5 text-xs text-muted-foreground\">{connector.detail}</p>\n )}\n </div>\n <span className=\"flex shrink-0 items-center gap-2 pt-1\">\n <StateChip state={connector.state} />\n <ChevronRight className=\"h-4 w-4 text-muted-foreground\" />\n </span>\n </button>\n </li>\n )\n}\n","import React from 'react'\nimport {\n Sheet,\n SheetContent,\n SheetHeader,\n SheetTitle,\n SheetDescription,\n SheetBody,\n Button,\n} from '@fayz-ai/ui'\nimport { Sparkles, RefreshCw, Plug, Loader2, CheckCircle2, Power, ExternalLink, Info } from 'lucide-react'\nimport type { ConnectorPlane } from '@fayz-ai/core'\nimport { useTranslation } from '../../hooks/useTranslation'\nimport { toast } from '../notifications/ToastProvider'\nimport { ConnectorMark } from './ConnectorMark'\nimport { DirectionBadge, PlaneBadge, StateChip } from './ConnectorRow'\nimport type { UnifiedConnector } from './model'\n\n/**\n * The connector journey.\n *\n * Every connector — an assistant that reads this org over MCP, a provider the\n * app syncs with, an entry the catalogue merely lists — answers the same four\n * questions, in the same order:\n *\n * 1. o que ele faz → capabilities, before any credential is asked for\n * 2. como ele vai resolver → the plane, agentic first when the provider allows\n * 3. autorizar → OAuth, credentials, or the honest reason there is\n * no button yet\n * 4. o que muda depois → the tools the assistant gained, or the pipeline\n * that now runs\n *\n * Steps 1 and 2 come before step 3 deliberately. Asking for a credential before\n * the person knows what the thing will be allowed to do is how consent screens\n * become a formality.\n *\n * It renders inside the assistant (`ConnectorsPanel` — the drawer one button\n * after the tools one), because connectors are what the agent can reach. The\n * Sheet below is the fallback for apps with no assistant mounted.\n */\n\nfunction Step({\n n,\n title,\n children,\n muted,\n}: {\n n: number\n title: string\n children: React.ReactNode\n muted?: boolean\n}) {\n return (\n <section className={muted ? 'opacity-60' : undefined}>\n <div className=\"flex items-center gap-2\">\n <span className=\"flex h-5 w-5 items-center justify-center rounded-full bg-muted text-[11px] font-semibold text-muted-foreground\">\n {n}\n </span>\n <h3 className=\"text-sm font-semibold text-foreground\">{title}</h3>\n </div>\n <div className=\"mt-2 pl-7\">{children}</div>\n </section>\n )\n}\n\n/**\n * The plane choice.\n *\n * Agentic is preselected whenever the connector supports it — that is the house\n * rule, and the card says why rather than leaving it as a silent default. When\n * a connector supports only one plane, the card still shows the reason: \"esse\n * provedor precisa de espelho\" is information, an invisible constraint is not.\n */\nfunction PlanePicker({\n planes,\n value,\n onChange,\n locked,\n}: {\n planes: ConnectorPlane[]\n value?: ConnectorPlane\n onChange?: (plane: ConnectorPlane) => void\n locked?: boolean\n}) {\n const { t } = useTranslation()\n if (planes.length === 0) {\n return (\n <p className=\"rounded-lg border border-dashed border-border p-3 text-xs text-muted-foreground\">\n {t('connectors.plane.undecided')}\n </p>\n )\n }\n return (\n <div className=\"grid gap-2 sm:grid-cols-2\">\n {planes.map((plane) => {\n const Icon = plane === 'agentic' ? Sparkles : RefreshCw\n const selected = value === plane\n const only = planes.length === 1\n return (\n <button\n key={plane}\n type=\"button\"\n disabled={locked || only}\n onClick={() => onChange?.(plane)}\n className={\n 'rounded-lg border p-3 text-left transition-colors ' +\n (selected ? 'border-primary bg-primary/5' : 'border-border hover:bg-muted/40') +\n (locked || only ? ' cursor-default' : '')\n }\n >\n <span className=\"flex items-center gap-1.5 text-sm font-medium text-foreground\">\n <Icon className=\"h-3.5 w-3.5\" />\n {t(`connectors.plane.${plane}`)}\n {plane === 'agentic' && !only && (\n <span className=\"rounded-full bg-primary/10 px-1.5 py-px text-[10px] font-normal text-primary\">\n {t('connectors.plane.recommended')}\n </span>\n )}\n </span>\n <span className=\"mt-1 block text-xs text-muted-foreground\">\n {t(`connectors.plane.${plane}.desc`)}\n </span>\n </button>\n )\n })}\n </div>\n )\n}\n\n/** Mark, name and badges — the same identity in the rail and in the sheet. */\nexport function ConnectorHeading({ connector }: { connector: UnifiedConnector }) {\n return (\n <div className=\"flex items-start gap-3\">\n <ConnectorMark connector={connector} />\n <div className=\"min-w-0\">\n <p className=\"font-semibold text-foreground\">{connector.name}</p>\n {connector.description && (\n <p className=\"mt-0.5 text-xs text-muted-foreground\">{connector.description}</p>\n )}\n <div className=\"mt-2 flex flex-wrap items-center gap-1.5\">\n <StateChip state={connector.state} />\n <DirectionBadge direction={connector.direction} />\n {(connector.activePlane ? [connector.activePlane] : connector.planes).map((p) => (\n <PlaneBadge key={p} plane={p} active={!!connector.activePlane} />\n ))}\n </div>\n </div>\n </div>\n )\n}\n\nexport function ConnectorJourney({\n connector,\n onChanged,\n onRevoke,\n}: {\n connector: UnifiedConnector\n /** Something was connected/disconnected — the list should reload. */\n onChanged?: () => void\n /** Revoking an inbound grant goes through the screen that owns the API. */\n onRevoke?: (connector: UnifiedConnector) => Promise<void> | void\n}) {\n const { t } = useTranslation()\n const def = connector.definition\n const [plane, setPlane] = React.useState<ConnectorPlane | undefined>()\n const [values, setValues] = React.useState<Record<string, string>>({})\n const [busy, setBusy] = React.useState<'test' | 'save' | 'oauth' | 'off' | 'plane' | null>(null)\n\n React.useEffect(() => {\n setValues({})\n setBusy(null)\n setPlane(\n connector.activePlane ??\n (connector.planes.includes('agentic') ? 'agentic' : connector.planes[0]),\n )\n }, [connector.id])\n\n const connected = connector.state === 'connected'\n const isSync = plane === 'sync'\n\n async function run(kind: NonNullable<typeof busy>, fn: () => Promise<unknown>, okMessage?: string) {\n setBusy(kind)\n try {\n await fn()\n if (okMessage) toast.success(okMessage)\n onChanged?.()\n } catch (e: any) {\n toast.error(e?.message ?? t('common.error'))\n } finally {\n setBusy(null)\n }\n }\n\n return (\n <div className=\"space-y-6\">\n {/* 1 — what it can do, stated before anything is asked for */}\n <Step n={1} title={t('connectors.journey.what')}>\n <Capabilities connector={connector} />\n </Step>\n\n {/* 2 — how it will be honoured */}\n <Step n={2} title={t('connectors.journey.how')}>\n <div className=\"space-y-2\">\n <PlanePicker\n planes={connector.planes}\n value={plane}\n locked={connected && !def?.setPlane}\n onChange={(next) => {\n if (!connected) return setPlane(next)\n if (!def?.setPlane) return\n void run('plane', async () => {\n await def.setPlane!(next)\n setPlane(next)\n }, t('connectors.plane.switched'))\n }}\n />\n {connected && connector.planes.length > 1 && !def?.setPlane && (\n <p className=\"text-[11px] text-muted-foreground\">{t('connectors.plane.lockedHint')}</p>\n )}\n </div>\n </Step>\n\n {/* 3 — authorize, or the honest reason there is nothing to press */}\n <Step n={3} title={t(connected ? 'connectors.journey.access' : 'connectors.journey.authorize')}>\n {connector.state === 'soon' && (\n <Note>{t('connectors.soonBody')}</Note>\n )}\n\n {connector.state === 'catalog' && (\n <Note>{t('connectors.needsPlugin')}</Note>\n )}\n\n {def && !connected && (\n <ConnectPanel\n connector={connector}\n values={values}\n setValues={setValues}\n busy={busy}\n run={run}\n />\n )}\n\n {connected && connector.definition && (\n <div className=\"flex flex-wrap items-center gap-2\">\n <span className=\"inline-flex items-center gap-1 text-xs text-success\">\n <CheckCircle2 className=\"h-3.5 w-3.5\" /> {t('connectors.connected')}\n </span>\n {connector.detail && <span className=\"text-xs text-muted-foreground\">· {connector.detail}</span>}\n {connector.definition.disconnect && (\n <Button\n variant=\"outline\"\n size=\"sm\"\n disabled={busy === 'off'}\n onClick={() =>\n run('off', () => connector.definition!.disconnect!(), t('connectors.disconnect'))\n }\n >\n {busy === 'off' ? <Loader2 className=\"h-3.5 w-3.5 animate-spin\" /> : <Power className=\"h-3.5 w-3.5\" />}\n {t('connectors.disconnect')}\n </Button>\n )}\n </div>\n )}\n\n {connected && !connector.definition && (\n <GrantAccess connector={connector} onRevoke={onRevoke} />\n )}\n </Step>\n\n {/* 4 — what changed, or what will */}\n <Step n={4} title={t('connectors.journey.after')} muted={!connected}>\n {connected ? (\n <div className=\"space-y-3\">\n {connector.definition?.ExtraPanel && isSync && <connector.definition.ExtraPanel />}\n {connector.activePlane === 'agentic' && (\n <p className=\"text-xs text-muted-foreground\">{t('connectors.after.agentic')}</p>\n )}\n </div>\n ) : (\n <p className=\"text-xs text-muted-foreground\">\n {t(plane === 'agentic' ? 'connectors.after.willAgentic' : 'connectors.after.willSync')}\n </p>\n )}\n </Step>\n\n {connector.docsUrl && (\n <a\n href={connector.docsUrl}\n target=\"_blank\"\n rel=\"noreferrer\"\n className=\"inline-flex items-center gap-1 text-xs text-muted-foreground hover:text-foreground\"\n >\n <ExternalLink className=\"h-3 w-3\" /> {t('connectors.docs')}\n </a>\n )}\n </div>\n )\n}\n\n/**\n * The journey as a right-hand sheet — the fallback surface.\n *\n * Apps with an assistant show this inside the rail instead, next to the chat:\n * a connector is a capability of the agent, so it belongs in the agent's own\n * column rather than in a panel that floats over the page. This wrapper is what\n * an app without that rail falls back to, so the journey is never unreachable.\n */\nexport function ConnectorDetail({\n connector,\n open,\n onOpenChange,\n onChanged,\n onRevoke,\n}: {\n connector: UnifiedConnector | null\n open: boolean\n onOpenChange: (open: boolean) => void\n onChanged?: () => void\n onRevoke?: (connector: UnifiedConnector) => Promise<void> | void\n}) {\n if (!connector) return null\n return (\n <Sheet open={open} onOpenChange={onOpenChange}>\n <SheetContent width=\"max-w-lg\">\n <SheetHeader>\n <SheetTitle className=\"sr-only\">{connector.name}</SheetTitle>\n <SheetDescription className=\"sr-only\">{connector.description ?? connector.name}</SheetDescription>\n <ConnectorHeading connector={connector} />\n </SheetHeader>\n <SheetBody>\n <ConnectorJourney connector={connector} onChanged={onChanged} onRevoke={onRevoke} />\n </SheetBody>\n </SheetContent>\n </Sheet>\n )\n}\n\nfunction Note({ children }: { children: React.ReactNode }) {\n return (\n <p className=\"flex items-start gap-2 rounded-lg border border-dashed border-border p-3 text-xs text-muted-foreground\">\n <Info className=\"mt-px h-3.5 w-3.5 shrink-0\" />\n <span>{children}</span>\n </p>\n )\n}\n\n/** What the connector reaches — entities, tools, scopes. */\nfunction Capabilities({ connector }: { connector: UnifiedConnector }) {\n const { t } = useTranslation()\n const entityCount = connector.entityCount ?? connector.entities?.length\n const tools = connector.agentTools ?? []\n\n return (\n <div className=\"space-y-2 text-xs text-muted-foreground\">\n {connector.direction === 'inbound' && (\n <p>\n {connector.readOnly ? t('connectors.readOnly') : t('connectors.readWrite')}\n {typeof entityCount === 'number' && entityCount > 0\n ? ` · ${t('connectors.entitiesCount', { count: entityCount })}`\n : ''}\n {connector.agentConfig?.model ? ` · ${connector.agentConfig.model}` : ''}\n </p>\n )}\n\n {connector.direction === 'outbound' && connector.entities?.length ? (\n <p>{t('connectors.entitiesList', { list: connector.entities.join(', ') })}</p>\n ) : null}\n\n {tools.length > 0 && (\n <div>\n <p className=\"mb-1\">{t('connectors.tools')}</p>\n <div className=\"flex flex-wrap gap-1\">\n {tools.map((tool) => (\n <span\n key={tool.name}\n title={tool.description}\n className=\"rounded border border-border px-1.5 py-0.5 font-mono text-[10px]\"\n >\n {tool.name}\n </span>\n ))}\n </div>\n </div>\n )}\n\n {connector.scopes && connector.scopes.length > 0 && (\n <div className=\"flex flex-wrap gap-1\">\n {connector.scopes.map((s) => (\n <span key={s} className=\"rounded bg-muted px-1.5 py-0.5 font-mono text-[10px]\">\n {s}\n </span>\n ))}\n </div>\n )}\n\n {tools.length === 0 && !connector.entities?.length && typeof entityCount !== 'number' && (\n <p>{t('connectors.capabilitiesUnknown')}</p>\n )}\n </div>\n )\n}\n\n/** OAuth button or the declarative credential form — whichever the connector declared. */\nfunction ConnectPanel({\n connector,\n values,\n setValues,\n busy,\n run,\n}: {\n connector: UnifiedConnector\n values: Record<string, string>\n setValues: React.Dispatch<React.SetStateAction<Record<string, string>>>\n busy: string | null\n run: (kind: any, fn: () => Promise<unknown>, ok?: string) => Promise<void>\n}) {\n const { t } = useTranslation()\n const def = connector.definition!\n\n if (def.authKind === 'oauth') {\n return (\n <Button\n disabled={busy === 'oauth' || !def.startOAuth}\n onClick={() =>\n run('oauth', async () => {\n const url = await def.startOAuth!(window.location.href)\n window.location.href = url\n })\n }\n >\n {busy === 'oauth' ? <Loader2 className=\"h-4 w-4 animate-spin\" /> : <Plug className=\"h-4 w-4\" />}\n {`${t('connectors.connect')} ${def.name}`}\n </Button>\n )\n }\n\n return (\n <div className=\"space-y-3\">\n <div className=\"grid gap-3 sm:grid-cols-2\">\n {(def.fields ?? []).map((f) => (\n <label key={f.key} className=\"block\">\n <span className=\"text-xs font-medium text-muted-foreground\">{f.label}</span>\n <input\n type={f.type}\n value={values[f.key] ?? ''}\n onChange={(e) => setValues((v) => ({ ...v, [f.key]: e.target.value }))}\n placeholder={f.placeholder}\n className=\"mt-1 w-full rounded-input border border-input bg-card px-3 py-2 text-sm focus:outline-none focus:ring-2 focus:ring-ring\"\n />\n </label>\n ))}\n </div>\n <div className=\"flex gap-2\">\n {def.testConnection && (\n <Button\n variant=\"outline\"\n size=\"sm\"\n disabled={busy === 'test'}\n onClick={() =>\n run('test', async () => {\n const res = await def.testConnection!(values)\n if (!res.ok) throw new Error(res.message ?? t('common.error'))\n toast.success(res.message ?? t('connectors.connected'))\n })\n }\n >\n {busy === 'test' ? <Loader2 className=\"h-3.5 w-3.5 animate-spin\" /> : <Plug className=\"h-3.5 w-3.5\" />}\n {t('connectors.test')}\n </Button>\n )}\n {def.saveConnection && (\n <Button\n size=\"sm\"\n disabled={busy === 'save'}\n onClick={() => run('save', () => def.saveConnection!(values), t('connectors.save'))}\n >\n {busy === 'save' ? <Loader2 className=\"h-3.5 w-3.5 animate-spin\" /> : <CheckCircle2 className=\"h-3.5 w-3.5\" />}\n {t('connectors.save')}\n </Button>\n )}\n </div>\n </div>\n )\n}\n\n/** An inbound grant: when it was approved, who by, and the way back out. */\nfunction GrantAccess({\n connector,\n onRevoke,\n}: {\n connector: UnifiedConnector\n onRevoke?: (connector: UnifiedConnector) => Promise<void> | void\n}) {\n const { t } = useTranslation()\n const [revoking, setRevoking] = React.useState(false)\n\n return (\n <div className=\"space-y-2\">\n <p className=\"text-xs text-muted-foreground\">\n {connector.createdAt ? t('connectors.connectedOn', { date: formatDate(connector.createdAt) }) : '—'}\n {' · '}\n {connector.lastUsedAt ? t('connectors.lastUsed', { when: formatRelative(connector.lastUsedAt) }) : t('connectors.neverUsed')}\n {connector.grantedByMe === false && ` · ${t('connectors.grantedByOther')}`}\n </p>\n {connector.revocable !== false ? (\n <Button\n variant=\"outline\"\n size=\"sm\"\n disabled={revoking}\n onClick={async () => {\n setRevoking(true)\n try {\n await onRevoke?.(connector)\n } finally {\n setRevoking(false)\n }\n }}\n className=\"text-destructive\"\n >\n {revoking ? <Loader2 className=\"h-3.5 w-3.5 animate-spin\" /> : <Power className=\"h-3.5 w-3.5\" />}\n {t('connectors.disconnect')}\n </Button>\n ) : (\n // No button rather than a disabled one: the assistant is part of the\n // product, and turning it off is a project setting. A greyed\n // \"Desconectar\" would read as something the user could fix.\n <p className=\"text-xs text-muted-foreground\">{t('connectors.partOfApp')}</p>\n )}\n </div>\n )\n}\n\nfunction formatDate(iso: string): string {\n return new Date(iso).toLocaleDateString(undefined, { day: '2-digit', month: 'short', year: 'numeric' })\n}\n\nfunction formatRelative(iso: string): string {\n const diff = Date.now() - new Date(iso).getTime()\n const minutes = Math.round(diff / 60_000)\n if (minutes < 1) return 'agora'\n if (minutes < 60) return `há ${minutes} min`\n const hours = Math.round(minutes / 60)\n if (hours < 24) return `há ${hours} h`\n const days = Math.round(hours / 24)\n if (days < 30) return `há ${days} d`\n return formatDate(iso)\n}\n","import React from 'react'\nimport { usePluginRuntimeOptional } from '@fayz-ai/core'\nimport type { ConnectorDefinition } from '@fayz-ai/core'\nimport { getFayzSupabaseClientOptional } from '../../data/client'\nimport { resolveFayzAgentConnection } from '../../lib/fayz-agent'\nimport { useTenantOptional } from '../../org/context'\nimport {\n buildConnectorList,\n type AgentGrant,\n type CatalogConnector,\n type InstalledConnector,\n type UnifiedConnector,\n} from './model'\n\n/**\n * One loader for both surfaces.\n *\n * Settings → Conectores and a plugin's Integrações tab are the same list seen\n * from two distances, so they must read the same rows — same id, same brand\n * mark, same journey. Two loaders would be two answers to \"o Google Calendar\n * está ligado?\", and the one the user happened to open would decide which is\n * true.\n */\n\n// The catalogue is global and immutable per session; fetching it once keeps a\n// plugin tab from re-hitting the platform every time it mounts.\nlet catalogPromise: Promise<CatalogConnector[]> | null = null\n\nfunction loadCatalog(): Promise<CatalogConnector[]> {\n if (catalogPromise) return catalogPromise\n const connection = resolveFayzAgentConnection()\n if (!connection) return Promise.resolve([])\n catalogPromise = fetch(`${connection.apiBaseUrl}/connectors?locale=pt-BR`)\n .then(async (response) => {\n const body = (await response.json()) as CatalogConnector[] | { connectors?: CatalogConnector[] }\n return Array.isArray(body) ? body : (body.connectors ?? [])\n })\n .catch(() => {\n catalogPromise = null // a network blip shouldn't poison the session\n return []\n })\n return catalogPromise\n}\n\nexport function useConnectorCatalog(): CatalogConnector[] | null {\n const [catalog, setCatalog] = React.useState<CatalogConnector[] | null>(null)\n React.useEffect(() => {\n let cancelled = false\n void loadCatalog().then((list) => {\n if (!cancelled) setCatalog(list)\n })\n return () => {\n cancelled = true\n }\n }, [])\n return catalog\n}\n\n/** Connector definitions this app has installed, optionally scoped to one host plugin. */\nfunction useInstalledDefinitions(hostPluginId?: string): ConnectorDefinition[] {\n const runtime = usePluginRuntimeOptional()\n return React.useMemo(() => {\n const byHost = runtime?.connectorsByHost\n if (!byHost) return []\n if (hostPluginId) return byHost.get(hostPluginId) ?? []\n return [...byHost.values()].flat()\n }, [runtime, hostPluginId])\n}\n\nexport interface ConnectorsView {\n connectors: UnifiedConnector[] | null\n error: string | null\n reload: () => void\n /** Withdraw an inbound grant. Resolves once the row is gone. */\n revokeGrant: (connector: UnifiedConnector) => Promise<void>\n /** No Fayz project behind this app — the inbound half simply doesn't exist. */\n agentAvailable: boolean\n tenantReady: boolean\n}\n\n/**\n * Builds the unified list: inbound grants (what reaches this org) + installed\n * connectors (what this app reaches) + the Fayz catalogue (what it could).\n */\nexport function useConnectors(options: {\n hostPluginId?: string\n /** Include the inbound grants — the plugin-scoped view leaves them out. */\n includeGrants?: boolean\n /** Include catalogue rows this app can't connect yet. */\n includeCatalog?: boolean\n} = {}): ConnectorsView {\n const { hostPluginId, includeGrants = true, includeCatalog = true } = options\n const definitions = useInstalledDefinitions(hostPluginId)\n const catalog = useConnectorCatalog()\n const tenant = useTenantOptional()\n const tenantId = tenant?.org?.id\n const connection = React.useMemo(() => resolveFayzAgentConnection(), [])\n\n const [installed, setInstalled] = React.useState<InstalledConnector[] | null>(null)\n const [grants, setGrants] = React.useState<AgentGrant[] | null>(null)\n const [error, setError] = React.useState<string | null>(null)\n const [nonce, setNonce] = React.useState(0)\n\n const call = React.useCallback(\n async (path: string, init?: RequestInit): Promise<Response> => {\n if (!connection) throw new Error('Este app não está ligado a um projeto Fayz.')\n const supabase = getFayzSupabaseClientOptional()\n const session = (await supabase?.auth.getSession())?.data.session\n if (!session?.access_token) throw new Error('Sessão expirada — entre de novo.')\n return fetch(\n `${connection.apiBaseUrl}/public/projects/${connection.projectId}/agents/connections${path}`,\n {\n ...init,\n headers: {\n ...(init?.headers ?? {}),\n Authorization: `Bearer ${session.access_token}`,\n 'Content-Type': 'application/json',\n },\n },\n )\n },\n [connection],\n )\n\n // Each connector reports its own status; one that throws is \"not connected\"\n // rather than a broken list.\n React.useEffect(() => {\n let cancelled = false\n void Promise.all(\n definitions.map(async (definition): Promise<InstalledConnector> => {\n try {\n const status = await definition.getStatus()\n return { definition, connected: status.connected, detail: status.detail, plane: status.plane }\n } catch {\n return { definition, connected: false }\n }\n }),\n ).then((list) => {\n if (!cancelled) setInstalled(list)\n })\n return () => {\n cancelled = true\n }\n }, [definitions, nonce])\n\n React.useEffect(() => {\n if (!includeGrants || !connection || !tenantId) {\n setGrants(includeGrants ? null : [])\n return\n }\n let cancelled = false\n ;(async () => {\n try {\n const response = await call(`?tenantId=${encodeURIComponent(tenantId)}`)\n const body = (await response.json()) as { connections?: AgentGrant[]; message?: string }\n if (cancelled) return\n if (!response.ok) {\n setError(body.message ?? 'Não foi possível carregar as conexões.')\n setGrants([])\n return\n }\n setGrants(body.connections ?? [])\n setError(null)\n } catch (e) {\n if (!cancelled) {\n setError((e as Error).message)\n setGrants([])\n }\n }\n })()\n return () => {\n cancelled = true\n }\n }, [call, tenantId, includeGrants, connection, nonce])\n\n const revokeGrant = React.useCallback(\n async (connector: UnifiedConnector) => {\n const response = await call(`/${connector.id}`, { method: 'DELETE' })\n if (!response.ok) {\n const body = (await response.json().catch(() => ({}))) as { message?: string }\n throw new Error(body.message ?? 'Não foi possível desconectar.')\n }\n setGrants((current) => (current ?? []).filter((g) => g.id !== connector.id))\n },\n [call],\n )\n\n const waitingGrants = includeGrants && !!connection && !!tenantId && grants === null\n const connectors = React.useMemo(() => {\n if (installed === null || waitingGrants) return null\n return buildConnectorList({\n installed,\n grants: includeGrants ? (grants ?? []) : [],\n catalog: includeCatalog ? (catalog ?? []) : [],\n })\n }, [installed, grants, catalog, includeGrants, includeCatalog, waitingGrants])\n\n return {\n connectors,\n error,\n reload: () => setNonce((n) => n + 1),\n revokeGrant,\n agentAvailable: !!connection,\n tenantReady: !!tenantId,\n }\n}\n","import React from 'react'\nimport { create } from 'zustand'\nimport { ChevronLeft, Search } from 'lucide-react'\nimport { Skeleton } from '@fayz-ai/ui'\nimport { useTranslation } from '../../hooks/useTranslation'\nimport { useRightRailStore } from '../right-rail'\nimport { useChatStore } from '../../stores/chat.store'\nimport { ConnectorMark } from './ConnectorMark'\nimport { PlaneBadge, StateChip } from './ConnectorRow'\nimport { ConnectorHeading, ConnectorJourney } from './ConnectorDetail'\nimport { useConnectors } from './useConnectors'\nimport { filterConnectors, type UnifiedConnector } from './model'\n\n/**\n * Conectores, inside the assistant.\n *\n * A connector is not a settings chore that happens elsewhere — it is what the\n * assistant can reach. So it lives where the assistant's own capabilities\n * already live: the chat panel, one button after the tools drawer. Settings →\n * Conectores keeps the inventory (the list you audit and revoke from) and\n * opening a row raises the assistant with this drawer already on that\n * connector.\n *\n * Two views in the drawer:\n * - the list: what this organization has, then what Fayz offers\n * - the journey: what a connector does, how it resolves, and how to authorize\n */\n\ninterface ConnectorsSurfaceState {\n /** Connector being shown; null means the list. */\n selected: string | null\n /**\n * A screen asked for this drawer and the chat hasn't opened it yet. A flag\n * rather than a counter because the request usually lands BEFORE the chat\n * panel mounts — the rail has to open first — so the chat has to find the\n * request waiting for it, not miss an edge it wasn't around for.\n */\n pending: boolean\n select: (id: string | null) => void\n open: (id: string | null) => void\n consume: () => void\n}\n\nexport const useConnectorsSurface = create<ConnectorsSurfaceState>((set) => ({\n selected: null,\n pending: false,\n select: (selected) => set({ selected }),\n open: (selected) => set({ selected, pending: true }),\n consume: () => set({ pending: false }),\n}))\n\n/** Raise the assistant with the connectors drawer open, on a connector or the list. */\nexport function openConnectorsPanel(connector?: UnifiedConnector | null): void {\n useConnectorsSurface.getState().open(connector?.id ?? null)\n // Both doors to the same panel: the rail owns it on desktop, the chat store on\n // the mobile/dock surface. Opening both is idempotent and covers either shell.\n useRightRailStore.getState().openPanel('chat')\n useChatStore.getState().setOpen(true)\n}\n\n/** Whether the assistant is mounted and can host the journey. */\nexport function useConnectorsPanelAvailable(): boolean {\n return useRightRailStore((s) => s.mounted && s.panels.some((p) => p.id === 'chat'))\n}\n\nexport function ConnectorsPanel({ onClose }: { onClose: () => void }) {\n const { t } = useTranslation()\n // Everything loads, but only outbound connectors are LISTED: inside the\n // assistant, a connector is something IT reaches — an inbound grant is\n // someone else reaching this organization, which is a consent decision and\n // belongs on the settings screen. Grants still load because Settings can send\n // one straight here, and a journey that couldn't resolve what it was asked to\n // show would silently bounce the user back to the list.\n const { connectors, reload, revokeGrant, agentAvailable, tenantReady } = useConnectors()\n const selectedId = useConnectorsSurface((s) => s.selected)\n const select = useConnectorsSurface((s) => s.select)\n const [query, setQuery] = React.useState('')\n const [failure, setFailure] = React.useState<string | null>(null)\n\n const selected = React.useMemo(\n () => (connectors ?? []).find((c) => c.id === selectedId) ?? null,\n [connectors, selectedId],\n )\n\n const filtered = React.useMemo(\n () => filterConnectors(connectors ?? [], 'outbound', query),\n [connectors, query],\n )\n const mine = filtered.filter((c) => c.state === 'connected' || c.state === 'ready')\n const offered = filtered.filter((c) => c.state === 'catalog' || c.state === 'soon')\n\n return (\n <div className=\"min-h-0 flex-1 overflow-y-auto\">\n <div className=\"sticky top-0 z-10 flex items-center justify-between gap-2 border-b border-border/40 bg-card/95 px-3 py-2 backdrop-blur\">\n {selected ? (\n <button\n onClick={() => select(null)}\n className=\"inline-flex min-w-0 items-center gap-1 rounded-md px-1 py-0.5 text-[11px] text-muted-foreground transition-colors hover:bg-muted hover:text-foreground\"\n >\n <ChevronLeft className=\"h-3.5 w-3.5 shrink-0\" />\n <span className=\"truncate\">{t('settings.connectors')}</span>\n </button>\n ) : (\n <span className=\"text-[11px] font-semibold text-foreground\">{t('settings.connectors')}</span>\n )}\n <button\n onClick={onClose}\n className=\"rounded-md px-1.5 py-0.5 text-[11px] text-muted-foreground transition-colors hover:bg-muted hover:text-foreground\"\n >\n {t('common.done')}\n </button>\n </div>\n\n {!agentAvailable || !tenantReady ? (\n <p className=\"p-4 text-sm text-muted-foreground\">\n {t(agentAvailable ? 'connectors.noOrgBody' : 'connectors.noProjectBody')}\n </p>\n ) : selected ? (\n <div className=\"space-y-4 p-3\">\n <ConnectorHeading connector={selected} />\n {failure && <p className=\"text-xs text-destructive\">{failure}</p>}\n <ConnectorJourney\n connector={selected}\n onChanged={reload}\n onRevoke={async (connector) => {\n if (!window.confirm(t('connectors.revokeConfirm', { name: connector.name }))) return\n try {\n await revokeGrant(connector)\n select(null)\n } catch (e) {\n setFailure((e as Error).message)\n }\n }}\n />\n </div>\n ) : (\n <>\n <div className=\"p-3 pb-2\">\n <div className=\"relative\">\n <Search className=\"pointer-events-none absolute left-2.5 top-1/2 h-3.5 w-3.5 -translate-y-1/2 text-muted-foreground\" />\n <input\n value={query}\n onChange={(e) => setQuery(e.target.value)}\n placeholder={t('connectors.search')}\n className=\"w-full rounded-lg border border-border bg-background py-1.5 pl-8 pr-2.5 text-[13px] outline-none focus:ring-2 focus:ring-ring\"\n />\n </div>\n </div>\n\n {connectors === null ? (\n <div className=\"space-y-3 p-3\" aria-hidden>\n {[0, 1, 2].map((i) => (\n <div key={i} className=\"flex items-center gap-2\">\n <Skeleton className=\"h-9 w-9 shrink-0 rounded-lg\" />\n <div className=\"flex-1 space-y-1.5\">\n <Skeleton className=\"h-3.5 w-28\" />\n <Skeleton className=\"h-3 w-40\" />\n </div>\n </div>\n ))}\n </div>\n ) : (\n <>\n <Section title={t('connectors.groupMine')} items={mine} onSelect={(c) => select(c.id)} />\n <Section title={t('connectors.groupOffered')} items={offered} onSelect={(c) => select(c.id)} />\n {mine.length === 0 && offered.length === 0 && (\n <p className=\"p-4 text-sm text-muted-foreground\">{t('connectors.emptyBody')}</p>\n )}\n </>\n )}\n </>\n )}\n </div>\n )\n}\n\nfunction Section({\n title,\n items,\n onSelect,\n}: {\n title: string\n items: UnifiedConnector[]\n onSelect: (connector: UnifiedConnector) => void\n}) {\n if (items.length === 0) return null\n return (\n <section className=\"pb-2\">\n <h3 className=\"px-3 pb-1 pt-1 text-[10px] font-semibold uppercase tracking-wider text-muted-foreground/50\">\n {title}\n </h3>\n <ul>\n {items.map((c) => (\n <li key={c.id}>\n <button\n onClick={() => onSelect(c)}\n className=\"flex w-full items-center gap-2.5 px-3 py-1.5 text-left transition-colors hover:bg-muted/50\"\n >\n <ConnectorMark connector={c} size=\"sm\" />\n <span className=\"min-w-0 flex-1\">\n <span className=\"flex items-center gap-1.5\">\n <span className=\"truncate text-[13px] font-medium text-foreground\">{c.name}</span>\n {(c.activePlane ? [c.activePlane] : c.planes).map((p) => (\n <PlaneBadge key={p} plane={p} active={!!c.activePlane} />\n ))}\n </span>\n <span className=\"mt-0.5 block\">\n <StateChip state={c.state} />\n </span>\n </span>\n </button>\n </li>\n ))}\n </ul>\n </section>\n )\n}\n","import * as React from 'react'\nimport {\n isDictationSupported,\n startDictation,\n stopSpeaking,\n type DictationSession,\n} from '../lib/speech'\n\nexport type DictationState = 'idle' | 'listening' | 'transcribing' | 'error'\nexport type DictationError = 'denied' | 'unsupported' | 'network' | 'no-speech' | 'failed'\n\ninterface UseDictationOptions {\n /** BCP-47 tag for recognition. Defaults to the browser's language. */\n locale?: string\n /** POST endpoint that returns `{ text }` — the Whisper seam. */\n transcribeEndpoint?: string\n /** Settled transcript, non-empty. */\n onTranscript: (text: string) => void\n /** Partial words while speaking, so the composer shows it working. */\n onInterim?: (text: string) => void\n}\n\n/**\n * Push-to-talk state machine for the composer's mic.\n *\n * One rule shapes it: the user must always see what was heard BEFORE it is\n * sent. Interim words land in the composer while speaking; the settled\n * transcript is handed back for the caller to send.\n */\nexport function useDictation({\n locale,\n transcribeEndpoint,\n onTranscript,\n onInterim,\n}: UseDictationOptions) {\n // Whoever is holding the microphone decides the language, not the app: a\n // pt-BR app used by an English speaker still has to hear English. An\n // explicit `voice.locale` is the deliberate override.\n const resolvedLocale =\n locale ?? (typeof navigator !== 'undefined' ? navigator.language || 'pt-BR' : 'pt-BR')\n\n const [state, setState] = React.useState<DictationState>('idle')\n const [error, setError] = React.useState<DictationError | null>(null)\n const sessionRef = React.useRef<DictationSession | null>(null)\n const callbacks = React.useRef({ onTranscript, onInterim })\n callbacks.current = { onTranscript, onInterim }\n\n const supported = React.useMemo(\n () => isDictationSupported(!!transcribeEndpoint),\n [transcribeEndpoint],\n )\n\n const finish = React.useCallback(() => {\n sessionRef.current = null\n setState('idle')\n }, [])\n\n const start = React.useCallback(() => {\n if (sessionRef.current || !supported) return\n // The assistant must not listen to its own voice.\n stopSpeaking()\n setError(null)\n setState('listening')\n sessionRef.current = startDictation(\n { locale: resolvedLocale, transcribeEndpoint },\n {\n onInterim: (text) => callbacks.current.onInterim?.(text),\n onFinal: (text) => {\n finish()\n if (text) callbacks.current.onTranscript(text)\n },\n onError: (code) => {\n sessionRef.current = null\n setError(code)\n setState('error')\n },\n },\n )\n }, [finish, resolvedLocale, supported, transcribeEndpoint])\n\n const stop = React.useCallback(() => {\n if (!sessionRef.current) return\n // A recorded clip still has to travel to the transcriber; native\n // recognition settles locally and returns through onFinal.\n if (transcribeEndpoint) setState('transcribing')\n sessionRef.current.stop()\n }, [transcribeEndpoint])\n\n const cancel = React.useCallback(() => {\n sessionRef.current?.cancel()\n sessionRef.current = null\n setState('idle')\n setError(null)\n }, [])\n\n const toggle = React.useCallback(() => {\n if (state === 'listening' || state === 'transcribing') stop()\n else start()\n }, [state, start, stop])\n\n // Never leave the mic open behind a closed panel.\n React.useEffect(() => () => sessionRef.current?.cancel(), [])\n\n return { supported, state, error, start, stop, cancel, toggle, clearError: () => setError(null) }\n}\n","import * as React from 'react'\n\n/** Live mic amplitude for the composer's waveform. Its own analysis-only\n * `getUserMedia` stream, because neither dictation transport exposes one; a\n * refused stream just reports `available: false`. Values land in a ref — the\n * render loop belongs to the waveform, not to React at 60fps. */\nexport function useMicLevels(active: boolean, bandCount = 28) {\n const levelsRef = React.useRef<Float32Array>(new Float32Array(bandCount))\n const [available, setAvailable] = React.useState(false)\n\n React.useEffect(() => {\n if (!active) {\n levelsRef.current.fill(0)\n setAvailable(false)\n return\n }\n if (typeof navigator === 'undefined' || !navigator.mediaDevices?.getUserMedia) return\n\n let cancelled = false\n let stream: MediaStream | null = null\n let context: AudioContext | null = null\n let frame = 0\n\n const AudioCtor: typeof AudioContext | undefined =\n typeof window === 'undefined'\n ? undefined\n : window.AudioContext ??\n (window as unknown as { webkitAudioContext?: typeof AudioContext }).webkitAudioContext\n if (!AudioCtor) return\n\n void navigator.mediaDevices\n .getUserMedia({ audio: true })\n .then((granted) => {\n if (cancelled) {\n granted.getTracks().forEach((track) => track.stop())\n return\n }\n stream = granted\n context = new AudioCtor()\n const analyser = context.createAnalyser()\n analyser.fftSize = 256\n analyser.smoothingTimeConstant = 0.6\n context.createMediaStreamSource(granted).connect(analyser)\n\n const spectrum = new Uint8Array(analyser.frequencyBinCount)\n // Speech lives low in the spectrum; the top bins would sit flat.\n const usableBins = Math.floor(analyser.frequencyBinCount * 0.55)\n const perBand = Math.max(1, Math.floor(usableBins / bandCount))\n setAvailable(true)\n\n const tick = () => {\n if (cancelled) return\n analyser.getByteFrequencyData(spectrum)\n for (let band = 0; band < bandCount; band++) {\n let sum = 0\n const from = band * perBand\n for (let i = from; i < from + perBand; i++) sum += spectrum[i] ?? 0\n const value = sum / perBand / 255\n const previous = levelsRef.current[band]\n // Rise fast, fall slow — snapping to zero between words reads as a dropout.\n levelsRef.current[band] = value > previous ? value : previous * 0.82 + value * 0.18\n }\n frame = requestAnimationFrame(tick)\n }\n frame = requestAnimationFrame(tick)\n })\n .catch(() => {\n if (!cancelled) setAvailable(false)\n })\n\n return () => {\n cancelled = true\n if (frame) cancelAnimationFrame(frame)\n stream?.getTracks().forEach((track) => track.stop())\n void context?.close().catch(() => {})\n levelsRef.current.fill(0)\n setAvailable(false)\n }\n }, [active, bandCount])\n\n return { levelsRef, available }\n}\n","import * as React from 'react'\nimport {\n AlertCircle,\n File as FileIcon,\n FileImage,\n FileSpreadsheet,\n FileText,\n Loader2,\n Upload,\n X,\n} from 'lucide-react'\nimport { cn } from '../../lib/cn'\nimport { useTranslation } from '../../hooks/useTranslation'\nimport { formatBytes, type AttachmentKind } from '../../lib/attachments'\nimport type { ChatAttachment } from '../../stores/chat.store'\n\nconst KIND_ICON: Record<AttachmentKind, typeof FileIcon> = {\n spreadsheet: FileSpreadsheet,\n csv: FileSpreadsheet,\n text: FileText,\n pdf: FileText,\n image: FileImage,\n binary: FileIcon,\n}\n\n/**\n * Drag-and-drop over a whole surface. Enter/leave fire for every child element\n * the pointer crosses, so the depth counter is what keeps the overlay from\n * flickering its way across the transcript.\n */\nexport function useFileDrop(enabled: boolean, onFiles: (files: File[]) => void) {\n const [dragging, setDragging] = React.useState(false)\n const depth = React.useRef(0)\n\n const carriesFiles = (event: React.DragEvent) =>\n Array.from(event.dataTransfer?.types ?? []).includes('Files')\n\n const reset = () => {\n depth.current = 0\n setDragging(false)\n }\n\n return {\n dragging: dragging && enabled,\n handlers: {\n onDragEnter: (event: React.DragEvent) => {\n if (!enabled || !carriesFiles(event)) return\n event.preventDefault()\n depth.current++\n setDragging(true)\n },\n // Without preventDefault here the browser opens the file instead of\n // dropping it, and `onDrop` never runs at all.\n onDragOver: (event: React.DragEvent) => {\n if (!enabled || !carriesFiles(event)) return\n event.preventDefault()\n },\n onDragLeave: (event: React.DragEvent) => {\n if (!enabled || !carriesFiles(event)) return\n event.preventDefault()\n depth.current = Math.max(0, depth.current - 1)\n if (depth.current === 0) setDragging(false)\n },\n onDrop: (event: React.DragEvent) => {\n if (!enabled || !carriesFiles(event)) return\n event.preventDefault()\n reset()\n const files = Array.from(event.dataTransfer?.files ?? [])\n if (files.length) onFiles(files)\n },\n },\n }\n}\n\n/** \"Solte aqui\", plus the promise that makes dropping a client list safe. */\nexport function AttachmentDropOverlay() {\n const { t } = useTranslation()\n return (\n <div\n aria-hidden\n className={cn(\n 'pointer-events-none absolute inset-0 z-20 flex flex-col items-center justify-center gap-1.5',\n 'rounded-lg border-2 border-dashed border-primary bg-background/92 px-6 text-center backdrop-blur-sm',\n )}\n >\n <Upload className=\"h-6 w-6 text-primary\" />\n <p className=\"text-[13px] font-medium text-foreground\">{t('chat.attachments.dropHere')}</p>\n <p className=\"text-[11px] leading-snug text-muted-foreground\">{t('chat.attachments.dropHint')}</p>\n </div>\n )\n}\n\nexport function AttachmentChips({\n attachments,\n onRemove,\n}: {\n attachments: ChatAttachment[]\n onRemove: (id: string) => void\n}) {\n const { t } = useTranslation()\n const [openId, setOpenId] = React.useState<string | null>(null)\n if (!attachments.length) return null\n const opened = attachments.find((a) => a.id === openId)\n\n return (\n <>\n {opened ? <AttachmentStructure attachment={opened} /> : null}\n <ul className=\"mb-1.5 flex flex-wrap gap-1.5 px-0.5\">\n {attachments.map((attachment) => {\n const Icon = KIND_ICON[attachment.kind]\n const unreadable = attachment.digest?.unreadable\n const failed = attachment.status === 'error' || !!unreadable\n const warnings = attachment.digest?.warnings\n return (\n <li\n key={attachment.id}\n className={cn(\n 'flex max-w-[230px] items-center gap-1.5 rounded-xl border py-1 pl-2 pr-1',\n failed ? 'border-destructive/40 bg-destructive/5' : 'border-border bg-muted/40',\n )}\n >\n {attachment.status === 'parsing' ? (\n <Loader2 className=\"h-3.5 w-3.5 shrink-0 animate-spin text-muted-foreground\" />\n ) : failed ? (\n <AlertCircle className=\"h-3.5 w-3.5 shrink-0 text-destructive\" />\n ) : (\n <Icon className=\"h-3.5 w-3.5 shrink-0 text-muted-foreground\" />\n )}\n\n <button\n type=\"button\"\n disabled={!attachment.digest?.headers?.length}\n onClick={() => setOpenId((id) => (id === attachment.id ? null : attachment.id))}\n aria-expanded={openId === attachment.id}\n className=\"min-w-0 flex-1 text-left focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring rounded disabled:cursor-default\"\n >\n <span className=\"block truncate text-[11.5px] leading-tight text-foreground\">\n {attachment.name}\n </span>\n <span\n className={cn(\n 'block truncate text-[10px] leading-tight',\n failed ? 'text-destructive' : 'text-muted-foreground',\n )}\n title={warnings?.join(' · ')}\n >\n {attachment.status === 'parsing'\n ? t('chat.attachments.parsing')\n : unreadable\n ? t('chat.attachments.error.excelUnsupported')\n : failed\n ? t(`chat.attachments.error.${attachment.error ?? 'unreadable'}`)\n : describe(attachment, t)}\n {!failed && warnings?.length ? ` · ${t('chat.attachments.hasWarnings')}` : ''}\n </span>\n </button>\n\n <button\n type=\"button\"\n onClick={() => onRemove(attachment.id)}\n aria-label={t('chat.attachments.remove', { name: attachment.name })}\n className={cn(\n 'inline-flex h-5 w-5 shrink-0 items-center justify-center rounded-full transition-colors',\n 'text-muted-foreground hover:bg-muted hover:text-foreground',\n 'focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring',\n )}\n >\n <X className=\"h-3 w-3\" />\n </button>\n </li>\n )\n })}\n </ul>\n </>\n )\n}\n\n/**\n * The file's structure, rendered from the digest the browser already parsed.\n *\n * This used to be the model's job — and a small model asked to narrate a digest\n * AND propose a mapping did neither reliably, flip-flopping between describing\n * 93 rows and answering \"não consigo importar\". Restating structured data we\n * hold exactly is not a judgement call: it costs tokens, it can drift from the\n * file, and it competes for the one thing the model is actually good at here.\n * So the surface says WHAT the file is; the model only proposes what it maps to.\n */\nfunction AttachmentStructure({ attachment }: { attachment: ChatAttachment }) {\n const { t } = useTranslation()\n const digest = attachment.digest\n const columns = digest?.columnTypes\n const headers = digest?.headers ?? []\n if (!headers.length) return null\n\n return (\n <div className=\"mb-1.5 max-h-52 overflow-y-auto rounded-xl border border-border bg-muted/30 px-2.5 py-2\">\n <p className=\"mb-1.5 text-[10.5px] font-medium text-foreground\">\n {digest?.rowCount !== undefined\n ? t('chat.attachments.shape', { rows: digest.rowCount, columns: headers.length })\n : attachment.name}\n </p>\n <ul className=\"space-y-0.5\">\n {headers.map((header, i) => {\n const column = columns?.[i]\n return (\n <li key={`${header}-${i}`} className=\"flex items-baseline gap-1.5 text-[10.5px] leading-tight\">\n <span className=\"min-w-0 flex-1 truncate text-muted-foreground\">{header || '—'}</span>\n <span className=\"shrink-0 rounded bg-muted px-1 text-[9.5px] text-muted-foreground/80\">\n {column?.type ?? 'text'}\n </span>\n </li>\n )\n })}\n </ul>\n {digest?.warnings?.length ? (\n <ul className=\"mt-1.5 space-y-0.5 border-t border-border/60 pt-1.5\">\n {digest.warnings.map((warning, i) => (\n <li key={i} className=\"text-[10px] leading-tight text-muted-foreground/80\">\n {warning}\n </li>\n ))}\n </ul>\n ) : null}\n </div>\n )\n}\n\n/** What the file IS, in the terms that matter: a spreadsheet is its shape. */\nfunction describe(\n attachment: ChatAttachment,\n t: (key: string, params?: Record<string, string | number>) => string,\n): string {\n const digest = attachment.digest\n if (digest?.sheets?.length) {\n return t('chat.attachments.sheets', { count: digest.sheets.length })\n }\n if (digest?.rowCount !== undefined && digest.headers?.length) {\n return t('chat.attachments.shape', {\n rows: digest.rowCount,\n columns: digest.headers.length,\n })\n }\n return formatBytes(attachment.size)\n}\n","import * as React from 'react'\nimport { ArrowUp, Loader2, Mic, Paperclip, Sparkles, Square } from 'lucide-react'\nimport { cn } from '../../lib/cn'\nimport { useTranslation } from '../../hooks/useTranslation'\nimport { useDictation } from '../../hooks/useDictation'\nimport { useMicLevels } from '../../hooks/useMicLevels'\nimport { useChatStore } from '../../stores/chat.store'\nimport { AttachmentChips } from './ChatAttachments'\nimport type { ChatVoiceConfig } from '../../app/config'\n\ninterface ChatComposerProps {\n onSend: (text: string) => void\n isStreaming: boolean\n isConfigured: boolean\n blocked: boolean\n voice?: ChatVoiceConfig\n hasSuggestions: boolean\n suggestionsOpen: boolean\n onToggleSuggestions: () => void\n}\n\nconst MAX_ROWS = 5\nconst LINE_HEIGHT = 20\n\n/**\n * The composer. Three ways in — type, talk, or pick a suggestion — and one\n * rule: whatever the assistant is about to receive is visible in the field\n * first. Dictation writes interim words straight into the textarea so the user\n * watches it being heard, and only sends once the transcript settles.\n */\nexport function ChatComposer({\n onSend,\n isStreaming,\n isConfigured,\n blocked,\n voice,\n hasSuggestions,\n suggestionsOpen,\n onToggleSuggestions,\n}: ChatComposerProps) {\n const { t } = useTranslation()\n const [input, setInput] = React.useState('')\n const textareaRef = React.useRef<HTMLTextAreaElement>(null)\n const voiceStartRequested = useChatStore((s) => s.voiceStartRequested)\n const consumeVoiceStart = useChatStore((s) => s.consumeVoiceStart)\n const draft = useChatStore((s) => s.draft)\n const setDraft = useChatStore((s) => s.setDraft)\n const attachments = useChatStore((s) => s.attachments)\n const addAttachments = useChatStore((s) => s.addAttachments)\n const removeAttachment = useChatStore((s) => s.removeAttachment)\n const fileInputRef = React.useRef<HTMLInputElement>(null)\n\n // Dictation is speech-to-TEXT: the transcript lands in the field and the\n // user sends it. Auto-send is opt-in, never the default — a mishearing\n // that ships itself is not something you can take back.\n const autoSend = voice?.autoSend === true\n const micEnabled = voice?.input !== false\n\n const canAttach = isConfigured && !blocked && !isStreaming\n const parsing = attachments.some((a) => a.status === 'parsing')\n const readyAttachments = attachments.filter((a) => a.status === 'ready').length\n\n const submit = React.useCallback(\n (text: string) => {\n const trimmed = text.trim()\n // A file with nothing typed is a legitimate turn (\"importa isso aí\"), so\n // the send button answers to the attachments too — but not while one is\n // still being read, or its digest would be dropped from the turn.\n if ((!trimmed && !readyAttachments) || parsing || isStreaming || !isConfigured || blocked) return\n setInput('')\n onSend(trimmed)\n },\n [blocked, isConfigured, isStreaming, onSend, parsing, readyAttachments],\n )\n\n const dictation = useDictation({\n locale: voice?.locale,\n transcribeEndpoint: voice?.transcribeEndpoint,\n onInterim: (text) => setInput(text),\n onTranscript: (text) => {\n if (autoSend) {\n submit(text)\n return\n }\n setInput(text)\n const el = textareaRef.current\n if (el) {\n el.focus()\n requestAnimationFrame(() => el.setSelectionRange(text.length, text.length))\n }\n },\n })\n\n const listening = dictation.state === 'listening'\n const transcribing = dictation.state === 'transcribing'\n const micBusy = listening || transcribing\n const showMic = micEnabled && dictation.supported\n const WAVEFORM_BANDS = 56\n const { levelsRef, available: levelsAvailable } = useMicLevels(listening, WAVEFORM_BANDS)\n\n // \"Talk\" tapped from outside the panel (the FAB's mic) — start listening as\n // soon as the composer exists, so one tap goes from anywhere to speaking.\n React.useEffect(() => {\n if (!voiceStartRequested) return\n consumeVoiceStart()\n if (showMic) dictation.start()\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [voiceStartRequested, showMic])\n\n // A suggestion loads its text HERE for the user to confirm, edit or discard —\n // clicking a chip is not the same as pressing send.\n React.useEffect(() => {\n if (!draft) return\n setInput(draft)\n setDraft('')\n const el = textareaRef.current\n if (el) {\n el.focus()\n el.setSelectionRange(draft.length, draft.length)\n }\n }, [draft, setDraft])\n\n // Auto-grow: a dictated paragraph should not scroll inside a one-line box.\n // Measured from height 0, not `auto`: `auto` let the browser report the\n // height already set, so one tall measurement pinned the box open forever.\n // An empty box is one line — no measurement can say otherwise, and asking the\n // browser for `scrollHeight` here reported the clamp and pinned it open.\n // Measuring is only for content that might wrap.\n React.useLayoutEffect(() => {\n const el = textareaRef.current\n if (!el) return\n // border-box: the height set here INCLUDES padding, so one line of text\n // needs the padding added or the glyphs get clipped.\n const style = getComputedStyle(el)\n const padding = parseFloat(style.paddingTop) + parseFloat(style.paddingBottom)\n if (!input) {\n el.style.height = `${LINE_HEIGHT + padding}px`\n return\n }\n el.style.height = '0px'\n el.style.height = `${Math.min(el.scrollHeight, LINE_HEIGHT * MAX_ROWS + padding)}px`\n }, [input])\n\n const handleKeyDown = (event: React.KeyboardEvent<HTMLTextAreaElement>) => {\n if (event.key === 'Enter' && !event.shiftKey) {\n event.preventDefault()\n submit(input)\n } else if (event.key === 'Escape' && micBusy) {\n event.preventDefault()\n dictation.cancel()\n setInput('')\n }\n }\n\n const placeholder = blocked\n ? t('chat.confirmAction.blocked')\n : listening\n ? t('chat.voice.listening')\n : transcribing\n ? t('chat.voice.transcribing')\n : t('chat.messagePlaceholder')\n\n const errorMessage =\n dictation.error === 'denied'\n ? t('chat.voice.denied')\n : dictation.error === 'network'\n ? t('chat.voice.network')\n : dictation.error === 'failed'\n ? t('chat.voice.failed')\n : null\n\n return (\n <div className=\"border-t border-border/40 bg-card/80 p-2 backdrop-blur\">\n {errorMessage && (\n <div\n role=\"status\"\n className=\"mb-1.5 flex items-center gap-1.5 rounded-lg bg-destructive/10 px-2.5 py-1.5 text-[11px] text-destructive\"\n >\n <span className=\"min-w-0 flex-1\">{errorMessage}</span>\n <button\n type=\"button\"\n onClick={dictation.clearError}\n className=\"shrink-0 font-medium underline-offset-2 hover:underline\"\n >\n {t('common.done')}\n </button>\n </div>\n )}\n\n {listening && (\n <p\n role=\"status\"\n className=\"mb-1 line-clamp-2 px-2.5 text-[12px] leading-snug text-muted-foreground\"\n >\n {input.trim() || t('chat.voice.listening')}\n </p>\n )}\n\n <AttachmentChips attachments={attachments} onRemove={removeAttachment} />\n\n <form\n onSubmit={(event) => {\n event.preventDefault()\n submit(input)\n }}\n className={cn(\n 'flex items-end gap-1 rounded-3xl border bg-background py-1 pl-2 pr-1 transition-all duration-200',\n listening\n ? 'border-primary ring-2 ring-primary/20'\n : 'border-border focus-within:border-foreground/25',\n )}\n >\n {hasSuggestions && (\n <button\n type=\"button\"\n onClick={onToggleSuggestions}\n aria-pressed={suggestionsOpen}\n aria-label={suggestionsOpen ? t('chat.suggestions.hide') : t('chat.suggestions.show')}\n title={suggestionsOpen ? t('chat.suggestions.hide') : t('chat.suggestions.show')}\n className={cn(\n 'mb-0.5 inline-flex h-8 w-8 shrink-0 items-center justify-center rounded-full transition-colors',\n 'focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring',\n suggestionsOpen\n ? 'bg-primary/10 text-primary'\n : 'text-muted-foreground hover:bg-muted hover:text-foreground',\n )}\n >\n <Sparkles className=\"h-4 w-4\" />\n </button>\n )}\n\n {/* Dropping is a mouse-only affordance — the clip is the keyboard one. */}\n <button\n type=\"button\"\n onClick={() => fileInputRef.current?.click()}\n disabled={!canAttach}\n aria-label={t('chat.attachments.add')}\n title={t('chat.attachments.add')}\n className={cn(\n 'mb-0.5 inline-flex h-8 w-8 shrink-0 items-center justify-center rounded-full transition-colors',\n 'text-muted-foreground hover:bg-muted hover:text-foreground',\n 'focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring disabled:opacity-30',\n )}\n >\n <Paperclip className=\"h-4 w-4\" />\n </button>\n <input\n ref={fileInputRef}\n type=\"file\"\n multiple\n className=\"hidden\"\n tabIndex={-1}\n onChange={(event) => {\n const files = Array.from(event.target.files ?? [])\n if (files.length) addAttachments(files)\n // Same file twice in a row fires no change event unless we clear it.\n event.target.value = ''\n }}\n />\n\n {/* While the mic is open the field steps aside: an empty text box says\n nothing about whether the assistant can hear you, and the waveform\n says it continuously. What was heard so far sits above the form, so\n nothing is ever sent that the user did not see first. */}\n {listening ? (\n <div className=\"min-w-0 flex-1 self-center px-2 py-1.5\">\n <LiveWaveform levelsRef={levelsRef} bands={WAVEFORM_BANDS} live={levelsAvailable} />\n </div>\n ) : (\n <textarea\n ref={textareaRef}\n rows={1}\n value={input}\n onChange={(event) => setInput(event.target.value)}\n onKeyDown={handleKeyDown}\n onPaste={(event) => {\n if (!canAttach) return\n const files = Array.from(event.clipboardData?.files ?? [])\n if (!files.length) return\n // Copying a range out of Excel puts BOTH the text and a picture\n // of it on the clipboard — pasting must stay a paste there, not\n // silently attach a screenshot.\n const text = event.clipboardData?.getData('text/plain')\n if (text && files.every((f) => f.type.startsWith('image/'))) return\n event.preventDefault()\n addAttachments(files)\n }}\n placeholder={placeholder}\n aria-label={t('chat.messagePlaceholder')}\n className={cn(\n 'min-w-0 flex-1 resize-none self-center bg-transparent px-1 py-1.5 text-[13.5px] leading-5 text-foreground',\n 'placeholder:text-muted-foreground/60 focus:outline-none disabled:cursor-not-allowed',\n )}\n disabled={isStreaming || !isConfigured || blocked}\n />\n )}\n\n {showMic && (\n <button\n type=\"button\"\n onClick={dictation.toggle}\n disabled={!isConfigured || blocked || isStreaming || transcribing}\n aria-pressed={listening}\n aria-label={listening ? t('chat.voice.stop') : t('chat.voice.start')}\n title={listening ? t('chat.voice.stop') : t('chat.voice.start')}\n className={cn(\n 'mb-0.5 inline-flex h-8 w-8 shrink-0 items-center justify-center rounded-full transition-all duration-200',\n 'focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring disabled:opacity-30',\n listening\n ? 'bg-primary text-primary-foreground shadow-[0_0_0_4px_hsl(var(--primary)/0.18)]'\n : 'text-muted-foreground hover:bg-muted hover:text-foreground',\n )}\n >\n {transcribing ? (\n <Loader2 className=\"h-4 w-4 animate-spin\" />\n ) : listening ? (\n <Square className=\"h-3 w-3 fill-current\" />\n ) : (\n <Mic className=\"h-4 w-4\" />\n )}\n </button>\n )}\n\n <button\n type=\"submit\"\n disabled={\n (!input.trim() && !readyAttachments) || parsing || isStreaming || !isConfigured || blocked\n }\n className={cn(\n 'mb-0.5 inline-flex h-8 w-8 shrink-0 items-center justify-center rounded-full transition-all duration-200',\n 'bg-primary text-primary-foreground hover:bg-primary/90',\n 'focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-1',\n 'disabled:bg-muted disabled:text-muted-foreground/50',\n )}\n aria-label={t('chat.send')}\n >\n <ArrowUp className=\"h-4 w-4\" strokeWidth={2.5} />\n </button>\n </form>\n </div>\n )\n}\n\n/**\n * The microphone signal, drawn where the text field was.\n *\n * The rAF loop writes `scaleY` straight onto the bars. Routing 28 values\n * through React state sixty times a second would re-render the whole composer\n * for a decoration — and the decoration is the only part that changes.\n *\n * `live: false` (permission for the analysis stream refused) falls back to a\n * gentle idle animation: still honest — it says \"the mic is open\" and no\n * longer claims to show what it hears.\n */\nfunction LiveWaveform({\n levelsRef,\n bands,\n live,\n}: {\n levelsRef: React.MutableRefObject<Float32Array>\n bands: number\n live: boolean\n}) {\n const barsRef = React.useRef<Array<HTMLSpanElement | null>>([])\n\n React.useEffect(() => {\n if (!live) return\n let frame = 0\n const draw = () => {\n const levels = levelsRef.current\n for (let i = 0; i < bands; i++) {\n const bar = barsRef.current[i]\n if (!bar) continue\n // Floor keeps a visible line at silence, so the row never looks broken.\n bar.style.transform = `scaleY(${0.12 + Math.min(1, (levels[i] ?? 0) * 1.9) * 0.88})`\n }\n frame = requestAnimationFrame(draw)\n }\n frame = requestAnimationFrame(draw)\n return () => cancelAnimationFrame(frame)\n }, [live, bands, levelsRef])\n\n return (\n // Edge to edge: 28 fixed-width bars centred left a short stub floating in\n // a wide composer, reading as a glitch rather than a level meter. The bars\n // stay thin and the SPACING absorbs the width, so it fills any composer.\n <div className=\"flex h-5 w-full items-center justify-between\" aria-hidden>\n {Array.from({ length: bands }, (_, i) => (\n <span\n key={i}\n ref={(el) => {\n barsRef.current[i] = el\n }}\n className={cn(\n 'h-full w-[2px] shrink-0 origin-center rounded-full bg-primary/70 transition-transform duration-75',\n live ? 'will-change-transform' : 'motion-safe:animate-pulse',\n )}\n style={\n live\n ? { transform: 'scaleY(0.12)' }\n : { transform: `scaleY(${[0.3, 0.55, 0.8, 0.5, 0.35][i % 5]})`, animationDelay: `${(i % 5) * 110}ms`, animationDuration: '900ms' }\n }\n />\n ))}\n </div>\n )\n}\n","import * as React from 'react'\n\n// Minimal markdown for chat bubbles — the subset agents actually emit:\n// **bold**, *italic*, `code`, [links](url), - / 1. lists, ### headings and\n// paragraphs. Built as React nodes (never innerHTML), so model output can't\n// inject markup. Deliberately dependency-free: the saas package ships in every\n// generated app and a full markdown library is ~30kb for four constructs.\n\nfunction renderInline(text: string, keyBase: string): React.ReactNode[] {\n const out: React.ReactNode[] = []\n // Tokenize: code first (protects its content), then bold, italic, links.\n const pattern = /(`[^`]+`)|(\\*\\*[^*]+\\*\\*)|(\\*[^*]+\\*)|(\\[[^\\]]+\\]\\([^)\\s]+\\))/g\n let last = 0\n let match: RegExpExecArray | null\n let i = 0\n while ((match = pattern.exec(text)) !== null) {\n if (match.index > last) out.push(text.slice(last, match.index))\n const token = match[0]\n const key = `${keyBase}-${i++}`\n if (token.startsWith('`')) {\n out.push(\n <code key={key} className=\"rounded bg-black/10 px-1 font-mono text-[0.85em] dark:bg-white/10\">\n {token.slice(1, -1)}\n </code>,\n )\n } else if (token.startsWith('**')) {\n out.push(<strong key={key}>{renderInline(token.slice(2, -2), key)}</strong>)\n } else if (token.startsWith('*')) {\n out.push(<em key={key}>{renderInline(token.slice(1, -1), key)}</em>)\n } else {\n const link = /^\\[([^\\]]+)\\]\\(([^)\\s]+)\\)$/.exec(token)\n if (link && /^(https?:\\/\\/|\\/|#)/.test(link[2])) {\n out.push(\n <a key={key} href={link[2]} target=\"_blank\" rel=\"noreferrer\" className=\"underline underline-offset-2\">\n {renderInline(link[1], key)}\n </a>,\n )\n } else {\n out.push(token)\n }\n }\n last = match.index + token.length\n }\n if (last < text.length) out.push(text.slice(last))\n return out\n}\n\nexport function ChatMarkdown({ content }: { content: string }) {\n const blocks: React.ReactNode[] = []\n const lines = content.split('\\n')\n let i = 0\n let key = 0\n\n while (i < lines.length) {\n const line = lines[i]\n if (!line.trim()) {\n i++\n continue\n }\n const heading = /^(#{1,4})\\s+(.*)$/.exec(line)\n if (heading) {\n blocks.push(\n <p key={key++} className=\"mt-1.5 font-semibold first:mt-0\">\n {renderInline(heading[2], `h${key}`)}\n </p>,\n )\n i++\n continue\n }\n if (/^\\s*([-*]|\\d+[.)])\\s+/.test(line)) {\n const items: React.ReactNode[] = []\n const ordered = /^\\s*\\d+[.)]\\s+/.test(line)\n while (i < lines.length && /^\\s*([-*]|\\d+[.)])\\s+/.test(lines[i])) {\n const item = lines[i].replace(/^\\s*([-*]|\\d+[.)])\\s+/, '')\n items.push(<li key={items.length}>{renderInline(item, `li${key}-${items.length}`)}</li>)\n i++\n }\n const listClass = 'my-1 space-y-0.5 pl-4 first:mt-0 last:mb-0'\n blocks.push(\n ordered ? (\n <ol key={key++} className={`${listClass} list-decimal`}>{items}</ol>\n ) : (\n <ul key={key++} className={`${listClass} list-disc`}>{items}</ul>\n ),\n )\n continue\n }\n // Paragraph: swallow consecutive plain lines with soft breaks.\n const para: React.ReactNode[] = []\n while (i < lines.length && lines[i].trim() && !/^\\s*([-*]|\\d+[.)])\\s+/.test(lines[i]) && !/^#{1,4}\\s+/.test(lines[i])) {\n if (para.length) para.push(<br key={`br${key}-${para.length}`} />)\n para.push(...renderInline(lines[i], `p${key}-${para.length}`))\n i++\n }\n blocks.push(\n <p key={key++} className=\"my-1 first:mt-0 last:mb-0\">\n {para}\n </p>,\n )\n }\n return <>{blocks}</>\n}\n","import * as React from 'react'\nimport { ArrowUpRight } from 'lucide-react'\nimport { cn } from '../../lib/cn'\n// NOTE: the copy AdminShell's setEntityRouteMap fills. Before the shell/ tree\n// was collapsed into src/, a second unpopulated copy lived beside it.\nimport { resolveEntityRoute, openEntity } from '../../lib/entity-routes'\nimport { navigateTo } from '../../app/routing'\nimport { useChatStore, type ChatRecordLink } from '../../stores/chat.store'\n\n/** A record's name, clickable when this app's route map resolves its\n * archetype. Unroutable renders as plain text — a missing link is correct, an\n * invented one is a dead end. */\nexport function RecordChip({\n link,\n variant = 'button',\n className,\n}: {\n link: ChatRecordLink\n /** `button` — standalone chip under a reply. `inline` — inside a card row. */\n variant?: 'button' | 'inline'\n className?: string\n}) {\n const setOpen = useChatStore((s) => s.setOpen)\n const routed = !!link.path || !!resolveEntityRoute(link.archetype, link.kind, link.entityKey)\n\n if (!routed) {\n return (\n <span className={cn('text-foreground', className)} title={link.id}>\n {link.label}\n </span>\n )\n }\n\n const go = () => {\n // An explicit destination beats the archetype map — a settings tab has no\n // archetype, and there is nothing to resolve it from.\n if (link.path) navigateTo(link.path)\n else openEntity(link.id, link.archetype, link.kind, undefined, link.entityKey)\n // On a phone the panel covers the whole screen — navigating \"somewhere\"\n // the user cannot see is the same as not navigating.\n if (typeof window !== 'undefined' && window.matchMedia?.('(max-width: 767px)').matches) {\n setOpen(false)\n }\n }\n\n if (variant === 'inline') {\n return (\n <button\n type=\"button\"\n onClick={go}\n title={link.id}\n className={cn(\n 'inline-flex max-w-full items-center gap-0.5 text-left font-medium text-foreground',\n 'underline decoration-dashed decoration-muted-foreground/40 underline-offset-2',\n 'transition-colors hover:text-primary hover:decoration-primary',\n 'focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-1',\n className,\n )}\n >\n <span className=\"truncate\">{link.label}</span>\n <ArrowUpRight className=\"h-3 w-3 shrink-0 opacity-50\" />\n </button>\n )\n }\n\n return (\n <button\n type=\"button\"\n onClick={go}\n title={link.id}\n className={cn(\n 'inline-flex items-center gap-1 rounded-full border border-border bg-background px-2.5 py-1',\n 'text-[11px] font-medium text-foreground shadow-sm transition-all duration-200',\n 'hover:border-primary/40 hover:bg-primary/5 hover:text-primary',\n 'focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring',\n className,\n )}\n >\n {link.label}\n <ArrowUpRight className=\"h-3 w-3\" />\n </button>\n )\n}\n","import * as React from 'react'\nimport { Check, ChevronRight, Infinity as InfinityIcon, Loader2, Paperclip, X } from 'lucide-react'\nimport { cn } from '../../lib/cn'\nimport { useTranslation } from '../../hooks/useTranslation'\nimport type { ChatMessage, ChatToolCall } from '../../stores/chat.store'\nimport { ChatMarkdown } from './markdown'\nimport { RecordChip } from './RecordChip'\n// NOTE: the copy AdminShell's setEntityRouteMap fills. Before the shell/ tree\n// was collapsed into src/, a second unpopulated copy lived beside it.\nimport { resolveEntityRoute } from '../../lib/entity-routes'\n\n/** `agenda_create_appointment` → `Agenda create appointment`. The raw name is\n * still there, one expand away — the person reading is a salon manager. */\nexport function humanizeToolName(name: string): string {\n const spaced = name\n .replace(/[._-]+/g, ' ')\n .replace(/([a-z0-9])([A-Z])/g, '$1 $2')\n .trim()\n return spaced.charAt(0).toUpperCase() + spaced.slice(1)\n}\n\nfunction ToolCallRow({ call }: { call: ChatToolCall }) {\n const { t } = useTranslation()\n const [open, setOpen] = React.useState(false)\n const failed = call.declined || /\"error\"\\s*:/.test(call.result ?? '')\n\n return (\n <div className=\"overflow-hidden rounded-lg border border-border/50 bg-muted/30\">\n <button\n type=\"button\"\n onClick={() => setOpen(!open)}\n aria-expanded={open}\n className=\"flex w-full items-center gap-1.5 px-2 py-1 text-left transition-colors hover:bg-muted/60\"\n >\n <ChevronRight\n className={cn(\n 'h-3 w-3 shrink-0 text-muted-foreground/50 transition-transform duration-200',\n open && 'rotate-90',\n )}\n />\n <span\n className={cn(\n 'flex h-3.5 w-3.5 shrink-0 items-center justify-center rounded-full',\n failed ? 'bg-destructive/15 text-destructive' : 'bg-success/15 text-success',\n )}\n >\n {failed ? <X className=\"h-2 w-2\" strokeWidth={3} /> : <Check className=\"h-2 w-2\" strokeWidth={3} />}\n </span>\n <span\n className={cn(\n 'min-w-0 flex-1 truncate text-[11px]',\n call.declined ? 'text-muted-foreground line-through' : 'text-muted-foreground',\n )}\n >\n {humanizeToolName(call.name)}\n </span>\n {call.autoApproved && (\n <span\n title={t('chat.confirmAction.autoApprovedHint')}\n className=\"inline-flex shrink-0 items-center gap-0.5 rounded-full bg-primary/10 px-1.5 py-px text-[9px] font-medium text-primary\"\n >\n <InfinityIcon className=\"h-2.5 w-2.5\" />\n {t('chat.confirmAction.autoApproved')}\n </span>\n )}\n </button>\n {open && (\n <div className=\"space-y-1 border-t border-border/50 px-2 py-1.5\">\n <code className=\"block font-mono text-[9.5px] text-muted-foreground/70\">{call.name}</code>\n {call.args && (\n <pre className=\"max-h-24 overflow-auto whitespace-pre-wrap break-all font-mono text-[9px] leading-snug text-muted-foreground\">\n {call.args}\n </pre>\n )}\n {call.result && (\n <pre className=\"max-h-40 overflow-auto whitespace-pre-wrap break-all rounded bg-background/70 p-1.5 font-mono text-[9px] leading-snug text-foreground/80\">\n {call.result}\n </pre>\n )}\n </div>\n )}\n </div>\n )\n}\n\nexport function MessageBubble({ message, isPending }: { message: ChatMessage; isPending?: boolean }) {\n const isUser = message.role === 'user'\n // Unroutable chips are dropped here — a goto row exists to be clicked.\n const routedLinks = React.useMemo(\n () =>\n (message.links ?? []).filter(\n (l) => !!l.path || !!resolveEntityRoute(l.archetype, l.kind, l.entityKey),\n ),\n [message.links],\n )\n\n return (\n <div\n className={cn(\n 'flex flex-col gap-1 motion-safe:animate-slide-in-from-bottom',\n isUser ? 'items-end' : 'items-start',\n )}\n >\n {/* Chronological order: the work happened BEFORE the reply — trace on\n top, answer below, goto buttons (the next step) underneath. */}\n {!isUser && (message.toolCalls?.length ?? 0) > 0 && (\n <div className=\"flex w-full max-w-[88%] flex-col gap-1\">\n {message.toolCalls!.map((call, i) => (\n <ToolCallRow key={`${call.name}-${i}`} call={call} />\n ))}\n </div>\n )}\n {/* What was attached, above what was typed. Names and shape only — the\n file itself never left the browser. */}\n {isUser && (message.attachments?.length ?? 0) > 0 && (\n <div className=\"flex max-w-[88%] flex-wrap justify-end gap-1\">\n {message.attachments!.map((attachment, i) => (\n <span\n key={`${attachment.name}-${i}`}\n className=\"inline-flex max-w-full items-center gap-1 rounded-lg border border-border bg-muted/50 px-1.5 py-0.5 text-[10.5px] text-muted-foreground\"\n >\n <Paperclip className=\"h-2.5 w-2.5 shrink-0\" />\n <span className=\"truncate\">{attachment.name}</span>\n </span>\n ))}\n </div>\n )}\n {/* The pending bubble and the answer are the SAME node — the reply fills\n it in place, so there is no unmount/remount flicker or slide-in replay. */}\n {(isUser ? !!message.content || !message.attachments?.length : message.content || isPending) && (\n <div\n className={cn(\n 'max-w-[88%] text-[13.5px] leading-relaxed',\n isUser\n ? 'rounded-2xl rounded-br-md bg-primary px-3.5 py-2 text-primary-foreground shadow-sm'\n : 'rounded-2xl rounded-bl-md border border-border/50 bg-muted/50 px-3.5 py-2 text-foreground',\n )}\n >\n {isUser ? (\n message.content\n ) : message.content ? (\n <ChatMarkdown content={message.content} />\n ) : (\n <TypingDots />\n )}\n </div>\n )}\n {!isUser && routedLinks.length > 0 && (\n <div className=\"flex max-w-[88%] flex-wrap gap-1\">\n {routedLinks.map((link) => (\n <RecordChip key={link.id} link={link} />\n ))}\n </div>\n )}\n </div>\n )\n}\n\n/** Which tools are running right now — the agent's work made visible instead\n * of a silent pause. */\nexport function ActiveToolChips({ names }: { names: string[] }) {\n return (\n <div className=\"flex flex-wrap items-center gap-1\">\n {names.map((name) => (\n <span\n key={name}\n className=\"inline-flex items-center gap-1 rounded-full border border-primary/25 bg-primary/[0.06] px-2 py-0.5 text-[10.5px] text-primary\"\n >\n <Loader2 className=\"h-2.5 w-2.5 animate-spin\" />\n {humanizeToolName(name)}\n </span>\n ))}\n </div>\n )\n}\n\nexport function TypingDots() {\n return (\n <div className=\"flex items-center gap-1 px-1 py-1.5\" aria-hidden>\n {[0, 1, 2].map((i) => (\n <span\n key={i}\n className=\"h-1.5 w-1.5 rounded-full bg-muted-foreground/40 motion-safe:animate-bounce\"\n style={{ animationDelay: `${i * 140}ms`, animationDuration: '900ms' }}\n />\n ))}\n </div>\n )\n}\n","import * as React from 'react'\nimport { AlertTriangle, Check, Infinity as InfinityIcon, ShieldCheck, X } from 'lucide-react'\nimport { cn } from '../../lib/cn'\nimport { useTranslation } from '../../hooks/useTranslation'\nimport { grantAutoApproval } from '../../lib/agent-approvals'\nimport { lookupRecordRef, looksLikeRecordId } from '../../lib/record-refs'\nimport { humanizeToolName } from './ChatMessages'\nimport { RecordChip } from './RecordChip'\nimport type { PendingAgentAction, PendingActionField } from '../../stores/chat.store'\n\n/**\n * The human gate in front of an agent write: shows what the agent wants to do\n * (tool + arguments) and blocks the conversation until the user decides — the\n * FAB's native rendering of the confirmation step every channel has (WhatsApp\n * asks \"responda SIM\", MCP uses elicitation).\n *\n * Three answers, not two. \"Always allow\" is what turns the assistant from a\n * demo into a tool someone uses forty times a day; it is scoped to this exact\n * action (create THIS entity), and for anything destructive it only lasts the\n * session — a misheard voice command must never be able to delete data under a\n * rule granted last month and forgotten.\n */\nexport function ConfirmActionCard({\n action,\n onResolve,\n}: {\n action: PendingAgentAction\n onResolve: (approved: boolean, values?: Record<string, unknown>) => void\n}) {\n const { t } = useTranslation()\n // The card is a form, not a receipt: the model's guesses are the starting\n // values and the user corrects them here, before anything is written. Fields\n // the model left out fall back to the entity's declared default, so a boolean\n // like `active` shows on without the model having to say so.\n const schema = action.fields ?? []\n // An update only carries what is changing. Seeding defaults there would write\n // a field nobody asked to touch, and demanding the required ones asks for data\n // the record already has.\n const partial = action.partial === true\n const seedValues = React.useCallback(\n (params: Record<string, unknown>) => {\n if (partial) return { ...params }\n const seeded: Record<string, unknown> = {}\n for (const f of schema) if (f.default !== undefined && !(f.key in params)) seeded[f.key] = f.default\n return { ...seeded, ...params }\n },\n [schema, partial],\n )\n const [values, setValues] = React.useState<Record<string, unknown>>(() => seedValues(action.params))\n const [showAll, setShowAll] = React.useState(false)\n React.useEffect(() => setValues(seedValues(action.params)), [action.params, seedValues])\n\n const isSet = (v: unknown) => v !== undefined && v !== null && v !== ''\n\n // Shown up front: what the model filled, plus anything required it left out.\n // The rest of the schema waits behind \"show all\" so the card stays readable.\n const primaryKeys = React.useMemo(() => {\n const keys = Object.keys(action.params).filter((k) => isSet(action.params[k]))\n if (partial) return keys\n for (const f of schema) if (f.required && !keys.includes(f.key)) keys.push(f.key)\n return keys\n }, [action.params, schema, partial])\n\n const extraKeys = React.useMemo(\n () => schema.map((f) => f.key).filter((k) => !primaryKeys.includes(k) && k !== 'id'),\n [schema, primaryKeys],\n )\n\n const visibleKeys = showAll ? [...primaryKeys, ...extraKeys] : primaryKeys\n const fieldOf = (key: string) => schema.find((f) => f.key === key)\n const entries = visibleKeys.map((key) => ({\n key,\n value: values[key],\n record: lookupRecordRef(values[key]),\n field: fieldOf(key),\n }))\n const destructive = !!action.destructive\n // What this action IS, in the reader's language. A tool's `description` is\n // written FOR THE MODEL (\"Takes IDS, not names: resolve the client/service\n // ids first via findAnything…\") and putting it here made the card read like\n // an internal spec sheet.\n // A caller-supplied title wins — \"Criar Cliente\" beats \"Create record\".\n const toolKey = `chat.tool.${action.toolName}`\n const translatedTool = t(toolKey)\n const heading =\n action.title ??\n (translatedTool !== toolKey ? translatedTool : humanizeToolName(action.toolName))\n const ruleLabel = action.scopeLabel ?? heading\n\n // A form doesn't submit while a required field is blank. Required fields are\n // always in the up-front rows, so what blocks confirm is always on screen.\n const missingRequiredKeys = React.useMemo(\n () => (partial ? [] : schema.filter((f) => f.required && !isSet(values[f.key])).map((f) => f.key)),\n [schema, values, partial],\n )\n const canConfirm = missingRequiredKeys.length === 0\n\n // On a partial write a blank field means \"unchanged\", never \"set to empty\" —\n // sending it would clear data the user never touched.\n const submitted = React.useCallback(\n () => (partial ? Object.fromEntries(Object.entries(values).filter(([, v]) => isSet(v))) : values),\n [partial, values],\n )\n\n const approve = React.useCallback(() => {\n if (canConfirm) onResolve(true, submitted())\n }, [canConfirm, onResolve, submitted])\n const decline = React.useCallback(() => onResolve(false), [onResolve])\n const approveAlways = React.useCallback(() => {\n if (!canConfirm) return\n grantAutoApproval({\n toolName: action.toolName,\n scope: action.scope,\n label: ruleLabel,\n session: destructive,\n })\n onResolve(true, submitted())\n }, [canConfirm, action.toolName, action.scope, ruleLabel, destructive, onResolve, submitted])\n\n // The card owns the conversation while it is up, so it owns the keyboard:\n // Enter confirms, Escape declines — no reaching for the mouse mid-flow.\n React.useEffect(() => {\n const handler = (event: KeyboardEvent) => {\n const target = event.target as HTMLElement | null\n const typing = target?.tagName === 'INPUT' || target?.tagName === 'TEXTAREA' || target?.tagName === 'SELECT'\n if (event.key === 'Enter' && !event.shiftKey && !typing) {\n event.preventDefault()\n approve()\n } else if (event.key === 'Escape') {\n event.preventDefault()\n decline()\n }\n }\n window.addEventListener('keydown', handler)\n return () => window.removeEventListener('keydown', handler)\n }, [approve, decline])\n\n return (\n <div\n role=\"alertdialog\"\n aria-live=\"assertive\"\n aria-label={heading}\n className={cn(\n 'mx-1 my-1.5 overflow-hidden rounded-xl border shadow-sm motion-safe:animate-zoom-in',\n destructive\n ? 'border-destructive/40 bg-destructive/5'\n : 'border-primary/30 bg-primary/[0.04]',\n )}\n >\n <div className=\"flex items-start gap-2 px-3 pt-2.5\">\n <span\n className={cn(\n 'mt-0.5 flex h-5 w-5 shrink-0 items-center justify-center rounded-full',\n destructive ? 'bg-destructive/15 text-destructive' : 'bg-primary/15 text-primary',\n )}\n >\n {destructive ? (\n <AlertTriangle className=\"h-3 w-3\" />\n ) : (\n <ShieldCheck className=\"h-3 w-3\" />\n )}\n </span>\n <div className=\"min-w-0 flex-1\">\n <p className=\"text-[11px] font-semibold uppercase tracking-wide text-muted-foreground\">\n {t('chat.confirmAction.title')}\n </p>\n <p className=\"mt-0.5 text-[13px] font-medium leading-snug text-foreground\">\n {heading}\n </p>\n </div>\n </div>\n\n {entries.length > 0 && (\n <dl className=\"mt-2 space-y-px px-3\">\n {entries.map(({ key, value, record, field }) => (\n <div\n key={key}\n className=\"flex items-baseline gap-2 rounded-md bg-background/60 px-2 py-1\"\n >\n <dt className=\"w-24 shrink-0 truncate text-[10px] uppercase tracking-wide text-muted-foreground\">\n {field?.label ?? humanizeKey(record ? stripIdSuffix(key) : key)}\n {field?.required && !partial && <span className=\"text-destructive\"> *</span>}\n </dt>\n <dd className=\"min-w-0 flex-1 break-words text-[12px] text-foreground\">\n {record ? (\n <RecordChip link={record} variant=\"inline\" />\n ) : looksLikeRecordId(value) ? (\n // An id is a reference, not something to hand-edit.\n <span className=\"font-mono text-[11px] text-muted-foreground\" title={value}>\n {value.slice(0, 8)}…\n </span>\n ) : isComplexValue(value) ? (\n // A list/object (e.g. a form's fields) — show it readably,\n // read-only; it is reviewed here and edited on its own screen.\n <ComplexValue value={value} />\n ) : (\n <FieldInput\n field={field}\n value={value}\n onChange={(next) => setValues((v) => ({ ...v, [key]: next }))}\n />\n )}\n </dd>\n </div>\n ))}\n </dl>\n )}\n\n {extraKeys.length > 0 && (\n <button\n type=\"button\"\n onClick={() => setShowAll(!showAll)}\n className=\"mt-1 px-3 text-[11px] font-medium text-muted-foreground underline-offset-2 hover:text-foreground hover:underline\"\n >\n {showAll\n ? t('chat.confirmAction.showLess')\n : t('chat.confirmAction.showAll', { count: extraKeys.length })}\n </button>\n )}\n\n {!canConfirm && (\n <p className=\"mt-1.5 px-3 text-[11px] text-destructive\">\n {t('chat.confirmAction.fillRequired', {\n fields: missingRequiredKeys\n .map((k) => fieldOf(k)?.label ?? humanizeKey(k))\n .join(', '),\n })}\n </p>\n )}\n\n <div className=\"mt-2.5 flex flex-wrap items-center gap-1.5 border-t border-border/40 bg-background/40 px-2 py-2\">\n <button\n type=\"button\"\n onClick={approve}\n disabled={!canConfirm}\n autoFocus\n className={cn(\n 'inline-flex h-8 items-center gap-1.5 rounded-lg px-3 text-[12px] font-medium transition-all',\n 'focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-1',\n 'disabled:cursor-not-allowed disabled:opacity-40 disabled:hover:bg-primary',\n destructive\n ? 'bg-destructive text-destructive-foreground hover:bg-destructive/90'\n : 'bg-primary text-primary-foreground hover:bg-primary/90',\n )}\n >\n <Check className=\"h-3.5 w-3.5\" strokeWidth={2.5} />\n {t('chat.confirmAction.confirm')}\n </button>\n {/* Some writes are answered every single time — granting standing\n approval for \"hand out access\" is not a convenience. */}\n {!action.noAutoApproval && (\n <button\n type=\"button\"\n onClick={approveAlways}\n disabled={!canConfirm}\n title={t('chat.confirmAction.alwaysHint', { label: ruleLabel })}\n className={cn(\n 'inline-flex h-8 items-center gap-1.5 rounded-lg border border-border bg-background px-2.5 text-[12px] font-medium text-muted-foreground transition-colors',\n 'hover:bg-muted hover:text-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring',\n 'disabled:cursor-not-allowed disabled:opacity-40',\n )}\n >\n <InfinityIcon className=\"h-3.5 w-3.5\" />\n {destructive\n ? t('chat.confirmAction.alwaysSession')\n : t('chat.confirmAction.always')}\n </button>\n )}\n <button\n type=\"button\"\n onClick={decline}\n className=\"ml-auto inline-flex h-8 items-center gap-1 rounded-lg px-2.5 text-[12px] font-medium text-muted-foreground transition-colors hover:bg-muted hover:text-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring\"\n >\n <X className=\"h-3.5 w-3.5\" />\n {t('chat.confirmAction.cancel')}\n </button>\n </div>\n </div>\n )\n}\n\n/** `client_id` → `client`, once the row shows a name instead of the id. */\nfunction stripIdSuffix(key: string): string {\n return key.replace(/[_-]?id$/i, '') || key\n}\n\n/** `client_name` / `clientName` → `Client name`. The model speaks column\n * names; the person reading the card should not have to. */\nfunction humanizeKey(key: string): string {\n const spaced = key\n .replace(/[_-]+/g, ' ')\n .replace(/([a-z0-9])([A-Z])/g, '$1 $2')\n .trim()\n return spaced.charAt(0).toUpperCase() + spaced.slice(1).toLowerCase()\n}\n\n/** A list or object the card can't edit inline (a form's fields, a nested\n * payload). Records are strings resolved earlier, so they never land here. */\nfunction isComplexValue(v: unknown): v is unknown[] | Record<string, unknown> {\n return typeof v === 'object' && v !== null\n}\n\n/** The human-readable label of a list item — a field's label, a record's name. */\nfunction itemLabel(item: unknown): string | null {\n if (item && typeof item === 'object') {\n const o = item as Record<string, unknown>\n for (const k of ['label', 'name', 'title', 'value']) {\n if (typeof o[k] === 'string' && o[k]) return o[k] as string\n }\n }\n return null\n}\n\n/** Read-only rendering for a list/object value: a form's fields become one\n * readable line each (label · type *), not \"[object Object],[object Object]\". */\nfunction ComplexValue({ value }: { value: unknown }) {\n if (Array.isArray(value)) {\n if (value.length === 0) return <span className=\"text-muted-foreground\">—</span>\n if (value.some((v) => v && typeof v === 'object')) {\n const shown = value.slice(0, 20)\n return (\n <ul className=\"space-y-0.5\">\n {shown.map((item, i) => {\n const o = (item ?? {}) as Record<string, unknown>\n const label = itemLabel(item) ?? `Item ${i + 1}`\n const hint = typeof o.type === 'string' ? o.type : undefined\n return (\n <li key={i} className=\"flex items-baseline gap-1\">\n <span className=\"text-muted-foreground\">•</span>\n <span className=\"text-foreground\">{label}</span>\n {hint && <span className=\"text-[10px] text-muted-foreground\">· {hint}</span>}\n {o.required === true && <span className=\"text-destructive\">*</span>}\n </li>\n )\n })}\n {value.length > shown.length && (\n <li className=\"text-[10px] text-muted-foreground\">+{value.length - shown.length}…</li>\n )}\n </ul>\n )\n }\n return <span>{value.map((v) => formatValue(v)).join(', ')}</span>\n }\n const obj = value as Record<string, unknown>\n const keys = Object.keys(obj).slice(0, 8)\n if (keys.length === 0) return <span className=\"text-muted-foreground\">—</span>\n return (\n <ul className=\"space-y-0.5\">\n {keys.map((k) => (\n <li key={k} className=\"flex gap-1.5\">\n <span className=\"shrink-0 text-[10px] uppercase tracking-wide text-muted-foreground\">{k}</span>\n <span className=\"min-w-0 break-words text-foreground\">\n {isComplexValue(obj[k]) ? JSON.stringify(obj[k]) : formatValue(obj[k])}\n </span>\n </li>\n ))}\n </ul>\n )\n}\n\nfunction formatValue(value: unknown): string {\n if (typeof value === 'boolean') return value ? '✓' : '—'\n if (Array.isArray(value)) return value.map((v) => formatValue(v)).join(', ')\n if (value && typeof value === 'object') return JSON.stringify(value)\n const text = String(value)\n // ISO datetimes are unreadable in a confirmation the user has 2 seconds for.\n const iso = /^(\\d{4}-\\d{2}-\\d{2})[T ](\\d{2}:\\d{2})/.exec(text)\n if (iso) {\n const parsed = new Date(text)\n if (!Number.isNaN(parsed.getTime())) return parsed.toLocaleString()\n }\n return text\n}\n\n/** ISO ⇄ the value shape each datetime-ish input actually accepts. */\nfunction toInputDate(value: unknown, type?: string): string {\n if (typeof value !== 'string' || !value) return ''\n const parsed = new Date(value)\n if (Number.isNaN(parsed.getTime())) return value\n const pad = (n: number) => String(n).padStart(2, '0')\n const date = `${parsed.getFullYear()}-${pad(parsed.getMonth() + 1)}-${pad(parsed.getDate())}`\n const time = `${pad(parsed.getHours())}:${pad(parsed.getMinutes())}`\n if (type === 'date') return date\n if (type === 'time') return time\n return `${date}T${time}`\n}\n\n/** One editable value, rendered from the entity's own `FieldType`. A timestamp\n * is not a text box and a boolean is not the string \"true\". */\nfunction FieldInput({\n field,\n value,\n onChange,\n}: {\n field?: PendingActionField\n value: unknown\n onChange: (next: unknown) => void\n}) {\n const base =\n 'w-full min-w-0 rounded border border-transparent bg-transparent px-1 py-0.5 text-[12px] text-foreground ' +\n 'hover:border-border focus:border-primary focus:bg-background focus:outline-none'\n const type = field?.type\n\n if (field?.readOnly) {\n return <span className=\"text-[12px] text-muted-foreground\">{formatValue(value)}</span>\n }\n\n if (type === 'boolean' || typeof value === 'boolean') {\n return (\n <input\n type=\"checkbox\"\n checked={value === true}\n onChange={(e) => onChange(e.target.checked)}\n className=\"h-3.5 w-3.5 rounded border-border\"\n />\n )\n }\n\n if (field?.options?.length) {\n return (\n <select value={String(value ?? '')} onChange={(e) => onChange(e.target.value)} className={base}>\n <option value=\"\" />\n {field.options.map((o) => (\n <option key={o.value} value={o.value}>\n {o.label ?? o.value}\n </option>\n ))}\n </select>\n )\n }\n\n if (type === 'textarea' || type === 'markdown') {\n return (\n <textarea\n rows={2}\n value={value === undefined || value === null ? '' : String(value)}\n placeholder={field?.placeholder}\n onChange={(e) => onChange(e.target.value)}\n className={cn(base, 'resize-none leading-snug')}\n />\n )\n }\n\n if (type === 'date' || type === 'datetime' || type === 'time') {\n const inputType = type === 'datetime' ? 'datetime-local' : type\n return (\n <input\n type={inputType}\n value={toInputDate(value, type)}\n onChange={(e) => {\n const raw = e.target.value\n if (!raw) return onChange('')\n // Times have no date to anchor to; everything else goes back as ISO.\n onChange(type === 'time' ? raw : new Date(raw).toISOString())\n }}\n className={base}\n />\n )\n }\n\n if (type === 'number' || type === 'currency' || typeof value === 'number') {\n return (\n <input\n type=\"number\"\n inputMode=\"decimal\"\n step={type === 'currency' ? '0.01' : 'any'}\n min={field?.min}\n max={field?.max}\n value={value === undefined || value === null ? '' : String(value)}\n placeholder={field?.placeholder}\n onChange={(e) => onChange(e.target.value === '' ? '' : Number(e.target.value))}\n className={base}\n />\n )\n }\n\n const htmlType = type === 'email' ? 'email' : type === 'phone' ? 'tel' : type === 'url' ? 'url' : 'text'\n return (\n <input\n type={htmlType}\n value={value === undefined || value === null ? '' : String(value)}\n placeholder={field?.placeholder}\n onChange={(e) => onChange(e.target.value)}\n className={base}\n />\n )\n}\n","import * as React from 'react'\nimport { Crown, Sparkles, ArrowRight } from 'lucide-react'\nimport { Button, Card } from '@fayz-ai/ui'\nimport type { Plan } from '@fayz-ai/core'\nimport { cn } from '../../lib/cn'\nimport { useTranslation } from '../../hooks/useTranslation'\nimport { useBillingStore } from '../../stores/billing.store'\nimport { usePermissionsStore } from '../../permissions'\nimport { useOrganizationStore } from '../../org/store'\nimport { navigateTo } from '../../app/routing'\nimport { getPlanEntitlements, featureDisplayName, resolvePlanCurrency } from './access-contract'\nimport { PlanFeatureItem } from './plan-feature'\n\n// ---------------------------------------------------------------------------\n// UpgradePrompt — the \"this is a higher-plan feature\" surface. Two variants:\n// • full (default): a benefit-led hero (compact icon + \"Unlock {Feature}\"),\n// a \"your plan\" context chip, and priced plan cards — the cheapest one that\n// unlocks the feature flagged \"Recommended\" and slightly elevated — each with\n// its own \"Upgrade\" CTA into /settings/subscription, plus a discreet\n// \"Compare all plans\" link.\n// • inline: a single-line banner for use as a gate fallback next to content.\n// Rendered by the AdminShell route guard (reason: 'plan'), the EntitlementGate\n// fallback, and anywhere a premium feature needs a discovery nudge.\n// ---------------------------------------------------------------------------\n\nexport interface UpgradePromptProps {\n /** Feature id (same id space as RBAC/nav) this prompt is about. */\n feature?: string\n /** Compact banner instead of the full hero block. */\n inline?: boolean\n className?: string\n}\n\nfunction planUnlocks(plan: Plan, feature: string | undefined): boolean {\n if (!feature) return plan.price > 0\n const ent = getPlanEntitlements(plan)\n // Entitled when the feature isn't explicitly disabled for the plan.\n return ent?.features?.[feature] !== false\n}\n\n/** Localized \"R$ 79\" style price, respecting the plan's currency + active locale. */\nfunction formatPrice(plan: Plan, locale: string | undefined): string {\n const currency = resolvePlanCurrency(plan.currency, locale)\n try {\n return new Intl.NumberFormat(locale, {\n style: 'currency',\n currency,\n minimumFractionDigits: Number.isInteger(plan.price) ? 0 : 2,\n }).format(plan.price)\n } catch {\n return `${currency} ${plan.price}`.trim()\n }\n}\n\nexport function UpgradePrompt({ feature, inline, className }: UpgradePromptProps) {\n const { t, locale } = useTranslation()\n const tr = (key: string, fallback: string, params?: Record<string, string>) => {\n let v = t(key)\n if (!v || v === key) v = fallback\n if (params) for (const [k, val] of Object.entries(params)) v = v.replace(`{${k}}`, val).replace(`{{${k}}}`, val)\n return v\n }\n\n const plans = useBillingStore((s) => s.plans)\n const features = usePermissionsStore((s) => s.features)\n const currentOrg = useOrganizationStore((s) => s.currentOrg)\n const currentPlanId = currentOrg?.plan || 'free'\n const currentPlan = plans.find((p) => p.id === currentPlanId)\n const currentPrice = currentPlan?.price ?? 0\n const currentPlanName = currentPlan?.name ?? tr('billing.free', 'Free')\n\n // Clean display name (strips \"(acesso)\"/\"(access)\" suffixes from the raw label).\n // Features gated only by plan (no RBAC entry, e.g. the assistant) fall back to\n // the shell's upgrade.feature.<id> translation before showing the raw id.\n const featureName = React.useMemo(() => {\n if (!feature) return null\n const label = features.find((f) => f.id === feature)?.label\n if (label) return featureDisplayName(label)\n const key = `upgrade.feature.${feature}`\n const named = t(key)\n return named && named !== key ? named : featureDisplayName(feature)\n }, [features, feature, t])\n\n // Plans that unlock the feature AND are an upgrade over the current plan,\n // cheapest first — so the first is the natural \"recommended\" entry point.\n const unlockingPlans = React.useMemo(\n () =>\n plans\n .filter((p) => p.id !== currentPlanId && p.price > currentPrice && planUnlocks(p, feature))\n .sort((a, b) => a.price - b.price),\n [plans, currentPlanId, currentPrice, feature],\n )\n const recommendedId = unlockingPlans[0]?.id\n\n const goToPlans = () => navigateTo('/settings/subscription')\n\n const heading = featureName\n ? tr('upgrade.unlock', 'Unlock {feature}', { feature: featureName })\n : tr('upgrade.title', 'Premium feature')\n\n // Benefit subcopy: per-feature key (upgrade.value.<feature>) with a dignified\n // generic fallback so every feature reads intentionally.\n const valueKey = feature ? `upgrade.value.${feature}` : ''\n const valueCopy = feature ? t(valueKey) : ''\n const subcopy =\n valueCopy && valueCopy !== valueKey\n ? valueCopy\n : tr('upgrade.valueGeneric', 'Get everything you need to grow — included in the plans below.')\n\n if (inline) {\n return (\n <div\n className={cn(\n 'flex flex-wrap items-center gap-3 rounded-xl border border-amber-400/40 bg-amber-50/60 px-4 py-3 dark:border-amber-400/25 dark:bg-amber-950/20',\n className,\n )}\n >\n <span className=\"flex h-8 w-8 shrink-0 items-center justify-center rounded-lg bg-amber-400/20 text-amber-600 dark:text-amber-400\">\n <Crown className=\"h-4 w-4\" />\n </span>\n <p className=\"min-w-0 flex-1 text-sm\">\n <span className=\"font-semibold text-foreground\">{heading}</span>\n <span className=\"ml-1.5 text-muted-foreground\">{subcopy}</span>\n </p>\n <Button size=\"sm\" onClick={goToPlans} className=\"shrink-0\">\n {tr('upgrade.ctaUpgrade', 'Upgrade')}\n <ArrowRight className=\"ml-1.5 h-3.5 w-3.5\" />\n </Button>\n </div>\n )\n }\n\n return (\n <div className={cn('mx-auto w-full max-w-4xl px-4 py-10 sm:py-14', className)}>\n {/* Hero — compact, benefit-led. Icon integrated with the title, not floating. */}\n <div className=\"flex flex-col items-center text-center\">\n {currentPlan && (\n <span className=\"mb-5 inline-flex items-center gap-1.5 rounded-full border bg-muted/40 px-3 py-1 text-xs font-medium text-muted-foreground\">\n <span className=\"h-1.5 w-1.5 rounded-full bg-muted-foreground/50\" aria-hidden=\"true\" />\n {tr('upgrade.currentPlan', 'Your plan: {plan}', { plan: currentPlanName })}\n </span>\n )}\n <h1 className=\"flex items-center gap-2.5 text-2xl font-bold tracking-tight text-foreground sm:text-3xl\">\n <span className=\"flex h-9 w-9 items-center justify-center rounded-xl bg-amber-400/15 text-amber-500 sm:h-10 sm:w-10\">\n <Crown className=\"h-5 w-5 sm:h-[22px] sm:w-[22px]\" />\n </span>\n {heading}\n </h1>\n <p className=\"mt-3 max-w-md text-sm text-muted-foreground sm:text-base\">{subcopy}</p>\n </div>\n\n {unlockingPlans.length > 0 && (\n <div\n className={cn(\n 'mt-9 grid gap-4 sm:gap-5',\n unlockingPlans.length === 1 ? 'max-w-sm mx-auto' : 'sm:grid-cols-2',\n unlockingPlans.length >= 3 && 'lg:grid-cols-3',\n )}\n >\n {unlockingPlans.map((plan) => {\n const recommended = plan.id === recommendedId\n const paid = plan.price > 0\n const highlights = plan.features.slice(0, 3)\n return (\n <Card\n key={plan.id}\n className={cn(\n 'relative flex flex-col p-5 transition-shadow',\n recommended\n ? 'border-primary shadow-lg ring-1 ring-primary/20 sm:-translate-y-1'\n : 'hover:shadow-md',\n )}\n >\n {recommended && (\n <span className=\"absolute -top-2.5 left-1/2 -translate-x-1/2 whitespace-nowrap inline-flex items-center gap-1 rounded-full bg-primary px-2.5 py-0.5 text-[11px] font-semibold uppercase tracking-wide text-primary-foreground shadow-sm\">\n <Sparkles className=\"h-3 w-3\" aria-hidden=\"true\" />\n {tr('upgrade.recommended', 'Recommended')}\n </span>\n )}\n\n <div className=\"flex items-center gap-1.5\">\n {paid && <Crown className=\"h-4 w-4 text-amber-500\" aria-hidden=\"true\" />}\n <h2 className=\"text-sm font-semibold text-foreground\">{plan.name}</h2>\n </div>\n\n <div className=\"mt-2 flex items-baseline gap-1\">\n <span className=\"text-2xl font-bold tracking-tight text-foreground tabular-nums\">\n {formatPrice(plan, locale)}\n </span>\n <span className=\"text-sm text-muted-foreground\">\n {plan.interval === 'year' ? tr('billing.perYear', '/yr') : tr('billing.perMonth', '/mo')}\n </span>\n </div>\n\n {plan.description && (\n <p className=\"mt-1 text-xs text-muted-foreground\">{plan.description}</p>\n )}\n\n <ul className=\"mt-4 flex-1 space-y-2\">\n {highlights.map((f) => (\n <PlanFeatureItem key={f} feature={f} className=\"text-xs text-foreground/80\" iconClassName=\"h-3.5 w-3.5\" />\n ))}\n </ul>\n\n <Button\n className=\"mt-5 w-full\"\n variant={recommended ? 'default' : 'outline'}\n onClick={goToPlans}\n aria-label={tr('upgrade.ctaUpgradeTo', 'Upgrade to {plan}', { plan: plan.name })}\n >\n {paid && <Crown className=\"mr-1.5 h-4 w-4\" aria-hidden=\"true\" />}\n {tr('upgrade.ctaUpgrade', 'Upgrade')}\n </Button>\n </Card>\n )\n })}\n </div>\n )}\n\n <div className=\"mt-7 text-center\">\n <button\n type=\"button\"\n onClick={goToPlans}\n className=\"inline-flex items-center gap-1 rounded text-sm font-medium text-muted-foreground underline-offset-4 transition-colors hover:text-foreground hover:underline focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring\"\n >\n {tr('upgrade.compareAll', 'Compare all plans')}\n <ArrowRight className=\"h-3.5 w-3.5\" aria-hidden=\"true\" />\n </button>\n </div>\n </div>\n )\n}\n","import * as React from 'react'\nimport { cn } from '../../lib/cn'\nimport { UpgradePrompt } from './UpgradePrompt'\n\n// ---------------------------------------------------------------------------\n// UpgradeOverlay — the plan-gate paywall that keeps the real page visible.\n// The gated page renders behind (blurred, inert) as a teaser of what the\n// upgrade unlocks; the UpgradePrompt floats above it.\n// Used by the AdminShell route guard for reason: 'plan' denials.\n// ---------------------------------------------------------------------------\n\nexport interface UpgradeOverlayProps {\n /** Feature id (same id space as RBAC/nav) the paywall is about. */\n feature?: string\n /** The gated page — rendered behind the paywall as a blurred teaser. */\n children: React.ReactNode\n className?: string\n /** Paywall layer classes — override the default full-viewport centering\n * (e.g. `min-h-full` inside a narrow drawer). */\n overlayClassName?: string\n /** Forwarded to the UpgradePrompt (spacing overrides for tight surfaces). */\n promptClassName?: string\n}\n\nexport function UpgradeOverlay({ feature, children, className, overlayClassName, promptClassName }: UpgradeOverlayProps) {\n return (\n <div className={cn('relative', className)}>\n {/* Teaser layer: the live page, blurred + faded in place and made inert —\n visual only, never interactive or read by AT. The blur lives on the\n content itself (not a backdrop) so it covers exactly the page, with\n no frosted rectangle or margins. */}\n <div\n aria-hidden=\"true\"\n className=\"pointer-events-none absolute inset-0 select-none overflow-hidden blur-[5px] opacity-40\"\n >\n {children}\n </div>\n {/* Paywall layer: transparent, centered over the teaser. */}\n <div className={cn('relative flex min-h-[70vh] items-center justify-center', overlayClassName)}>\n <UpgradePrompt feature={feature} className={cn('py-8 sm:py-10', promptClassName)} />\n </div>\n </div>\n )\n}\n","/**\n * Entitlement key for the AI assistant.\n *\n * A plan gates it with `entitlements.features.assistant = false`; absent means\n * open, so apps that never declare it keep the assistant.\n */\nexport const ASSISTANT_FEATURE = 'assistant'\n","import * as React from 'react'\nimport {\n ArrowDown,\n ArrowLeft,\n Sparkles,\n MessageSquare,\n Plug,\n Settings2,\n SquarePen,\n X,\n} from 'lucide-react'\nimport { cn } from '../../lib/cn'\nimport { useTranslation } from '../../hooks/useTranslation'\nimport { useChatStore } from '../../stores/chat.store'\nimport { useChat } from '../../hooks/useChat'\nimport { useAITools } from '../../hooks/useAITools'\nimport { useAuthStore } from '@fayz-ai/auth'\nimport { ChatSuggestions, ChatToolsPanel } from './ChatSuggestions'\nimport { ConnectorsPanel, useConnectorsSurface } from '../connect/ConnectorsPanel'\nimport { ChatComposer } from './ChatComposer'\nimport { AttachmentDropOverlay, useFileDrop } from './ChatAttachments'\nimport { ActiveToolChips, MessageBubble } from './ChatMessages'\nimport { ConfirmActionCard } from './ConfirmActionCard'\nimport { stopSpeaking } from '../../lib/speech'\nimport { useAccessOptional } from '../../access/context'\nimport { UpgradeOverlay } from '../billing/UpgradeOverlay'\nimport { ASSISTANT_FEATURE } from '../../lib/assistant-feature'\nimport { resolveFayzAgentConnection, type FayzAgentConnectionConfig } from '../../lib/fayz-agent'\nimport type { ChatVoiceConfig } from '../../app/config'\n\n/** Injected once — the idle view rises in as a stagger, elements carrying their\n * own animationDelay. Motion-gated in CSS so reduced-motion gets it static. */\nconst INTRO_STYLE_ID = 'chat-panel-anims'\nfunction ensureIntroStyles() {\n if (typeof document === 'undefined') return\n if (document.getElementById(INTRO_STYLE_ID)) return\n const style = document.createElement('style')\n style.id = INTRO_STYLE_ID\n style.textContent = `\n @media (prefers-reduced-motion: no-preference) {\n @keyframes chatIntroUp {\n from { opacity: 0; transform: translateY(10px); }\n to { opacity: 1; transform: translateY(0); }\n }\n .chat-intro { animation: chatIntroUp 420ms cubic-bezier(0.22, 1, 0.36, 1) both; }\n }\n `\n document.head.appendChild(style)\n}\n\n/** The conversation with no box around it — status row, history/tools drawers,\n * transcript, confirmation card, suggestions, composer. Owns no position, so\n * any surface can mount it. */\nexport interface ChatConversationProps {\n apiEndpoint?: string\n systemPrompt?: string\n agent?: FayzAgentConnectionConfig | false\n voice?: ChatVoiceConfig\n /** Enables the discreet \"continuar no WhatsApp\" hand-off under the composer. */\n whatsapp?: { number: string; message?: string }\n className?: string\n}\n\ntype Drawer = 'none' | 'tools' | 'connectors'\n\nexport function ChatConversation({\n apiEndpoint,\n systemPrompt,\n agent,\n voice,\n whatsapp,\n className,\n}: ChatConversationProps) {\n const { messages, isStreaming, conversationId } = useChatStore()\n const {\n sendMessage, isConfigured, pendingAction, resolvePendingAction,\n activeTools, conversations, loadConversations, resumeConversation, startNewConversation,\n } = useChat({ apiEndpoint, systemPrompt, agent })\n const { t } = useTranslation()\n const { suggestions, toolGroups } = useAITools()\n const user = useAuthStore((s) => s.user)\n const setDraft = useChatStore((s) => s.setDraft)\n const suggestionsOpen = useChatStore((s) => s.suggestionsOpen)\n const setSuggestionsOpen = useChatStore((s) => s.setSuggestionsOpen)\n // A plan gates the assistant only with an explicit `features.assistant:false`,\n // so an app that never heard of it stays open.\n const planLocked = !useAccessOptional().entitled(ASSISTANT_FEATURE)\n const usable = isConfigured && !planLocked\n\n // The drop target is the whole panel, not the composer strip — you aim a\n // dragged file at the conversation, not at a 40px input.\n const addAttachments = useChatStore((s) => s.addAttachments)\n const { dragging, handlers: dropHandlers } = useFileDrop(\n usable && !pendingAction && !isStreaming,\n addAttachments,\n )\n\n React.useEffect(ensureIntroStyles, [])\n\n // Skeleton only makes sense when a Fayz agent backs the history — a custom\n // apiEndpoint has no thread list, so its first load would never settle.\n const conversationsLoaded = useChatStore((s) => s.conversationsLoaded)\n const hasHistoryBackend = React.useMemo(\n () => !apiEndpoint && !!resolveFayzAgentConnection(agent),\n [apiEndpoint, agent],\n )\n const conversationsPending = hasHistoryBackend && !conversationsLoaded\n\n // Two views in one tab: the open thread, and the list you came from. The\n // panel remounts on every open, so `messages` (which survive in the store)\n // decide where you land — reopening returns you to what you were doing.\n const [view, setView] = React.useState<'thread' | 'list'>(\n () => (useChatStore.getState().messages.length > 0 ? 'thread' : 'list'),\n )\n const [drawer, setDrawer] = React.useState<Drawer>('none')\n const [atBottom, setAtBottom] = React.useState(true)\n const scrollRef = React.useRef<HTMLDivElement>(null)\n\n const hasMessages = messages.length > 0\n const totalTools = toolGroups.reduce((sum, g) => sum + g.tools.length, 0)\n\n const scrollToBottom = React.useCallback((behavior: ScrollBehavior = 'smooth') => {\n const el = scrollRef.current\n if (!el) return\n el.scrollTo({ top: el.scrollHeight, behavior })\n }, [])\n\n // Only autoscroll while the user is at the bottom; the jump pill covers the rest.\n React.useEffect(() => {\n if (atBottom) scrollToBottom()\n }, [messages, activeTools, pendingAction, atBottom, scrollToBottom])\n\n React.useEffect(() => {\n loadConversations()\n // Coming back to a live thread, the suggestion strip is noise in front of\n // it; the composer's Sparkles button brings it back.\n setSuggestionsOpen(useChatStore.getState().messages.length === 0)\n return () => stopSpeaking()\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [loadConversations])\n\n const handleScroll = (event: React.UIEvent<HTMLDivElement>) => {\n const el = event.currentTarget\n setAtBottom(el.scrollHeight - el.scrollTop - el.clientHeight < 48)\n }\n\n const send = (text: string) => {\n setView('thread')\n setAtBottom(true)\n setSuggestionsOpen(false)\n sendMessage(text)\n }\n\n // Delegated work (\"resolver com IA\"): the user already said go elsewhere —\n // fire it the moment the conversation can. Locked/unconfigured drops the\n // queue; the paywall or offline note on screen explains why.\n const queuedPrompt = useChatStore((s) => s.queuedPrompt)\n const consumeQueuedPrompt = useChatStore((s) => s.consumeQueuedPrompt)\n React.useEffect(() => {\n if (!queuedPrompt) return\n const prompt = consumeQueuedPrompt()\n if (prompt && usable) send(prompt)\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [queuedPrompt, usable])\n\n const toggleDrawer = (next: Drawer) => setDrawer((current) => (current === next ? 'none' : next))\n\n // Settings → Conectores raises the assistant on this drawer. The request is\n // left waiting in the store because it usually lands before this panel exists.\n const connectorsPending = useConnectorsSurface((s) => s.pending)\n const consumeConnectorsRequest = useConnectorsSurface((s) => s.consume)\n React.useEffect(() => {\n if (!connectorsPending) return\n setDrawer('connectors')\n consumeConnectorsRequest()\n }, [connectorsPending, consumeConnectorsRequest])\n\n const greetingName = (user?.fullName || user?.email || '').split(/[\\s@]/)[0]\n const showSuggestions = usable && suggestions.length > 0 && suggestionsOpen\n\n return (\n <div\n {...dropHandlers}\n className={cn('relative flex min-h-0 flex-1 flex-col overflow-hidden', className)}\n >\n {dragging && <AttachmentDropOverlay />}\n\n {/* Status + actions. The surface around it owns the title and the close. */}\n <div className=\"flex items-center gap-2 border-b border-border/40 bg-card/95 px-2 py-1 backdrop-blur\">\n {view === 'thread' && hasMessages ? (\n <button\n type=\"button\"\n onClick={() => setView('list')}\n className={cn(\n 'inline-flex min-w-0 flex-1 items-center gap-1 rounded-lg px-1.5 py-1 text-left text-[11.5px]',\n 'text-muted-foreground transition-colors hover:bg-muted hover:text-foreground',\n 'focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring',\n )}\n >\n <ArrowLeft className=\"h-3.5 w-3.5 shrink-0\" />\n <span className=\"truncate\">{t('chat.backToConversations')}</span>\n </button>\n ) : (\n <p className=\"min-w-0 flex-1 truncate px-1 text-[11px] leading-tight text-muted-foreground\">\n {isStreaming ? t('chat.status.working') : !isConfigured ? t('chat.status.offline') : ''}\n </p>\n )}\n\n <div className=\"flex items-center gap-0.5\">\n {hasMessages && (\n <HeaderButton\n onClick={() => {\n startNewConversation()\n setView('list')\n }}\n label={t('chat.newConversation')}\n >\n <SquarePen className=\"h-3.5 w-3.5\" />\n </HeaderButton>\n )}\n {totalTools > 0 && (\n <HeaderButton\n active={drawer === 'tools'}\n onClick={() => toggleDrawer('tools')}\n label={t('chat.toolsAvailable', { count: totalTools })}\n >\n <Settings2 className=\"h-3.5 w-3.5\" />\n </HeaderButton>\n )}\n {/* Next to the tools it already has: what it could reach. Same drawer\n pattern, because connecting a provider is the same kind of thing as\n inspecting a tool — the assistant's own capability surface. */}\n <HeaderButton\n active={drawer === 'connectors'}\n onClick={() => toggleDrawer('connectors')}\n label={t('settings.connectors')}\n >\n <Plug className=\"h-3.5 w-3.5\" />\n </HeaderButton>\n </div>\n </div>\n\n {drawer === 'tools' ? (\n <ChatToolsPanel toolGroups={toolGroups} onClose={() => setDrawer('none')} />\n ) : drawer === 'connectors' ? (\n <ConnectorsPanel onClose={() => setDrawer('none')} />\n ) : (\n <div className=\"relative flex min-h-0 flex-1 flex-col\">\n <div\n ref={scrollRef}\n onScroll={handleScroll}\n className={cn('min-h-0 flex-1 overflow-y-auto', hasMessages && 'space-y-2 px-3 py-3')}\n >\n {/* Unavailable belongs HERE, not in the composer placeholder: a\n sentence explaining why nothing works reads as a hint about what\n to type when it sits in the input. */}\n {planLocked ? (\n // Same paywall pattern as the route guard: the assistant's idle\n // state (greeting + suggestions) shows behind as a blurred teaser.\n <UpgradeOverlay\n feature={ASSISTANT_FEATURE}\n overlayClassName=\"min-h-full py-4\"\n promptClassName=\"px-3 py-4 sm:py-6\"\n >\n <div className=\"flex flex-col px-3 pt-4\">\n <p className=\"px-0.5 text-[15px] font-semibold leading-snug text-foreground\">\n {greetingName\n ? t('chat.greetingNamed', { name: greetingName })\n : t('chat.greeting')}\n </p>\n <p className=\"px-0.5 text-[12px] leading-snug text-muted-foreground\">\n {t('chat.greetingHint')}\n </p>\n {suggestions.length > 0 && (\n <div className=\"mt-4\">\n <ChatSuggestions\n suggestions={suggestions}\n compact\n onDismiss={() => {}}\n onSelect={() => {}}\n />\n </div>\n )}\n </div>\n </UpgradeOverlay>\n ) : !isConfigured ? (\n <div className=\"flex min-h-0 flex-1 flex-col items-center justify-center gap-1 px-6 py-10 text-center\">\n <Sparkles className=\"mb-1 h-6 w-6 text-muted-foreground/40\" />\n <p className=\"text-[13px] font-medium text-foreground\">{t('chat.unavailable')}</p>\n <p className=\"text-[11.5px] leading-relaxed text-muted-foreground\">\n {t('chat.notConfigured')}\n </p>\n </div>\n ) : view === 'list' || !hasMessages ? (\n <div className=\"flex min-h-0 flex-1 flex-col px-3 pt-4\">\n <p className=\"chat-intro px-0.5 text-[15px] font-semibold leading-snug text-foreground\">\n {greetingName\n ? t('chat.greetingNamed', { name: greetingName })\n : t('chat.greeting')}\n </p>\n <p\n className=\"chat-intro px-0.5 text-[12px] leading-snug text-muted-foreground\"\n style={{ animationDelay: '70ms' }}\n >\n {t('chat.greetingHint')}\n </p>\n\n {conversationsPending ? (\n <div className=\"chat-intro mt-4\" style={{ animationDelay: '140ms' }}>\n <span className=\"block px-0.5 pb-1 text-[10px] font-semibold uppercase tracking-wider text-muted-foreground/60\">\n {t('chat.recentConversations')}\n </span>\n <div className=\"space-y-1 py-0.5\">\n {[76, 58, 66].map((width, index) => (\n <div key={index} className=\"flex items-center gap-2 px-1 py-1.5\">\n <div className=\"h-3 w-3 shrink-0 animate-pulse rounded-full bg-muted\" />\n <div\n className=\"h-3 animate-pulse rounded bg-muted\"\n style={{ width: `${width}%` }}\n />\n </div>\n ))}\n </div>\n </div>\n ) : conversations.length > 0 && (\n <div className=\"chat-intro mt-4 min-h-0\" style={{ animationDelay: '140ms' }}>\n <span className=\"block px-0.5 pb-1 text-[10px] font-semibold uppercase tracking-wider text-muted-foreground/60\">\n {t('chat.recentConversations')}\n </span>\n <div className=\"-mx-1\">\n {conversations.slice(0, 6).map((conversation) => (\n <button\n key={conversation.id}\n type=\"button\"\n onClick={() => {\n setAtBottom(true)\n setView('thread')\n // Opening a thread puts the transcript in front;\n // the strip would cover the tail of it.\n setSuggestionsOpen(false)\n resumeConversation(conversation.id)\n }}\n className={cn(\n 'flex w-full items-start gap-2 rounded-lg px-2 py-1.5 text-left transition-colors',\n 'hover:bg-muted/60 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring',\n )}\n >\n <MessageSquare className=\"mt-0.5 h-3 w-3 shrink-0 text-muted-foreground/40\" />\n <span className=\"min-w-0 flex-1\">\n <span className=\"line-clamp-1 block text-[12.5px] text-foreground/90\">\n {conversation.title ?? t('chat.untitledConversation')}\n </span>\n </span>\n </button>\n ))}\n </div>\n </div>\n )}\n </div>\n ) : null}\n\n {view === 'thread' &&\n messages.map((message, i) => (\n <MessageBubble\n key={message.id}\n message={message}\n isPending={\n isStreaming &&\n !pendingAction &&\n activeTools.length === 0 &&\n i === messages.length - 1 &&\n message.role === 'assistant'\n }\n />\n ))}\n\n {pendingAction && (\n <ConfirmActionCard action={pendingAction} onResolve={resolvePendingAction} />\n )}\n {/* Nothing runs behind the card — it is what everything is waiting on. */}\n {!pendingAction && activeTools.length > 0 && <ActiveToolChips names={activeTools} />}\n </div>\n\n {!atBottom && hasMessages && (\n <button\n type=\"button\"\n onClick={() => {\n setAtBottom(true)\n scrollToBottom()\n }}\n className={cn(\n 'absolute bottom-2 left-1/2 -translate-x-1/2 rounded-full border border-border bg-card px-2.5 py-1',\n 'text-[11px] font-medium text-foreground shadow-lg transition-colors hover:bg-muted',\n )}\n >\n <ArrowDown className=\"mr-1 inline h-3 w-3\" />\n {t('chat.jumpToLatest')}\n </button>\n )}\n\n {showSuggestions && (\n <ChatSuggestions\n suggestions={suggestions}\n compact\n onDismiss={() => setSuggestionsOpen(false)}\n onSelect={(suggestion) => setDraft(suggestion.prompt ?? suggestion.label)}\n />\n )}\n </div>\n )}\n\n {drawer === 'none' && (\n <ChatComposer\n onSend={send}\n isStreaming={isStreaming}\n isConfigured={usable}\n blocked={!!pendingAction}\n voice={voice}\n hasSuggestions={suggestions.length > 0}\n suggestionsOpen={suggestionsOpen}\n onToggleSuggestions={() => setSuggestionsOpen(!suggestionsOpen)}\n />\n )}\n\n {/* Discreet channel hand-off — the conversation follows the user out of\n the app. Shown only when the app configured a WhatsApp number. */}\n {drawer === 'none' && whatsapp?.number && (\n <a\n href={`https://wa.me/${whatsapp.number.replace(/\\D/g, '')}?text=${encodeURIComponent(\n whatsapp.message ?? t('chat.whatsapp.defaultMessage'),\n )}`}\n target=\"_blank\"\n rel=\"noreferrer\"\n className=\"flex items-center justify-center gap-1.5 pb-2 text-[10.5px] text-muted-foreground/50 transition-colors hover:text-[#25D366]\"\n >\n <WhatsAppGlyph className=\"h-3 w-3\" />\n {t('chat.whatsapp.continue')}\n </a>\n )}\n </div>\n )\n}\n\n/** lucide dropped brand icons — a minimal WhatsApp glyph, currentColor. */\nfunction WhatsAppGlyph({ className }: { className?: string }) {\n return (\n <svg viewBox=\"0 0 24 24\" fill=\"currentColor\" aria-hidden=\"true\" className={className}>\n <path d=\"M12 2a10 10 0 0 0-8.6 15.1L2 22l5-1.3A10 10 0 1 0 12 2Zm0 18.2a8.2 8.2 0 0 1-4.2-1.2l-.3-.2-3 .8.8-2.9-.2-.3A8.2 8.2 0 1 1 12 20.2Zm4.5-6.1c-.2-.1-1.5-.7-1.7-.8-.2-.1-.4-.1-.5.1-.2.2-.6.8-.8 1-.1.2-.3.2-.5.1a6.7 6.7 0 0 1-2-1.2 7.5 7.5 0 0 1-1.4-1.7c-.1-.2 0-.4.1-.5l.4-.4c.1-.2.2-.3.3-.5v-.4c0-.1-.5-1.3-.7-1.8-.2-.4-.4-.4-.5-.4h-.5c-.1 0-.4.1-.6.3-.2.2-.8.8-.8 1.9s.8 2.2 1 2.4c.1.2 1.6 2.5 4 3.5.6.2 1 .4 1.4.5.6.2 1.1.2 1.5.1.5-.1 1.5-.6 1.7-1.2.2-.6.2-1.1.1-1.2 0-.1-.2-.2-.5-.3Z\" />\n </svg>\n )\n}\n\nfunction HeaderButton({\n children,\n label,\n onClick,\n active,\n}: {\n children: React.ReactNode\n label: string\n onClick: () => void\n active?: boolean\n}) {\n return (\n <button\n type=\"button\"\n onClick={onClick}\n title={label}\n aria-label={label}\n aria-pressed={active}\n className={cn(\n 'inline-flex h-7 w-7 items-center justify-center rounded-lg transition-colors',\n 'focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring',\n active\n ? 'bg-primary/10 text-primary'\n : 'text-muted-foreground hover:bg-muted hover:text-foreground',\n )}\n >\n {children}\n </button>\n )\n}\n","import * as React from 'react'\nimport { useChatStore } from '../stores/chat.store'\nimport { useRightRailStore } from '../components/right-rail'\n\n/** The agentic hand-off: queue a prompt that auto-sends (the click IS the send\n * intent) and flip the rail to the Chat tab. Shared by the Notes tab and any\n * plugin surface (e.g. a task's \"Conversar com IA\"). */\nexport function useDelegateToAssistant(): (prompt: string) => void {\n const queuePrompt = useChatStore((s) => s.queuePrompt)\n const openPanel = useRightRailStore((s) => s.openPanel)\n return React.useCallback(\n (prompt: string) => {\n queuePrompt(prompt)\n openPanel('chat')\n },\n [queuePrompt, openPanel],\n )\n}\n","import { create } from 'zustand'\n\n// ---------------------------------------------------------------------------\n// Notes ↔ Tasks bridge. The rail's Notes tab always offers a \"tarefas\" input\n// per note; when a tasks backend registers here (plugin-tasks does on setup),\n// those todos are REAL tasks — created, listed and toggled through the tasks\n// provider, linked back by a `note:<id>` label. One source of truth: the\n// Tarefas tab shows everything, the note shows its own slice. No adapter\n// registered → the section hides and notes fall back to `- [ ]` checklists.\n// ---------------------------------------------------------------------------\n\nexport interface NoteTodo {\n id: string\n title: string\n done: boolean\n}\n\nexport interface NotesTasksAdapter {\n /** Create a task linked to the note (label `note:<noteId>`). */\n createTodo(input: { title: string; noteId: string; noteTitle: string }): Promise<NoteTodo>\n /** Tasks linked to the note, open first. */\n listTodos(noteId: string): Promise<NoteTodo[]>\n /** Flip the underlying task between done and todo. */\n toggleTodo(id: string, done: boolean): Promise<void>\n removeTodo(id: string): Promise<void>\n}\n\ninterface NotesTasksBridgeState {\n adapter: NotesTasksAdapter | null\n setAdapter: (adapter: NotesTasksAdapter | null) => void\n}\n\nexport const useNotesTasksBridge = create<NotesTasksBridgeState>((set) => ({\n adapter: null,\n setAdapter: (adapter) => set({ adapter }),\n}))\n\n/** Called by the tasks plugin (or any tasks backend) at setup time. */\nexport function registerNotesTasksAdapter(adapter: NotesTasksAdapter): void {\n useNotesTasksBridge.getState().setAdapter(adapter)\n}\n\nexport const NOTE_LABEL_PREFIX = 'note:'\n","import * as React from 'react'\nimport { ArrowLeft, CheckSquare2, Eye, Pencil, Pin, PinOff, Plus, Search, Sparkles, Square, StickyNote, Trash2 } from 'lucide-react'\nimport { Input, cn } from '@fayz-ai/ui'\nimport { create as createStore } from 'zustand'\nimport { useAuthStore } from '@fayz-ai/auth'\nimport { useTranslation } from '../../hooks/useTranslation'\nimport { useOrganizationStore } from '../../stores/organization.store'\nimport { useRightRailPanel } from '../right-rail'\nimport { useDelegateToAssistant } from '../../lib/assistant-delegation'\nimport { useNotesTasksBridge, type NoteTodo } from '../../lib/notes-tasks-bridge'\nimport { ChatMarkdown } from '../chat/markdown'\n\n// ---------------------------------------------------------------------------\n// NotesPanel — the rail's \"Notas\" tab. Apple Notes-inspired: a searchable list\n// (pinned first), and a plain-markdown editor where the first line is the\n// title. Local-first: notes persist per tenant+user in localStorage — the seam\n// to graduate to a DB-backed provider later without changing the UI.\n// ---------------------------------------------------------------------------\n\nexport interface Note {\n id: string\n content: string\n pinned: boolean\n createdAt: string\n updatedAt: string\n}\n\nfunction storageKey(orgId: string, userId: string): string {\n return `fayz.notes.${orgId}.${userId}`\n}\n\n// Note count shared between the panel (which mutates) and the tab badge\n// (registered elsewhere) — module-level so both see the same number live.\nconst useNotesCount = createStore<{ count: number; setCount: (count: number) => void }>((set) => ({\n count: 0,\n setCount: (count) => set({ count }),\n}))\n\nfunction loadNotes(key: string): Note[] {\n try {\n const raw = localStorage.getItem(key)\n return raw ? (JSON.parse(raw) as Note[]) : []\n } catch {\n return []\n }\n}\n\nfunction saveNotes(key: string, notes: Note[]): void {\n try {\n localStorage.setItem(key, JSON.stringify(notes))\n } catch {\n /* quota/private mode — notes stay in-memory for the session */\n }\n}\n\nfunction titleOf(note: Note): string {\n return note.content.split('\\n').find((l) => l.trim())?.replace(/^#+\\s*/, '').trim() ?? ''\n}\n\nfunction snippetOf(note: Note): string {\n const lines = note.content.split('\\n').filter((l) => l.trim())\n return lines.slice(1).join(' · ').slice(0, 120)\n}\n\nfunction noteDate(iso: string, locale?: string): string {\n const d = new Date(iso)\n const today = new Date()\n const sameDay = d.toDateString() === today.toDateString()\n return sameDay\n ? d.toLocaleTimeString(locale, { hour: '2-digit', minute: '2-digit' })\n : d.toLocaleDateString(locale, { day: '2-digit', month: '2-digit', year: '2-digit' })\n}\n\nexport function NotesPanel() {\n const { t, locale } = useTranslation()\n const tr = (key: string, fallback: string) => {\n const v = t(key)\n return v && v !== key ? v : fallback\n }\n\n const user = useAuthStore((s) => s.user)\n const currentOrg = useOrganizationStore((s) => s.currentOrg)\n const key = storageKey(currentOrg?.id ?? 'local', user?.id ?? 'anon')\n\n const [notes, setNotes] = React.useState<Note[]>(() => loadNotes(key))\n const [openId, setOpenId] = React.useState<string | null>(null)\n const [search, setSearch] = React.useState('')\n const [preview, setPreview] = React.useState(false)\n const [confirmingDelete, setConfirmingDelete] = React.useState<string | null>(null)\n\n // Workspace switch swaps the whole notebook.\n React.useEffect(() => {\n setNotes(loadNotes(key))\n setOpenId(null)\n }, [key])\n\n const update = (next: Note[]) => {\n setNotes(next)\n saveNotes(key, next)\n useNotesCount.getState().setCount(next.length)\n }\n\n const createNote = () => {\n const now = new Date().toISOString()\n const note: Note = {\n id: `n_${now}_${Math.random().toString(36).slice(2, 8)}`,\n content: '',\n pinned: false,\n createdAt: now,\n updatedAt: now,\n }\n update([note, ...notes])\n setPreview(false)\n setOpenId(note.id)\n }\n\n const patchNote = (id: string, patch: Partial<Note>) =>\n update(notes.map((n) => (n.id === id ? { ...n, ...patch, updatedAt: new Date().toISOString() } : n)))\n\n const deleteNote = (id: string) => {\n update(notes.filter((n) => n.id !== id))\n setConfirmingDelete(null)\n if (openId === id) setOpenId(null)\n }\n\n const open = openId ? notes.find((n) => n.id === openId) : null\n\n // -------------------------------------------------------------------------\n // Editor\n // -------------------------------------------------------------------------\n if (open) {\n return (\n <div className=\"flex min-h-0 flex-1 flex-col\">\n <div className=\"flex items-center gap-1 border-b border-border/40 px-2 py-1.5\">\n <button\n type=\"button\"\n onClick={() => setOpenId(null)}\n className=\"inline-flex items-center gap-1 rounded-lg px-1.5 py-1 text-[11.5px] text-muted-foreground transition-colors hover:bg-muted hover:text-foreground\"\n >\n <ArrowLeft className=\"h-3.5 w-3.5\" />\n {tr('notes.back', 'Notas')}\n </button>\n <span className=\"flex-1\" />\n <IconButton\n label={open.pinned ? tr('notes.unpin', 'Desafixar') : tr('notes.pin', 'Fixar')}\n onClick={() => patchNote(open.id, { pinned: !open.pinned })}\n active={open.pinned}\n >\n {open.pinned ? <PinOff className=\"h-3.5 w-3.5\" /> : <Pin className=\"h-3.5 w-3.5\" />}\n </IconButton>\n <IconButton\n label={preview ? tr('notes.edit', 'Editar') : tr('notes.preview', 'Visualizar')}\n onClick={() => setPreview(!preview)}\n active={preview}\n >\n {preview ? <Pencil className=\"h-3.5 w-3.5\" /> : <Eye className=\"h-3.5 w-3.5\" />}\n </IconButton>\n <IconButton label={tr('notes.delete', 'Excluir')} onClick={() => deleteNote(open.id)} danger>\n <Trash2 className=\"h-3.5 w-3.5\" />\n </IconButton>\n </div>\n\n {preview ? (\n <div className=\"min-h-0 flex-1 overflow-y-auto px-4 py-3 text-sm\">\n {open.content.trim() ? (\n <NoteBody\n content={open.content}\n onToggleLine={(lineIdx) => patchNote(open.id, { content: toggleChecklistLine(open.content, lineIdx) })}\n />\n ) : (\n <p className=\"text-muted-foreground\">{tr('notes.emptyNote', 'Nota vazia')}</p>\n )}\n </div>\n ) : (\n <textarea\n autoFocus\n value={open.content}\n onChange={(e) => patchNote(open.id, { content: e.target.value })}\n placeholder={tr('notes.placeholder', 'Escreva algo… (markdown funciona: # título, - [ ] checklist, **negrito**)')}\n className={cn(\n 'min-h-0 flex-1 resize-none bg-transparent px-4 py-3 text-sm leading-relaxed text-foreground',\n 'placeholder:text-muted-foreground/60 focus:outline-none',\n )}\n />\n )}\n <DelegateCta note={open} tr={tr} />\n\n <NoteTodosSection noteId={open.id} noteTitle={titleOf(open)} tr={tr} />\n\n <p className=\"border-t border-border/40 px-4 py-1.5 text-[10px] text-muted-foreground/60\">\n {tr('notes.created', 'Criada')} {noteDate(open.createdAt, locale)} · {tr('notes.edited', 'Editada')} {noteDate(open.updatedAt, locale)}\n </p>\n </div>\n )\n }\n\n // -------------------------------------------------------------------------\n // List\n // -------------------------------------------------------------------------\n const q = search.trim().toLowerCase()\n const visible = notes\n .filter((n) => !q || n.content.toLowerCase().includes(q))\n .sort((a, b) =>\n a.pinned !== b.pinned ? (a.pinned ? -1 : 1) : b.updatedAt.localeCompare(a.updatedAt),\n )\n\n return (\n <div className=\"flex min-h-0 flex-1 flex-col\">\n <div className=\"flex items-center gap-2 border-b border-border/40 px-3 py-2\">\n <div className=\"relative min-w-0 flex-1\">\n <Search className=\"pointer-events-none absolute left-2.5 top-1/2 h-3.5 w-3.5 -translate-y-1/2 text-muted-foreground/60\" />\n <Input\n value={search}\n onChange={(e) => setSearch(e.target.value)}\n placeholder={tr('notes.search', 'Buscar notas…')}\n className=\"h-8 pl-8 text-sm\"\n />\n </div>\n <button\n type=\"button\"\n onClick={createNote}\n aria-label={tr('notes.new', 'Nova nota')}\n title={tr('notes.new', 'Nova nota')}\n className=\"inline-flex h-8 w-8 shrink-0 items-center justify-center rounded-lg bg-primary text-primary-foreground transition-opacity hover:opacity-90\"\n >\n <Plus className=\"h-4 w-4\" />\n </button>\n </div>\n\n <div className=\"min-h-0 flex-1 overflow-y-auto\">\n {visible.length === 0 && (\n <div className=\"flex flex-col items-center gap-2 p-10 text-center text-muted-foreground\">\n <StickyNote className=\"h-6 w-6\" />\n <p className=\"text-sm font-medium text-foreground\">\n {q ? tr('notes.noResults', 'Nada encontrado') : tr('notes.empty', 'Nenhuma nota ainda')}\n </p>\n {!q && (\n <p className=\"text-xs\">{tr('notes.emptyHint', 'Crie sua primeira nota com o botão +')}</p>\n )}\n </div>\n )}\n {visible.map((n) => {\n const title = titleOf(n) || tr('notes.untitled', 'Nova nota')\n const snippet = snippetOf(n)\n const confirming = confirmingDelete === n.id\n return (\n <div\n key={n.id}\n className=\"group relative border-b border-border/40 transition-colors hover:bg-muted/50\"\n >\n <button\n type=\"button\"\n onClick={() => { setPreview(false); setOpenId(n.id) }}\n className=\"flex w-full flex-col items-start gap-0.5 px-4 py-2.5 text-left\"\n >\n <span className=\"flex w-full items-center gap-1.5\">\n {n.pinned && <Pin className=\"h-3 w-3 shrink-0 text-primary\" />}\n <span className=\"min-w-0 flex-1 truncate text-[13px] font-semibold text-foreground\">\n {title}\n </span>\n </span>\n <span className=\"flex w-full items-baseline gap-2 text-xs text-muted-foreground\">\n <span className=\"shrink-0 tabular-nums\">{noteDate(n.updatedAt, locale)}</span>\n <span className=\"min-w-0 truncate\">\n {snippet || tr('notes.emptyNote', 'Nota vazia')}\n </span>\n </span>\n </button>\n <div className=\"absolute right-2 top-1/2 -translate-y-1/2\">\n {confirming ? (\n <span className=\"flex items-center gap-1 rounded-lg bg-card px-1 py-0.5 shadow-sm\">\n <button\n type=\"button\"\n onClick={() => deleteNote(n.id)}\n className=\"rounded px-1.5 py-0.5 text-[11px] font-semibold text-destructive hover:bg-destructive/10\"\n >\n {tr('notes.confirmDelete', 'Excluir?')}\n </button>\n <button\n type=\"button\"\n onClick={() => setConfirmingDelete(null)}\n className=\"rounded px-1.5 py-0.5 text-[11px] text-muted-foreground hover:bg-muted\"\n >\n {tr('common.cancel', 'Cancelar')}\n </button>\n </span>\n ) : (\n <button\n type=\"button\"\n onClick={() => setConfirmingDelete(n.id)}\n aria-label={tr('notes.delete', 'Excluir')}\n className=\"rounded-lg p-1.5 text-muted-foreground/50 opacity-0 transition-opacity hover:bg-muted hover:text-destructive group-hover:opacity-100\"\n >\n <Trash2 className=\"h-3.5 w-3.5\" />\n </button>\n )}\n </div>\n </div>\n )\n })}\n </div>\n </div>\n )\n}\n\n// ---------------------------------------------------------------------------\n// \"Resolver com IA\" — the agentic hand-off. The user doesn't work the note;\n// they delegate it. Queues an explicit prompt (auto-sends, unlike a draft) and\n// flips the rail to the Chat tab where the agent picks it up with its tools.\n// ---------------------------------------------------------------------------\n\nfunction DelegateCta({ note, tr }: { note: Note; tr: (key: string, fallback: string) => string }) {\n const delegate = useDelegateToAssistant()\n if (!note.content.trim()) return null\n\n const handleClick = () =>\n delegate(\n `${tr(\n 'notes.delegateNote.prompt',\n 'Assuma esta nota e resolva: analise o conteúdo, execute o que for acionável com suas ferramentas e me devolva o que fez e o que ficou pendente.',\n )}\\n\\n---\\n${note.content}`,\n )\n\n return (\n <div className=\"px-4 pb-2\">\n <button\n type=\"button\"\n onClick={handleClick}\n className={cn(\n 'group flex w-full items-center justify-center gap-2 rounded-xl px-3 py-2 text-[13px] font-semibold',\n 'bg-gradient-to-r from-primary via-primary/80 to-primary text-primary-foreground',\n 'bg-[length:200%_100%] bg-left shadow-sm transition-all duration-500',\n 'hover:bg-right hover:shadow-md focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring',\n )}\n >\n <Sparkles className=\"h-4 w-4 transition-transform duration-300 group-hover:rotate-12\" />\n {tr('notes.delegateNote', 'Conversar com IA')}\n </button>\n </div>\n )\n}\n\n// ---------------------------------------------------------------------------\n// Note todos — always-available input that creates REAL tasks (plugin-tasks)\n// linked to this note via the notes-tasks bridge. The Tarefas tab remains the\n// single source of truth; here the note sees and toggles its own slice. In an\n// app without a tasks backend the section hides (inline `- [ ]` checklists\n// still cover light lists).\n// ---------------------------------------------------------------------------\n\nfunction NoteTodosSection({ noteId, noteTitle, tr }: {\n noteId: string\n noteTitle: string\n tr: (key: string, fallback: string) => string\n}) {\n const adapter = useNotesTasksBridge((s) => s.adapter)\n const delegate = useDelegateToAssistant()\n const [todos, setTodos] = React.useState<NoteTodo[]>([])\n const [draft, setDraft] = React.useState('')\n const [busy, setBusy] = React.useState(false)\n\n React.useEffect(() => {\n if (!adapter) return\n let alive = true\n adapter.listTodos(noteId).then((rows) => { if (alive) setTodos(rows) }).catch(() => {})\n return () => { alive = false }\n }, [adapter, noteId])\n\n if (!adapter) return null\n\n const addTodo = async () => {\n const title = draft.trim()\n if (!title || busy) return\n setBusy(true)\n try {\n const todo = await adapter.createTodo({ title, noteId, noteTitle })\n setTodos((prev) => [...prev, todo])\n setDraft('')\n } catch {\n /* provider offline — keep the draft so nothing is lost */\n } finally {\n setBusy(false)\n }\n }\n\n const toggle = (todo: NoteTodo) => {\n setTodos((prev) => prev.map((t) => (t.id === todo.id ? { ...t, done: !t.done } : t)))\n adapter.toggleTodo(todo.id, !todo.done).catch(() => {\n setTodos((prev) => prev.map((t) => (t.id === todo.id ? { ...t, done: todo.done } : t)))\n })\n }\n\n const remove = (todo: NoteTodo) => {\n setTodos((prev) => prev.filter((t) => t.id !== todo.id))\n adapter.removeTodo(todo.id).catch(() => {\n setTodos((prev) => [...prev, todo])\n })\n }\n\n return (\n <div className=\"border-t border-border/40 px-4 py-2.5\">\n <p className=\"pb-1.5 text-[10px] font-semibold uppercase tracking-wider text-muted-foreground/60\">\n {tr('notes.todos', 'Tarefas')}{todos.length > 0 ? ` · ${todos.filter((t) => !t.done).length}/${todos.length}` : ''}\n </p>\n <ul className=\"space-y-0.5\">\n {todos.map((todo) => (\n <li key={todo.id} className=\"group flex items-start gap-2\">\n <button\n type=\"button\"\n onClick={() => toggle(todo)}\n className=\"mt-0.5 shrink-0 text-muted-foreground/60 transition-colors hover:text-primary\"\n aria-label={todo.title}\n >\n {todo.done ? <CheckSquare2 className=\"h-4 w-4 text-primary\" /> : <Square className=\"h-4 w-4\" />}\n </button>\n <span className={cn('min-w-0 flex-1 text-[13px]', todo.done && 'text-muted-foreground line-through')}>\n {todo.title}\n </span>\n {!todo.done && (\n <button\n type=\"button\"\n onClick={() =>\n delegate(\n `${tr(\n 'notes.delegateTodo.prompt',\n 'Assuma esta tarefa e resolva agora, usando suas ferramentas quando precisar. Me devolva o resultado:',\n )}\\n\\n\"${todo.title}\"${noteTitle ? ` — ${tr('notes.delegateTodo.from', 'da nota')} \"${noteTitle}\"` : ''}`,\n )\n }\n aria-label={tr('notes.delegateTodo', 'Conversar com IA')}\n title={tr('notes.delegateTodo', 'Conversar com IA')}\n className=\"shrink-0 rounded p-0.5 text-muted-foreground/40 opacity-0 transition-opacity hover:text-primary group-hover:opacity-100\"\n >\n <Sparkles className=\"h-3.5 w-3.5\" />\n </button>\n )}\n <button\n type=\"button\"\n onClick={() => remove(todo)}\n aria-label={tr('notes.delete', 'Excluir')}\n className=\"shrink-0 rounded p-0.5 text-muted-foreground/40 opacity-0 transition-opacity hover:text-destructive group-hover:opacity-100\"\n >\n <Trash2 className=\"h-3.5 w-3.5\" />\n </button>\n </li>\n ))}\n </ul>\n <div className=\"mt-1 flex items-center gap-2\">\n <Plus className=\"h-3.5 w-3.5 shrink-0 text-muted-foreground/50\" />\n <input\n value={draft}\n onChange={(e) => setDraft(e.target.value)}\n onKeyDown={(e) => { if (e.key === 'Enter') void addTodo() }}\n placeholder={tr('notes.addTodo', 'Adicionar tarefa…')}\n disabled={busy}\n className=\"min-w-0 flex-1 bg-transparent py-1 text-[13px] text-foreground placeholder:text-muted-foreground/50 focus:outline-none\"\n />\n </div>\n </div>\n )\n}\n\n// ---------------------------------------------------------------------------\n// Checklist-aware preview. `- [ ]`/`- [x]` lines render as toggleable\n// checkboxes (the light-task use case notes absorb so it never needs a real\n// Task); everything else renders as markdown.\n// ---------------------------------------------------------------------------\n\nconst CHECKLIST_RE = /^\\s*[-*] \\[( |x|X)\\] (.*)$/\n\nfunction toggleChecklistLine(content: string, lineIdx: number): string {\n const lines = content.split('\\n')\n const line = lines[lineIdx]\n if (!line) return content\n lines[lineIdx] = CHECKLIST_RE.test(line)\n ? line.replace(/\\[( |x|X)\\]/, (m) => (m === '[ ]' ? '[x]' : '[ ]'))\n : line\n return lines.join('\\n')\n}\n\ntype NoteBlock =\n | { type: 'md'; text: string }\n | { type: 'check'; items: Array<{ line: number; done: boolean; text: string }> }\n\nfunction segment(content: string): NoteBlock[] {\n const blocks: NoteBlock[] = []\n content.split('\\n').forEach((line, i) => {\n const m = line.match(CHECKLIST_RE)\n const last = blocks[blocks.length - 1]\n if (m) {\n const item = { line: i, done: m[1].toLowerCase() === 'x', text: m[2] }\n if (last?.type === 'check') last.items.push(item)\n else blocks.push({ type: 'check', items: [item] })\n } else if (last?.type === 'md') {\n last.text += `\\n${line}`\n } else {\n blocks.push({ type: 'md', text: line })\n }\n })\n return blocks\n}\n\nfunction NoteBody({ content, onToggleLine }: { content: string; onToggleLine: (line: number) => void }) {\n return (\n <div className=\"space-y-2\">\n {segment(content).map((block, i) =>\n block.type === 'md' ? (\n block.text.trim() ? <ChatMarkdown key={i} content={block.text} /> : null\n ) : (\n <ul key={i} className=\"space-y-1\">\n {block.items.map((item) => (\n <li key={item.line}>\n <button\n type=\"button\"\n onClick={() => onToggleLine(item.line)}\n className=\"flex w-full items-start gap-2 rounded px-1 py-0.5 text-left transition-colors hover:bg-muted/50\"\n >\n {item.done ? (\n <CheckSquare2 className=\"mt-0.5 h-4 w-4 shrink-0 text-primary\" />\n ) : (\n <Square className=\"mt-0.5 h-4 w-4 shrink-0 text-muted-foreground/60\" />\n )}\n <span className={cn('min-w-0 flex-1', item.done && 'text-muted-foreground line-through')}>\n {item.text}\n </span>\n </button>\n </li>\n ))}\n </ul>\n ),\n )}\n </div>\n )\n}\n\n/** Registers Notas as a rail tab (after Chat 10 and Tarefas 20). Renders\n * nothing itself — mounted by the admin provider stack. */\nexport function NotesRailPanel() {\n const { t } = useTranslation()\n const raw = t('notes.title')\n const label = raw && raw !== 'notes.title' ? raw : 'Notas'\n\n // Seed the count before the panel is ever opened; the panel keeps it live.\n const user = useAuthStore((s) => s.user)\n const currentOrg = useOrganizationStore((s) => s.currentOrg)\n const key = storageKey(currentOrg?.id ?? 'local', user?.id ?? 'anon')\n const count = useNotesCount((s) => s.count)\n React.useEffect(() => {\n useNotesCount.getState().setCount(loadNotes(key).length)\n }, [key])\n\n useRightRailPanel(\n React.useMemo(\n () => ({ id: 'notes', label, icon: StickyNote, order: 30, badge: { count }, Component: NotesPanel }),\n [label, count],\n ),\n )\n return null\n}\n\nfunction IconButton({ children, label, onClick, active, danger }: {\n children: React.ReactNode\n label: string\n onClick: () => void\n active?: boolean\n danger?: boolean\n}) {\n return (\n <button\n type=\"button\"\n onClick={onClick}\n aria-label={label}\n title={label}\n className={cn(\n 'inline-flex h-7 w-7 items-center justify-center rounded-lg transition-colors',\n active ? 'bg-muted text-foreground' : 'text-muted-foreground hover:bg-muted hover:text-foreground',\n danger && 'hover:text-destructive',\n )}\n >\n {children}\n </button>\n )\n}\n","import type { ThemeTokens } from './tokens'\n\n// Polaris (Shopify Admin \"Sail\") light theme.\n// Page #f1f1f1, cards #ffffff, near-black brand #303030, light sidebar #ebebeb\n// with raised-white active items. Semantic accents only carry color.\nexport const lightTheme: ThemeTokens = {\n name: 'light',\n colors: {\n // Brand surface is near-black, not a saturated hue. Buttons get the bevel\n // shadow below; flat color is only half the look.\n primary: '0 0% 18.8%', // #303030\n primaryForeground: '0 0% 100%', // #ffffff\n secondary: '0 0% 96.9%', // #f7f7f7\n secondaryForeground: '0 0% 18.8%', // #303030\n accent: '0 0% 94.5%', // #f1f1f1 (hover/selected step)\n accentForeground: '0 0% 18.8%', // #303030\n background: '0 0% 94.5%', // #f1f1f1 — page is never white\n foreground: '0 0% 18.8%', // #303030\n card: '0 0% 100%', // #ffffff\n cardForeground: '0 0% 18.8%', // #303030\n muted: '0 0% 96.9%', // #f7f7f7\n mutedForeground: '0 0% 38%', // #616161\n border: '0 0% 89%', // #e3e3e3 (hairline, not dark gray)\n input: '0 0% 54.1%', // #8a8a8a — inputs need stronger border\n ring: '214 100% 41.4%', // #005bd3 — focus blue\n popover: '0 0% 100%',\n popoverForeground: '0 0% 18.8%',\n destructive: '354 92% 41%', // #c70a24\n destructiveForeground: '0 0% 100%',\n success: '167 95% 25.1%', // #047b5d\n successForeground: '0 0% 100%',\n warning: '43 100% 50%', // #ffb800\n warningForeground: '0 0% 18.8%',\n\n // Layout surfaces — light gray rail (Polaris \"Sail\"), raised white active items.\n sidebar: '0 0% 92.2%', // #ebebeb\n sidebarForeground: '0 0% 18.8%', // #303030\n sidebarBorder: '0 0% 86.3%', // #dcdcdc\n sidebarAccent: '0 0% 100%', // #ffffff — active item floats above rail\n sidebarAccentForeground: '0 0% 18.8%',\n sidebarMuted: '0 0% 38%', // #616161\n content: '0 0% 94.5%', // #f1f1f1\n },\n perception: {\n buttonRadius: '0.5rem', // 8px (--p-border-radius-200)\n cardRadius: '0.5rem', // 8px — Polaris cards are 8px, not 12px\n inputRadius: '0.5rem',\n modalRadius: '1rem', // 16px (--p-border-radius-400)\n fontFamily: 'Inter, ui-sans-serif, system-ui, -apple-system, sans-serif',\n fontFamilyMono: 'JetBrains Mono, ui-monospace, SFMono-Regular, monospace',\n // Polaris hairline + a touch of bottom lift so cards visibly float on the gray page.\n shadowSm: '0 1px 0 rgba(0, 0, 0, 0.05), 0 1px 3px 0 rgba(26, 26, 26, 0.06), 0 1px 2px -1px rgba(26, 26, 26, 0.06)',\n shadowMd: '0 1px 1px -1px rgba(26, 26, 26, 0.07), 0 4px 8px -2px rgba(26, 26, 26, 0.10)',\n shadowLg: '0 4px 12px -2px rgba(26, 26, 26, 0.15), 0 1px 3px rgba(26, 26, 26, 0.08)',\n // Inset bevels — Polaris signature. Buttons feel physical because of these.\n shadowButton:\n 'inset 0 -1px 0 rgba(0,0,0,0.10), inset 0 1px 0 rgba(255,255,255,0.50), 0 1px 0 rgba(0,0,0,0.05)',\n shadowButtonPrimary:\n 'inset 0 -1px 0 rgba(0,0,0,0.20), inset 0 1px 0 rgba(255,255,255,0.20), 0 1px 1.5px rgba(0,0,0,0.20)',\n shadowButtonInset:\n 'inset 0 2px 1px -1px rgba(0,0,0,0.20), inset 0 0 0 1px rgba(0,0,0,0.05)',\n },\n}\n","import type { ThemeTokens } from './tokens'\n\n// \"Sail midnight\" — Polaris/Shopify Admin dark companion. No upstream reference;\n// designed from the same philosophy as the light theme: neutral grayscale chrome,\n// page bg darker than cards (mirrors the light \"card floats on page\" hierarchy),\n// brand surface is the highest-contrast color (here near-white instead of near-black).\nexport const darkTheme: ThemeTokens = {\n name: 'dark',\n colors: {\n primary: '0 0% 100%', // #ffffff — inverted brand surface\n primaryForeground: '0 0% 10.2%', // #1a1a1a\n secondary: '0 0% 18.8%', // #303030\n secondaryForeground: '0 0% 89%', // #e3e3e3\n accent: '0 0% 22.7%', // #3a3a3a — hover/selected one step up from card\n accentForeground: '0 0% 100%',\n background: '0 0% 10.2%', // #1a1a1a — page\n foreground: '0 0% 89%', // #e3e3e3\n card: '0 0% 14.9%', // #262626 — one step lighter than page\n cardForeground: '0 0% 89%',\n muted: '0 0% 18.8%', // #303030\n mutedForeground: '0 0% 64.7%', // #a5a5a5\n border: '0 0% 22.7%', // #3a3a3a — hairline visible on cards\n input: '0 0% 32.2%', // #525252\n ring: '217 100% 68.4%', // #5b9bff — brighter blue for dark\n popover: '0 0% 18.8%', // popovers sit above cards\n popoverForeground: '0 0% 89%',\n destructive: '7 100% 44.9%', // #e51c00\n destructiveForeground: '0 0% 100%',\n success: '156 71% 42.5%', // #1fb87a\n successForeground: '0 0% 0%',\n warning: '41 100% 65.1%', // #ffc94d\n warningForeground: '0 0% 10.2%',\n\n // Sidebar matches page; active item is a raised dark pill.\n sidebar: '0 0% 10.2%', // #1a1a1a\n sidebarForeground: '0 0% 89%',\n sidebarBorder: '0 0% 16.5%', // #2a2a2a\n sidebarAccent: '0 0% 18.8%', // #303030\n sidebarAccentForeground: '0 0% 100%',\n sidebarMuted: '0 0% 64.7%',\n content: '0 0% 10.2%',\n },\n perception: {\n buttonRadius: '0.5rem',\n cardRadius: '0.5rem',\n inputRadius: '0.5rem',\n modalRadius: '1rem',\n fontFamily: 'Inter, ui-sans-serif, system-ui, -apple-system, sans-serif',\n fontFamilyMono: 'JetBrains Mono, ui-monospace, SFMono-Regular, monospace',\n // Shadows on dark are stronger or they disappear.\n shadowSm: '0 1px 0 rgba(0, 0, 0, 0.4), 0 1px 3px 0 rgba(0, 0, 0, 0.35), 0 1px 2px -1px rgba(0, 0, 0, 0.35)',\n shadowMd: '0 1px 1px -1px rgba(0, 0, 0, 0.5), 0 4px 8px -2px rgba(0, 0, 0, 0.6)',\n shadowLg: '0 4px 12px -2px rgba(0, 0, 0, 0.6), 0 1px 3px rgba(0, 0, 0, 0.4)',\n // Bevels — top highlight strengthens on near-white primary; on dark default\n // buttons we lean on the inset-bottom shadow for depth.\n shadowButton:\n 'inset 0 -1px 0 rgba(0,0,0,0.40), inset 0 1px 0 rgba(255,255,255,0.08), 0 1px 0 rgba(0,0,0,0.30)',\n shadowButtonPrimary:\n 'inset 0 -1px 0 rgba(0,0,0,0.20), inset 0 1px 0 rgba(255,255,255,0.40), 0 1px 1.5px rgba(0,0,0,0.40)',\n shadowButtonInset:\n 'inset 0 2px 1px -1px rgba(0,0,0,0.50), inset 0 0 0 1px rgba(0,0,0,0.20)',\n },\n}\n","import type {\n ThemeTokens,\n SemanticColors,\n UIPerceptionTokens,\n SaasTheme,\n ThemeRadius,\n ThemeShadow,\n ThemeFont,\n} from './tokens'\n\ntype SidebarTokens = Exclude<SaasTheme['sidebar'], string | undefined>\n\n/**\n * Derive a colored (\"brand\") sidebar palette from a single brand HSL string\n * (e.g. \"243 75% 59%\"). Keeps the brand hue/saturation and shifts lightness for\n * the border/active surfaces so text stays readable (light foreground on the\n * saturated rail). Falls back to undefined (→ neutral) if the value isn't HSL.\n */\nfunction deriveBrandSidebar(brand: string): SidebarTokens | undefined {\n const parts = brand.trim().split(/\\s+/)\n if (parts.length < 3) return undefined\n const [h, s, lRaw] = parts\n const l = parseFloat(lRaw)\n if (Number.isNaN(l)) return undefined\n const shiftL = (delta: number) => `${h} ${s} ${Math.max(0, Math.min(100, l + delta))}%`\n return {\n background: brand, // the brand color fills the rail\n foreground: '0 0% 100%', // white primary text — readable on the saturated rail\n border: shiftL(-12), // slightly darker hairline\n accent: shiftL(-15), // active item — a deeper shade that reads as selected\n accentForeground: '0 0% 100%',\n muted: `${h} 35% 82%`, // dimmed icons / secondary labels\n }\n}\n\n/** Resolve SaasTheme.sidebar (string preset or explicit tokens) into tokens. */\nfunction resolveSidebar(theme: SaasTheme): SidebarTokens | undefined {\n const sidebar = theme.sidebar\n if (sidebar === 'neutral') return undefined // keep the default light rail\n if (sidebar === 'brand') return deriveBrandSidebar(theme.brand)\n return sidebar\n}\nimport { lightTheme } from './light'\nimport { createFayzTheme } from '@fayz-ai/ui'\n\nexport interface CreateThemeOptions {\n name?: string\n colors?: Partial<SemanticColors>\n /** Dark mode color overrides — applied instead of `colors` when in dark mode */\n darkColors?: Partial<SemanticColors>\n perception?: Partial<UIPerceptionTokens>\n /** Shorthand: single HSL value that auto-derives primary, ring, and accent */\n brand?: string\n}\n\n/**\n * Discriminate the two theme shapes a FayzAppConfig can carry. The explicit\n * `__kind: 'saas-theme'` marker is authoritative; the structural fallback\n * exists only for hand-written configs that predate the marker. Note the\n * fallback is ambiguous for a `{ name, brand }`-only SaasTheme (it routes to\n * the CreateThemeOptions path) — set `__kind` to opt out of the ambiguity.\n */\nexport function isSaasTheme(theme: SaasTheme | CreateThemeOptions): theme is SaasTheme {\n if ('__kind' in theme && theme.__kind === 'saas-theme') return true\n return 'brand' in theme && ('radius' in theme || 'sidebar' in theme || 'font' in theme)\n}\n\n// --- Friendly preset maps ---\n\nconst RADIUS_MAP: Record<ThemeRadius, { button: string; card: string; input: string; modal: string }> = {\n sharp: { button: '0px', card: '0px', input: '0px', modal: '0px' },\n soft: { button: '0.5rem', card: '0.75rem', input: '0.5rem', modal: '0.75rem' },\n round: { button: '9999px', card: '1rem', input: '0.75rem', modal: '1.25rem' },\n}\n\nconst SHADOW_MAP: Record<ThemeShadow, { sm: string; md: string; lg: string }> = {\n none: { sm: 'none', md: 'none', lg: 'none' },\n subtle: { sm: '0 1px 2px 0 rgb(0 0 0 / 0.03)', md: '0 2px 4px -1px rgb(0 0 0 / 0.06)', lg: '0 4px 6px -2px rgb(0 0 0 / 0.05)' },\n medium: { sm: '0 1px 2px 0 rgb(0 0 0 / 0.05)', md: '0 4px 6px -1px rgb(0 0 0 / 0.1), 0 2px 4px -2px rgb(0 0 0 / 0.1)', lg: '0 10px 15px -3px rgb(0 0 0 / 0.1), 0 4px 6px -4px rgb(0 0 0 / 0.1)' },\n bold: { sm: '0 1px 3px 0 rgb(0 0 0 / 0.1)', md: '0 4px 8px -1px rgb(0 0 0 / 0.15), 0 2px 4px -1px rgb(0 0 0 / 0.1)', lg: '0 12px 24px -4px rgb(0 0 0 / 0.15), 0 4px 8px -2px rgb(0 0 0 / 0.1)' },\n}\n\nconst FONT_MAP: Record<ThemeFont, string> = {\n 'system': 'ui-sans-serif, system-ui, -apple-system, sans-serif',\n 'inter': '\"Inter\", ui-sans-serif, system-ui, -apple-system, sans-serif',\n 'dm-sans': '\"DM Sans\", ui-sans-serif, system-ui, -apple-system, sans-serif',\n 'poppins': '\"Poppins\", ui-sans-serif, system-ui, -apple-system, sans-serif',\n 'geist': '\"Geist\", ui-sans-serif, system-ui, -apple-system, sans-serif',\n 'plus-jakarta': '\"Plus Jakarta Sans\", ui-sans-serif, system-ui, -apple-system, sans-serif',\n 'outfit': '\"Outfit\", -apple-system, BlinkMacSystemFont, \"Segoe UI\", \"Roboto\", sans-serif',\n 'nunito': '\"Nunito\", ui-sans-serif, system-ui, -apple-system, sans-serif',\n 'source-sans': '\"Source Sans 3\", ui-sans-serif, system-ui, -apple-system, sans-serif',\n 'raleway': '\"Raleway\", ui-sans-serif, system-ui, -apple-system, sans-serif',\n 'manrope': '\"Manrope\", ui-sans-serif, system-ui, -apple-system, sans-serif',\n}\n\n/**\n * Resolve a SaasTheme (friendly format) into CreateThemeOptions (internal format).\n * This is the main API for vertical themes.\n *\n * Light-only colors (content bg, card, border, etc.) go into `colors`.\n * Dark-mode overrides go into `darkColors` so the dark base theme isn't broken.\n * Sidebar colors are always applied (same in both modes — the sidebar has its own palette).\n */\nexport function resolveTheme(theme: SaasTheme): CreateThemeOptions {\n const presetId = theme.preset ?? 'classic_admin'\n const preset = createFayzTheme(presetId)\n const radius = theme.radius ? RADIUS_MAP[theme.radius] : presetId === 'classic_admin' ? RADIUS_MAP.soft : undefined\n const shadow = theme.shadow ? SHADOW_MAP[theme.shadow] : presetId === 'classic_admin' ? SHADOW_MAP.medium : undefined\n const font = theme.font ? FONT_MAP[theme.font] : presetId === 'classic_admin' ? FONT_MAP.inter : undefined\n\n // --- Light mode colors ---\n const colors: Partial<SemanticColors> = { ...theme.colors }\n\n // Content background (light mode only)\n if (theme.content) {\n colors.content = theme.content.background\n }\n\n // Sidebar colors apply in both modes (sidebar has its own palette). Resolve the\n // 'brand' | 'neutral' preset or explicit tokens first; neutral → keep defaults.\n const sidebar = resolveSidebar(theme)\n if (sidebar) {\n colors.sidebar = sidebar.background\n colors.sidebarForeground = sidebar.foreground\n colors.sidebarAccent = sidebar.accent\n colors.sidebarAccentForeground = sidebar.accentForeground\n if (sidebar.border) colors.sidebarBorder = sidebar.border\n if (sidebar.muted) colors.sidebarMuted = sidebar.muted\n }\n\n // Brand shorthand — derive primary/ring/accent here so a `{ brand, sidebar }` SaasTheme\n // still gets the branded primary, not just the preset's neutral one (regression fix).\n // `theme.colors` is spread in above, so anything the app pinned explicitly wins: the\n // shorthand fills the gaps it left instead of overwriting its choices.\n if (theme.brand) {\n const given = theme.colors ?? {}\n if (given.primary == null) colors.primary = theme.brand\n if (given.primaryForeground == null) colors.primaryForeground = '0 0% 100%'\n if (given.ring == null) colors.ring = theme.brand\n const bp = theme.brand.split(' ')\n if (bp.length >= 3) {\n const hue = (parseFloat(bp[0]) - 50 + 360) % 360\n if (given.accent == null) colors.accent = `${hue} ${bp[1]} ${bp[2]}`\n if (given.accentForeground == null) colors.accentForeground = '0 0% 100%'\n }\n }\n\n // --- Dark mode colors (only sidebar + brand — let darkTheme handle the rest) ---\n const darkColors: Partial<SemanticColors> = {}\n\n // Sidebar keeps same palette in dark mode\n if (sidebar) {\n darkColors.sidebar = sidebar.background\n darkColors.sidebarForeground = sidebar.foreground\n darkColors.sidebarAccent = sidebar.accent\n darkColors.sidebarAccentForeground = sidebar.accentForeground\n if (sidebar.border) darkColors.sidebarBorder = sidebar.border\n if (sidebar.muted) darkColors.sidebarMuted = sidebar.muted\n }\n\n return {\n ...preset,\n name: theme.name,\n brand: theme.brand,\n colors: {\n ...(preset.colors ?? {}),\n ...colors,\n },\n darkColors: {\n ...(preset.darkColors ?? {}),\n ...darkColors,\n ...(theme.darkColors ?? {}),\n },\n perception: {\n ...(preset.perception ?? {}),\n fontFamilyMono: '\"JetBrains Mono\", ui-monospace, SFMono-Regular, monospace',\n ...(radius\n ? {\n buttonRadius: radius.button,\n cardRadius: radius.card,\n inputRadius: radius.input,\n modalRadius: radius.modal,\n }\n : {}),\n ...(font ? { fontFamily: font } : {}),\n ...(shadow\n ? {\n shadowSm: shadow.sm,\n shadowMd: shadow.md,\n shadowLg: shadow.lg,\n }\n : {}),\n // Raw tokens win over the radius/shadow/font presets above — an app with\n // its own design system states exact values without leaving SaasTheme.\n ...(theme.perception ?? {}),\n },\n }\n}\n\nexport function createTheme(overrides: CreateThemeOptions): ThemeTokens {\n const colors = { ...lightTheme.colors, ...overrides.colors }\n\n // Brand shorthand: auto-derive primary, ring, accent from single HSL.\n // Explicit `colors.*` overrides win — same precedence as resolveTheme above.\n if (overrides.brand) {\n const given = overrides.colors ?? {}\n if (given.primary == null) colors.primary = overrides.brand\n if (given.primaryForeground == null) colors.primaryForeground = '0 0% 100%'\n if (given.ring == null) colors.ring = overrides.brand\n // Derive accent by shifting hue ~50 degrees\n const parts = overrides.brand.split(' ')\n if (parts.length >= 3) {\n const hue = (parseFloat(parts[0]) - 50 + 360) % 360\n if (given.accent == null) colors.accent = `${hue} ${parts[1]} ${parts[2]}`\n if (given.accentForeground == null) colors.accentForeground = '0 0% 100%'\n }\n }\n\n return {\n name: overrides.name ?? lightTheme.name,\n colors,\n perception: {\n ...lightTheme.perception,\n ...overrides.perception,\n },\n }\n}\n\nconst colorVarMap: Record<string, string> = {\n primary: '--primary',\n primaryForeground: '--primary-foreground',\n secondary: '--secondary',\n secondaryForeground: '--secondary-foreground',\n accent: '--accent',\n accentForeground: '--accent-foreground',\n background: '--background',\n foreground: '--foreground',\n card: '--card',\n cardForeground: '--card-foreground',\n muted: '--muted',\n mutedForeground: '--muted-foreground',\n border: '--border',\n input: '--input',\n ring: '--ring',\n popover: '--popover',\n popoverForeground: '--popover-foreground',\n destructive: '--destructive',\n destructiveForeground: '--destructive-foreground',\n success: '--success',\n successForeground: '--success-foreground',\n warning: '--warning',\n warningForeground: '--warning-foreground',\n // Layout surfaces\n sidebar: '--sidebar',\n sidebarForeground: '--sidebar-foreground',\n sidebarBorder: '--sidebar-border',\n sidebarAccent: '--sidebar-accent',\n sidebarAccentForeground: '--sidebar-accent-foreground',\n sidebarMuted: '--sidebar-muted',\n content: '--content',\n}\n\nconst perceptionVarMap: Record<string, string> = {\n buttonRadius: '--button-radius',\n cardRadius: '--card-radius',\n inputRadius: '--input-radius',\n modalRadius: '--modal-radius',\n fontFamily: '--font-family',\n fontFamilyMono: '--font-family-mono',\n shadowSm: '--shadow-sm',\n shadowMd: '--shadow-md',\n shadowLg: '--shadow-lg',\n shadowButton: '--shadow-button',\n shadowButtonPrimary: '--shadow-button-primary',\n shadowButtonInset: '--shadow-button-inset',\n surfaceBackdropFilter: '--surface-backdrop-filter',\n modalBackground: '--modal-bg',\n modalBorder: '--modal-border',\n modalOverlayBackground: '--modal-overlay-bg',\n modalOverlayBackdropFilter: '--modal-overlay-backdrop-filter',\n modalShadow: '--modal-shadow',\n glassEdgeGradient: '--glass-edge-gradient',\n glassPrimaryEdgeGradient: '--glass-primary-edge-gradient',\n glassInnerHighlight: '--glass-inner-highlight',\n fieldBackground: '--field-bg',\n fieldBorder: '--field-border',\n fieldShadow: '--field-shadow',\n buttonBackground: '--button-bg',\n buttonBackgroundHover: '--button-hover-bg',\n buttonBorder: '--button-border',\n buttonPrimaryBackground: '--button-primary-bg',\n buttonPrimaryBackgroundHover: '--button-primary-hover-bg',\n buttonPrimaryBorder: '--button-primary-border',\n buttonBackdropFilter: '--button-backdrop-filter',\n}\n\nexport function applyTheme(theme: ThemeTokens, element?: HTMLElement): void {\n const target = element ?? document.documentElement\n\n for (const [key, cssVar] of Object.entries(colorVarMap)) {\n const value = theme.colors[key as keyof typeof theme.colors]\n if (value) {\n target.style.setProperty(cssVar, value)\n }\n }\n\n for (const [key, cssVar] of Object.entries(perceptionVarMap)) {\n const value = theme.perception[key as keyof typeof theme.perception]\n if (value) {\n target.style.setProperty(cssVar, value)\n }\n }\n}\n\nexport function getSystemPreference(): 'light' | 'dark' {\n if (typeof window === 'undefined') return 'light'\n return window.matchMedia('(prefers-color-scheme: dark)').matches ? 'dark' : 'light'\n}\n","import { create, type StoreApi, type UseBoundStore } from 'zustand'\nimport type { ThemeTokens } from '../theme/tokens'\nimport { lightTheme } from '../theme/light'\nimport { darkTheme } from '../theme/dark'\nimport { applyTheme } from '../theme/utils'\nimport type { CreateThemeOptions } from '../theme/utils'\n\ntype ThemeMode = 'light' | 'dark' | 'system'\n\nconst STORAGE_KEY = 'saas-core:theme-mode'\n\ninterface ThemeState {\n mode: ThemeMode\n resolvedMode: 'light' | 'dark'\n /** Only the user's partial overrides — NOT a full theme */\n overrides: CreateThemeOptions | null\n setMode: (mode: ThemeMode) => void\n setOverrides: (overrides: CreateThemeOptions | null) => void\n initialize: () => void\n // Keep old API name working\n setCustomTheme: (theme: ThemeTokens | null) => void\n}\n\nfunction getSystemPreference(): 'light' | 'dark' {\n if (typeof window === 'undefined') return 'light'\n return window.matchMedia('(prefers-color-scheme: dark)').matches ? 'dark' : 'light'\n}\n\nfunction getSavedMode(): ThemeMode {\n if (typeof window === 'undefined') return 'light'\n const saved = localStorage.getItem(STORAGE_KEY)\n if (saved === 'light' || saved === 'dark' || saved === 'system') return saved\n return 'light'\n}\n\nfunction resolveMode(mode: ThemeMode): 'light' | 'dark' {\n return mode === 'system' ? getSystemPreference() : mode\n}\n\n/** Merge base theme (light or dark) with user's partial overrides */\nfunction buildTheme(base: ThemeTokens, overrides: CreateThemeOptions | null): ThemeTokens {\n if (!overrides) return base\n\n const isDark = base.name === 'dark'\n const colors = { ...base.colors }\n\n // Brand shorthand: derive primary, ring, accent from single HSL\n if (overrides.brand) {\n colors.primary = overrides.brand\n colors.primaryForeground = '0 0% 100%'\n colors.ring = overrides.brand\n const parts = overrides.brand.split(' ')\n if (parts.length >= 3) {\n const hue = (parseFloat(parts[0]) - 50 + 360) % 360\n colors.accent = `${hue} ${parts[1]} ${parts[2]}`\n colors.accentForeground = '0 0% 100%'\n }\n }\n\n // Apply explicit color overrides.\n // In dark mode, use darkColors if provided; otherwise skip light-only colors.\n const colorOverrides = isDark && overrides.darkColors\n ? overrides.darkColors\n : overrides.colors\n\n if (colorOverrides) {\n for (const [key, value] of Object.entries(colorOverrides)) {\n if (value !== undefined) {\n (colors as any)[key] = value\n }\n }\n }\n\n return {\n name: overrides.name ?? base.name,\n colors,\n perception: {\n ...base.perception,\n ...(overrides.perception ?? {}),\n },\n }\n}\n\nconst STORE_KEY = '__fayz_theme_store__'\n\nfunction createThemeStore(): UseBoundStore<StoreApi<ThemeState>> {\n // Window-level singleton to survive linked-package dual-module loading\n if (typeof window !== 'undefined' && (window as any)[STORE_KEY]) {\n return (window as any)[STORE_KEY]\n }\n\n const store = create<ThemeState>((set, get) => ({\n mode: getSavedMode(),\n resolvedMode: 'light',\n overrides: null,\n\n setMode: (mode) => {\n const resolved = resolveMode(mode)\n set({ mode, resolvedMode: resolved })\n\n // Persist to localStorage\n if (typeof window !== 'undefined') {\n localStorage.setItem(STORAGE_KEY, mode)\n }\n\n const { overrides } = get()\n const baseTheme = resolved === 'dark' ? darkTheme : lightTheme\n const theme = buildTheme(baseTheme, overrides)\n\n if (typeof document !== 'undefined') {\n // Enable color transition before applying changes\n document.documentElement.classList.add('theme-transitioning')\n\n applyTheme(theme)\n document.documentElement.classList.toggle('dark', resolved === 'dark')\n\n // Remove transition class after animation completes\n setTimeout(() => {\n document.documentElement.classList.remove('theme-transitioning')\n }, 450)\n } else {\n applyTheme(theme)\n }\n },\n\n setOverrides: (overrides) => {\n set({ overrides })\n const { resolvedMode } = get()\n const baseTheme = resolvedMode === 'dark' ? darkTheme : lightTheme\n const theme = buildTheme(baseTheme, overrides)\n applyTheme(theme)\n },\n\n // Legacy compat — if someone passes a full ThemeTokens, store it as overrides\n setCustomTheme: (_theme) => {\n // Ignore — callers should use setOverrides now\n },\n\n initialize: () => {\n const { mode, setMode } = get()\n setMode(mode)\n\n // Listen for OS theme changes when in 'system' mode\n if (typeof window !== 'undefined') {\n window.matchMedia('(prefers-color-scheme: dark)').addEventListener('change', () => {\n const current = get()\n if (current.mode === 'system') {\n current.setMode('system')\n }\n })\n }\n },\n }))\n\n if (typeof window !== 'undefined') {\n (window as any)[STORE_KEY] = store\n }\n\n return store\n}\n\nexport const useThemeStore = createThemeStore()\n","import { create } from 'zustand'\n\nconst STORAGE_KEY = 'saas-core:locale'\n\n/** The locale the user picked, or undefined on a first visit. */\nexport function readPersistedLocale(): string | undefined {\n try {\n return localStorage.getItem(STORAGE_KEY) ?? undefined\n } catch {\n return undefined\n }\n}\n\nfunction getPersistedLocale(): string {\n return readPersistedLocale() ?? 'en'\n}\n\ninterface LocaleState {\n locale: string\n setLocale: (locale: string) => void\n /**\n * Adopt the app config's default locale on a first visit — WITHOUT persisting\n * it, so the user's own pick is still what gets written later. Without this\n * the store starts at 'en' and a pt-BR app paints its shell in English until\n * someone touches the language switch (which is why every app hand-called\n * `setCurrentLocale` in main.tsx).\n */\n hydrateDefault: (locale: string) => void\n}\n\nexport const useLocaleStore = create<LocaleState>((set) => ({\n locale: getPersistedLocale(),\n setLocale: (locale) => {\n try { localStorage.setItem(STORAGE_KEY, locale) } catch { /* ignore */ }\n set({ locale })\n },\n hydrateDefault: (locale) => {\n if (readPersistedLocale()) return\n set({ locale })\n },\n}))\n","import type { EntityDef, SearchTarget } from '@fayz-ai/core'\nimport { getAllEntities } from '@fayz-ai/core'\nimport { checkAccess } from '../access/headless'\nimport { buildDataToolIndex } from './ai-tool-handlers'\nimport { entityToolName, registryToolName } from './core-ai-tools'\nimport type { PluginRegistryDef } from '../types/plugins'\n\n// What the palette may search — built from buildDataToolIndex, the same index\n// the agent's findAnything walks, so ⌘K and the agent never drift apart.\n// Permission-filtered here, before anything is queried.\n\n/** People first, then the catalog; taxonomy and ledger rows are reached by number. */\nfunction boostFor(entity: EntityDef): number {\n switch (entity.data?.archetype) {\n case 'person': return 1\n case 'product':\n case 'service': return 0.95\n case 'order':\n case 'transaction': return 0.8\n case 'location': return 0.8\n case 'category': return 0.7\n default: return 0.85\n }\n}\n\nexport interface CollectSearchTargetsInput {\n registries?: Map<string, PluginRegistryDef[]>\n queryEntities?: Array<{ key: string; entity: EntityDef; writable?: boolean }>\n}\n\nexport function collectSearchTargets(input: CollectSearchTargetsInput = {}): SearchTarget[] {\n const index = buildDataToolIndex({\n registries: input.registries ?? new Map(),\n entities: getAllEntities(),\n registryToolName,\n entityToolName,\n queryEntities: input.queryEntities ?? [],\n })\n\n const targets: SearchTarget[] = []\n const seen = new Set<string>()\n for (const [indexKey, target] of index) {\n // The index holds each entity twice; only the `key:` twin carries the\n // stable identity the server index and route resolver speak.\n if (!indexKey.startsWith('key:')) continue\n const key = indexKey.slice(4)\n if (seen.has(key)) continue\n seen.add(key)\n\n const permission = target.entity.permission\n if (permission && !checkAccess(permission.feature, permission.action).allowed) continue\n\n targets.push({\n key,\n label: target.label,\n icon: target.entity.icon,\n entity: target.entity,\n mockData: target.mockData,\n boost: boostFor(target.entity),\n })\n }\n\n // Order only decides ties — a client should beat a category.\n return targets.sort((a, b) => (b.boost ?? 1) - (a.boost ?? 1) || a.key.localeCompare(b.key))\n}\n","import { useCallback, useMemo, useRef } from 'react'\nimport { searchEverything, type GlobalSearchResult, type SearchHit } from '@fayz-ai/core'\nimport { usePluginRuntimeOptional } from '../lib/plugins'\nimport { collectSearchTargets } from '../lib/search-targets'\nimport { openEntity, resolveEntityRoute } from '../lib/entity-routes'\n\n/** The palette's data half: one search across every entity the user may see,\n * plus the navigation that opening a result performs. */\nexport function useGlobalSearch() {\n const runtime = usePluginRuntimeOptional()\n\n const targets = useMemo(\n () => collectSearchTargets({\n registries: runtime?.registries ?? new Map(),\n queryEntities: runtime?.activePlugins.flatMap((p) => p.queryEntities ?? []) ?? [],\n }),\n // Rebuilding per keystroke would re-permission-check every entity.\n [runtime],\n )\n\n // A slow answer for \"bi\" must not overwrite a fast one for \"bigodinho\".\n const generation = useRef(0)\n\n const search = useCallback(\n async (query: string, onPartial?: (result: GlobalSearchResult) => void): Promise<GlobalSearchResult> => {\n const token = ++generation.current\n return searchEverything(query, {\n targets,\n limit: 30,\n perTarget: 5,\n onPartial: onPartial ? (partial) => { if (token === generation.current) onPartial(partial) } : undefined,\n })\n },\n [targets],\n )\n\n const select = useCallback((hit: SearchHit) => {\n openEntity(hit.id, hit.archetype, hit.archetypeKind, undefined, hit.key)\n }, [])\n\n /** True when opening this hit lands somewhere real. */\n const canOpen = useCallback(\n (hit: SearchHit) => resolveEntityRoute(hit.archetype, hit.archetypeKind, hit.key) !== null,\n [],\n )\n\n return { search, select, canOpen, targetCount: targets.length }\n}\n","import * as React from 'react'\nimport { usePluginRuntimeOptional, getWidgetsForZone, resolvePluginComponent } from '@fayz-ai/core'\n\n/** Renders all plugin widgets registered for a zone, in order. Plugins fill\n * these slots (detail-tab zones, page zones) without the host knowing them. */\nexport function WidgetSlot({\n zone,\n contextOverrides,\n ...props\n}: { zone: string; contextOverrides?: Record<string, unknown> } & Record<string, unknown>) {\n const runtime = usePluginRuntimeOptional()\n if (!runtime) return null\n const widgets = getWidgetsForZone(runtime, zone, contextOverrides as never)\n if (!widgets.length) return null\n return (\n <>\n {widgets.map((widget, i) => {\n const Component = resolvePluginComponent(widget) as React.ComponentType<Record<string, unknown>> | undefined\n if (!Component) return null\n const w = widget as unknown as { config?: unknown; plugin?: unknown; props?: Record<string, unknown> }\n // Pass BOTH contracts: the saas-core widget contract (config/runtime/\n // plugin/widget) the de-bridged plugins expect, AND the spread props\n // that native archetype zones use.\n return (\n <Component\n key={widget.id ?? `${zone}-${i}`}\n config={w.config}\n runtime={{ ...runtime.context, ...(contextOverrides ?? {}) }}\n plugin={w.plugin}\n widget={widget}\n {...(w.props ?? {})}\n {...props}\n />\n )\n })}\n </>\n )\n}\n","import * as React from 'react'\nimport { create } from 'zustand'\nimport type { PluginNavigationEntry } from '@fayz-ai/core'\n\n// ---------------------------------------------------------------------------\n// Runtime navigation contributions.\n//\n// The sidebar is otherwise built once from static sources (plugin manifests +\n// host `pages`) and does not react to per-tenant data. Some nav is inherently\n// dynamic — sales channels, for instance, are rows a merchant owns and differ\n// per workspace, so no static manifest can express them.\n//\n// A contributor (a plugin widget, or a host `shellMounts` component) pushes\n// entries under a stable id; the shell merges them into the same route-prefix\n// nesting/gating as everything else and rebuilds when they change. This keeps\n// the shell generic: it resolves whatever is contributed and knows nothing\n// about the specific feature (channels, etc.) doing the contributing.\n// ---------------------------------------------------------------------------\n\ninterface NavContributionsState {\n contributions: Record<string, PluginNavigationEntry[]>\n setContribution: (id: string, entries: PluginNavigationEntry[]) => void\n clearContribution: (id: string) => void\n}\n\nexport const useNavContributionsStore = create<NavContributionsState>((set) => ({\n contributions: {},\n setContribution: (id, entries) =>\n set((s) => ({ contributions: { ...s.contributions, [id]: entries } })),\n clearContribution: (id) =>\n set((s) => {\n if (!(id in s.contributions)) return s\n const next = { ...s.contributions }\n delete next[id]\n return { contributions: next }\n }),\n}))\n\n/**\n * Contribute runtime nav entries under a stable `id`. Reactive: whenever\n * `entries` changes the shell rebuilds the sidebar. Entries participate in the\n * same route-prefix nesting as plugin/page nav — so children whose route is a\n * sub-path of an existing entry (e.g. `/channels/…` under a static `/channels`)\n * nest under it automatically. Contribution is cleared on unmount.\n */\nexport function useNavContribution(id: string, entries: PluginNavigationEntry[]): void {\n const setContribution = useNavContributionsStore((s) => s.setContribution)\n const clearContribution = useNavContributionsStore((s) => s.clearContribution)\n // Content-hash the entries so the effect only re-fires when they actually\n // change, not on every parent re-render that rebuilds the array identity.\n const key = JSON.stringify(entries)\n React.useEffect(() => {\n setContribution(id, entries)\n return () => clearContribution(id)\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [id, key])\n}\n","import { getSupabaseClientOptional, getActiveTenantId } from '@fayz-ai/core'\nimport { useOrganizationStore } from '../org/store'\nimport type { FayzProject, CreateFayzProjectInput, UpdateFayzProjectInput } from './types'\n\n// Supabase-backed access to public.fayz_projects, scoped to the current tenant.\n// No dedicated provider abstraction: this is a thin, single-table CRUD the shell\n// owns. Reads go through the authenticated client so RLS (tenant_id IN\n// user_tenant_ids()) applies.\n\nconst TABLE = 'fayz_projects'\n\nfunction db(): any {\n const client = getSupabaseClientOptional() as any\n if (!client) throw new Error('[fayz-projects] Supabase not initialized')\n return client\n}\n\n/** Current tenant id: the selected workspace, falling back to the core active tenant. */\nfunction tenantId(): string | undefined {\n return useOrganizationStore.getState().currentOrg?.id ?? getActiveTenantId()\n}\n\nfunction rowToProject(row: any): FayzProject {\n return {\n id: row.id,\n tenantId: row.tenant_id,\n fayzProjectId: row.fayz_project_id ?? null,\n appId: row.app_id ?? null,\n name: row.name,\n kind: row.kind ?? 'site',\n isDefault: row.is_default ?? false,\n storefrontEnabled: row.storefront_enabled ?? false,\n previewUrl: row.preview_url ?? null,\n editorUrl: row.editor_url ?? null,\n slug: row.slug ?? null,\n metadata: row.metadata ?? {},\n createdAt: row.created_at,\n updatedAt: row.updated_at,\n }\n}\n\nfunction inputToRow(input: CreateFayzProjectInput | UpdateFayzProjectInput): Record<string, unknown> {\n const row: Record<string, unknown> = {}\n if ('name' in input && input.name !== undefined) row.name = input.name\n if (input.kind !== undefined) row.kind = input.kind\n if (input.fayzProjectId !== undefined) row.fayz_project_id = input.fayzProjectId\n if (input.appId !== undefined) row.app_id = input.appId\n if (input.isDefault !== undefined) row.is_default = input.isDefault\n if (input.storefrontEnabled !== undefined) row.storefront_enabled = input.storefrontEnabled\n if (input.previewUrl !== undefined) row.preview_url = input.previewUrl\n if (input.editorUrl !== undefined) row.editor_url = input.editorUrl\n if (input.slug !== undefined) row.slug = input.slug\n return row\n}\n\nexport async function listFayzProjects(): Promise<FayzProject[]> {\n const tid = tenantId()\n let q = db().from(TABLE).select('*').order('is_default', { ascending: false }).order('created_at', { ascending: true })\n if (tid) q = q.eq('tenant_id', tid)\n const { data, error } = await q\n if (error) throw error\n return (data ?? []).map(rowToProject)\n}\n\n/** The tenant's default project, or the first one when none is flagged default. */\nexport async function getDefaultFayzProject(): Promise<FayzProject | null> {\n const projects = await listFayzProjects()\n return projects.find((p) => p.isDefault) ?? projects[0] ?? null\n}\n\nexport async function createFayzProject(input: CreateFayzProjectInput): Promise<FayzProject> {\n // A tenant keeps at most one default (partial unique index). Clearing the old\n // default first keeps the insert from tripping it.\n if (input.isDefault) await clearDefault()\n const { data, error } = await db().from(TABLE)\n .insert({ tenant_id: tenantId(), ...inputToRow(input) })\n .select().single()\n if (error) throw error\n return rowToProject(data)\n}\n\nexport async function updateFayzProject(id: string, input: UpdateFayzProjectInput): Promise<FayzProject> {\n if (input.isDefault) await clearDefault(id)\n const { data, error } = await db().from(TABLE).update(inputToRow(input)).eq('id', id).select().single()\n if (error) throw error\n return rowToProject(data)\n}\n\nexport async function deleteFayzProject(id: string): Promise<void> {\n const { error } = await db().from(TABLE).delete().eq('id', id)\n if (error) throw error\n}\n\n/** Demote the current default for this tenant (except `keepId`), so a new default\n * can be set without violating fayz_projects_one_default_per_tenant. */\nasync function clearDefault(keepId?: string): Promise<void> {\n const tid = tenantId()\n let q = db().from(TABLE).update({ is_default: false }).eq('is_default', true)\n if (tid) q = q.eq('tenant_id', tid)\n if (keepId) q = q.neq('id', keepId)\n await q\n}\n","import { create } from 'zustand'\nimport { getSupabaseClientOptional } from '@fayz-ai/core'\nimport { listFayzProjects } from './provider'\nimport type { FayzProject } from './types'\n\n// Shared, tenant-scoped cache of the current workspace's fayz projects. The\n// \"Seu site\" sidebar widget and the Projetos settings tab read from here; a\n// settings edit calls refresh() so the widget updates without a reload.\n\ninterface FayzProjectsState {\n projects: FayzProject[]\n loading: boolean\n /** Tenant the current projects were loaded for — guards against stale loads. */\n loadedFor: string | null\n load: (tenantId: string | undefined) => Promise<void>\n refresh: () => Promise<void>\n}\n\nexport const useFayzProjectsStore = create<FayzProjectsState>((set, get) => ({\n projects: [],\n loading: false,\n loadedFor: null,\n load: async (tenantId) => {\n // No supabase (mock apps) → nothing to load; the widget self-hides.\n if (!getSupabaseClientOptional()) {\n set({ projects: [], loading: false, loadedFor: tenantId ?? null })\n return\n }\n set({ loading: true })\n try {\n const projects = await listFayzProjects()\n set({ projects, loading: false, loadedFor: tenantId ?? null })\n } catch {\n // Table not provisioned yet, or a transient read error: contribute nothing.\n set({ projects: [], loading: false, loadedFor: tenantId ?? null })\n }\n },\n refresh: async () => {\n try {\n const projects = await listFayzProjects()\n set({ projects })\n } catch {\n /* ignore */\n }\n },\n}))\n\nexport function defaultProjectOf(projects: FayzProject[]): FayzProject | null {\n return projects.find((p) => p.isDefault) ?? projects[0] ?? null\n}\n\n/** Fayz editor base — the platform surface that opens a project for editing. */\nconst EDITOR_BASE = 'https://fayz.ai/editor'\n\n/** The project's editor URL: the explicit editor_url, else derived from the\n * platform convention (fayz.ai/editor/{projectId}). Null when neither applies. */\nexport function editorUrlOf(p: Pick<FayzProject, 'editorUrl' | 'fayzProjectId'>): string | null {\n if (p.editorUrl) return p.editorUrl\n return p.fayzProjectId ? `${EDITOR_BASE}/${p.fayzProjectId}` : null\n}\n","import * as React from 'react'\nimport { Globe, Store, LayoutTemplate, ExternalLink, PenSquare, ChevronsUpDown } from 'lucide-react'\nimport { Dropdown, DropdownTrigger, DropdownContent, DropdownItem, DropdownLabel, useLayoutStore } from '@fayz-ai/ui'\nimport { useTranslation } from '@fayz-ai/core'\nimport { useOrganizationStore } from '../org/store'\nimport { useFayzProjectsStore, defaultProjectOf, editorUrlOf } from './store'\nimport type { FayzProject, FayzProjectKind } from './types'\nimport type { AppSiteConfig } from '../app/config'\n\n// ---------------------------------------------------------------------------\n// \"Seu site\" — sidebar footer widget (rendered just above the user row). Shows\n// the current tenant's default fayz project with two actions: Abrir (open the\n// live/preview site) and Editar (open the fayz editor, /fayz/editor). When the\n// tenant owns more than one project, a picker switches which one is shown.\n// Self-hides when the tenant has no projects (or no supabase).\n// ---------------------------------------------------------------------------\n\nconst KIND_ICON: Record<FayzProjectKind, React.ComponentType<{ className?: string }>> = {\n site: Globe,\n storefront: Store,\n landing_page: LayoutTemplate,\n other: Globe,\n}\n\nfunction openExternal(url: string | null | undefined) {\n if (url) window.open(url, '_blank', 'noopener,noreferrer')\n}\n\n/** Build a display-only FayzProject from the app's config-declared site. */\nfunction synthFromFallback(f?: AppSiteConfig): FayzProject | null {\n if (!f) return null\n return {\n id: 'config-site', tenantId: '', name: f.name, kind: f.kind ?? 'site',\n isDefault: true, storefrontEnabled: f.kind === 'storefront',\n fayzProjectId: f.fayzProjectId ?? null, appId: null,\n previewUrl: f.previewUrl ?? null, editorUrl: f.editorUrl ?? null,\n slug: null, metadata: {}, createdAt: '', updatedAt: '',\n }\n}\n\nexport function SeuSiteWidget({ fallback, onEdit }: { fallback?: AppSiteConfig; onEdit?: () => void }) {\n const t = useTranslation()\n const currentOrgId = useOrganizationStore((s) => s.currentOrg?.id)\n const projects = useFayzProjectsStore((s) => s.projects)\n const load = useFayzProjectsStore((s) => s.load)\n const loadedFor = useFayzProjectsStore((s) => s.loadedFor)\n const collapsed = useLayoutStore((s) => s.sidebarCollapsed)\n\n const [selectedId, setSelectedId] = React.useState<string | null>(null)\n\n React.useEffect(() => {\n if (loadedFor !== (currentOrgId ?? null)) void load(currentOrgId)\n }, [currentOrgId, loadedFor, load])\n\n // DB projects win; the config-declared site is the fallback for mock/standalone\n // apps with no per-tenant rows (e.g. a mock admin whose site is bamboo.business).\n const active: FayzProject | null =\n projects.find((p) => p.id === selectedId) ?? defaultProjectOf(projects) ?? synthFromFallback(fallback)\n\n if (!active) return null\n\n const Icon = KIND_ICON[active.kind] ?? Globe\n const tr = (key: string, fallback: string) => {\n const v = t(key)\n return !v || v === key ? fallback : v\n }\n\n // Collapsed rail: a single icon that opens the live site.\n if (collapsed) {\n return (\n <button\n onClick={() => openExternal(active.previewUrl)}\n title={active.name}\n className=\"flex w-full items-center justify-center rounded-button p-2 text-sidebar-foreground/80 transition-colors hover:bg-sidebar-accent/60 hover:text-sidebar-accent-foreground\"\n >\n <Icon className=\"h-4 w-4 shrink-0\" />\n </button>\n )\n }\n\n const multiple = projects.length > 1\n const editorUrl = editorUrlOf(active)\n const domain = active.previewUrl ? active.previewUrl.replace(/^https?:\\/\\//, '').replace(/\\/+$/, '') : null\n\n const iconBtn = 'rounded-button p-1 text-sidebar-muted transition-colors hover:bg-sidebar-accent hover:text-sidebar-foreground disabled:cursor-not-allowed disabled:opacity-30'\n\n return (\n <div>\n <p className=\"px-1 pb-1 text-[10px] font-semibold uppercase tracking-wider text-sidebar-muted\">\n {/* App-supplied wording wins over the translation: \"site\" is wrong for a\n store admin, and the right word is the host's to choose. */}\n {fallback?.label ?? tr('projects.yourSite', 'Seu site')}\n </p>\n <div className=\"rounded-button px-1 py-0.5\">\n <div className=\"flex items-center gap-2\">\n <Icon className=\"h-4 w-4 shrink-0 text-sidebar-foreground/70\" />\n {multiple ? (\n <Dropdown>\n <DropdownTrigger asChild>\n <button className=\"flex min-w-0 flex-1 items-center gap-1 text-left\">\n <span className=\"min-w-0 flex-1 truncate text-[13px] font-medium text-sidebar-foreground\">{active.name}</span>\n <ChevronsUpDown className=\"h-3 w-3 shrink-0 text-sidebar-muted\" />\n </button>\n </DropdownTrigger>\n <DropdownContent align=\"start\" className=\"w-56\">\n <DropdownLabel>{tr('projects.yourProjects', 'Seus projetos')}</DropdownLabel>\n {projects.map((p) => {\n const PIcon = KIND_ICON[p.kind] ?? Globe\n return (\n <DropdownItem key={p.id} onClick={() => setSelectedId(p.id)}>\n <PIcon className=\"mr-2 h-3.5 w-3.5 shrink-0\" />\n <span className=\"truncate\">{p.name}</span>\n </DropdownItem>\n )\n })}\n </DropdownContent>\n </Dropdown>\n ) : (\n <span className=\"min-w-0 flex-1 truncate text-[13px] font-medium text-sidebar-foreground\">{active.name}</span>\n )}\n <div className=\"flex shrink-0 items-center gap-0.5\">\n <button onClick={() => openExternal(active.previewUrl)} disabled={!active.previewUrl} title={tr('projects.open', 'Abrir')} className={iconBtn}>\n <ExternalLink className=\"h-3.5 w-3.5\" />\n </button>\n <button onClick={() => (onEdit ? onEdit() : openExternal(editorUrl))} disabled={!onEdit && !editorUrl} title={tr('projects.edit', 'Editar')} className={iconBtn}>\n <PenSquare className=\"h-3.5 w-3.5\" />\n </button>\n </div>\n </div>\n {domain && (\n <a\n href={active.previewUrl ?? undefined}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"mt-0.5 block truncate pl-6 text-[11px] text-sidebar-muted hover:text-sidebar-foreground/80\"\n >\n {domain}\n </a>\n )}\n </div>\n </div>\n )\n}\n","import * as React from 'react'\nimport { X } from 'lucide-react'\nimport { cn } from '../lib/cn'\nimport { useTranslation } from '../hooks/useTranslation'\nimport { useRightRailStore } from './right-rail'\n\n/** The shell's companion column: a tab bar and whichever panel is active.\n * The frame inset comes from AppShell's `<aside>` padding, so this fills its\n * box exactly. */\nexport function RightRail({ frame = true }: { frame?: boolean }) {\n const { t } = useTranslation()\n const open = useRightRailStore((s) => s.open)\n const panels = useRightRailStore((s) => s.panels)\n const active = useRightRailStore((s) => s.active)\n const openPanel = useRightRailStore((s) => s.openPanel)\n const close = useRightRailStore((s) => s.close)\n\n // Publish the card's real left edge (as inset-from-right) while open. The\n // FAB anchors to it; measuring the DOM — not mirroring the width prop —\n // keeps it honest through clamps, drags and the open tween.\n const setWidth = useRightRailStore((s) => s.setWidth)\n const rootRef = React.useRef<HTMLDivElement>(null)\n React.useEffect(() => {\n if (!open) return\n const el = rootRef.current\n if (!el) return\n const publish = () => {\n // Below md the card is a full-screen overlay and the FAB is hidden.\n if (window.innerWidth < 768) return\n setWidth(Math.max(0, Math.round(window.innerWidth - el.getBoundingClientRect().left)))\n }\n publish()\n const observer = new ResizeObserver(publish)\n observer.observe(el)\n window.addEventListener('resize', publish)\n return () => {\n observer.disconnect()\n window.removeEventListener('resize', publish)\n }\n }, [open, setWidth])\n\n const current = panels.find((p) => p.id === active) ?? panels[0]\n if (!open || !current) return null\n const Panel = current.Component\n\n return (\n <div\n ref={rootRef}\n role=\"complementary\"\n aria-label={current.label}\n className={cn(\n 'flex min-h-0 flex-col overflow-hidden bg-card',\n 'fixed inset-0 z-40 motion-safe:animate-slide-in-from-bottom',\n 'md:motion-safe:animate-slide-in-from-right',\n 'md:static md:z-auto md:h-full md:w-full',\n frame\n ? 'md:rounded-2xl md:border md:border-border/60'\n : 'md:border-l md:border-border/60',\n )}\n >\n <div className=\"flex items-center gap-1 border-b border-border/40 px-1.5 py-1.5\">\n {panels.length > 1 ? (\n <div className=\"flex min-w-0 flex-1 items-center gap-0.5\" role=\"tablist\">\n {panels.map((panel) => {\n const Icon = panel.icon\n const selected = panel.id === current.id\n return (\n <button\n key={panel.id}\n type=\"button\"\n role=\"tab\"\n aria-selected={selected}\n onClick={() => openPanel(panel.id)}\n className={cn(\n 'inline-flex min-w-0 items-center gap-1.5 rounded-lg px-2.5 py-1.5 text-[12.5px] font-medium transition-colors',\n 'focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring',\n selected\n ? 'bg-muted text-foreground'\n : 'text-muted-foreground hover:bg-muted/60 hover:text-foreground',\n )}\n >\n {Icon && <Icon className=\"h-3.5 w-3.5 shrink-0\" />}\n <span className=\"truncate\">{panel.label}</span>\n {panel.badge && panel.badge.count > 0 && (\n <span\n className={cn(\n 'inline-flex h-4 min-w-4 shrink-0 items-center justify-center rounded-full px-1 text-[10px] font-semibold tabular-nums',\n panel.badge.tone === 'destructive'\n ? 'bg-destructive text-destructive-foreground'\n : 'bg-muted-foreground/15 text-muted-foreground',\n )}\n >\n {panel.badge.count > 99 ? '99+' : panel.badge.count}\n </span>\n )}\n </button>\n )\n })}\n </div>\n ) : (\n <span className=\"min-w-0 flex-1 truncate px-2 text-[12.5px] font-semibold text-foreground\">\n {current.label}\n </span>\n )}\n\n <button\n type=\"button\"\n onClick={close}\n aria-label={t('common.close')}\n title={t('common.close')}\n className=\"inline-flex h-7 w-7 shrink-0 items-center justify-center rounded-lg text-muted-foreground transition-colors hover:bg-muted hover:text-foreground\"\n >\n <X className=\"h-4 w-4\" />\n </button>\n </div>\n\n {/* Keyed so switching tabs does not hand one panel's DOM to another. */}\n <div key={current.id} className=\"flex min-h-0 flex-1 flex-col overflow-hidden\">\n <Panel />\n </div>\n </div>\n )\n}\n","import { create } from 'zustand'\nimport type { Notification, NotificationState } from '../types'\n\ninterface NotificationStore extends NotificationState {\n setNotifications: (notifications: Notification[]) => void\n addNotification: (notification: Notification) => void\n markRead: (id: string) => void\n markAllRead: () => void\n setLoading: (loading: boolean) => void\n reset: () => void\n}\n\nconst initialState: NotificationState = {\n notifications: [],\n unreadCount: 0,\n loading: false,\n}\n\nexport const useNotificationStore = create<NotificationStore>((set) => ({\n ...initialState,\n setNotifications: (notifications) =>\n set({\n notifications,\n unreadCount: notifications.filter((n) => !n.read).length,\n }),\n addNotification: (notification) =>\n set((state) => ({\n notifications: [notification, ...state.notifications],\n unreadCount: state.unreadCount + (notification.read ? 0 : 1),\n })),\n markRead: (id) =>\n set((state) => {\n const notifications = state.notifications.map((n) =>\n n.id === id ? { ...n, read: true } : n\n )\n return {\n notifications,\n unreadCount: notifications.filter((n) => !n.read).length,\n }\n }),\n markAllRead: () =>\n set((state) => ({\n notifications: state.notifications.map((n) => ({ ...n, read: true })),\n unreadCount: 0,\n })),\n setLoading: (loading) => set({ loading }),\n reset: () => set(initialState),\n}))\n","// Shim → native Supabase client (unified singleton across shell + plugins).\nimport type { SupabaseClient } from '@supabase/supabase-js'\nimport { getSupabaseClientOptional as _getOpt } from '@fayz-ai/core'\nexport { createSupabaseProvider, setGlobalSupabaseClient } from '@fayz-ai/core'\n// @fayz-ai/core returns a loosely-typed client (no hard supabase coupling); the\n// shell does `.from(...)` against the single public client, so surface it as\n// the real client type.\nexport const getSupabaseClientOptional = (): SupabaseClient | null =>\n _getOpt() as unknown as SupabaseClient | null\nexport {\n getFayzSupabaseClient as getSupabaseClient,\n getFayzSupabaseClientOptional as getSupabaseClientSafe,\n createFayzSupabaseClient as createSupabaseClient,\n} from '../data/client'\nimport { getFayzSupabaseClient } from '../data/client'\n// Core tables now live in the public schema — the \"core\" client is just the\n// plain public client. Kept as a backward-compatible alias for call sites.\nexport const getCoreClient = getFayzSupabaseClient\nexport const getCoreSupabaseClient = getFayzSupabaseClient\nexport const getProjectSupabaseClient = getFayzSupabaseClient\nexport type { SupabaseClient }\n","import { useCallback, useEffect, useMemo, useRef } from 'react'\nimport { useNotificationStore } from '../stores/notifications.store'\nimport { getSupabaseClient } from '../lib/supabase'\nimport type { Notification } from '../types'\n\nexport function useNotifications() {\n const store = useNotificationStore()\n const channelRef = useRef<ReturnType<\n ReturnType<typeof getSupabaseClient>['channel']\n > | null>(null)\n\n const fetchNotifications = useCallback(async () => {\n store.setLoading(true)\n try {\n const supabase = getSupabaseClient()\n const { data, error } = await supabase\n .from('notifications')\n .select('*')\n .order('created_at', { ascending: false })\n .limit(50)\n\n if (error) throw error\n store.setNotifications(data ?? [])\n } catch (err) {\n console.error('Failed to fetch notifications:', err)\n } finally {\n store.setLoading(false)\n }\n }, [store])\n\n const markAsRead = useCallback(\n async (id: string) => {\n store.markRead(id)\n try {\n const supabase = getSupabaseClient()\n const { error } = await supabase\n .from('notifications')\n .update({ read: true })\n .eq('id', id)\n\n if (error) throw error\n } catch (err) {\n console.error('Failed to mark notification as read:', err)\n }\n },\n [store]\n )\n\n const markAllAsRead = useCallback(async () => {\n store.markAllRead()\n try {\n const supabase = getSupabaseClient()\n const { error } = await supabase\n .from('notifications')\n .update({ read: true })\n .eq('read', false)\n\n if (error) throw error\n } catch (err) {\n console.error('Failed to mark all notifications as read:', err)\n }\n }, [store])\n\n const subscribeToRealtime = useCallback(() => {\n try {\n const supabase = getSupabaseClient()\n const channel = supabase\n .channel('notifications')\n .on(\n 'postgres_changes',\n { event: 'INSERT', schema: 'public', table: 'notifications' },\n (payload) => {\n store.addNotification(payload.new as Notification)\n }\n )\n .subscribe()\n\n channelRef.current = channel\n } catch (err) {\n console.error('Failed to subscribe to realtime notifications:', err)\n }\n }, [store])\n\n useEffect(() => {\n return () => {\n if (channelRef.current) {\n const supabase = getSupabaseClient()\n supabase.removeChannel(channelRef.current)\n channelRef.current = null\n }\n }\n }, [])\n\n return useMemo(\n () => ({\n notifications: store.notifications,\n unreadCount: store.unreadCount,\n loading: store.loading,\n fetchNotifications,\n markAsRead,\n markAllAsRead,\n subscribeToRealtime,\n }),\n [\n store.notifications,\n store.unreadCount,\n store.loading,\n fetchNotifications,\n markAsRead,\n markAllAsRead,\n subscribeToRealtime,\n ]\n )\n}\n","import * as React from 'react'\nimport { Sparkles, Wrench, Bug } from 'lucide-react'\nimport { cn } from '../../lib/cn'\nimport type { ChangelogEntry } from '../../types/notifications'\n\ninterface ChangelogFeedProps {\n changelogUrl?: string\n className?: string\n}\n\nconst TYPE_ICONS: Record<string, React.ElementType> = {\n feature: Sparkles,\n improvement: Wrench,\n fix: Bug,\n}\n\nconst TYPE_COLORS: Record<string, string> = {\n feature: 'text-primary',\n improvement: 'text-info',\n fix: 'text-success',\n}\n\nexport function ChangelogFeed({ changelogUrl, className }: ChangelogFeedProps) {\n const [entries, setEntries] = React.useState<ChangelogEntry[]>([])\n const [loading, setLoading] = React.useState(false)\n\n React.useEffect(() => {\n if (!changelogUrl) return\n\n setLoading(true)\n fetch(changelogUrl)\n .then((r) => r.json())\n .then((data: ChangelogEntry[]) => setEntries(data))\n .catch(() => setEntries([]))\n .finally(() => setLoading(false))\n }, [changelogUrl])\n\n if (loading) {\n return (\n <div className={cn('flex items-center justify-center py-12', className)}>\n <p className=\"text-sm text-muted-foreground\">Loading...</p>\n </div>\n )\n }\n\n if (!changelogUrl || entries.length === 0) {\n return (\n <div className={cn('flex flex-col items-center justify-center py-12 text-center', className)}>\n <Sparkles className=\"h-8 w-8 text-muted-foreground/50 mb-2\" />\n <p className=\"text-sm text-muted-foreground\">No updates yet</p>\n </div>\n )\n }\n\n return (\n <div className={cn('max-h-96 overflow-y-auto', className)}>\n {entries.map((entry) => {\n const Icon = TYPE_ICONS[entry.type] ?? Sparkles\n const colorClass = TYPE_COLORS[entry.type] ?? TYPE_COLORS.feature\n\n return (\n <div key={entry.id} className=\"border-b px-4 py-3 last:border-0\">\n <div className=\"flex items-start gap-3\">\n <div className={cn('mt-0.5 shrink-0', colorClass)}>\n <Icon className=\"h-4 w-4\" />\n </div>\n <div className=\"min-w-0 flex-1\">\n <div className=\"flex items-center gap-2\">\n <p className=\"text-sm font-medium\">{entry.title}</p>\n {entry.version && (\n <span className=\"rounded-full bg-muted px-1.5 py-0.5 text-[10px] font-medium text-muted-foreground\">\n {entry.version}\n </span>\n )}\n </div>\n <p className=\"mt-0.5 text-xs text-muted-foreground\">{entry.body}</p>\n <p className=\"mt-1 text-[10px] text-muted-foreground/70\">{entry.date}</p>\n </div>\n </div>\n </div>\n )\n })}\n </div>\n )\n}\n","import * as React from 'react'\nimport { CheckCheck, Info, AlertTriangle, AlertCircle, CheckCircle2 } from 'lucide-react'\nimport { cn } from '../../lib/cn'\nimport { Button } from '@fayz-ai/ui'\nimport { ChangelogFeed } from './ChangelogFeed'\nimport type { Notification } from '../../types'\n\ninterface NotificationInboxProps {\n notifications: Notification[]\n onMarkRead: (id: string) => void\n onMarkAllRead: () => void\n onNotificationClick?: (notification: Notification) => void\n changelogUrl?: string\n className?: string\n}\n\nconst TYPE_ICONS: Record<string, React.ElementType> = {\n info: Info,\n success: CheckCircle2,\n warning: AlertTriangle,\n error: AlertCircle,\n}\n\nconst TYPE_COLORS: Record<string, string> = {\n info: 'text-info',\n success: 'text-success',\n warning: 'text-warning',\n error: 'text-destructive',\n}\n\nfunction timeAgo(dateString: string): string {\n const now = Date.now()\n const then = new Date(dateString).getTime()\n const diff = Math.floor((now - then) / 1000)\n\n if (diff < 60) return 'just now'\n if (diff < 3600) return `${Math.floor(diff / 60)}m ago`\n if (diff < 86400) return `${Math.floor(diff / 3600)}h ago`\n if (diff < 604800) return `${Math.floor(diff / 86400)}d ago`\n return new Date(dateString).toLocaleDateString('en-US', {\n month: 'short',\n day: 'numeric',\n })\n}\n\nexport function NotificationInbox({\n notifications,\n onMarkRead,\n onMarkAllRead,\n onNotificationClick,\n changelogUrl,\n className,\n}: NotificationInboxProps) {\n const [activeTab, setActiveTab] = React.useState<'inbox' | 'whats-new'>('inbox')\n const unreadCount = notifications.filter((n) => !n.read).length\n const inboxNotifications = notifications.filter((n) => n.category !== 'changelog')\n\n return (\n <div className={cn('flex w-80 flex-col', className)}>\n {/* Tabs */}\n <div className=\"flex border-b\">\n <button\n onClick={() => setActiveTab('inbox')}\n className={cn(\n 'flex-1 px-4 py-2.5 text-sm font-medium border-b-2 transition-colors',\n activeTab === 'inbox'\n ? 'border-primary text-primary'\n : 'border-transparent text-muted-foreground hover:text-foreground'\n )}\n >\n Inbox\n {unreadCount > 0 && (\n <span className=\"ml-1.5 rounded-full bg-primary px-1.5 py-0.5 text-[10px] text-primary-foreground\">\n {unreadCount}\n </span>\n )}\n </button>\n <button\n onClick={() => setActiveTab('whats-new')}\n className={cn(\n 'flex-1 px-4 py-2.5 text-sm font-medium border-b-2 transition-colors',\n activeTab === 'whats-new'\n ? 'border-primary text-primary'\n : 'border-transparent text-muted-foreground hover:text-foreground'\n )}\n >\n What's New\n </button>\n </div>\n\n {/* Tab Content */}\n {activeTab === 'inbox' ? (\n <>\n {unreadCount > 0 && (\n <div className=\"flex items-center justify-end px-4 py-2\">\n <Button\n variant=\"ghost\"\n size=\"sm\"\n className=\"h-auto px-2 py-1 text-xs\"\n onClick={onMarkAllRead}\n >\n <CheckCheck className=\"mr-1 h-3 w-3\" />\n Mark all read\n </Button>\n </div>\n )}\n\n <div className=\"max-h-96 overflow-y-auto\">\n {inboxNotifications.length === 0 ? (\n <div className=\"flex flex-col items-center justify-center py-12 text-center\">\n <p className=\"text-sm text-muted-foreground\">No notifications</p>\n </div>\n ) : (\n inboxNotifications.map((notification) => {\n const Icon = TYPE_ICONS[notification.type] ?? Info\n const colorClass = TYPE_COLORS[notification.type] ?? TYPE_COLORS.info\n\n return (\n <div\n key={notification.id}\n role=\"button\"\n tabIndex={0}\n className={cn(\n 'flex cursor-pointer gap-3 border-b px-4 py-3 transition-colors hover:bg-muted/50',\n !notification.read && 'bg-muted/30'\n )}\n onClick={() => {\n if (!notification.read) onMarkRead(notification.id)\n onNotificationClick?.(notification)\n }}\n onKeyDown={(e) => {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault()\n if (!notification.read) onMarkRead(notification.id)\n onNotificationClick?.(notification)\n }\n }}\n >\n <div className={cn('mt-0.5 shrink-0', colorClass)}>\n <Icon className=\"h-4 w-4\" />\n </div>\n\n <div className=\"min-w-0 flex-1\">\n <div className=\"flex items-start justify-between gap-2\">\n <p\n className={cn(\n 'truncate text-sm',\n !notification.read && 'font-medium'\n )}\n >\n {notification.title}\n </p>\n {!notification.read && (\n <span className=\"mt-1.5 h-2 w-2 shrink-0 rounded-full bg-primary\" />\n )}\n </div>\n <p className=\"mt-0.5 line-clamp-2 text-xs text-muted-foreground\">\n {notification.body}\n </p>\n <p className=\"mt-1 text-xs text-muted-foreground/70\">\n {timeAgo(notification.createdAt)}\n </p>\n </div>\n </div>\n )\n })\n )}\n </div>\n </>\n ) : (\n <ChangelogFeed changelogUrl={changelogUrl} />\n )}\n </div>\n )\n}\n","import React from 'react'\nimport { getFayzSupabaseClientOptional } from '../../data/client'\nimport { resolveFayzAgentConnection } from '../../lib/fayz-agent'\nimport { Skeleton } from '@fayz-ai/ui'\nimport { knownClientMark } from './client-marks'\n\n/**\n * The consent screen an external agent sends the user to.\n *\n * It lives in the APP, not in fayz, and that placement is the point: the person\n * approving is the salon owner, who has a session here and no fayz account at\n * all. Hosting this in the platform would bounce them to a login they cannot\n * pass.\n *\n * What it must show, and why each one:\n *\n * - **who is asking** — name, site and the exact redirect URI, fetched from\n * the client's own metadata rather than echoed from the query string, so\n * the name on screen is the identity the client actually claims.\n * - **what they get** — read-only, said plainly. The request usually asks for\n * `write` too; the server drops it, and this screen shows what was GRANTED,\n * never what was requested. A consent screen that lists a capability the\n * connection does not have is worse than no screen.\n * - **which organization** — the thing being handed over is an organization's\n * data, so the organization has to be named, and picked when the user\n * belongs to more than one. Approving without knowing whose data it is is\n * not consent.\n */\n\ninterface ConsentClient {\n name: string\n website?: string\n logoUri?: string\n redirectUri: string\n /**\n * The identity was attested — its metadata came from the origin its client_id\n * names. False means the client typed its own name when registering, and the\n * screen says so instead of dressing it up.\n */\n identityVerified?: boolean\n}\n\ninterface ConsentAccess {\n scopes: string[]\n readOnly: boolean\n summary: string\n}\n\ninterface ConsentOrganization {\n tenantId: string\n name: string\n role?: string\n}\n\ninterface ConsentPayload {\n client: ConsentClient\n access: ConsentAccess\n user: { id: string; email?: string }\n organizations: ConsentOrganization[]\n}\n\nexport interface ConnectConsentPageProps {\n /** Product name shown next to the requesting client. Defaults to the document title. */\n appName?: string\n /**\n * ICON-ONLY mark. Not the wordmark: this badge is square, and a wordmark in\n * it is cropped. Absent, the app's initial is used, which is always legible.\n */\n logo?: React.ReactNode\n}\n\ntype State =\n | { status: 'loading' }\n | { status: 'error'; message: string }\n | { status: 'ready'; payload: ConsentPayload }\n | { status: 'approving' }\n\nexport function ConnectConsentPage({ appName, logo }: ConnectConsentPageProps) {\n const [state, setState] = React.useState<State>({ status: 'loading' })\n const [tenantId, setTenantId] = React.useState<string>('')\n const request = React.useMemo(\n () => new URLSearchParams(window.location.search).get('request') ?? '',\n [],\n )\n\n const connection = React.useMemo(() => resolveFayzAgentConnection(), [])\n const product = appName ?? document.title ?? 'este app'\n\n const authorizedFetch = React.useCallback(\n async (path: string, init?: RequestInit): Promise<Response> => {\n if (!connection) throw new Error('Este app não está ligado a um projeto Fayz.')\n const supabase = getFayzSupabaseClientOptional()\n const session = (await supabase?.auth.getSession())?.data.session\n if (!session?.access_token) {\n // Not an error state — the user simply needs to sign in first, and must\n // come back to the SAME authorization request afterwards.\n const back = encodeURIComponent(window.location.pathname + window.location.search)\n window.location.href = `/login?redirect=${back}`\n throw new Error('redirecting')\n }\n return fetch(\n `${connection.apiBaseUrl}/public/projects/${connection.projectId}/agents/oauth${path}`,\n {\n ...init,\n headers: {\n ...(init?.headers ?? {}),\n Authorization: `Bearer ${session.access_token}`,\n 'Content-Type': 'application/json',\n },\n },\n )\n },\n [connection],\n )\n\n React.useEffect(() => {\n let cancelled = false\n ;(async () => {\n if (!request) {\n setState({ status: 'error', message: 'Link de autorização inválido ou incompleto.' })\n return\n }\n try {\n const response = await authorizedFetch(`/consent/request?request=${encodeURIComponent(request)}`)\n const body = (await response.json()) as ConsentPayload & { message?: string }\n if (cancelled) return\n if (!response.ok) {\n setState({ status: 'error', message: body.message ?? 'Não foi possível ler o pedido.' })\n return\n }\n setState({ status: 'ready', payload: body })\n // Pre-select when there is nothing to choose.\n if (body.organizations.length === 1) setTenantId(body.organizations[0].tenantId)\n } catch (error) {\n if (cancelled || (error as Error).message === 'redirecting') return\n setState({ status: 'error', message: (error as Error).message })\n }\n })()\n return () => {\n cancelled = true\n }\n }, [request, authorizedFetch])\n\n async function approve() {\n if (!tenantId) return\n const previous = state\n setState({ status: 'approving' })\n try {\n const response = await authorizedFetch('/consent', {\n method: 'POST',\n body: JSON.stringify({ request, tenantId }),\n })\n const body = (await response.json()) as { redirectTo?: string; message?: string }\n if (!response.ok || !body.redirectTo) {\n setState({ status: 'error', message: body.message ?? 'Não foi possível autorizar.' })\n return\n }\n // Hand the browser back to the client that started this.\n window.location.href = body.redirectTo\n } catch (error) {\n if ((error as Error).message === 'redirecting') return\n setState(previous)\n }\n }\n\n function cancel() {\n window.history.length > 1 ? window.history.back() : (window.location.href = '/')\n }\n\n return (\n <div className=\"flex min-h-screen items-center justify-center bg-sidebar p-4\">\n <div className=\"relative w-full max-w-md rounded-2xl border border-border/50 bg-card p-8 shadow-2xl\">\n {/* The card's shape is known before the request resolves, so it is\n drawn first. A dialog that asks for a decision should not appear to\n change size while the user is reading it. */}\n {state.status === 'loading' && <ConsentSkeleton />}\n\n {state.status === 'error' && (\n <div className=\"py-6 text-center\">\n <h1 className=\"text-lg font-semibold text-foreground\">Não deu para autorizar</h1>\n <p className=\"mt-2 text-sm text-muted-foreground\">{state.message}</p>\n <button\n onClick={cancel}\n className=\"mt-6 rounded-lg border border-border px-4 py-2 text-sm font-medium hover:bg-muted\"\n >\n Voltar\n </button>\n </div>\n )}\n\n {(state.status === 'ready' || state.status === 'approving') && (\n <ConsentBody\n payload={state.status === 'ready' ? state.payload : undefined}\n product={product}\n logo={logo}\n tenantId={tenantId}\n onTenantChange={setTenantId}\n onApprove={approve}\n onCancel={cancel}\n busy={state.status === 'approving'}\n />\n )}\n </div>\n </div>\n )\n}\n\nfunction ConsentBody({\n payload,\n product,\n logo,\n tenantId,\n onTenantChange,\n onApprove,\n onCancel,\n busy,\n}: {\n payload?: ConsentPayload\n product: string\n logo?: React.ReactNode\n tenantId: string\n onTenantChange: (id: string) => void\n onApprove: () => void\n onCancel: () => void\n busy: boolean\n}) {\n if (!payload) return <ConsentSkeleton />\n\n const { client, access, organizations } = payload\n const org = organizations.find((o) => o.tenantId === tenantId)\n const mark =\n client.logoUri ?? knownClientMark(client.website, client.identityVerified === true, client.name)\n\n return (\n <>\n <div className=\"mb-6 flex items-center justify-center gap-3\">\n <MarkBadge fallback={client.name}>\n {mark ? <img src={mark} alt=\"\" className=\"h-full w-full object-cover\" /> : null}\n </MarkBadge>\n <span className=\"text-muted-foreground\">⇄</span>\n <MarkBadge fallback={product}>{logo}</MarkBadge>\n </div>\n\n <h1 className=\"text-center text-xl font-semibold text-foreground\">\n {client.name} quer acessar seus dados\n </h1>\n\n <dl className=\"mt-6 divide-y divide-border overflow-hidden rounded-xl border border-border text-sm\">\n <Row\n label=\"Aplicativo\"\n value={\n <span>\n {client.name}\n {client.identityVerified !== true && (\n // Not an alarm — most CLI clients register themselves and are\n // perfectly legitimate. But the user is about to hand over an\n // organization's data, and \"this name is self-declared\" is a\n // fact they are entitled to before deciding.\n <span className=\"block text-xs text-muted-foreground\">\n nome informado pelo próprio aplicativo\n </span>\n )}\n </span>\n }\n />\n {client.website && (\n <Row\n label=\"Site\"\n value={\n <a href={client.website} target=\"_blank\" rel=\"noreferrer noopener\" className=\"text-primary hover:underline\">\n {client.website}\n </a>\n }\n />\n )}\n {/* Shown because it is the one field that decides where the access\n actually ends up — a user who recognises the name but not the\n destination has not been told enough. */}\n <Row label=\"Retorna para\" value={<span className=\"break-all font-mono text-xs\">{client.redirectUri}</span>} />\n <Row\n label=\"Acesso\"\n value={\n <span>\n {access.readOnly ? 'Somente leitura' : 'Leitura e escrita'}\n <span className=\"block text-xs text-muted-foreground\">{access.summary}</span>\n </span>\n }\n />\n </dl>\n\n <div className=\"mt-5\">\n <label className=\"mb-1.5 block text-sm font-medium text-foreground\">\n Organização que está liberando\n </label>\n {organizations.length === 0 ? (\n <p className=\"rounded-lg border border-border bg-muted/40 p-3 text-sm text-muted-foreground\">\n Sua conta não pertence a nenhuma organização neste app, então não há dados para liberar.\n </p>\n ) : organizations.length === 1 ? (\n <div className=\"rounded-lg border border-border bg-muted/40 px-3 py-2.5 text-sm\">\n {organizations[0].name}\n {organizations[0].role && (\n <span className=\"ml-2 text-xs text-muted-foreground\">({organizations[0].role})</span>\n )}\n </div>\n ) : (\n <select\n value={tenantId}\n onChange={(e) => onTenantChange(e.target.value)}\n className=\"w-full rounded-lg border border-border bg-background px-3 py-2.5 text-sm\"\n >\n <option value=\"\">Escolha uma organização…</option>\n {organizations.map((o) => (\n <option key={o.tenantId} value={o.tenantId}>\n {o.name}\n {o.role ? ` (${o.role})` : ''}\n </option>\n ))}\n </select>\n )}\n </div>\n\n <p className=\"mt-5 text-xs leading-relaxed text-muted-foreground\">\n Ao aprovar, {client.name} poderá ler os dados\n {org ? ` de ${org.name}` : ' da organização escolhida'} até você desconectar.\n Você pode desfazer isso a qualquer momento em <strong>Configurações → Conectores</strong>.\n </p>\n\n <div className=\"mt-6 flex justify-end gap-2\">\n <button\n onClick={onCancel}\n disabled={busy}\n className=\"rounded-lg border border-border px-4 py-2 text-sm font-medium hover:bg-muted disabled:opacity-50\"\n >\n Cancelar\n </button>\n <button\n onClick={onApprove}\n disabled={busy || !tenantId}\n className=\"rounded-lg bg-primary px-5 py-2 text-sm font-medium text-primary-foreground hover:opacity-90 disabled:opacity-50\"\n >\n {busy ? 'Aprovando…' : 'Aprovar'}\n </button>\n </div>\n </>\n )\n}\n\nfunction ConsentSkeleton() {\n return (\n <div aria-hidden>\n <div className=\"mb-6 flex items-center justify-center gap-3\">\n <Skeleton className=\"h-12 w-12 rounded-xl\" />\n <Skeleton className=\"h-4 w-4 rounded-full\" />\n <Skeleton className=\"h-12 w-12 rounded-xl\" />\n </div>\n <Skeleton className=\"mx-auto h-6 w-64\" />\n <div className=\"mt-6 divide-y divide-border overflow-hidden rounded-xl border border-border\">\n {[0, 1, 2, 3].map((i) => (\n <div key={i} className=\"flex gap-4 px-4 py-3\">\n <Skeleton className=\"h-4 w-24 shrink-0\" />\n <Skeleton className=\"h-4 flex-1\" />\n </div>\n ))}\n </div>\n <Skeleton className=\"mt-5 h-4 w-52\" />\n <Skeleton className=\"mt-2 h-11 w-full rounded-lg\" />\n <div className=\"mt-6 flex justify-end gap-2\">\n <Skeleton className=\"h-9 w-24 rounded-lg\" />\n <Skeleton className=\"h-9 w-24 rounded-lg\" />\n </div>\n </div>\n )\n}\n\n/**\n * A 48px square for a product mark.\n *\n * When there IS a mark, it fills the square with no frame of its own: these\n * marks already come with their own rounded background, and wrapping one in a\n * bordered, padded box draws a second frame around the first. The chrome exists\n * only for the fallback, where a bare initial floating in the layout would read\n * as a missing image rather than a deliberate placeholder.\n */\nfunction MarkBadge({\n children,\n fallback,\n}: {\n children?: React.ReactNode\n fallback: string\n}) {\n if (children) {\n return (\n // The node is the app's own, sized for wherever it normally lives (the\n // sidebar rail sizes it too, via cloneElement). It is stretched to the\n // badge here rather than by changing the component, which would follow it\n // everywhere else it is used.\n <div className=\"h-12 w-12 shrink-0 overflow-hidden rounded-xl [&>*]:h-full [&>*]:w-full [&_img]:h-full [&_img]:w-full [&_img]:rounded-xl [&_img]:object-cover [&_svg]:h-full [&_svg]:w-full\">\n {children}\n </div>\n )\n }\n return (\n <div className=\"flex h-12 w-12 shrink-0 items-center justify-center rounded-xl border border-border bg-muted text-lg font-semibold\">\n {fallback.slice(0, 1).toUpperCase()}\n </div>\n )\n}\n\nfunction Row({ label, value }: { label: string; value: React.ReactNode }) {\n return (\n <div className=\"flex gap-4 px-4 py-3\">\n <dt className=\"w-28 shrink-0 text-muted-foreground\">{label}</dt>\n <dd className=\"min-w-0 flex-1 text-foreground\">{value}</dd>\n </div>\n )\n}\n","import React from 'react'\nimport { Plus, Search } from 'lucide-react'\nimport {\n Modal,\n ModalContent,\n ModalHeader,\n ModalTitle,\n ModalDescription,\n Skeleton,\n} from '@fayz-ai/ui'\nimport { useTranslation } from '../../hooks/useTranslation'\nimport { ConnectorMark } from './ConnectorMark'\nimport { PlaneBadge, StateChip } from './ConnectorRow'\nimport { CATEGORY_LABELS, filterConnectors, type UnifiedConnector } from './model'\n\n/**\n * The Fayz connector directory, as an \"add\" panel.\n *\n * It lists the very same rows the hub does — same id, same mark, same badges —\n * because \"Google Calendar\" browsed here and \"Google Calendar\" configured in\n * Agenda → Integrações are one connector, not two screens that happen to share\n * a name. Picking one opens the same journey panel; nothing is duplicated here,\n * so nothing can drift.\n *\n * Three states exist and the panel has to tell them apart, because collapsing\n * them is how a catalogue turns into a promise:\n *\n * - **pronto para conectar** — a plugin in THIS app contributes it, so there\n * is a real place to go and connect it.\n * - **disponível no Fayz** — the platform has it built, but this app lacks the\n * plugin that hosts it.\n * - **em breve** — a catalogue entry with nothing behind it yet.\n */\nexport function AddConnectorPanel({\n open,\n onOpenChange,\n connectors,\n onSelect,\n}: {\n open: boolean\n onOpenChange: (open: boolean) => void\n /** The unified list; `null` while it loads. */\n connectors: UnifiedConnector[] | null\n onSelect: (connector: UnifiedConnector) => void\n}) {\n const { t } = useTranslation()\n const [query, setQuery] = React.useState('')\n\n // Already-granted inbound assistants aren't things you \"add\" — they arrive by\n // approving a consent screen, and they're already in the list behind this one.\n const addable = React.useMemo(\n () => (connectors ?? []).filter((c) => c.direction === 'outbound'),\n [connectors],\n )\n const filtered = React.useMemo(() => filterConnectors(addable, 'all', query), [addable, query])\n\n return (\n <Modal open={open} onOpenChange={onOpenChange}>\n <ModalContent size=\"2xl\">\n <ModalHeader>\n <ModalTitle>{t('connectors.add')}</ModalTitle>\n <ModalDescription>{t('connectors.addSubtitle')}</ModalDescription>\n </ModalHeader>\n\n {/* 22 entries is past the point where scanning works — the search is\n what makes the list usable rather than a wall. */}\n <div className=\"relative\">\n <Search className=\"pointer-events-none absolute left-3 top-1/2 h-4 w-4 -translate-y-1/2 text-muted-foreground\" />\n <input\n value={query}\n onChange={(e) => setQuery(e.target.value)}\n placeholder={t('connectors.search')}\n className=\"w-full rounded-lg border border-border bg-background py-2 pl-9 pr-3 text-sm outline-none focus:ring-2 focus:ring-ring\"\n />\n </div>\n\n <div className=\"-mx-1 max-h-[55vh] overflow-y-auto px-1\">\n {connectors === null && (\n <ul className=\"divide-y divide-border\" aria-hidden>\n {[0, 1, 2, 3, 4].map((i) => (\n <li key={i} className=\"flex items-center gap-3 py-3\">\n <Skeleton className=\"h-9 w-9 shrink-0 rounded-lg\" />\n <div className=\"flex-1 space-y-2\">\n <Skeleton className=\"h-4 w-32\" />\n <Skeleton className=\"h-3 w-56\" />\n </div>\n <Skeleton className=\"h-8 w-24 rounded-lg\" />\n </li>\n ))}\n </ul>\n )}\n\n {connectors !== null && filtered.length === 0 && (\n <p className=\"py-10 text-center text-sm text-muted-foreground\">\n {t('connectors.noneFound', { query })}\n </p>\n )}\n\n {filtered.length > 0 && (\n <ul className=\"divide-y divide-border\">\n {filtered.map((c) => (\n <CatalogRow key={c.id} connector={c} onSelect={onSelect} />\n ))}\n </ul>\n )}\n </div>\n </ModalContent>\n </Modal>\n )\n}\n\nfunction CatalogRow({\n connector,\n onSelect,\n}: {\n connector: UnifiedConnector\n onSelect: (connector: UnifiedConnector) => void\n}) {\n const category = connector.category ? (CATEGORY_LABELS[connector.category] ?? connector.category) : null\n\n return (\n <li>\n <button\n onClick={() => onSelect(connector)}\n className=\"flex w-full items-center gap-3 py-3 text-left transition-colors hover:bg-muted/40\"\n >\n <ConnectorMark connector={connector} size=\"sm\" />\n <div className=\"min-w-0 flex-1\">\n <div className=\"flex flex-wrap items-center gap-2\">\n <span className=\"font-medium text-foreground\">{connector.name}</span>\n {category && (\n <span className=\"rounded-full border border-border px-2 py-0.5 text-[11px] text-muted-foreground\">\n {category}\n </span>\n )}\n {connector.planes.map((p) => (\n <PlaneBadge key={p} plane={p} active={connector.activePlane === p} />\n ))}\n </div>\n {connector.description && (\n <p className=\"mt-0.5 line-clamp-1 text-xs text-muted-foreground\">{connector.description}</p>\n )}\n </div>\n <span className=\"shrink-0\">\n <StateChip state={connector.state} />\n </span>\n </button>\n </li>\n )\n}\n\n/** Small trigger a screen can render next to its heading. */\nexport function AddConnectorButton({ onClick }: { onClick: () => void }) {\n const { t } = useTranslation()\n return (\n <button\n onClick={onClick}\n className=\"inline-flex shrink-0 items-center gap-1.5 rounded-lg bg-primary px-3 py-1.5 text-sm font-medium text-primary-foreground hover:opacity-90\"\n >\n <Plus className=\"h-4 w-4\" />\n {t('connectors.add')}\n </button>\n )\n}\n","import React from 'react'\nimport { Skeleton } from '@fayz-ai/ui'\nimport { Plus } from 'lucide-react'\nimport { useTranslation } from '../../hooks/useTranslation'\nimport { AddConnectorPanel } from './AddConnectorPanel'\nimport { ConnectorRow } from './ConnectorRow'\nimport { ConnectorDetail } from './ConnectorDetail'\nimport { openConnectorsPanel, useConnectorsPanelAvailable } from './ConnectorsPanel'\nimport { useConnectors } from './useConnectors'\nimport { filterConnectors, type ConnectorFilter, type UnifiedConnector } from './model'\n\n/**\n * Settings → Conectores — the whole surface, in one list.\n *\n * Two things used to live apart: what an outside assistant had been granted\n * over this organization, and what the app itself reached out to. To the person\n * running the salon \"o Claude lê minha agenda\" and \"minha agenda vai pro Google\"\n * are the same kind of decision, so they are the same list. `direction` tells\n * them apart; a second screen would only hide half the answer.\n *\n * It is also the other half of consent: an approval you cannot find is an\n * approval you cannot withdraw. Everything granted is listed, and everything\n * listed can be revoked — from the same panel that explains what it does.\n */\nexport function ConnectorsTab() {\n const { t } = useTranslation()\n const { connectors, error, reload, revokeGrant, agentAvailable, tenantReady } = useConnectors()\n const [adding, setAdding] = React.useState(false)\n const [selected, setSelected] = React.useState<UnifiedConnector | null>(null)\n const [filter, setFilter] = React.useState<ConnectorFilter>('all')\n const [failure, setFailure] = React.useState<string | null>(null)\n const assistantAvailable = useConnectorsPanelAvailable()\n\n // Connecting happens in the assistant's own drawer — the connector is a\n // capability of the agent, so the journey belongs next to it. This screen\n // stays the inventory: what is granted, and how to take it back. Apps with no\n // assistant mounted fall back to the sheet so the journey is never stranded.\n const openJourney = React.useCallback(\n (connector: UnifiedConnector) => {\n if (assistantAvailable) openConnectorsPanel(connector)\n else setSelected(connector)\n },\n [assistantAvailable],\n )\n\n // The list proper is what belongs to this organization; the catalogue lives\n // behind \"Adicionar\", so browsing what exists never gets confused with what\n // is actually running.\n const mine = React.useMemo(\n () => (connectors ?? []).filter((c) => c.state === 'connected' || c.state === 'ready'),\n [connectors],\n )\n const visible = React.useMemo(() => filterConnectors(mine, filter), [mine, filter])\n\n // Keep the open panel in step with a reload — a connector that just connected\n // should say so without being reopened.\n React.useEffect(() => {\n if (!selected || !connectors) return\n const fresh = connectors.find((c) => c.id === selected.id)\n if (fresh && fresh !== selected) setSelected(fresh)\n if (!fresh) setSelected(null)\n }, [connectors])\n\n if (!agentAvailable) {\n return <Empty title={t('connectors.noProject')} body={t('connectors.noProjectBody')} />\n }\n if (!tenantReady) {\n return <Empty title={t('connectors.noOrg')} body={t('connectors.noOrgBody')} />\n }\n\n return (\n <div className=\"space-y-4\">\n <div className=\"flex items-start justify-between gap-4\">\n <div>\n <h2 className=\"text-lg font-semibold text-foreground\">{t('settings.connectors')}</h2>\n <p className=\"mt-1 text-sm text-muted-foreground\">{t('connectors.hubSubtitle')}</p>\n </div>\n <button\n onClick={() => setAdding(true)}\n className=\"inline-flex shrink-0 items-center gap-1.5 rounded-lg bg-primary px-3 py-1.5 text-sm font-medium text-primary-foreground hover:opacity-90\"\n >\n <Plus className=\"h-4 w-4\" />\n {t('connectors.add')}\n </button>\n </div>\n\n <AddConnectorPanel\n open={adding}\n onOpenChange={setAdding}\n connectors={connectors}\n onSelect={(connector) => {\n setAdding(false)\n openJourney(connector)\n }}\n />\n\n {(error || failure) && (\n <div className=\"rounded-lg border border-destructive/30 bg-destructive/10 p-3 text-sm text-destructive\">\n {failure ?? error}\n </div>\n )}\n\n {mine.length > 4 && <Filters value={filter} onChange={setFilter} />}\n\n {/* Skeleton rather than a spinner: the list's shape is known before its\n contents are, so showing that shape keeps the layout from jumping. */}\n {connectors === null && <ConnectionsSkeleton />}\n\n {connectors !== null && visible.length === 0 && (\n <Empty title={t('connectors.emptyTitle')} body={t('connectors.emptyBody')} />\n )}\n\n {visible.length > 0 && (\n <ul className=\"divide-y divide-border overflow-hidden rounded-xl border border-border\">\n {visible.map((c) => (\n <ConnectorRow key={c.id} connector={c} onOpen={openJourney} />\n ))}\n </ul>\n )}\n\n <ConnectorDetail\n connector={selected}\n open={!!selected}\n onOpenChange={(open) => !open && setSelected(null)}\n onChanged={reload}\n onRevoke={async (connector) => {\n // Irreversible from the user's side, and it disconnects something that\n // may be in use right now — so it asks, and it names what it will cut.\n if (!window.confirm(t('connectors.revokeConfirm', { name: connector.name }))) return\n try {\n await revokeGrant(connector)\n setSelected(null)\n } catch (e) {\n setFailure((e as Error).message)\n }\n }}\n />\n </div>\n )\n}\n\nconst FILTERS: ConnectorFilter[] = ['all', 'connected', 'agentic', 'sync']\n\nfunction Filters({ value, onChange }: { value: ConnectorFilter; onChange: (f: ConnectorFilter) => void }) {\n const { t } = useTranslation()\n return (\n <div className=\"flex flex-wrap gap-1.5\">\n {FILTERS.map((f) => (\n <button\n key={f}\n onClick={() => onChange(f)}\n className={\n 'rounded-full px-3 py-1 text-xs font-medium transition-colors ' +\n (f === value ? 'bg-primary text-primary-foreground' : 'bg-muted text-muted-foreground hover:bg-muted/70')\n }\n >\n {t(`connectors.filter.${f}`)}\n </button>\n ))}\n </div>\n )\n}\n\nfunction ConnectionsSkeleton() {\n return (\n <ul className=\"divide-y divide-border overflow-hidden rounded-xl border border-border\" aria-hidden>\n {[0, 1].map((i) => (\n <li key={i} className=\"flex items-start gap-4 p-4\">\n <Skeleton className=\"h-10 w-10 shrink-0 rounded-lg\" />\n <div className=\"min-w-0 flex-1 space-y-2 py-0.5\">\n <Skeleton className=\"h-4 w-40\" />\n <Skeleton className=\"h-3 w-64\" />\n </div>\n <Skeleton className=\"h-8 w-28 shrink-0 rounded-lg\" />\n </li>\n ))}\n </ul>\n )\n}\n\nfunction Empty({ title, body }: { title: string; body: string }) {\n return (\n <div className=\"rounded-xl border border-dashed border-border p-8 text-center\">\n <p className=\"font-medium text-foreground\">{title}</p>\n <p className=\"mt-1 text-sm text-muted-foreground\">{body}</p>\n </div>\n )\n}\n","export interface LocaleOption {\n code: string\n label: string\n flag: string\n}\n\nexport const SUPPORTED_LOCALES: LocaleOption[] = [\n { code: 'en', label: 'English', flag: '🇺🇸' },\n { code: 'pt-BR', label: 'Português (BR)', flag: '🇧🇷' },\n]\n\nexport function getLocaleOption(code: string): LocaleOption {\n return SUPPORTED_LOCALES.find((l) => l.code === code) ?? SUPPORTED_LOCALES[0]\n}\n","import * as React from 'react'\nimport { Save, Check } from 'lucide-react'\nimport { Button } from '@fayz-ai/ui'\nimport { Input } from '@fayz-ai/ui'\nimport {\n Select,\n SelectContent,\n SelectItem,\n SelectTrigger,\n SelectValue,\n} from '@fayz-ai/ui'\nimport { Card, CardContent, CardDescription, CardFooter, CardHeader, CardTitle } from '@fayz-ai/ui'\nimport { useTranslation } from '../../hooks/useTranslation'\nimport { useLocaleStore } from '../../stores/locale.store'\nimport { SUPPORTED_LOCALES } from '../../lib/locale-config'\nimport type { Tenant } from '../../types'\n\ninterface CompanySettingsProps {\n tenant?: Tenant | null\n onSave?: (settings: {\n name: string\n timezone: string\n currency: string\n }) => void\n}\n\nconst TIMEZONES = [\n { value: 'America/Sao_Paulo', label: 'Brasilia (BRT)' },\n { value: 'America/New_York', label: 'Eastern (US)' },\n { value: 'America/Chicago', label: 'Central (US)' },\n { value: 'America/Denver', label: 'Mountain (US)' },\n { value: 'America/Los_Angeles', label: 'Pacific (US)' },\n { value: 'America/Mexico_City', label: 'Mexico City' },\n { value: 'America/Buenos_Aires', label: 'Buenos Aires' },\n { value: 'Europe/London', label: 'London' },\n { value: 'Europe/Paris', label: 'Paris' },\n { value: 'Europe/Berlin', label: 'Berlin' },\n { value: 'Europe/Madrid', label: 'Madrid' },\n { value: 'Europe/Lisbon', label: 'Lisbon' },\n { value: 'Asia/Tokyo', label: 'Tokyo' },\n { value: 'Asia/Shanghai', label: 'Shanghai' },\n { value: 'Australia/Sydney', label: 'Sydney' },\n { value: 'UTC', label: 'UTC' },\n]\n\nconst CURRENCIES = [\n { value: 'BRL', label: 'BRL - Real' },\n { value: 'USD', label: 'USD - US Dollar' },\n { value: 'EUR', label: 'EUR - Euro' },\n { value: 'GBP', label: 'GBP - British Pound' },\n { value: 'JPY', label: 'JPY - Japanese Yen' },\n { value: 'CAD', label: 'CAD - Canadian Dollar' },\n { value: 'AUD', label: 'AUD - Australian Dollar' },\n { value: 'MXN', label: 'MXN - Mexican Peso' },\n { value: 'ARS', label: 'ARS - Argentine Peso' },\n]\n\nexport function CompanySettings({ tenant, onSave }: CompanySettingsProps) {\n const { t } = useTranslation()\n const { locale: uiLocale, setLocale: setUiLocale } = useLocaleStore()\n const [name, setName] = React.useState(tenant?.name ?? '')\n const [timezone, setTimezone] = React.useState(tenant?.settings?.timezone ?? 'UTC')\n const [currency, setCurrency] = React.useState(tenant?.settings?.currency ?? 'USD')\n const [saving, setSaving] = React.useState(false)\n\n React.useEffect(() => {\n if (tenant) {\n setName(tenant.name)\n setTimezone(tenant.settings?.timezone ?? 'UTC')\n setCurrency(tenant.settings?.currency ?? 'USD')\n }\n }, [tenant])\n\n const handleSubmit = async (e: React.FormEvent) => {\n e.preventDefault()\n if (!onSave) return\n\n setSaving(true)\n try {\n await onSave({ name, timezone, currency })\n } finally {\n setSaving(false)\n }\n }\n\n return (\n <div className=\"space-y-6\">\n <form onSubmit={handleSubmit}>\n <Card>\n <CardHeader>\n <CardTitle className=\"text-lg\">{t('settings.company.title')}</CardTitle>\n <CardDescription>\n {t('settings.company.subtitle')}\n </CardDescription>\n </CardHeader>\n\n <CardContent className=\"space-y-4\">\n <div className=\"space-y-2\">\n <label htmlFor=\"company-name\" className=\"text-sm font-medium\">\n {t('settings.company.name')}\n </label>\n <Input\n id=\"company-name\"\n value={name}\n onChange={(e) => setName(e.target.value)}\n placeholder=\"Acme Inc.\"\n />\n </div>\n\n <div className=\"grid gap-4 sm:grid-cols-3\">\n <div className=\"space-y-2\">\n <label className=\"text-sm font-medium\">{t('settings.company.timezone')}</label>\n <Select value={timezone} onValueChange={setTimezone}>\n <SelectTrigger>\n <SelectValue placeholder={t('settings.company.timezonePlaceholder')} />\n </SelectTrigger>\n <SelectContent>\n {TIMEZONES.map((tz) => (\n <SelectItem key={tz.value} value={tz.value}>\n {tz.label}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n </div>\n\n <div className=\"space-y-2\">\n <label className=\"text-sm font-medium\">{t('settings.company.currency')}</label>\n <Select value={currency} onValueChange={setCurrency}>\n <SelectTrigger>\n <SelectValue placeholder={t('settings.company.currencyPlaceholder')} />\n </SelectTrigger>\n <SelectContent>\n {CURRENCIES.map((c) => (\n <SelectItem key={c.value} value={c.value}>\n {c.label}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n </div>\n\n </div>\n </CardContent>\n\n <CardFooter className=\"justify-end\">\n <Button type=\"submit\" disabled={saving}>\n <Save className=\"mr-2 h-4 w-4\" />\n {saving ? t('common.saving') : t('settings.save')}\n </Button>\n </CardFooter>\n </Card>\n </form>\n\n {/* UI Language */}\n <Card>\n <CardHeader>\n <CardTitle className=\"text-base\">{t('settings.uiLanguage')}</CardTitle>\n <CardDescription>{t('settings.uiLanguageDescription')}</CardDescription>\n </CardHeader>\n <CardContent>\n <div className=\"grid gap-2 sm:grid-cols-2\">\n {SUPPORTED_LOCALES.map((loc) => (\n <button\n key={loc.code}\n onClick={() => {\n setUiLocale(loc.code)\n window.location.reload()\n }}\n className={`flex items-center justify-between rounded-lg border-2 px-4 py-3 text-sm transition-all ${\n uiLocale === loc.code\n ? 'border-primary bg-primary/5'\n : 'border-transparent bg-muted/30 hover:bg-muted/50'\n }`}\n >\n <span className=\"flex items-center gap-3\">\n <span className=\"text-xl\">{loc.flag}</span>\n <span className=\"font-medium\">{loc.label}</span>\n </span>\n {uiLocale === loc.code && <Check className=\"h-4 w-4 text-primary\" />}\n </button>\n ))}\n </div>\n </CardContent>\n </Card>\n </div>\n )\n}\n","import { CompanySettings } from './CompanySettings'\nimport { useOrganizationStore } from '../../stores/organization.store'\n// Native org adapter — the shell's lib/org-context provider is never mounted,\n// so importing from there returned a null adapter and every save was a no-op.\n// The native <OrgProvider> (packages/saas/src/org) is the one actually mounted.\nimport { useOrgAdapterOptional } from '../../org'\nimport { toast } from '../notifications/ToastProvider'\nimport type { Tenant, TenantSettings } from '../../types'\n\nfunction toTenantSettings(settings: unknown): TenantSettings {\n const source = (settings && typeof settings === 'object' ? settings : {}) as Partial<TenantSettings>\n const branding = (source.branding && typeof source.branding === 'object' ? source.branding : {}) as TenantSettings['branding']\n\n return {\n timezone: source.timezone ?? 'America/Sao_Paulo',\n currency: source.currency ?? 'BRL',\n locale: source.locale ?? 'pt-BR',\n branding: {\n primaryColor: branding.primaryColor,\n accentColor: branding.accentColor,\n logoUrl: branding.logoUrl,\n faviconUrl: branding.faviconUrl,\n },\n }\n}\n\nexport function ConnectedCompanySettings() {\n const currentOrg = useOrganizationStore((s) => s.currentOrg)\n const setCurrentOrg = useOrganizationStore((s) => s.setCurrentOrg)\n const adapter = useOrgAdapterOptional()\n // Map Organization to Tenant shape for the component\n const tenant: Tenant | null = currentOrg\n ? {\n id: currentOrg.id,\n name: currentOrg.name,\n slug: currentOrg.slug,\n logoUrl: currentOrg.logoUrl,\n plan: currentOrg.plan ?? 'free',\n settings: toTenantSettings(currentOrg.settings),\n createdAt: currentOrg.createdAt,\n updatedAt: currentOrg.updatedAt,\n }\n : null\n\n const handleSave = async (data: { name: string; timezone: string; currency: string }) => {\n if (!adapter || !currentOrg) return\n\n try {\n const currentSettings = toTenantSettings(currentOrg.settings)\n const updated = await adapter.updateOrg(currentOrg.id, {\n name: data.name,\n settings: {\n ...currentSettings,\n timezone: data.timezone,\n currency: data.currency,\n },\n })\n setCurrentOrg(updated)\n toast.success('Settings saved')\n } catch (err: any) {\n toast.error('Failed to save', { description: err?.message })\n }\n }\n\n return <CompanySettings tenant={tenant} onSave={handleSave} />\n}\n","import * as React from 'react'\nimport { Camera, Save } from 'lucide-react'\nimport { cn } from '../../lib/cn'\nimport { Button } from '@fayz-ai/ui'\nimport { Input } from '@fayz-ai/ui'\nimport { Avatar, AvatarFallback, AvatarImage } from '@fayz-ai/ui'\nimport { Card, CardContent, CardDescription, CardFooter, CardHeader, CardTitle } from '@fayz-ai/ui'\nimport { useTranslation } from '../../hooks/useTranslation'\nimport type { AuthUser } from '../../types'\n\ninterface UserProfileProps {\n user?: AuthUser | null\n onSave?: (data: { fullName: string }) => void\n onAvatarChange?: (file: File) => void\n}\n\nfunction getInitials(name: string): string {\n return name\n .split(' ')\n .map((part) => part[0])\n .filter(Boolean)\n .slice(0, 2)\n .join('')\n .toUpperCase()\n}\n\nexport function UserProfile({ user, onSave, onAvatarChange }: UserProfileProps) {\n const { t } = useTranslation()\n const [fullName, setFullName] = React.useState(user?.fullName ?? '')\n const [saving, setSaving] = React.useState(false)\n const fileInputRef = React.useRef<HTMLInputElement>(null)\n\n React.useEffect(() => {\n if (user) {\n setFullName(user.fullName)\n }\n }, [user])\n\n const handleAvatarClick = () => {\n fileInputRef.current?.click()\n }\n\n const handleFileChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n const file = e.target.files?.[0]\n if (file && onAvatarChange) {\n onAvatarChange(file)\n }\n if (e.target) {\n e.target.value = ''\n }\n }\n\n const handleSubmit = async (e: React.FormEvent) => {\n e.preventDefault()\n if (!onSave) return\n\n setSaving(true)\n try {\n await onSave({ fullName })\n } finally {\n setSaving(false)\n }\n }\n\n return (\n <form onSubmit={handleSubmit} className=\"space-y-6\">\n <Card>\n <CardHeader>\n <CardTitle className=\"text-lg\">{t('settings.profile.title')}</CardTitle>\n <CardDescription>\n {t('settings.profile.subtitle')}\n </CardDescription>\n </CardHeader>\n\n <CardContent className=\"space-y-6\">\n <div className=\"flex items-center gap-6\">\n <div className=\"relative\">\n <Avatar className=\"h-20 w-20\">\n <AvatarImage src={user?.avatarUrl} alt={user?.fullName} />\n <AvatarFallback className=\"text-lg\">\n {user?.fullName ? getInitials(user.fullName) : '?'}\n </AvatarFallback>\n </Avatar>\n {onAvatarChange && (\n <button\n type=\"button\"\n onClick={handleAvatarClick}\n className={cn(\n 'absolute -bottom-1 -right-1 flex h-8 w-8 items-center justify-center rounded-full',\n 'border-2 border-background bg-primary text-primary-foreground',\n 'transition-colors hover:bg-primary/90'\n )}\n aria-label=\"Change avatar\"\n >\n <Camera className=\"h-3.5 w-3.5\" />\n </button>\n )}\n <input\n ref={fileInputRef}\n type=\"file\"\n accept=\"image/*\"\n className=\"hidden\"\n onChange={handleFileChange}\n />\n </div>\n\n <div className=\"space-y-1\">\n <p className=\"font-medium\">{user?.fullName ?? 'User'}</p>\n <p className=\"text-sm text-muted-foreground\">{user?.email}</p>\n </div>\n </div>\n\n <div className=\"space-y-2\">\n <label htmlFor=\"full-name\" className=\"text-sm font-medium\">\n {t('settings.profile.fullName')}\n </label>\n <Input\n id=\"full-name\"\n value={fullName}\n onChange={(e) => setFullName(e.target.value)}\n placeholder=\"John Doe\"\n />\n </div>\n\n <div className=\"space-y-2\">\n <label htmlFor=\"email\" className=\"text-sm font-medium\">\n {t('settings.profile.email')}\n </label>\n <Input\n id=\"email\"\n type=\"email\"\n value={user?.email ?? ''}\n disabled\n className=\"bg-muted\"\n />\n <p className=\"text-xs text-muted-foreground\">\n {t('settings.profile.emailHelp')}\n </p>\n </div>\n </CardContent>\n\n <CardFooter className=\"justify-end\">\n <Button type=\"submit\" disabled={saving}>\n <Save className=\"mr-2 h-4 w-4\" />\n {saving ? t('common.saving') : t('settings.profile.saveProfile')}\n </Button>\n </CardFooter>\n </Card>\n </form>\n )\n}\n","import * as React from 'react'\nimport { UserProfile } from './UserProfile'\n// The signed-in user lives in @fayz-ai/auth's store (the one AuthProvider fills) —\n// the shell stores/auth.store is a separate, unpopulated store.\nimport { useAuthStore } from '@fayz-ai/auth'\nimport { getSupabaseClient, getSupabaseClientSafe } from '../../lib/supabase'\nimport { toast } from '../notifications/ToastProvider'\n\ninterface ProfileRow {\n full_name: string | null\n avatar_url: string | null\n email: string | null\n}\n\n// The \"/me\" surface: the current user's canonical profile = the auth user (id,\n// e-mail) merged with their profiles row (name, avatar). Reads/writes go\n// to public.profiles (RLS: id = auth.uid(), so a user only ever sees/edits their\n// own), and keep the auth-user metadata in sync so both stay coherent.\nexport function ConnectedUserProfile() {\n const user = useAuthStore((s) => s.user)\n const setUser = useAuthStore((s) => s.setUser)\n const [profile, setProfile] = React.useState<ProfileRow | null>(null)\n\n // Fill: load the canonical profile row on mount (falls back to auth metadata).\n React.useEffect(() => {\n const supabase = getSupabaseClientSafe()\n if (!user || !supabase) return // mock/no-backend: just use the auth-store user\n let cancelled = false\n void supabase\n .from('profiles')\n .select('full_name, avatar_url, email')\n .eq('id', user.id)\n .maybeSingle()\n .then(({ data }) => {\n if (!cancelled && data) setProfile(data as ProfileRow)\n })\n return () => {\n cancelled = true\n }\n }, [user?.id])\n\n const handleSave = async (data: { fullName: string }) => {\n if (!user) return\n try {\n const supabase = getSupabaseClient()\n // Upsert the canonical row (INSERT if the profile doesn't exist yet).\n const { error: profileError } = await supabase\n .from('profiles')\n .upsert({ id: user.id, full_name: data.fullName, email: user.email }, { onConflict: 'id' })\n if (profileError) throw profileError\n\n // Keep the auth-user metadata in sync (used across the app's session).\n const { error: metaError } = await supabase.auth.updateUser({ data: { full_name: data.fullName } })\n if (metaError) throw metaError\n\n setUser({ ...user, fullName: data.fullName })\n setProfile({ full_name: data.fullName, avatar_url: profile?.avatar_url ?? null, email: user.email })\n toast.success('Perfil atualizado')\n } catch (err: any) {\n toast.error('Falha ao atualizar', { description: err?.message })\n }\n }\n\n const handleAvatarChange = async (file: File) => {\n if (!user) return\n try {\n const supabase = getSupabaseClient()\n const ext = file.name.split('.').pop()\n const path = `avatars/${user.id}.${ext}`\n\n const { error: uploadError } = await supabase.storage\n .from('avatars')\n .upload(path, file, { upsert: true })\n if (uploadError) throw uploadError\n\n const { data: urlData } = supabase.storage.from('avatars').getPublicUrl(path)\n const avatarUrl = urlData.publicUrl\n\n const { error: profileError } = await supabase\n .from('profiles')\n .upsert({ id: user.id, avatar_url: avatarUrl, email: user.email }, { onConflict: 'id' })\n if (profileError) throw profileError\n\n await supabase.auth.updateUser({ data: { avatar_url: avatarUrl } })\n setUser({ ...user, avatarUrl })\n setProfile({ full_name: profile?.full_name ?? null, avatar_url: avatarUrl, email: user.email })\n toast.success('Avatar atualizado')\n } catch (err: any) {\n toast.error('Falha ao enviar avatar', { description: err?.message })\n }\n }\n\n // Merge: prefer the canonical profile row, fall back to auth metadata.\n const merged = user\n ? { ...user, fullName: profile?.full_name ?? user.fullName, avatarUrl: profile?.avatar_url ?? user.avatarUrl }\n : null\n\n return <UserProfile user={merged as any} onSave={handleSave} onAvatarChange={handleAvatarChange} />\n}\n","import * as React from 'react'\nimport { KeyRound, Loader2, Clock, ShieldCheck, UserPlus } from 'lucide-react'\nimport { Button } from '@fayz-ai/ui'\nimport { Card, CardContent, CardDescription, CardHeader, CardTitle } from '@fayz-ai/ui'\nimport { useTranslation } from '../../hooks/useTranslation'\nimport type { AuthUser } from '../../types'\n\nexport interface TenantSecuritySettings {\n sessionTimeoutMinutes?: number\n require2FA?: boolean\n inviteOnly?: boolean\n}\n\ninterface SecuritySettingsProps {\n user?: AuthUser | null\n tenantSecurity?: TenantSecuritySettings\n isAdmin?: boolean\n onResetPassword?: () => Promise<void>\n onTenantSecurityChange?: (settings: TenantSecuritySettings) => Promise<void>\n}\n\nconst SESSION_TIMEOUT_OPTIONS = [\n { label: '30 minutes', value: 30 },\n { label: '1 hour', value: 60 },\n { label: '4 hours', value: 240 },\n { label: '8 hours', value: 480 },\n { label: '24 hours', value: 1440 },\n { label: 'No limit', value: 0 },\n]\n\nfunction ToggleRow({\n icon,\n label,\n description,\n checked,\n onChange,\n disabled,\n}: {\n icon: React.ReactNode\n label: string\n description: string\n checked: boolean\n onChange: (val: boolean) => void\n disabled?: boolean\n}) {\n return (\n <div className=\"flex items-start justify-between gap-4 py-3\">\n <div className=\"flex gap-3\">\n <div className=\"mt-0.5 text-muted-foreground\">{icon}</div>\n <div>\n <p className=\"text-sm font-medium\">{label}</p>\n <p className=\"text-xs text-muted-foreground\">{description}</p>\n </div>\n </div>\n <button\n type=\"button\"\n role=\"switch\"\n aria-checked={checked}\n disabled={disabled}\n onClick={() => onChange(!checked)}\n className={`relative inline-flex h-5 w-9 shrink-0 cursor-pointer items-center rounded-full transition-colors disabled:cursor-not-allowed disabled:opacity-50 ${\n checked ? 'bg-primary' : 'bg-muted-foreground/30'\n }`}\n >\n <span\n className={`pointer-events-none block h-4 w-4 rounded-full bg-white shadow-sm transition-transform ${\n checked ? 'translate-x-[18px]' : 'translate-x-[2px]'\n }`}\n />\n </button>\n </div>\n )\n}\n\nexport function SecuritySettings({\n user,\n tenantSecurity,\n isAdmin,\n onResetPassword,\n onTenantSecurityChange,\n}: SecuritySettingsProps) {\n const { t } = useTranslation()\n const [resetting, setResetting] = React.useState(false)\n const [resetSent, setResetSent] = React.useState(false)\n const [savingTenant, setSavingTenant] = React.useState(false)\n\n const handleResetPassword = async () => {\n if (!onResetPassword) return\n setResetting(true)\n try {\n await onResetPassword()\n setResetSent(true)\n } catch {\n // handled via toast in connected wrapper\n } finally {\n setResetting(false)\n }\n }\n\n const updateTenantSecurity = async (partial: Partial<TenantSecuritySettings>) => {\n if (!onTenantSecurityChange) return\n setSavingTenant(true)\n try {\n await onTenantSecurityChange({ ...tenantSecurity, ...partial })\n } catch {\n // handled via toast\n } finally {\n setSavingTenant(false)\n }\n }\n\n const baseClass =\n 'flex h-10 w-full rounded-input border border-input bg-background px-3 py-2 text-sm shadow-sm ring-offset-background focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring disabled:cursor-not-allowed disabled:opacity-50'\n\n return (\n <div className=\"space-y-6\">\n {/* Password reset */}\n <Card>\n <CardHeader>\n <CardTitle className=\"text-lg\">{t('settings.security.passwordTitle')}</CardTitle>\n <CardDescription>\n {t('settings.security.passwordSubtitle')}\n </CardDescription>\n </CardHeader>\n <CardContent>\n <div className=\"flex items-center justify-between rounded-lg border p-4\">\n <div className=\"space-y-0.5\">\n <p className=\"text-sm font-medium\">{user?.email}</p>\n <p className=\"text-xs text-muted-foreground\">\n {resetSent\n ? t('settings.security.resetLinkSent')\n : t('settings.security.resetLinkDescription')}\n </p>\n </div>\n <Button\n variant=\"outline\"\n size=\"sm\"\n disabled={resetting || resetSent}\n onClick={handleResetPassword}\n >\n {resetting && <Loader2 className=\"mr-2 h-4 w-4 animate-spin\" />}\n <KeyRound className=\"mr-2 h-4 w-4\" />\n {resetSent ? t('settings.security.linkSent') : t('settings.security.resetPassword')}\n </Button>\n </div>\n </CardContent>\n </Card>\n\n {/* Tenant security — only visible to admins */}\n {isAdmin && (\n <Card>\n <CardHeader>\n <CardTitle className=\"text-lg\">{t('settings.security.orgSecurityTitle')}</CardTitle>\n <CardDescription>\n {t('settings.security.orgSecuritySubtitle')}\n </CardDescription>\n </CardHeader>\n <CardContent className=\"space-y-1 divide-y\">\n <ToggleRow\n icon={<ShieldCheck className=\"h-4 w-4\" />}\n label={t('settings.security.require2FA')}\n description={t('settings.security.require2FADescription')}\n checked={tenantSecurity?.require2FA ?? false}\n onChange={(val) => updateTenantSecurity({ require2FA: val })}\n disabled={savingTenant}\n />\n <ToggleRow\n icon={<UserPlus className=\"h-4 w-4\" />}\n label={t('settings.security.inviteOnly')}\n description={t('settings.security.inviteOnlyDescription')}\n checked={tenantSecurity?.inviteOnly ?? true}\n onChange={(val) => updateTenantSecurity({ inviteOnly: val })}\n disabled={savingTenant}\n />\n\n <div className=\"flex items-start justify-between gap-4 py-3\">\n <div className=\"flex gap-3\">\n <div className=\"mt-0.5 text-muted-foreground\">\n <Clock className=\"h-4 w-4\" />\n </div>\n <div>\n <p className=\"text-sm font-medium\">{t('settings.security.sessionTimeout')}</p>\n <p className=\"text-xs text-muted-foreground\">\n {t('settings.security.sessionTimeoutDescription')}\n </p>\n </div>\n </div>\n <select\n value={tenantSecurity?.sessionTimeoutMinutes ?? 0}\n onChange={(e) =>\n updateTenantSecurity({ sessionTimeoutMinutes: Number(e.target.value) })\n }\n disabled={savingTenant}\n className={`${baseClass} w-36`}\n >\n {SESSION_TIMEOUT_OPTIONS.map((opt) => (\n <option key={opt.value} value={opt.value}>\n {opt.label}\n </option>\n ))}\n </select>\n </div>\n </CardContent>\n </Card>\n )}\n </div>\n )\n}\n","import { create } from 'zustand'\nimport type { AuthUser, AuthSession, AuthState } from '../types'\n\ninterface AuthStore extends AuthState {\n setUser: (user: AuthUser | null) => void\n setSession: (session: AuthSession | null) => void\n setLoading: (loading: boolean) => void\n setInitialized: (initialized: boolean) => void\n setPendingEmailVerification: (pending: boolean) => void\n reset: () => void\n}\n\nconst initialState: AuthState = {\n user: null,\n session: null,\n loading: true,\n initialized: false,\n pendingEmailVerification: false,\n}\n\nexport const useAuthStore = create<AuthStore>((set) => ({\n ...initialState,\n setUser: (user) => set({ user }),\n setSession: (session) => set({ session, user: session?.user ?? null, pendingEmailVerification: false }),\n setLoading: (loading) => set({ loading }),\n setInitialized: (initialized) => set({ initialized }),\n setPendingEmailVerification: (pendingEmailVerification) => set({ pendingEmailVerification }),\n reset: () => set(initialState),\n}))\n","import { createContext, useContext } from 'react'\nimport type { AuthAdapter } from '../types/auth-adapter'\n\nconst AuthAdapterContext = createContext<AuthAdapter | null>(null)\n\nexport const AuthAdapterProvider = AuthAdapterContext.Provider\n\nexport function useAuthAdapter(): AuthAdapter {\n const adapter = useContext(AuthAdapterContext)\n if (!adapter) {\n throw new Error('useAuthAdapter must be used within an AuthAdapterProvider')\n }\n return adapter\n}\n\nexport function useAuthAdapterOptional(): AuthAdapter | null {\n return useContext(AuthAdapterContext)\n}\n","import { SecuritySettings } from './SecuritySettings'\nimport type { TenantSecuritySettings } from './SecuritySettings'\nimport { useAuthStore } from '../../stores/auth.store'\nimport { useOrganizationStore } from '../../stores/organization.store'\nimport { useAuthAdapterOptional } from '../../lib/auth-context'\n// Native org adapter — see ConnectedCompanySettings. The shell org-context\n// provider is never mounted, so the old import yielded a null adapter (no-op save).\nimport { useOrgAdapterOptional } from '../../org'\nimport { toast } from '../notifications/ToastProvider'\n\nexport function ConnectedSecuritySettings() {\n const user = useAuthStore((s) => s.user)\n const authAdapter = useAuthAdapterOptional()\n const orgAdapter = useOrgAdapterOptional()\n const currentOrg = useOrganizationStore((s) => s.currentOrg)\n const setCurrentOrg = useOrganizationStore((s) => s.setCurrentOrg)\n\n const settings = (currentOrg?.settings ?? {}) as Record<string, unknown>\n const tenantSecurity = (settings.security ?? {}) as TenantSecuritySettings\n\n // Determine if current user is admin (owner/admin role)\n const members = useOrganizationStore((s) => s.members)\n const currentMember = members.find((m) => m.userId === user?.id)\n const isAdmin = currentMember?.profileName?.toLowerCase() === 'owner' ||\n currentMember?.profileName?.toLowerCase() === 'admin'\n\n const handleResetPassword = async () => {\n if (!authAdapter || !user?.email) return\n try {\n await authAdapter.resetPassword(user.email)\n toast.success('Password reset link sent', { description: `Check ${user.email} for the reset link.` })\n } catch (err: any) {\n toast.error('Failed to send reset link', { description: err?.message })\n throw err\n }\n }\n\n const handleTenantSecurityChange = async (security: TenantSecuritySettings) => {\n if (!orgAdapter || !currentOrg) return\n try {\n const updated = await orgAdapter.updateOrg(currentOrg.id, {\n settings: { ...settings, security },\n })\n setCurrentOrg(updated)\n toast.success('Security settings updated')\n } catch (err: any) {\n toast.error('Failed to update security settings', { description: err?.message })\n throw err\n }\n }\n\n return (\n <SecuritySettings\n user={user as any}\n tenantSecurity={tenantSecurity}\n isAdmin={isAdmin}\n onResetPassword={handleResetPassword}\n onTenantSecurityChange={orgAdapter ? handleTenantSecurityChange : undefined}\n />\n )\n}\n","import * as React from 'react'\nimport { Upload, Save, X } from 'lucide-react'\nimport { cn } from '../../lib/cn'\nimport { Button } from '@fayz-ai/ui'\nimport { Input } from '@fayz-ai/ui'\nimport { Card, CardContent, CardDescription, CardFooter, CardHeader, CardTitle } from '@fayz-ai/ui'\nimport { useTranslation } from '../../hooks/useTranslation'\nimport type { TenantSettings } from '../../types'\n\ninterface BrandingSettingsProps {\n branding?: TenantSettings['branding'] | null\n onSave?: (branding: TenantSettings['branding'], assets?: {\n logoFile?: File | null\n faviconFile?: File | null\n }) => void\n}\n\ninterface FileUploadProps {\n label: string\n accept: string\n currentUrl?: string\n onFileSelect: (file: File) => void\n onClear?: () => void\n hint?: string\n}\n\nfunction FileUploadField({\n label,\n accept,\n currentUrl,\n onFileSelect,\n onClear,\n hint,\n}: FileUploadProps) {\n const { t } = useTranslation()\n const inputRef = React.useRef<HTMLInputElement>(null)\n const [preview, setPreview] = React.useState<string | null>(null)\n\n const handleChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n const file = e.target.files?.[0]\n if (file) {\n onFileSelect(file)\n const url = URL.createObjectURL(file)\n setPreview(url)\n }\n if (e.target) {\n e.target.value = ''\n }\n }\n\n const displayUrl = preview ?? currentUrl\n\n return (\n <div className=\"space-y-2\">\n <label className=\"text-sm font-medium\">{label}</label>\n <div className=\"flex items-center gap-4\">\n {displayUrl ? (\n <div className=\"relative\">\n <img\n src={displayUrl}\n alt={label}\n className=\"h-16 w-16 rounded-md border object-contain p-1\"\n />\n {onClear && (\n <button\n type=\"button\"\n onClick={() => {\n onClear()\n setPreview(null)\n }}\n className=\"absolute -right-1.5 -top-1.5 flex h-5 w-5 items-center justify-center rounded-full bg-destructive text-destructive-foreground\"\n aria-label={`Remove ${label.toLowerCase()}`}\n >\n <X className=\"h-3 w-3\" />\n </button>\n )}\n </div>\n ) : (\n <div className=\"flex h-16 w-16 items-center justify-center rounded-md border border-dashed\">\n <Upload className=\"h-5 w-5 text-muted-foreground/50\" />\n </div>\n )}\n\n <div>\n <Button\n type=\"button\"\n variant=\"outline\"\n size=\"sm\"\n onClick={() => inputRef.current?.click()}\n >\n {t('settings.branding.chooseFile')}\n </Button>\n {hint && (\n <p className=\"mt-1 text-xs text-muted-foreground\">{hint}</p>\n )}\n </div>\n </div>\n <input\n ref={inputRef}\n type=\"file\"\n accept={accept}\n className=\"hidden\"\n onChange={handleChange}\n />\n </div>\n )\n}\n\nexport function BrandingSettings({ branding, onSave }: BrandingSettingsProps) {\n const { t } = useTranslation()\n const [primaryColor, setPrimaryColor] = React.useState(branding?.primaryColor ?? '#000000')\n const [accentColor, setAccentColor] = React.useState(branding?.accentColor ?? '#6366f1')\n const [logoFile, setLogoFile] = React.useState<File | null>(null)\n const [faviconFile, setFaviconFile] = React.useState<File | null>(null)\n const [logoUrl, setLogoUrl] = React.useState(branding?.logoUrl ?? '')\n const [faviconUrl, setFaviconUrl] = React.useState(branding?.faviconUrl ?? '')\n const [saving, setSaving] = React.useState(false)\n\n React.useEffect(() => {\n if (branding) {\n setPrimaryColor(branding.primaryColor ?? '#000000')\n setAccentColor(branding.accentColor ?? '#6366f1')\n setLogoUrl(branding.logoUrl ?? '')\n setFaviconUrl(branding.faviconUrl ?? '')\n }\n }, [branding])\n\n const handleSubmit = async (e: React.FormEvent) => {\n e.preventDefault()\n if (!onSave) return\n\n setSaving(true)\n try {\n await onSave({\n primaryColor,\n accentColor,\n logoUrl,\n faviconUrl,\n }, {\n logoFile,\n faviconFile,\n })\n setLogoFile(null)\n setFaviconFile(null)\n } finally {\n setSaving(false)\n }\n }\n\n return (\n <form onSubmit={handleSubmit}>\n <Card>\n <CardHeader>\n <CardTitle className=\"text-lg\">{t('settings.branding.title')}</CardTitle>\n <CardDescription>\n {t('settings.branding.subtitle')}\n </CardDescription>\n </CardHeader>\n\n <CardContent className=\"space-y-6\">\n <div className=\"grid gap-6 sm:grid-cols-2\">\n <div className=\"space-y-2\">\n <label htmlFor=\"primary-color\" className=\"text-sm font-medium\">\n {t('settings.branding.primaryColor')}\n </label>\n <div className=\"flex items-center gap-3\">\n <input\n type=\"color\"\n id=\"primary-color\"\n value={primaryColor}\n onChange={(e) => setPrimaryColor(e.target.value)}\n className=\"h-10 w-10 cursor-pointer rounded-md border bg-transparent p-0.5\"\n />\n <Input\n value={primaryColor}\n onChange={(e) => setPrimaryColor(e.target.value)}\n placeholder=\"#000000\"\n className=\"flex-1\"\n maxLength={7}\n />\n </div>\n </div>\n\n <div className=\"space-y-2\">\n <label htmlFor=\"accent-color\" className=\"text-sm font-medium\">\n {t('settings.branding.accentColor')}\n </label>\n <div className=\"flex items-center gap-3\">\n <input\n type=\"color\"\n id=\"accent-color\"\n value={accentColor}\n onChange={(e) => setAccentColor(e.target.value)}\n className=\"h-10 w-10 cursor-pointer rounded-md border bg-transparent p-0.5\"\n />\n <Input\n value={accentColor}\n onChange={(e) => setAccentColor(e.target.value)}\n placeholder=\"#6366f1\"\n className=\"flex-1\"\n maxLength={7}\n />\n </div>\n </div>\n </div>\n\n <div className=\"rounded-md border p-4\">\n <p className=\"mb-3 text-sm font-medium\">{t('settings.branding.preview')}</p>\n <div className=\"flex items-center gap-3\">\n <div\n className=\"h-10 w-24 rounded-md\"\n style={{ backgroundColor: primaryColor }}\n />\n <div\n className=\"h-10 w-24 rounded-md\"\n style={{ backgroundColor: accentColor }}\n />\n </div>\n </div>\n\n <FileUploadField\n label=\"Logo\"\n accept=\"image/png,image/jpeg,image/svg+xml,image/webp\"\n currentUrl={logoUrl || undefined}\n onFileSelect={setLogoFile}\n onClear={() => {\n setLogoUrl('')\n setLogoFile(null)\n }}\n hint=\"Recommended: 200x50px, PNG or SVG\"\n />\n\n <FileUploadField\n label=\"Favicon\"\n accept=\"image/png,image/x-icon,image/svg+xml\"\n currentUrl={faviconUrl || undefined}\n onFileSelect={setFaviconFile}\n onClear={() => {\n setFaviconUrl('')\n setFaviconFile(null)\n }}\n hint=\"Recommended: 32x32px, PNG or ICO\"\n />\n </CardContent>\n\n <CardFooter className=\"justify-end\">\n <Button type=\"submit\" disabled={saving}>\n <Save className=\"mr-2 h-4 w-4\" />\n {saving ? t('common.saving') : t('settings.branding.saveBranding')}\n </Button>\n </CardFooter>\n </Card>\n </form>\n )\n}\n","import { BrandingSettings } from './BrandingSettings'\nimport { useOrganizationStore } from '../../stores/organization.store'\nimport { toast } from '../notifications/ToastProvider'\nimport { getSupabaseClient } from '../../lib/supabase'\nimport type { TenantSettings } from '../../types'\n\nexport function ConnectedBrandingSettings() {\n const currentOrg = useOrganizationStore((s) => s.currentOrg)\n const setCurrentOrg = useOrganizationStore((s) => s.setCurrentOrg)\n\n const handleSave = async (\n branding: TenantSettings['branding'],\n assets?: { logoFile?: File | null; faviconFile?: File | null },\n ) => {\n if (!currentOrg) return\n\n try {\n const supabase = getSupabaseClient()\n let nextBranding = { ...branding }\n\n if (assets?.logoFile) {\n const ext = assets.logoFile.name.split('.').pop() ?? 'png'\n const path = `branding/${currentOrg.id}/logo.${ext}`\n const { error: uploadError } = await supabase.storage\n .from('avatars')\n .upload(path, assets.logoFile, { upsert: true })\n if (uploadError) throw uploadError\n const { data } = supabase.storage.from('avatars').getPublicUrl(path)\n nextBranding.logoUrl = data.publicUrl\n }\n\n if (assets?.faviconFile) {\n const ext = assets.faviconFile.name.split('.').pop() ?? 'png'\n const path = `branding/${currentOrg.id}/favicon.${ext}`\n const { error: uploadError } = await supabase.storage\n .from('avatars')\n .upload(path, assets.faviconFile, { upsert: true })\n if (uploadError) throw uploadError\n const { data } = supabase.storage.from('avatars').getPublicUrl(path)\n nextBranding.faviconUrl = data.publicUrl\n }\n\n const currentSettings = (currentOrg.settings ?? {}) as Record<string, unknown>\n const settings = {\n ...currentSettings,\n branding: nextBranding,\n }\n\n const { data: updatedTenant, error: updateError } = await supabase\n .from('tenants')\n .update({\n settings,\n logo_url: nextBranding.logoUrl ?? currentOrg.logoUrl ?? null,\n })\n .eq('id', currentOrg.id)\n .select()\n .single()\n\n if (updateError) throw updateError\n\n setCurrentOrg({\n ...currentOrg,\n logoUrl: updatedTenant.logo_url ?? undefined,\n settings: updatedTenant.settings ?? settings,\n updatedAt: updatedTenant.updated_at ?? currentOrg.updatedAt,\n })\n\n toast.success('Branding saved')\n } catch (err: any) {\n toast.error('Failed to save branding', { description: err?.message })\n }\n }\n\n const currentSettings = (currentOrg?.settings ?? {}) as Partial<TenantSettings>\n\n return (\n <BrandingSettings\n branding={currentSettings.branding}\n onSave={handleSave}\n />\n )\n}\n","import * as React from 'react'\nimport { Globe, Store, LayoutTemplate, Plus, Trash2, ExternalLink, PenSquare, Star } from 'lucide-react'\nimport { Button, Input } from '@fayz-ai/ui'\nimport { useOrganizationStore } from '../org/store'\nimport { useFayzProjectsStore, editorUrlOf } from './store'\nimport { createFayzProject, updateFayzProject, deleteFayzProject } from './provider'\nimport type { FayzProject, FayzProjectKind, CreateFayzProjectInput } from './types'\n\n// ---------------------------------------------------------------------------\n// Projetos — manual CRUD for the tenant's fayz projects (sites/storefronts/\n// landing pages). Drives the \"Seu site\" sidebar widget and, later, the Loja\n// Online sales channel + Marketing landing links. Every mutation refresh()es\n// the shared store so the widget updates live.\n// ---------------------------------------------------------------------------\n\nconst KINDS: { value: FayzProjectKind; label: string; icon: React.ComponentType<{ className?: string }> }[] = [\n { value: 'site', label: 'Site', icon: Globe },\n { value: 'storefront', label: 'Loja (storefront)', icon: Store },\n { value: 'landing_page', label: 'Landing page', icon: LayoutTemplate },\n { value: 'other', label: 'Outro', icon: Globe },\n]\n\nconst KIND_ICON = Object.fromEntries(KINDS.map((k) => [k.value, k.icon])) as Record<FayzProjectKind, React.ComponentType<{ className?: string }>>\n\nexport function ProjectsSettings() {\n const currentOrgId = useOrganizationStore((s) => s.currentOrg?.id)\n const projects = useFayzProjectsStore((s) => s.projects)\n const load = useFayzProjectsStore((s) => s.load)\n const refresh = useFayzProjectsStore((s) => s.refresh)\n const [adding, setAdding] = React.useState(false)\n const [editing, setEditing] = React.useState<string | null>(null)\n\n React.useEffect(() => { void load(currentOrgId) }, [currentOrgId, load])\n\n const onCreate = async (input: CreateFayzProjectInput) => {\n await createFayzProject(input)\n setAdding(false)\n await refresh()\n }\n const onSave = async (id: string, input: CreateFayzProjectInput) => {\n await updateFayzProject(id, input)\n setEditing(null)\n await refresh()\n }\n const onDelete = async (id: string) => {\n await deleteFayzProject(id)\n await refresh()\n }\n const setDefault = async (id: string) => {\n await updateFayzProject(id, { isDefault: true })\n await refresh()\n }\n\n return (\n <div className=\"space-y-4\">\n <div className=\"flex items-start justify-between gap-3\">\n <div>\n <h3 className=\"text-sm font-semibold text-foreground\">Sites e projetos fayz</h3>\n <p className=\"mt-0.5 text-xs text-muted-foreground\">\n Os projetos fayz deste workspace — sites, lojas e landing pages. O projeto padrão aparece no menu como “Seu site”.\n </p>\n </div>\n {!adding && (\n <Button size=\"sm\" onClick={() => setAdding(true)}>\n <Plus className=\"mr-1.5 h-4 w-4\" /> Adicionar\n </Button>\n )}\n </div>\n\n {adding && <ProjectForm onCancel={() => setAdding(false)} onSubmit={onCreate} />}\n\n <div className=\"space-y-2\">\n {projects.length === 0 && !adding && (\n <p className=\"rounded-card border border-dashed border-border p-6 text-center text-sm text-muted-foreground\">\n Nenhum projeto ainda. Adicione o site do cliente (id do projeto fayz + URLs de preview e editor).\n </p>\n )}\n {projects.map((p) =>\n editing === p.id ? (\n <ProjectForm key={p.id} initial={p} onCancel={() => setEditing(null)} onSubmit={(input) => onSave(p.id, input)} />\n ) : (\n <ProjectRow\n key={p.id}\n project={p}\n onEdit={() => setEditing(p.id)}\n onDelete={() => onDelete(p.id)}\n onSetDefault={() => setDefault(p.id)}\n />\n ),\n )}\n </div>\n </div>\n )\n}\n\nfunction ProjectRow({ project, onEdit, onDelete, onSetDefault }: { project: FayzProject; onEdit: () => void; onDelete: () => void; onSetDefault: () => void }) {\n const Icon = KIND_ICON[project.kind] ?? Globe\n return (\n <div className=\"flex items-center gap-3 rounded-card border border-border bg-card p-3\">\n <span className=\"flex h-9 w-9 shrink-0 items-center justify-center rounded-md bg-primary/10\">\n <Icon className=\"h-4 w-4 text-primary\" />\n </span>\n <div className=\"min-w-0 flex-1\">\n <div className=\"flex items-center gap-2\">\n <span className=\"truncate text-sm font-medium text-foreground\">{project.name}</span>\n {project.isDefault && (\n <span className=\"rounded-full bg-emerald-100 px-2 py-0.5 text-[10px] font-semibold text-emerald-800\">padrão</span>\n )}\n {project.storefrontEnabled && (\n <span className=\"rounded-full bg-blue-100 px-2 py-0.5 text-[10px] font-semibold text-blue-800\">storefront</span>\n )}\n </div>\n <p className=\"truncate text-xs text-muted-foreground\">{project.previewUrl || 'sem URL de preview'}</p>\n </div>\n <div className=\"flex shrink-0 items-center gap-1\">\n {project.previewUrl && (\n <Button size=\"sm\" variant=\"ghost\" onClick={() => window.open(project.previewUrl!, '_blank', 'noopener,noreferrer')} title=\"Abrir\"><ExternalLink className=\"h-4 w-4\" /></Button>\n )}\n {editorUrlOf(project) && (\n <Button size=\"sm\" variant=\"ghost\" onClick={() => window.open(editorUrlOf(project)!, '_blank', 'noopener,noreferrer')} title=\"Editar\"><PenSquare className=\"h-4 w-4\" /></Button>\n )}\n {!project.isDefault && (\n <Button size=\"sm\" variant=\"ghost\" onClick={onSetDefault} title=\"Definir como padrão\"><Star className=\"h-4 w-4\" /></Button>\n )}\n <Button size=\"sm\" variant=\"ghost\" onClick={onEdit}>Editar</Button>\n <Button size=\"sm\" variant=\"ghost\" onClick={onDelete}><Trash2 className=\"h-4 w-4 text-red-500\" /></Button>\n </div>\n </div>\n )\n}\n\nfunction ProjectForm({ initial, onCancel, onSubmit }: { initial?: FayzProject; onCancel: () => void; onSubmit: (input: CreateFayzProjectInput) => void }) {\n const [name, setName] = React.useState(initial?.name ?? '')\n const [kind, setKind] = React.useState<FayzProjectKind>(initial?.kind ?? 'site')\n const [fayzProjectId, setFayzProjectId] = React.useState(initial?.fayzProjectId ?? '')\n const [previewUrl, setPreviewUrl] = React.useState(initial?.previewUrl ?? '')\n const [isDefault, setIsDefault] = React.useState(initial?.isDefault ?? false)\n const [storefrontEnabled, setStorefrontEnabled] = React.useState(initial?.storefrontEnabled ?? false)\n\n const submit = () =>\n onSubmit({\n name: name.trim() || 'Meu site',\n kind,\n fayzProjectId: fayzProjectId.trim() || null,\n previewUrl: previewUrl.trim() || null,\n // editor URL is derived from the project id (fayz.ai/editor/{id}).\n isDefault,\n storefrontEnabled: storefrontEnabled || kind === 'storefront',\n })\n\n return (\n <div className=\"rounded-card border border-border bg-card p-4\">\n <div className=\"mb-3 flex flex-wrap gap-2\">\n {KINDS.map((k) => (\n <button key={k.value} type=\"button\" onClick={() => setKind(k.value)} className={`flex items-center gap-1.5 rounded-full px-3 py-1 text-xs font-medium ${k.value === kind ? 'bg-primary text-primary-foreground' : 'bg-muted text-muted-foreground hover:text-foreground'}`}>\n <k.icon className=\"h-3.5 w-3.5\" /> {k.label}\n </button>\n ))}\n </div>\n <div className=\"grid gap-2 sm:grid-cols-2\">\n <Input value={name} placeholder=\"Nome do site\" onChange={(e) => setName(e.target.value)} />\n <Input value={fayzProjectId} placeholder=\"fayz project id (opcional)\" onChange={(e) => setFayzProjectId(e.target.value)} />\n <Input value={previewUrl} placeholder=\"URL de preview (https://…)\" onChange={(e) => setPreviewUrl(e.target.value)} />\n </div>\n <div className=\"mt-3 flex flex-wrap items-center gap-4\">\n <label className=\"flex items-center gap-2 text-xs text-foreground\">\n <input type=\"checkbox\" checked={isDefault} onChange={(e) => setIsDefault(e.target.checked)} /> Projeto padrão\n </label>\n <label className=\"flex items-center gap-2 text-xs text-foreground\">\n <input type=\"checkbox\" checked={storefrontEnabled} onChange={(e) => setStorefrontEnabled(e.target.checked)} /> Storefront ativo (canal de venda)\n </label>\n </div>\n <div className=\"mt-3 flex gap-2\">\n <Button size=\"sm\" onClick={submit}>{initial ? 'Salvar' : 'Adicionar'}</Button>\n <Button size=\"sm\" variant=\"outline\" onClick={onCancel}>Cancelar</Button>\n </div>\n </div>\n )\n}\n","import * as React from 'react'\nimport { Plug, Building2, User, Shield, Palette, Globe, ArrowLeft, ChevronRight } from 'lucide-react'\nimport { cn } from '../../lib/cn'\nimport { ConnectorsTab } from '../connect'\nimport { useTranslation } from '../../hooks/useTranslation'\nimport { ConnectedCompanySettings } from './ConnectedCompanySettings'\nimport { ConnectedUserProfile } from './ConnectedUserProfile'\nimport { ConnectedSecuritySettings } from './ConnectedSecuritySettings'\nimport { ConnectedBrandingSettings } from './ConnectedBrandingSettings'\nimport { ProjectsSettings } from '../../projects/ProjectsSettings'\n\nexport interface SettingsTab {\n id: string\n label: string\n icon?: React.ReactNode\n /** Lucide icon name — used when these tabs are rendered in the app sidebar\n * (which resolves icons by name) instead of in the in-page nav. */\n iconName?: string\n component: React.ReactNode\n /** Plugin-contributed tab — draws the core/plugins divider. */\n isPlugin?: boolean\n}\n\n/** The core (non-plugin, non-org) settings tabs. Exported so the shell can\n * build the same list for the contextual /settings sidebar. */\nexport function useCoreSettingsTabs({\n showCompany = true,\n showBranding = true,\n}: { showCompany?: boolean; showBranding?: boolean } = {}): SettingsTab[] {\n const { t } = useTranslation()\n return React.useMemo(() => [\n ...(showCompany ? [{ id: 'general', label: t('settings.general'), icon: <Building2 className=\"h-4 w-4\" />, iconName: 'Building2', component: <ConnectedCompanySettings /> }] : []),\n { id: 'profile', label: t('settings.profile'), icon: <User className=\"h-4 w-4\" />, iconName: 'User', component: <ConnectedUserProfile /> },\n { id: 'security', label: t('settings.security'), icon: <Shield className=\"h-4 w-4\" />, iconName: 'Shield', component: <ConnectedSecuritySettings /> },\n ...(showBranding ? [{ id: 'branding', label: t('settings.branding'), icon: <Palette className=\"h-4 w-4\" />, iconName: 'Palette', component: <ConnectedBrandingSettings /> }] : []),\n // Sites/projetos fayz — business apps only (a tenant with a company has sites).\n ...(showCompany ? [{ id: 'sites', label: t('settings.sites'), icon: <Globe className=\"h-4 w-4\" />, iconName: 'Globe', component: <ProjectsSettings /> }] : []),\n // Conectores — the other half of consent. An approval the user cannot find\n // is one they cannot withdraw, so this sits next to the rest of the\n // organization's settings rather than behind a link in an email.\n { id: 'connectors', label: t('settings.connectors'), icon: <Plug className=\"h-4 w-4\" />, iconName: 'Plug', component: <ConnectorsTab /> },\n ], [t, showCompany, showBranding])\n}\n\ninterface SettingsPageProps {\n tabs?: SettingsTab[]\n extraTabs?: SettingsTab[]\n defaultTab?: string\n className?: string\n beforeContent?: React.ReactNode\n afterContent?: React.ReactNode\n /** Show the company \"Geral\" (organization general) tab. Default: true.\n * B2C apps pass false to hide org-identity settings. Ignored when `tabs` is\n * supplied explicitly. */\n showCompany?: boolean\n /** Show the branding (\"Identidade Visual\") tab. Default: true. Ignored when\n * `tabs` is supplied explicitly. */\n showBranding?: boolean\n /** The shell already renders this nav (contextual /settings sidebar), so the\n * desktop in-page nav column is dropped and the content spans the page.\n * Mobile keeps its master/detail list — the sidebar is a drawer there. */\n hideNav?: boolean\n /** Controlled active tab. When provided (the shell owns the settings nav and\n * drives it from the URL), this — not the internal hashchange state — decides\n * which tab's content renders, so navigating between tabs from the shell\n * sidebar reliably swaps the content. Uncontrolled (undefined) keeps the\n * self-managed behaviour used by standalone <SettingsPage> mounts. */\n activeTabId?: string\n}\n\nexport function SettingsPage({\n tabs,\n extraTabs,\n defaultTab,\n className,\n beforeContent,\n afterContent,\n showCompany = true,\n showBranding = true,\n hideNav = false,\n activeTabId,\n}: SettingsPageProps) {\n const { t } = useTranslation()\n\n const defaultTabs = useCoreSettingsTabs({ showCompany, showBranding })\n\n const baseTabs = tabs ?? defaultTabs\n const resolvedTabs = extraTabs ? [...baseTabs, ...extraTabs] : baseTabs\n\n // Controlled mode: the shell owns the settings nav (contextual sidebar) and\n // passes the active tab parsed from the URL. In that mode the URL — not the\n // internal hashchange state below — is the single source of truth.\n const controlled = activeTabId !== undefined\n\n // Detect active tab from URL: /settings/financial/... → 'financial'\n function getTabFromHash(): string | null {\n const hash = typeof window !== 'undefined' ? window.location.hash.slice(1) || '/' : '/'\n if (hash.startsWith('/settings/')) {\n const tabId = hash.slice('/settings/'.length).split('/')[0]\n if (resolvedTabs.find((t) => t.id === tabId)) return tabId\n }\n return null\n }\n\n const [activeTab, setActiveTab] = React.useState<string | null>(() => {\n return getTabFromHash() ?? defaultTab ?? null\n })\n\n // Sync tab from hash changes\n React.useEffect(() => {\n const handler = () => {\n const tab = getTabFromHash()\n if (tab) setActiveTab(tab)\n }\n window.addEventListener('hashchange', handler)\n return () => window.removeEventListener('hashchange', handler)\n }, [resolvedTabs])\n\n // Desktop always shows a selected tab; when none is chosen yet (landing on\n // /settings), default to the first tab — 'general'. Mobile keeps its\n // list-first master/detail behaviour (driven by the raw activeTab below).\n // Controlled mode uses the shell-supplied tab instead of internal state.\n const effectiveTab = controlled ? activeTabId ?? null : activeTab\n const desktopTab = effectiveTab ?? resolvedTabs[0]?.id ?? null\n const activeContent = desktopTab ? resolvedTabs.find((t) => t.id === desktopTab)?.component : null\n\n // On mobile: show list OR content. On desktop: show both. In controlled mode\n // the shell drawer holds the nav list, so SettingsPage always shows content.\n const showingContent = controlled ? true : activeTab !== null\n\n const handleSelectTab = (tabId: string) => {\n setActiveTab(tabId)\n window.location.hash = `/settings/${tabId}`\n }\n\n const handleBack = () => {\n setActiveTab(null)\n window.location.hash = '/settings'\n }\n\n const renderNav = (activeId: string | null) => (\n <ul className=\"space-y-0.5\">\n {resolvedTabs.map((tab, i) => (\n <React.Fragment key={tab.id}>\n {tab.isPlugin && (i === 0 || !resolvedTabs[i - 1]?.isPlugin) && (\n <li className=\"py-2\">\n <div className=\"border-t\" />\n <p className=\"px-3 pt-2 text-[10px] font-semibold uppercase tracking-wider text-muted-foreground\">{t('common.plugins')}</p>\n </li>\n )}\n <li>\n <button\n onClick={() => handleSelectTab(tab.id)}\n className={cn(\n 'flex w-full items-center gap-2 rounded-md px-3 py-2 text-sm font-medium transition-colors',\n activeId === tab.id\n ? 'bg-muted text-foreground'\n : 'text-muted-foreground hover:bg-muted/50 hover:text-foreground'\n )}\n >\n {tab.icon && <span className=\"shrink-0\">{tab.icon}</span>}\n <span className=\"flex-1 text-left\">{tab.label}</span>\n {/* Mobile: show chevron */}\n <ChevronRight className=\"h-4 w-4 text-muted-foreground/50 md:hidden\" />\n </button>\n </li>\n </React.Fragment>\n ))}\n </ul>\n )\n\n return (\n <div className={cn('space-y-6', className)}>\n {/* Mobile: back button + tab title when viewing content. Skipped in\n controlled mode — the shell drawer owns the settings list + back. */}\n {!controlled && showingContent && (\n <button\n onClick={handleBack}\n className=\"flex items-center gap-1.5 text-sm text-muted-foreground hover:text-foreground transition-colors md:hidden\"\n >\n <ArrowLeft className=\"h-4 w-4\" />\n {t('settings.title')}\n </button>\n )}\n\n {/* Header — MOBILE ONLY, and only on the list step. On desktop the shell\n band above already names the page: printing it again here spent a whole\n heading saying \"Settings\" under a bar that says \"Settings\", and with the\n nav in the shell sidebar it repeated the rail's own selection. */}\n {!showingContent && (\n <div className=\"md:hidden\">\n <h1 className=\"text-2xl font-bold tracking-tight\">{t('settings.title')}</h1>\n <p className=\"text-sm text-muted-foreground\">{t('settings.subtitle')}</p>\n </div>\n )}\n\n {beforeContent}\n\n {/* Desktop: side-by-side layout, or content-only when the shell owns the nav */}\n <div className=\"hidden md:flex md:gap-6\">\n {!hideNav && <nav className=\"w-52 shrink-0\">{renderNav(desktopTab)}</nav>}\n <div className=\"min-w-0 flex-1\">{activeContent ?? resolvedTabs[0]?.component}</div>\n </div>\n\n {/* Mobile: list or content, not both */}\n <div className=\"md:hidden\">\n {showingContent ? (\n <div>{activeContent}</div>\n ) : (\n <nav>{renderNav(activeTab)}</nav>\n )}\n </div>\n\n {afterContent}\n </div>\n )\n}\n","import { create } from 'zustand'\nimport type { Invite } from '../types/invite'\n\ninterface InviteStore {\n invites: Invite[]\n loading: boolean\n setInvites: (invites: Invite[]) => void\n setLoading: (loading: boolean) => void\n reset: () => void\n}\n\nexport const useInviteStore = create<InviteStore>((set) => ({\n invites: [],\n loading: false,\n setInvites: (invites) => set({ invites }),\n setLoading: (loading) => set({ loading }),\n reset: () => set({ invites: [], loading: false }),\n}))\n","import * as React from 'react'\nimport { Plus, X } from 'lucide-react'\nimport { toast } from '../notifications/ToastProvider'\nimport {\n Modal,\n ModalContent,\n ModalHeader,\n ModalTitle,\n ModalDescription,\n ModalFooter,\n} from '@fayz-ai/ui'\nimport { Button } from '@fayz-ai/ui'\nimport { Input } from '@fayz-ai/ui'\nimport { Select, SelectTrigger, SelectValue, SelectContent, SelectItem } from '@fayz-ai/ui'\nimport { Badge } from '@fayz-ai/ui'\nimport { usePermissionsStore } from '../../stores/permissions.store'\nimport { useOrganizationStore } from '../../stores/organization.store'\nimport { useInviteStore } from '../../stores/invite.store'\n// Native org adapter (the one the app actually provides). The shell lib/org-context\n// is a separate, un-provided context that returns null here — which made the submit\n// button a no-op (handleSend bailed on `!adapter`).\nimport { useOrgAdapterOptional as useNativeOrgAdapter } from '../../org'\nimport type { OrgAdapter } from '../../types/org-adapter'\n\n// The native adapter is the same runtime object; its Invite/Location types differ\n// from the shell's only in fields these components don't read, so a cast is safe.\nconst useOrgAdapterOptional = () => useNativeOrgAdapter() as unknown as OrgAdapter | null\n// The signed-in user lives in @fayz-ai/auth's store (what OrgProvider reads). The\n// shell stores/auth.store is a separate, unpopulated store — reading `user` from\n// it left `user` null, so handleSend bailed on `!user` (silent no-op).\nimport { useAuthStore } from '@fayz-ai/auth'\nimport { useTranslation } from '../../hooks/useTranslation'\n\ninterface InviteMemberDialogProps {\n open: boolean\n onOpenChange: (open: boolean) => void\n /** Pre-fill the first email (e.g. from person detail Access tab) */\n defaultEmail?: string\n}\n\nexport function InviteMemberDialog({ open, onOpenChange, defaultEmail }: InviteMemberDialogProps) {\n const { t } = useTranslation()\n const adapter = useOrgAdapterOptional()\n const currentOrg = useOrganizationStore((s) => s.currentOrg)\n const profiles = usePermissionsStore((s) => s.profiles)\n const setInvites = useInviteStore((s) => s.setInvites)\n const { user } = useAuthStore()\n\n const [emails, setEmails] = React.useState<string[]>([defaultEmail ?? ''])\n const [profileId, setProfileId] = React.useState(profiles[1]?.id ?? profiles[0]?.id ?? '')\n const [sending, setSending] = React.useState(false)\n const [sent, setSent] = React.useState(false)\n\n const addEmail = () => setEmails((prev) => [...prev, ''])\n\n const updateEmail = (idx: number, value: string) => {\n setEmails((prev) => {\n const next = [...prev]\n next[idx] = value\n return next\n })\n }\n\n const removeEmail = (idx: number) => {\n setEmails((prev) => prev.filter((_, i) => i !== idx))\n }\n\n const handleSend = async () => {\n if (!adapter || !currentOrg || !user) return\n const validEmails = emails.filter((e) => e.trim() && e.includes('@'))\n if (validEmails.length === 0) return\n\n setSending(true)\n try {\n if (validEmails.length === 1) {\n await adapter.createInvite(currentOrg.id, validEmails[0].trim(), profileId, user.id)\n } else {\n await adapter.bulkInvite(currentOrg.id, validEmails.map((e) => e.trim()), profileId, user.id)\n }\n const invites = await adapter.listInvites(currentOrg.id)\n setInvites(invites)\n setSent(true)\n } catch (err: any) {\n toast.error('Failed to send invites', { description: err?.message })\n } finally {\n setSending(false)\n }\n }\n\n const handleClose = () => {\n onOpenChange(false)\n // Reset after animation\n setTimeout(() => {\n setEmails([''])\n setProfileId(profiles[1]?.id ?? profiles[0]?.id ?? '')\n setSent(false)\n }, 200)\n }\n\n return (\n <Modal open={open} onOpenChange={handleClose}>\n <ModalContent>\n <ModalHeader>\n <ModalTitle>{t('organization.invite.title')}</ModalTitle>\n <ModalDescription>{t('organization.invite.description')}</ModalDescription>\n </ModalHeader>\n\n {sent ? (\n <div className=\"py-8 text-center\">\n <div className=\"mx-auto mb-3 flex h-12 w-12 items-center justify-center rounded-full bg-success/10\">\n <svg className=\"h-6 w-6 text-success\" fill=\"none\" viewBox=\"0 0 24 24\" strokeWidth={2} stroke=\"currentColor\"><path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M4.5 12.75l6 6 9-13.5\" /></svg>\n </div>\n <p className=\"text-sm font-medium\">{t('organization.invite.sent')}</p>\n <p className=\"text-xs text-muted-foreground mt-1\">{t('organization.invite.sentDescription')}</p>\n </div>\n ) : (\n <div className=\"space-y-4 py-4\">\n <div className=\"space-y-2\">\n <label className=\"text-sm font-medium\">{t('organization.invite.emailLabel')}</label>\n {emails.map((email, idx) => (\n <div key={idx} className=\"flex items-center gap-2\">\n <Input\n type=\"email\"\n placeholder=\"team@example.com\"\n value={email}\n onChange={(e) => updateEmail(idx, e.target.value)}\n />\n {emails.length > 1 && (\n <Button variant=\"ghost\" size=\"sm\" onClick={() => removeEmail(idx)}>\n <X className=\"h-4 w-4\" />\n </Button>\n )}\n </div>\n ))}\n <Button variant=\"ghost\" size=\"sm\" onClick={addEmail} className=\"text-xs\">\n <Plus className=\"h-3.5 w-3.5 mr-1\" />\n {t('organization.invite.addAnother')}\n </Button>\n </div>\n\n <div>\n <label className=\"text-sm font-medium\">{t('organization.invite.roleLabel')}</label>\n <Select value={profileId} onValueChange={setProfileId}>\n <SelectTrigger className=\"mt-1\">\n <SelectValue placeholder={t('organization.invite.rolePlaceholder')} />\n </SelectTrigger>\n <SelectContent>\n {profiles.map((p) => (\n <SelectItem key={p.id} value={p.id}>{p.name}</SelectItem>\n ))}\n </SelectContent>\n </Select>\n </div>\n </div>\n )}\n\n <ModalFooter>\n {sent ? (\n <Button onClick={handleClose}>{t('common.done')}</Button>\n ) : (\n <>\n <Button variant=\"outline\" onClick={handleClose}>{t('common.cancel')}</Button>\n <Button onClick={handleSend} disabled={sending || emails.every((e) => !e.trim())}>\n {sending ? t('organization.invite.sending') : t('organization.invite.sendInvites')}\n </Button>\n </>\n )}\n </ModalFooter>\n </ModalContent>\n </Modal>\n )\n}\n","import * as React from 'react'\nimport { UserPlus, MoreHorizontal, Mail, Clock } from 'lucide-react'\nimport { Card } from '@fayz-ai/ui'\nimport { Button } from '@fayz-ai/ui'\nimport { Badge } from '@fayz-ai/ui'\nimport { Skeleton } from '@fayz-ai/ui'\nimport { Avatar, AvatarFallback, AvatarImage } from '@fayz-ai/ui'\nimport { Select, SelectTrigger, SelectValue, SelectContent, SelectItem } from '@fayz-ai/ui'\nimport {\n Dropdown,\n DropdownTrigger,\n DropdownContent,\n DropdownItem,\n DropdownSeparator,\n} from '@fayz-ai/ui'\nimport { InviteMemberDialog } from './InviteMemberDialog'\nimport { toast } from '../notifications/ToastProvider'\nimport { useOrganizationStore } from '../../stores/organization.store'\nimport { usePermissionsStore } from '../../stores/permissions.store'\nimport { useInviteStore } from '../../stores/invite.store'\n// Native org adapter (see InviteMemberDialog) — the shell context is un-provided.\nimport { useOrgAdapterOptional as useNativeOrgAdapter } from '../../org'\nimport type { OrgAdapter } from '../../types/org-adapter'\nconst useOrgAdapterOptional = () => useNativeOrgAdapter() as unknown as OrgAdapter | null\nimport { useAuthStore } from '@fayz-ai/auth'\nimport { useSystemPermission } from '../../hooks/useSystemPermission'\nimport { useTranslation } from '../../hooks/useTranslation'\nimport { dedup } from '../../lib/dedup'\nimport { useLimitGuard, invalidateLimit } from '../../access'\n\n// A normalized team row: either a person (person-first mode) with an optional\n// access overlay, or a legacy tenant_members row. `memberId` present ⇒ has login+role.\ninterface TeamRow {\n key: string\n name: string\n email: string\n avatarUrl?: string\n /** kind label shown next to the name in person mode (e.g. \"Staff\"). */\n subtitle?: string\n roleId?: string\n roleName?: string\n memberId?: string\n hasAccess: boolean\n joinedAt?: string\n isCurrentUser: boolean\n}\n\nconst capitalize = (s: string) => (s ? s.charAt(0).toUpperCase() + s.slice(1) : s)\n\nexport function TeamTab() {\n const adapter = useOrgAdapterOptional()\n const currentOrg = useOrganizationStore((s) => s.currentOrg)\n const members = useOrganizationStore((s) => s.members)\n const setMembers = useOrganizationStore((s) => s.setMembers)\n const teamPersonKinds = useOrganizationStore((s) => s.teamPersonKinds)\n const profiles = usePermissionsStore((s) => s.profiles)\n const invites = useInviteStore((s) => s.invites)\n const setInvites = useInviteStore((s) => s.setInvites)\n const { user } = useAuthStore()\n const hasSystemPermission = useSystemPermission()\n\n // Person-first mode: drive the list from people of the configured kinds when\n // the adapter supports it. Otherwise fall back to the legacy members list.\n const personMode = teamPersonKinds.length > 0 && typeof adapter?.listTeam === 'function'\n const [team, setTeam] = React.useState<Awaited<ReturnType<NonNullable<OrgAdapter['listTeam']>>> | null>(null)\n\n const [inviteOpen, setInviteOpen] = React.useState(false)\n // Seat cap ('users' limit → tenant_members count). Guarded before opening the\n // invite dialog; the guard opens the global UpgradeModal when at the cap.\n const guardSeats = useLimitGuard('users')\n\n const handleOpenInvite = async () => {\n if ((await guardSeats(1)) === 'blocked') return\n setInviteOpen(true)\n }\n\n const reloadTeam = React.useCallback(async () => {\n if (!adapter || !currentOrg) return\n if (personMode && adapter.listTeam) {\n setTeam(await adapter.listTeam(currentOrg.id, teamPersonKinds))\n } else {\n setMembers(await adapter.listMembers(currentOrg.id))\n }\n }, [adapter, currentOrg?.id, personMode, teamPersonKinds, setMembers])\n\n // Load the person-first team list when in person mode (deduped).\n React.useEffect(() => {\n if (personMode && adapter?.listTeam && currentOrg) {\n dedup('team:people:' + currentOrg.id, () => adapter.listTeam!(currentOrg.id, teamPersonKinds))\n .then(setTeam)\n .catch(() => setTeam([]))\n }\n }, [personMode, adapter, currentOrg?.id, teamPersonKinds.join(',')])\n\n // Load invites on mount (deduped to avoid strict mode double-fetch)\n React.useEffect(() => {\n if (adapter && currentOrg) {\n dedup('team:invites:' + currentOrg.id, () => adapter.listInvites(currentOrg.id)).then(setInvites).catch(() => {})\n }\n }, [adapter, currentOrg?.id])\n\n const handleChangeProfile = async (memberId: string, profileId: string) => {\n if (!adapter || !currentOrg) return\n try {\n await adapter.updateMemberProfile(currentOrg.id, memberId, profileId)\n await reloadTeam()\n } catch {\n // ignore\n }\n }\n\n const handleRemoveMember = async (memberId: string) => {\n if (!adapter || !currentOrg) return\n try {\n await adapter.removeMember(currentOrg.id, memberId)\n await reloadTeam()\n } catch {\n // ignore\n }\n }\n\n // Normalized rows for the table — person-first or legacy members.\n const rows: TeamRow[] = personMode\n ? (team ?? []).map((p) => ({\n // Login-only rows carry no personId — key off the membership instead.\n key: p.personId ?? p.membership?.memberId ?? p.name,\n name: p.name,\n email: p.email ?? '',\n avatarUrl: p.avatarUrl,\n subtitle: p.kind ? capitalize(p.kind) : undefined,\n roleId: p.membership?.profileId,\n roleName: p.membership?.profileName,\n memberId: p.membership?.memberId,\n hasAccess: !!p.membership,\n joinedAt: p.membership?.joinedAt,\n isCurrentUser: p.membership?.userId === user?.id,\n }))\n : members.map((m) => ({\n key: m.id,\n name: m.user.fullName,\n email: m.user.email,\n avatarUrl: m.user.avatarUrl,\n roleId: m.profileId,\n roleName: m.profileName,\n memberId: m.id,\n hasAccess: true,\n joinedAt: m.joinedAt,\n isCurrentUser: m.userId === user?.id,\n }))\n const rowsLoading = personMode ? team === null : members.length === 0\n\n const handleRevokeInvite = async (inviteId: string) => {\n if (!adapter || !currentOrg) return\n try {\n await adapter.revokeInvite(currentOrg.id, inviteId)\n const updated = await adapter.listInvites(currentOrg.id)\n setInvites(updated)\n toast.success(t('organization.team.inviteRevoked'))\n } catch (err: any) {\n toast.error(t('organization.team.inviteActionFailed'), { description: err?.message })\n }\n }\n\n const handleResendInvite = async (inviteId: string) => {\n if (!adapter || !currentOrg) return\n try {\n await adapter.resendInvite(currentOrg.id, inviteId)\n const updated = await adapter.listInvites(currentOrg.id)\n setInvites(updated)\n toast.success(t('organization.team.inviteResent'))\n } catch (err: any) {\n toast.error(t('organization.team.inviteActionFailed'), { description: err?.message })\n }\n }\n\n const { t } = useTranslation()\n const canManageTeam = hasSystemPermission('manage_team')\n const pendingInvites = invites.filter((i) => i.status === 'pending')\n\n return (\n <div className=\"space-y-6\">\n {/* Members */}\n <div>\n <div className=\"flex items-center justify-between mb-4\">\n <div>\n <h3 className=\"text-lg font-semibold\">{t('organization.team.title')}</h3>\n <p className=\"text-sm text-muted-foreground\">{t('organization.team.memberCount', { count: String(rows.length), plural: rows.length !== 1 ? 's' : '' })}</p>\n </div>\n {canManageTeam && (\n <Button size=\"sm\" onClick={() => { void handleOpenInvite() }}>\n <UserPlus className=\"h-4 w-4 mr-1\" />\n {t('organization.team.invite')}\n </Button>\n )}\n </div>\n\n <Card className=\"overflow-hidden\">\n <div className=\"overflow-x-auto\">\n <table className=\"w-full\">\n <thead>\n <tr className=\"border-b bg-muted/50\">\n <th className=\"text-left p-3 text-sm font-medium text-muted-foreground\">{t('organization.team.member')}</th>\n <th className=\"text-left p-3 text-sm font-medium text-muted-foreground\">{t('organization.team.role')}</th>\n <th className=\"text-left p-3 text-sm font-medium text-muted-foreground\">{t('organization.team.joined')}</th>\n {canManageTeam && (\n <th className=\"text-right p-3 text-sm font-medium text-muted-foreground w-12\" />\n )}\n </tr>\n </thead>\n <tbody className=\"divide-y\">\n {rowsLoading ? (\n // Rows load async; show skeleton rows meanwhile.\n Array.from({ length: 3 }).map((_, i) => (\n <tr key={`sk-${i}`}>\n <td className=\"p-3\">\n <div className=\"flex items-center gap-3\">\n <Skeleton className=\"h-8 w-8 shrink-0 rounded-full\" />\n <div className=\"space-y-1.5\">\n <Skeleton className=\"h-3.5 w-32\" />\n <Skeleton className=\"h-3 w-40\" />\n </div>\n </div>\n </td>\n <td className=\"p-3\"><Skeleton className=\"h-6 w-24 rounded-full\" /></td>\n <td className=\"p-3\"><Skeleton className=\"h-3 w-20\" /></td>\n {canManageTeam && <td className=\"p-3\" />}\n </tr>\n ))\n ) : rows.length === 0 ? (\n <tr>\n <td colSpan={canManageTeam ? 4 : 3} className=\"p-6 text-center text-sm text-muted-foreground\">\n {t('organization.team.empty')}\n </td>\n </tr>\n ) : rows.map((row) => {\n const initials = (row.name || '?')\n .split(' ')\n .map((n) => n[0])\n .join('')\n .toUpperCase()\n .slice(0, 2)\n\n return (\n <tr key={row.key} className=\"hover:bg-muted/30\">\n <td className=\"p-3\">\n <div className=\"flex items-center gap-3\">\n <Avatar className=\"h-8 w-8\">\n {row.avatarUrl && <AvatarImage src={row.avatarUrl} />}\n <AvatarFallback className=\"text-xs\">{initials}</AvatarFallback>\n </Avatar>\n <div>\n <p className=\"text-sm font-medium\">\n {row.name}\n {row.isCurrentUser && <span className=\"text-muted-foreground ml-1\">{t('organization.team.you')}</span>}\n {row.subtitle && <Badge variant=\"outline\" className=\"ml-2 text-[10px] font-normal\">{row.subtitle}</Badge>}\n </p>\n {row.email && <p className=\"text-xs text-muted-foreground\">{row.email}</p>}\n </div>\n </div>\n </td>\n <td className=\"p-3\">\n {!row.hasAccess ? (\n <div className=\"flex items-center gap-2\">\n <Badge variant=\"outline\" className=\"text-xs text-muted-foreground\">{t('organization.team.noAccess')}</Badge>\n {canManageTeam && (\n <Button variant=\"ghost\" size=\"sm\" className=\"h-7 text-xs\" onClick={() => { void handleOpenInvite() }}>\n <UserPlus className=\"h-3 w-3 mr-1\" />\n {t('organization.team.invite')}\n </Button>\n )}\n </div>\n ) : canManageTeam && !row.isCurrentUser && row.memberId ? (\n <Select\n value={row.roleId}\n onValueChange={(val) => handleChangeProfile(row.memberId!, val)}\n >\n <SelectTrigger className=\"h-8 w-36 text-xs\">\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n {profiles.map((p) => (\n <SelectItem key={p.id} value={p.id}>{p.name}</SelectItem>\n ))}\n </SelectContent>\n </Select>\n ) : (\n <Badge variant=\"secondary\" className=\"text-xs\">\n {profiles.find((p) => p.id === row.roleId)?.name ?? row.roleName}\n </Badge>\n )}\n </td>\n <td className=\"p-3 text-sm text-muted-foreground\">\n {row.joinedAt ? new Date(row.joinedAt).toLocaleDateString() : '—'}\n </td>\n {canManageTeam && (\n <td className=\"p-3 text-right\">\n {row.hasAccess && !row.isCurrentUser && row.memberId && (\n <Dropdown>\n <DropdownTrigger asChild>\n <Button variant=\"ghost\" size=\"sm\">\n <MoreHorizontal className=\"h-4 w-4\" />\n </Button>\n </DropdownTrigger>\n <DropdownContent align=\"end\">\n <DropdownItem\n className=\"text-destructive\"\n onClick={() => handleRemoveMember(row.memberId!)}\n >\n {t('organization.team.removeMember')}\n </DropdownItem>\n </DropdownContent>\n </Dropdown>\n )}\n </td>\n )}\n </tr>\n )\n })}\n </tbody>\n </table>\n </div>\n </Card>\n </div>\n\n {/* Pending Invites */}\n {pendingInvites.length > 0 && (\n <div>\n <h3 className=\"text-lg font-semibold mb-3\">{t('organization.team.pendingInvites')}</h3>\n <div className=\"space-y-2\">\n {pendingInvites.map((invite) => (\n <Card key={invite.id} className=\"p-3\">\n <div className=\"flex items-center gap-3\">\n <div className=\"flex h-8 w-8 items-center justify-center rounded-full bg-muted\">\n <Mail className=\"h-4 w-4 text-muted-foreground\" />\n </div>\n <div className=\"flex-1 min-w-0\">\n <p className=\"text-sm font-medium\">{invite.email}</p>\n <div className=\"flex items-center gap-2 text-xs text-muted-foreground\">\n <Badge variant=\"secondary\" className=\"text-xs\">{invite.profileName}</Badge>\n <span className=\"flex items-center gap-1\">\n <Clock className=\"h-3 w-3\" />\n Sent {new Date(invite.createdAt).toLocaleDateString()}\n </span>\n </div>\n </div>\n {canManageTeam && (\n <div className=\"flex items-center gap-1\">\n <Button variant=\"ghost\" size=\"sm\" className=\"text-xs\" onClick={() => handleResendInvite(invite.id)}>\n {t('organization.team.resend')}\n </Button>\n <Button variant=\"ghost\" size=\"sm\" className=\"text-xs text-destructive\" onClick={() => handleRevokeInvite(invite.id)}>\n {t('organization.team.revoke')}\n </Button>\n </div>\n )}\n </div>\n </Card>\n ))}\n </div>\n </div>\n )}\n\n <InviteMemberDialog\n open={inviteOpen}\n onOpenChange={(open) => {\n setInviteOpen(open)\n // On close (after a successful invite the dialog closes itself),\n // refresh the seat count so the guard/banner reflect the new member.\n if (!open) invalidateLimit('users')\n }}\n />\n </div>\n )\n}\n","import * as React from 'react'\nimport { Card } from '@fayz-ai/ui'\nimport { Input } from '@fayz-ai/ui'\nimport { Badge } from '@fayz-ai/ui'\nimport { Checkbox, type CheckboxColor } from '@fayz-ai/ui'\nimport { useSaveBar, useBackHandler } from '@fayz-ai/ui'\nimport { ArrowLeft, ChevronDown, ChevronRight, Search } from 'lucide-react'\nimport { useTranslation } from '../../hooks/useTranslation'\nimport type { FeatureDeclaration, PermissionAction, PermissionProfile, SystemPermission } from '../../types/permissions'\n\nconst ACTIONS: PermissionAction[] = ['read', 'create', 'edit', 'delete']\nconst ACTION_COLORS: Partial<Record<PermissionAction, CheckboxColor>> = {\n read: 'primary',\n create: 'success',\n edit: 'warning',\n delete: 'destructive',\n}\nconst SYSTEM_PERMISSIONS: { id: SystemPermission; key: string }[] = [\n { id: 'manage_team', key: 'organization.permissions.manageTeam' },\n { id: 'manage_billing', key: 'organization.permissions.manageBilling' },\n { id: 'manage_settings', key: 'organization.permissions.manageSettings' },\n { id: 'manage_permissions', key: 'organization.permissions.managePermissions' },\n]\n\ninterface PermissionMatrixEditorProps {\n features: FeatureDeclaration[]\n profile?: PermissionProfile\n onSave: (data: { name: string; description?: string; systemPermissions: SystemPermission[]; grants: Record<string, PermissionAction[]> }) => void\n onCancel: () => void\n saving?: boolean\n /** True when creating/duplicating (not editing an existing custom role). Drives\n * the SaveBar dirty state + the breadcrumb crumb. */\n isNew?: boolean\n /** Label of the parent list, shown in the back breadcrumb (e.g. \"Permissões\"). */\n parentLabel?: string\n}\n\nexport function PermissionMatrixEditor({ features, profile, onSave, onCancel, saving, isNew, parentLabel }: PermissionMatrixEditorProps) {\n const { t } = useTranslation()\n const [name, setName] = React.useState(profile?.name ?? '')\n const [description, setDescription] = React.useState(profile?.description ?? '')\n const [systemPerms, setSystemPerms] = React.useState<SystemPermission[]>(profile?.systemPermissions ?? [])\n const [grants, setGrants] = React.useState<Record<string, PermissionAction[]>>(profile?.grants ?? {})\n const [collapsed, setCollapsed] = React.useState<Set<string>>(new Set())\n const [search, setSearch] = React.useState('')\n\n // Snapshot the initial form so an EDIT only shows the SaveBar once something\n // actually changes. A NEW role (create/duplicate) is unsaved by definition, so\n // it's \"dirty\" as soon as it has a name.\n const initial = React.useRef({\n name: profile?.name ?? '',\n description: profile?.description ?? '',\n systemPerms: JSON.stringify(profile?.systemPermissions ?? []),\n grants: JSON.stringify(profile?.grants ?? {}),\n })\n const dirty = isNew\n ? name.trim() !== ''\n : name !== initial.current.name ||\n description !== initial.current.description ||\n JSON.stringify(systemPerms) !== initial.current.systemPerms ||\n JSON.stringify(grants) !== initial.current.grants\n\n const toggleSystemPerm = (perm: SystemPermission) => {\n setSystemPerms((prev) =>\n prev.includes(perm) ? prev.filter((p) => p !== perm) : [...prev, perm]\n )\n }\n\n const toggleGrant = (featureId: string, action: PermissionAction) => {\n setGrants((prev) => {\n const current = prev[featureId] ?? []\n const next = current.includes(action)\n ? current.filter((a) => a !== action)\n : [...current, action]\n return { ...prev, [featureId]: next }\n })\n }\n\n const toggleGroup = (group: string) => {\n setCollapsed((prev) => {\n const next = new Set(prev)\n next.has(group) ? next.delete(group) : next.add(group)\n return next\n })\n }\n\n const handleSave = () => {\n if (!name.trim()) return\n onSave({ name: name.trim(), description: description.trim() || undefined, systemPermissions: systemPerms, grants })\n }\n\n // Surface Save/Discard through the app-wide floating SaveBar (same pattern as\n // CRUD forms), and wire Escape → back-to-list.\n useSaveBar({\n dirty,\n saving,\n onSave: handleSave,\n onDiscard: onCancel,\n saveLabel: isNew ? t('organization.permissions.createProfile') : t('organization.permissions.updateProfile'),\n })\n useBackHandler(onCancel)\n\n // Group features, filtering by search\n const groups = React.useMemo(() => {\n const filtered = search\n ? features.filter((f) => f.label.toLowerCase().includes(search.toLowerCase()))\n : features\n const map = new Map<string, FeatureDeclaration[]>()\n for (const f of filtered) {\n const group = f.group ?? 'General'\n if (!map.has(group)) map.set(group, [])\n map.get(group)!.push(f)\n }\n return map\n }, [features, search])\n\n return (\n <div className=\"space-y-6\">\n {/* Back-to-list breadcrumb, matching the CRUD subpage pattern. */}\n <nav className=\"flex items-center gap-1.5 text-sm text-muted-foreground\">\n <button type=\"button\" onClick={onCancel} className=\"inline-flex items-center gap-1 transition-colors hover:text-foreground\">\n <ArrowLeft className=\"h-3.5 w-3.5\" />\n {parentLabel ?? t('organization.permissions.title')}\n </button>\n <span>/</span>\n <span className=\"max-w-[240px] truncate font-medium text-foreground\">\n {name.trim() || t('organization.permissions.createCustom')}\n </span>\n </nav>\n\n <div className=\"grid gap-4 sm:grid-cols-2\">\n <div>\n <label className=\"text-sm font-medium\">{t('organization.permissions.profileName')}</label>\n <Input value={name} onChange={(e) => setName(e.target.value)} placeholder={t('organization.permissions.profileNamePlaceholder')} className=\"mt-1\" />\n </div>\n <div>\n <label className=\"text-sm font-medium\">{t('organization.permissions.description')}</label>\n <Input value={description} onChange={(e) => setDescription(e.target.value)} placeholder={t('organization.permissions.descriptionPlaceholder')} className=\"mt-1\" />\n </div>\n </div>\n\n {/* Unified Permission Matrix */}\n <Card className=\"overflow-hidden\">\n {/* Search filter */}\n {features.length > 8 && (\n <div className=\"border-b border-border/40 px-3 py-2\">\n <div className=\"relative\">\n <Search className=\"absolute left-2.5 top-1/2 h-3.5 w-3.5 -translate-y-1/2 text-muted-foreground\" />\n <Input\n value={search}\n onChange={(e) => setSearch(e.target.value)}\n placeholder={t('organization.permissions.searchFeatures')}\n className=\"h-8 pl-8 text-xs\"\n />\n </div>\n </div>\n )}\n\n <div className=\"overflow-x-auto\">\n <table className=\"w-full\">\n <thead>\n <tr className=\"border-b bg-muted/50\">\n <th className=\"text-left p-3 text-sm font-medium text-muted-foreground\">{t('common.feature')}</th>\n {ACTIONS.map((action) => (\n <th key={action} className=\"p-3 text-center text-sm font-medium text-muted-foreground capitalize w-20\">\n {t(`organization.permissions.action.${action}`) === `organization.permissions.action.${action}` ? action : t(`organization.permissions.action.${action}`)}\n </th>\n ))}\n </tr>\n </thead>\n <tbody className=\"divide-y\">\n {/* System permissions group */}\n <tr>\n <td colSpan={5} className=\"p-2 px-3\">\n <button\n onClick={() => toggleGroup('__system')}\n className=\"flex items-center gap-1.5 text-xs\"\n >\n {collapsed.has('__system')\n ? <ChevronRight className=\"h-3 w-3 text-muted-foreground\" />\n : <ChevronDown className=\"h-3 w-3 text-muted-foreground\" />\n }\n <Badge variant=\"secondary\" className=\"text-xs\">{t('organization.permissions.systemPermissions')}</Badge>\n </button>\n </td>\n </tr>\n {!collapsed.has('__system') && SYSTEM_PERMISSIONS.map((sp) => (\n <tr key={sp.id} className=\"hover:bg-muted/30\">\n <td className=\"p-3 text-sm font-medium\">{t(sp.key)}</td>\n <td colSpan={4} className=\"p-3\">\n <div className=\"flex justify-center\">\n <Checkbox\n checked={systemPerms.includes(sp.id)}\n onChange={() => toggleSystemPerm(sp.id)}\n />\n </div>\n </td>\n </tr>\n ))}\n\n {/* Feature permission groups */}\n {Array.from(groups.entries()).map(([groupName, groupFeatures]) => (\n <React.Fragment key={groupName}>\n <tr>\n <td colSpan={5} className=\"p-2 px-3\">\n <button\n onClick={() => toggleGroup(groupName)}\n className=\"flex items-center gap-1.5 text-xs\"\n >\n {collapsed.has(groupName)\n ? <ChevronRight className=\"h-3 w-3 text-muted-foreground\" />\n : <ChevronDown className=\"h-3 w-3 text-muted-foreground\" />\n }\n <Badge variant=\"secondary\" className=\"text-xs\">{groupName}</Badge>\n <span className=\"text-[10px] text-muted-foreground\">{groupFeatures.length}</span>\n </button>\n </td>\n </tr>\n {!collapsed.has(groupName) && groupFeatures.map((feature) => (\n <tr key={feature.id} className=\"hover:bg-muted/30\">\n <td className=\"p-3 text-sm font-medium\">{feature.label}</td>\n {ACTIONS.map((action) => (\n <td key={action} className=\"p-3 text-center\">\n <div className=\"flex justify-center\">\n <Checkbox\n checked={grants[feature.id]?.includes(action) ?? false}\n onChange={() => toggleGrant(feature.id, action)}\n color={ACTION_COLORS[action]}\n />\n </div>\n </td>\n ))}\n </tr>\n ))}\n </React.Fragment>\n ))}\n </tbody>\n </table>\n </div>\n </Card>\n {/* Save / Discard are provided by the app-wide floating SaveBar (useSaveBar). */}\n </div>\n )\n}\n","import * as React from 'react'\nimport { Shield, Pencil, Trash2, Plus, Eye, Copy } from 'lucide-react'\nimport { Card, CardHeader, CardTitle, CardDescription, CardContent } from '@fayz-ai/ui'\nimport { Button } from '@fayz-ai/ui'\nimport { Badge } from '@fayz-ai/ui'\nimport { Skeleton } from '@fayz-ai/ui'\nimport { PermissionMatrixEditor } from './PermissionMatrixEditor'\nimport { usePermissionsStore } from '../../stores/permissions.store'\nimport { useOrganizationStore } from '../../stores/organization.store'\n// Use the NATIVE org adapter (the one the app actually provides). The shell\n// lib/org-context is a separate, un-provided context that returns null here.\nimport { useOrgAdapterOptional } from '../../org'\nimport { useTranslation } from '../../hooks/useTranslation'\nimport type { PermissionProfile, PermissionAction, SystemPermission } from '../../types/permissions'\n\nexport function PermissionProfilesTab() {\n const adapter = useOrgAdapterOptional()\n const currentOrg = useOrganizationStore((s) => s.currentOrg)\n const profiles = usePermissionsStore((s) => s.profiles)\n const features = usePermissionsStore((s) => s.features)\n const setProfiles = usePermissionsStore((s) => s.setProfiles)\n const members = useOrganizationStore((s) => s.members)\n const realProfile = usePermissionsStore((s) => s.realProfile)\n const startImpersonation = usePermissionsStore((s) => s.startImpersonation)\n\n const canPreview = (realProfile?.systemPermissions ?? []).includes('manage_permissions') ?? false\n\n const { t } = useTranslation()\n const [editingProfile, setEditingProfile] = React.useState<PermissionProfile | null>(null)\n const [creating, setCreating] = React.useState(false)\n // When duplicating, we open the CREATE flow pre-filled from a source role (its\n // grants/system perms), with a fresh name — system roles are static, so users\n // customize by copying rather than editing them in place.\n const [duplicateSource, setDuplicateSource] = React.useState<PermissionProfile | null>(null)\n const [saving, setSaving] = React.useState(false)\n // A swallowed failure here read as \"nothing happened when I clicked save\".\n // The write can genuinely fail (a pool without the tenant_roles table, an RLS\n // denial) and the person deserves to know which.\n const [error, setError] = React.useState<string | null>(null)\n\n const handleDuplicate = (profile: PermissionProfile) => {\n setEditingProfile(null)\n setCreating(false)\n setDuplicateSource({\n ...profile,\n name: t('organization.permissions.copyName', { name: profile.name }) || `${profile.name} (copy)`,\n isSystem: false,\n })\n }\n\n const memberCountByProfile = React.useMemo(() => {\n const counts: Record<string, number> = {}\n for (const m of members) {\n counts[m.profileId] = (counts[m.profileId] ?? 0) + 1\n }\n return counts\n }, [members])\n\n const handleSave = async (data: { name: string; description?: string; systemPermissions: SystemPermission[]; grants: Record<string, PermissionAction[]> }) => {\n if (!adapter || !currentOrg) return\n setSaving(true)\n setError(null)\n try {\n if (editingProfile) {\n await adapter.updateProfile(currentOrg.id, editingProfile.id, data)\n } else {\n await adapter.createProfile(currentOrg.id, data)\n }\n const updated = await adapter.listProfiles(currentOrg.id)\n setProfiles(updated)\n setEditingProfile(null)\n setCreating(false)\n setDuplicateSource(null)\n } catch (e) {\n setError(e instanceof Error ? e.message : String(e))\n } finally {\n setSaving(false)\n }\n }\n\n const handleDelete = async (profile: PermissionProfile) => {\n if (!adapter || !currentOrg || profile.isSystem) return\n try {\n await adapter.deleteProfile(currentOrg.id, profile.id)\n const updated = await adapter.listProfiles(currentOrg.id)\n setProfiles(updated)\n } catch (e) {\n setError(e instanceof Error ? e.message : String(e))\n }\n }\n\n if (creating || editingProfile || duplicateSource) {\n return (\n <PermissionMatrixEditor\n features={features}\n profile={editingProfile ?? duplicateSource ?? undefined}\n isNew={!editingProfile}\n parentLabel={t('organization.permissions.title')}\n onSave={handleSave}\n onCancel={() => { setEditingProfile(null); setCreating(false); setDuplicateSource(null) }}\n saving={saving}\n />\n )\n }\n\n return (\n <div className=\"space-y-4\">\n <div className=\"flex items-center justify-between\">\n <div>\n <h3 className=\"text-lg font-semibold\">{t('organization.permissions.title')}</h3>\n <p className=\"text-sm text-muted-foreground\">{t('organization.permissions.subtitle')}</p>\n </div>\n <Button onClick={() => setCreating(true)} size=\"sm\">\n <Plus className=\"h-4 w-4 mr-1\" />\n {t('organization.permissions.createProfile')}\n </Button>\n </div>\n\n {error && (\n <p className=\"rounded-lg border border-destructive/40 bg-destructive/5 px-3 py-2 text-sm text-destructive\">\n {error}\n </p>\n )}\n\n <div className=\"grid gap-3\">\n {profiles.length === 0 ? (\n // Roles load via central org hydration; show skeletons until they arrive.\n Array.from({ length: 4 }).map((_, i) => (\n <Card key={`sk-${i}`}>\n <CardContent className=\"flex items-center gap-4 p-4\">\n <Skeleton className=\"h-10 w-10 shrink-0 rounded-lg\" />\n <div className=\"flex-1 space-y-2\">\n <Skeleton className=\"h-4 w-40\" />\n <Skeleton className=\"h-3 w-64\" />\n </div>\n </CardContent>\n </Card>\n ))\n ) : profiles.map((profile) => (\n <Card key={profile.id}>\n <CardContent className=\"flex items-center gap-4 p-4\">\n <div className=\"flex h-10 w-10 shrink-0 items-center justify-center rounded-lg bg-primary/10\">\n <Shield className=\"h-5 w-5 text-primary\" />\n </div>\n <div className=\"flex-1 min-w-0\">\n <div className=\"flex items-center gap-2\">\n <CardTitle className=\"text-sm\">{profile.name}</CardTitle>\n {profile.isSystem && <Badge variant=\"secondary\" className=\"text-xs\">{t('organization.permissions.system')}</Badge>}\n </div>\n {profile.description && (\n <CardDescription className=\"text-xs mt-0.5\">{profile.description}</CardDescription>\n )}\n <p className=\"text-xs text-muted-foreground mt-1\">\n {t('organization.permissions.memberCount', { count: String(memberCountByProfile[profile.id] ?? 0), plural: (memberCountByProfile[profile.id] ?? 0) !== 1 ? 's' : '' })}\n </p>\n </div>\n <div className=\"flex items-center gap-1\">\n {canPreview && profile.id !== realProfile?.id && (\n <Button\n variant=\"ghost\"\n size=\"sm\"\n title={t('organization.permissions.previewAs')}\n onClick={() => startImpersonation(profile)}\n >\n <Eye className=\"h-3.5 w-3.5\" />\n </Button>\n )}\n {/* Duplicate — always available; the primary (and only) way to\n customize a static system role. */}\n <Button\n variant=\"ghost\"\n size=\"sm\"\n title={t('organization.permissions.duplicate')}\n onClick={() => handleDuplicate(profile)}\n >\n <Copy className=\"h-3.5 w-3.5\" />\n </Button>\n {/* Edit + delete are for custom roles only — system roles are static. */}\n {!profile.isSystem && (\n <>\n <Button variant=\"ghost\" size=\"sm\" onClick={() => setEditingProfile(profile)}>\n <Pencil className=\"h-3.5 w-3.5\" />\n </Button>\n <Button\n variant=\"ghost\"\n size=\"sm\"\n className=\"text-destructive hover:text-destructive\"\n onClick={() => handleDelete(profile)}\n >\n <Trash2 className=\"h-3.5 w-3.5\" />\n </Button>\n </>\n )}\n </div>\n </CardContent>\n </Card>\n ))}\n </div>\n </div>\n )\n}\n","import React from 'react'\n\ninterface ActiveToggleProps {\n active: boolean\n onChange: (active: boolean) => void\n}\n\nexport function ActiveToggle({ active, onChange }: ActiveToggleProps) {\n return (\n <button type=\"button\" onClick={() => onChange(!active)} className=\"flex items-center gap-1.5\">\n <div className={`relative inline-flex h-5 w-9 items-center rounded-full transition-colors ${\n active ? 'bg-primary' : 'bg-muted-foreground/30'\n }`}>\n <span className={`pointer-events-none block h-4 w-4 rounded-full bg-white shadow-sm transition-transform ${\n active ? 'translate-x-[18px]' : 'translate-x-[2px]'\n }`} />\n </div>\n <span className={`text-xs font-medium ${active ? 'text-foreground' : 'text-muted-foreground'}`}>\n {active ? 'Active' : 'Inactive'}\n </span>\n </button>\n )\n}\n","import React from 'react'\nimport { User } from 'lucide-react'\nimport { Card, CardContent } from '@fayz-ai/ui'\nimport { ActiveToggle } from './ActiveToggle'\nimport type { FieldDef, FieldGroup } from '@fayz-ai/core'\n\ninterface PersonFormLayoutProps {\n fields: FieldDef[]\n fieldGroups: FieldGroup[]\n values: Record<string, any>\n onChange: (key: string, val: any) => void\n renderField: (field: FieldDef, value: any, onChange: (val: any) => void) => React.ReactNode\n compact?: boolean\n}\n\nconst IDENTITY_FIELDS = new Set(['name', 'dateOfBirth', 'documentNumber'])\nconst CONTACT_FIELDS = new Set(['email', 'phone'])\nconst ADDRESS_FIELDS = new Set(['address', 'city', 'state', 'country', 'postalCode'])\nconst SKIP_FIELDS = new Set(['isActive', 'status', 'tags', 'avatarUrl', 'notes'])\nconst ALL_PERSON_FIELDS = new Set([...IDENTITY_FIELDS, ...CONTACT_FIELDS, ...ADDRESS_FIELDS, ...SKIP_FIELDS])\n\nfunction FieldItem({ field, value, onChange, renderField, colSpan, compact }: {\n field: FieldDef; value: any; onChange: (val: any) => void\n renderField: PersonFormLayoutProps['renderField']; colSpan?: boolean; compact?: boolean\n}) {\n return (\n <div className={`${compact ? 'space-y-1' : 'space-y-1.5'} ${colSpan ? 'md:col-span-2' : ''}`}>\n <label className={`font-medium ${compact ? 'text-xs' : 'text-sm'}`}>\n {field.label}{field.required && <span className=\"text-destructive ml-0.5\">*</span>}\n </label>\n {renderField(field, value, onChange)}\n </div>\n )\n}\n\nexport function PersonFormLayout({ fields, fieldGroups, values, onChange, renderField, compact }: PersonFormLayoutProps) {\n const nameField = fields.find((f) => f.key === 'name')\n const docField = fields.find((f) => f.key === 'documentNumber')\n const dobField = fields.find((f) => f.key === 'dateOfBirth')\n const contactFields = fields.filter((f) => CONTACT_FIELDS.has(f.key))\n const addressFields = fields.filter((f) => ADDRESS_FIELDS.has(f.key))\n const notesField = fields.find((f) => f.key === 'notes')\n const hasActive = fields.some((f) => f.key === 'isActive')\n\n // Project-specific fields\n const projectFields = fields.filter((f) => !ALL_PERSON_FIELDS.has(f.key))\n\n const groupFieldMap = new Map<string, FieldDef[]>()\n const ungroupedProject: FieldDef[] = []\n for (const field of projectFields) {\n if (field.group) {\n const existing = groupFieldMap.get(field.group) ?? []\n existing.push(field)\n groupFieldMap.set(field.group, existing)\n } else {\n ungroupedProject.push(field)\n }\n }\n\n const gap = compact ? 'gap-2.5' : 'gap-3'\n const cardPad = compact ? 'pt-3' : 'pt-4'\n const sectionLabel = compact ? 'text-xs font-semibold text-foreground' : 'text-sm font-semibold text-foreground'\n\n return (\n <div className={compact ? 'space-y-2.5' : 'space-y-5'}>\n {/* Identity card — avatar + name + dob + doc + active toggle */}\n <Card>\n <CardContent className={cardPad}>\n <div className={`flex ${compact ? 'gap-3' : 'gap-5'}`}>\n <div className={`flex shrink-0 items-center justify-center rounded-2xl bg-primary/10 text-primary ${compact ? 'h-10 w-10' : 'h-16 w-16'}`}>\n <User className={compact ? 'h-4 w-4' : 'h-6 w-6'} />\n </div>\n <div className={`flex-1 ${compact ? 'space-y-2' : 'space-y-4'}`}>\n {/* Row 1: Name + Document + Active toggle */}\n <div className={`flex items-start ${gap}`}>\n <div className={`flex-1 grid ${gap} sm:grid-cols-2`}>\n {nameField && (\n <div className={`${compact ? 'space-y-1' : 'space-y-1.5'} ${!docField ? 'sm:col-span-2' : ''}`}>\n <label className={`font-medium ${compact ? 'text-xs' : 'text-sm'}`}>{nameField.label}{nameField.required && <span className=\"text-destructive ml-0.5\">*</span>}</label>\n {renderField(nameField, values[nameField.key], (val) => onChange(nameField.key, val))}\n </div>\n )}\n {docField && (\n <div className={compact ? 'space-y-1' : 'space-y-1.5'}>\n <label className={`font-medium ${compact ? 'text-xs' : 'text-sm'}`}>{docField.label}{docField.required && <span className=\"text-destructive ml-0.5\">*</span>}</label>\n {renderField(docField, values[docField.key], (val) => onChange(docField.key, val))}\n </div>\n )}\n </div>\n {hasActive && (\n <div className={`shrink-0 ${compact ? 'mt-4' : 'mt-6'}`}>\n <ActiveToggle active={values.isActive ?? true} onChange={(v) => onChange('isActive', v)} />\n </div>\n )}\n </div>\n {/* Row 2: Date of birth */}\n {dobField && (\n <div className={`grid ${gap} sm:grid-cols-2`}>\n <FieldItem field={dobField} value={values[dobField.key]} onChange={(val) => onChange(dobField.key, val)} renderField={renderField} compact={compact} />\n </div>\n )}\n </div>\n </div>\n </CardContent>\n </Card>\n\n {/* Project-specific grouped fields */}\n {fieldGroups.map((group) => {\n const gFields = groupFieldMap.get(group.id)\n if (!gFields || gFields.length === 0) return null\n const cols = group.columns ?? 2\n return (\n <div key={group.id}>\n <h3 className={sectionLabel}>{group.label}</h3>\n {group.description && <p className={`text-muted-foreground ${compact ? 'text-[10px] mt-0.5 mb-1.5' : 'text-xs mt-0.5 mb-3'}`}>{group.description}</p>}\n <Card className=\"mt-1\">\n <CardContent className={cardPad}>\n <div className={`grid ${gap} ${cols >= 2 ? 'md:grid-cols-2' : ''} ${cols >= 3 ? 'lg:grid-cols-3' : ''}`}>\n {gFields.map((field) => (\n <FieldItem key={field.key} field={field} value={values[field.key]} onChange={(val) => onChange(field.key, val)} renderField={renderField} colSpan={field.span === 2} compact={compact} />\n ))}\n </div>\n </CardContent>\n </Card>\n </div>\n )\n })}\n\n {/* Ungrouped project fields */}\n {ungroupedProject.length > 0 && (\n <Card>\n <CardContent className={cardPad}>\n <div className={`grid ${gap} md:grid-cols-2`}>\n {ungroupedProject.map((field) => (\n <FieldItem key={field.key} field={field} value={values[field.key]} onChange={(val) => onChange(field.key, val)} renderField={renderField} colSpan={field.span === 2} compact={compact} />\n ))}\n </div>\n </CardContent>\n </Card>\n )}\n\n {/* Contact */}\n {contactFields.length > 0 && (\n <div>\n <h3 className={sectionLabel}>Contact</h3>\n <Card className=\"mt-1\">\n <CardContent className={cardPad}>\n <div className={`grid ${gap} md:grid-cols-2`}>\n {contactFields.map((field) => (\n <FieldItem key={field.key} field={field} value={values[field.key]} onChange={(val) => onChange(field.key, val)} renderField={renderField} compact={compact} />\n ))}\n </div>\n </CardContent>\n </Card>\n </div>\n )}\n\n {/* Address */}\n {addressFields.length > 0 && (\n <div>\n <h3 className={sectionLabel}>Address</h3>\n <Card className=\"mt-1\">\n <CardContent className={cardPad}>\n <div className={`grid ${gap} md:grid-cols-2`}>\n {addressFields.map((field) => (\n <FieldItem key={field.key} field={field} value={values[field.key]} onChange={(val) => onChange(field.key, val)} renderField={renderField} colSpan={field.key === 'address'} compact={compact} />\n ))}\n </div>\n </CardContent>\n </Card>\n </div>\n )}\n\n {/* Notes */}\n {notesField && (\n <Card>\n <CardContent className={cardPad}>\n <FieldItem field={notesField} value={values[notesField.key]} onChange={(val) => onChange(notesField.key, val)} renderField={renderField} compact={compact} />\n </CardContent>\n </Card>\n )}\n </div>\n )\n}\n","import React from 'react'\nimport { Package } from 'lucide-react'\nimport { Card, CardContent } from '@fayz-ai/ui'\nimport { ActiveToggle } from './ActiveToggle'\nimport type { FieldDef, FieldGroup } from '@fayz-ai/core'\n\ninterface ProductFormLayoutProps {\n fields: FieldDef[]\n fieldGroups: FieldGroup[]\n values: Record<string, any>\n onChange: (key: string, val: any) => void\n renderField: (field: FieldDef, value: any, onChange: (val: any) => void) => React.ReactNode\n}\n\nconst PRICING_FIELDS = new Set(['price', 'cost', 'currency', 'unit'])\nconst STOCK_FIELDS = new Set(['stock', 'minStock'])\nconst SKIP_FIELDS = new Set(['status', 'isActive', 'tags', 'imageUrl', 'name', 'description', 'sku', 'category'])\n\nfunction FieldItem({ field, value, onChange, renderField, colSpan }: {\n field: FieldDef; value: any; onChange: (val: any) => void\n renderField: ProductFormLayoutProps['renderField']; colSpan?: boolean\n}) {\n return (\n <div className={`space-y-1.5 ${colSpan ? 'md:col-span-2' : ''}`}>\n <label className=\"text-sm font-medium\">\n {field.label}{field.required && <span className=\"text-destructive ml-0.5\">*</span>}\n </label>\n {renderField(field, value, onChange)}\n </div>\n )\n}\n\nexport function ProductFormLayout({ fields, fieldGroups, values, onChange, renderField }: ProductFormLayoutProps) {\n const nameField = fields.find((f) => f.key === 'name')\n const descField = fields.find((f) => f.key === 'description')\n const skuField = fields.find((f) => f.key === 'sku')\n const categoryField = fields.find((f) => f.key === 'category')\n const imageField = fields.find((f) => f.key === 'imageUrl')\n const pricingFields = fields.filter((f) => PRICING_FIELDS.has(f.key))\n const stockFields = fields.filter((f) => STOCK_FIELDS.has(f.key))\n const statusField = fields.find((f) => f.key === 'status')\n const hasActive = fields.some((f) => f.key === 'isActive')\n\n // Project-specific fields\n const projectFields = fields.filter((f) => !SKIP_FIELDS.has(f.key) && !PRICING_FIELDS.has(f.key) && !STOCK_FIELDS.has(f.key))\n\n const groupFieldMap = new Map<string, FieldDef[]>()\n const ungroupedProject: FieldDef[] = []\n for (const field of projectFields) {\n if (field.group) {\n const existing = groupFieldMap.get(field.group) ?? []\n existing.push(field)\n groupFieldMap.set(field.group, existing)\n } else {\n ungroupedProject.push(field)\n }\n }\n\n return (\n <div className=\"space-y-6\">\n {/* Identity card — image + name + category + active */}\n <Card>\n <CardContent className=\"pt-5\">\n <div className=\"flex gap-5\">\n {/* Product image or placeholder */}\n <div className=\"shrink-0 space-y-2\">\n {values.imageUrl ? (\n <img src={values.imageUrl} alt=\"\" className=\"h-24 w-24 rounded-2xl object-cover\" />\n ) : (\n <div className=\"flex h-24 w-24 items-center justify-center rounded-2xl bg-primary/10 text-primary\">\n <Package className=\"h-8 w-8\" />\n </div>\n )}\n {imageField && (\n <div className=\"w-24\">\n <input\n type=\"text\"\n value={values.imageUrl ?? ''}\n onChange={(e) => onChange('imageUrl', e.target.value)}\n placeholder=\"Image URL\"\n className=\"w-full rounded-md border border-input bg-background px-2 py-1 text-[10px] text-muted-foreground placeholder:text-muted-foreground/50 focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring\"\n />\n </div>\n )}\n </div>\n\n <div className=\"flex-1 space-y-4\">\n {/* Name + active toggle */}\n <div className=\"flex items-start gap-4\">\n {nameField && (\n <div className=\"flex-1 space-y-1.5\">\n <label className=\"text-sm font-medium\">{nameField.label}{nameField.required && <span className=\"text-destructive ml-0.5\">*</span>}</label>\n {renderField(nameField, values[nameField.key], (val) => onChange(nameField.key, val))}\n </div>\n )}\n {(hasActive || statusField) && (\n <div className=\"mt-6 shrink-0\">\n <ActiveToggle\n active={hasActive ? (values.isActive ?? true) : statusField ? values[statusField.key] === 'active' || values[statusField.key] === 'available' : true}\n onChange={(v) => {\n if (hasActive) onChange('isActive', v)\n if (statusField) {\n const opts = statusField.options?.map((o: any) => typeof o === 'string' ? o : o.value) ?? []\n const activeVal = opts.find((o: string) => o === 'active' || o === 'available') ?? 'active'\n const inactiveVal = opts.find((o: string) => o === 'inactive' || o === 'sold_out' || o === 'hidden') ?? 'inactive'\n onChange(statusField.key, v ? activeVal : inactiveVal)\n }\n }}\n />\n </div>\n )}\n </div>\n\n {/* Category + SKU */}\n <div className=\"grid gap-4 sm:grid-cols-2\">\n {categoryField && <FieldItem field={categoryField} value={values[categoryField.key]} onChange={(val) => onChange(categoryField.key, val)} renderField={renderField} />}\n {skuField && <FieldItem field={skuField} value={values[skuField.key]} onChange={(val) => onChange(skuField.key, val)} renderField={renderField} />}\n </div>\n\n {/* Description */}\n {descField && <FieldItem field={descField} value={values[descField.key]} onChange={(val) => onChange(descField.key, val)} renderField={renderField} colSpan />}\n </div>\n </div>\n </CardContent>\n </Card>\n\n {/* Pricing */}\n {pricingFields.length > 0 && (\n <div>\n <h3 className=\"text-sm font-semibold text-foreground\">Pricing</h3>\n <Card className=\"mt-1\">\n <CardContent className=\"pt-5\">\n <div className=\"grid gap-4 md:grid-cols-2\">\n {pricingFields.map((field) => (\n <FieldItem key={field.key} field={field} value={values[field.key]} onChange={(val) => onChange(field.key, val)} renderField={renderField} />\n ))}\n </div>\n </CardContent>\n </Card>\n </div>\n )}\n\n {/* Stock */}\n {stockFields.length > 0 && (\n <div>\n <h3 className=\"text-sm font-semibold text-foreground\">Inventory</h3>\n <Card className=\"mt-1\">\n <CardContent className=\"pt-5\">\n <div className=\"grid gap-4 md:grid-cols-2\">\n {stockFields.map((field) => (\n <FieldItem key={field.key} field={field} value={values[field.key]} onChange={(val) => onChange(field.key, val)} renderField={renderField} />\n ))}\n </div>\n </CardContent>\n </Card>\n </div>\n )}\n\n {/* Project-specific grouped fields */}\n {fieldGroups.map((group) => {\n const gFields = groupFieldMap.get(group.id)\n if (!gFields || gFields.length === 0) return null\n const cols = group.columns ?? 2\n return (\n <div key={group.id}>\n <h3 className=\"text-sm font-semibold text-foreground\">{group.label}</h3>\n <Card className=\"mt-1\">\n <CardContent className=\"pt-5\">\n <div className={`grid gap-4 ${cols >= 2 ? 'md:grid-cols-2' : ''}`}>\n {gFields.map((field) => (\n <FieldItem key={field.key} field={field} value={values[field.key]} onChange={(val) => onChange(field.key, val)} renderField={renderField} colSpan={field.span === 2} />\n ))}\n </div>\n </CardContent>\n </Card>\n </div>\n )\n })}\n\n {/* Ungrouped project fields */}\n {ungroupedProject.length > 0 && (\n <div>\n <h3 className=\"text-sm font-semibold text-foreground\">Details</h3>\n <Card className=\"mt-1\">\n <CardContent className=\"pt-5\">\n <div className=\"grid gap-4 md:grid-cols-2\">\n {ungroupedProject.map((field) => (\n <FieldItem key={field.key} field={field} value={values[field.key]} onChange={(val) => onChange(field.key, val)} renderField={renderField} colSpan={field.span === 2} />\n ))}\n </div>\n </CardContent>\n </Card>\n </div>\n )}\n </div>\n )\n}\n","import React from 'react'\nimport { Briefcase } from 'lucide-react'\nimport { Card, CardContent } from '@fayz-ai/ui'\nimport { ActiveToggle } from './ActiveToggle'\nimport type { FieldDef, FieldGroup } from '@fayz-ai/core'\n\ninterface ServiceFormLayoutProps {\n fields: FieldDef[]\n fieldGroups: FieldGroup[]\n values: Record<string, any>\n onChange: (key: string, val: any) => void\n renderField: (field: FieldDef, value: any, onChange: (val: any) => void) => React.ReactNode\n}\n\nconst IDENTITY_FIELDS = new Set(['name', 'description', 'imageUrl', 'category'])\nconst PRICING_FIELDS = new Set(['price', 'cost', 'currency', 'durationMinutes'])\nconst SKIP_FIELDS = new Set(['status', 'isActive', 'tags'])\n\nfunction FieldItem({ field, value, onChange, renderField, colSpan }: {\n field: FieldDef; value: any; onChange: (val: any) => void\n renderField: ServiceFormLayoutProps['renderField']; colSpan?: boolean\n}) {\n return (\n <div className={`space-y-1.5 ${colSpan ? 'md:col-span-2' : ''}`}>\n <label className=\"text-sm font-medium\">\n {field.label}{field.required && <span className=\"text-destructive ml-0.5\">*</span>}\n </label>\n {renderField(field, value, onChange)}\n </div>\n )\n}\n\nexport function ServiceFormLayout({ fields, fieldGroups, values, onChange, renderField }: ServiceFormLayoutProps) {\n const nameField = fields.find((f) => f.key === 'name')\n const descField = fields.find((f) => f.key === 'description')\n const otherIdentity = fields.filter((f) => IDENTITY_FIELDS.has(f.key) && f.key !== 'name' && f.key !== 'description')\n const pricingFields = fields.filter((f) => PRICING_FIELDS.has(f.key))\n const statusField = fields.find((f) => f.key === 'status')\n const hasActive = fields.some((f) => f.key === 'isActive')\n\n const allKnown = new Set([...IDENTITY_FIELDS, ...PRICING_FIELDS, ...SKIP_FIELDS])\n const projectFields = fields.filter((f) => !allKnown.has(f.key))\n\n const groupFieldMap = new Map<string, FieldDef[]>()\n const ungroupedProject: FieldDef[] = []\n for (const field of projectFields) {\n if (field.group) {\n const existing = groupFieldMap.get(field.group) ?? []\n existing.push(field)\n groupFieldMap.set(field.group, existing)\n } else {\n ungroupedProject.push(field)\n }\n }\n\n return (\n <div className=\"space-y-6\">\n {/* Identity */}\n <Card>\n <CardContent className=\"pt-5\">\n <div className=\"flex gap-5\">\n <div className=\"flex h-20 w-20 shrink-0 items-center justify-center rounded-2xl bg-primary/10 text-primary\">\n <Briefcase className=\"h-8 w-8\" />\n </div>\n <div className=\"flex-1 space-y-4\">\n {/* Name + active toggle */}\n <div className=\"flex items-start gap-4\">\n {nameField && (\n <div className=\"flex-1 space-y-1.5\">\n <label className=\"text-sm font-medium\">{nameField.label}{nameField.required && <span className=\"text-destructive ml-0.5\">*</span>}</label>\n {renderField(nameField, values[nameField.key], (val) => onChange(nameField.key, val))}\n </div>\n )}\n {(hasActive || statusField) && (\n <div className=\"mt-6 shrink-0\">\n <ActiveToggle\n active={hasActive ? (values.isActive ?? true) : statusField ? values[statusField.key] === 'active' : true}\n onChange={(v) => {\n if (hasActive) onChange('isActive', v)\n if (statusField) onChange(statusField.key, v ? 'active' : 'inactive')\n }}\n />\n </div>\n )}\n </div>\n {/* Description */}\n {descField && <FieldItem field={descField} value={values[descField.key]} onChange={(val) => onChange(descField.key, val)} renderField={renderField} colSpan />}\n {/* Other identity */}\n {otherIdentity.length > 0 && (\n <div className=\"grid gap-4 sm:grid-cols-2\">\n {otherIdentity.map((field) => (\n <FieldItem key={field.key} field={field} value={values[field.key]} onChange={(val) => onChange(field.key, val)} renderField={renderField} />\n ))}\n </div>\n )}\n </div>\n </div>\n </CardContent>\n </Card>\n\n {/* Pricing & Duration */}\n {pricingFields.length > 0 && (\n <div>\n <h3 className=\"text-sm font-semibold text-foreground\">Pricing & Duration</h3>\n <Card className=\"mt-1\">\n <CardContent className=\"pt-5\">\n <div className=\"grid gap-4 md:grid-cols-2\">\n {pricingFields.map((field) => (\n <FieldItem key={field.key} field={field} value={values[field.key]} onChange={(val) => onChange(field.key, val)} renderField={renderField} />\n ))}\n </div>\n </CardContent>\n </Card>\n </div>\n )}\n\n {/* Project-specific grouped fields */}\n {fieldGroups.map((group) => {\n const gFields = groupFieldMap.get(group.id)\n if (!gFields || gFields.length === 0) return null\n const cols = group.columns ?? 2\n return (\n <div key={group.id}>\n <h3 className=\"text-sm font-semibold text-foreground\">{group.label}</h3>\n <Card className=\"mt-1\">\n <CardContent className=\"pt-5\">\n <div className={`grid gap-4 ${cols >= 2 ? 'md:grid-cols-2' : ''}`}>\n {gFields.map((field) => (\n <FieldItem key={field.key} field={field} value={values[field.key]} onChange={(val) => onChange(field.key, val)} renderField={renderField} colSpan={field.span === 2} />\n ))}\n </div>\n </CardContent>\n </Card>\n </div>\n )\n })}\n\n {/* Ungrouped project fields */}\n {ungroupedProject.length > 0 && (\n <div>\n <h3 className=\"text-sm font-semibold text-foreground\">Details</h3>\n <Card className=\"mt-1\">\n <CardContent className=\"pt-5\">\n <div className=\"grid gap-4 md:grid-cols-2\">\n {ungroupedProject.map((field) => (\n <FieldItem key={field.key} field={field} value={values[field.key]} onChange={(val) => onChange(field.key, val)} renderField={renderField} colSpan={field.span === 2} />\n ))}\n </div>\n </CardContent>\n </Card>\n </div>\n )}\n </div>\n )\n}\n","import React from 'react'\nimport { MapPin } from 'lucide-react'\nimport { Card, CardContent } from '@fayz-ai/ui'\nimport { ActiveToggle } from './ActiveToggle'\nimport type { FieldDef, FieldGroup } from '@fayz-ai/core'\n\ninterface LocationFormLayoutProps {\n fields: FieldDef[]\n fieldGroups: FieldGroup[]\n values: Record<string, any>\n onChange: (key: string, val: any) => void\n renderField: (field: FieldDef, value: any, onChange: (val: any) => void) => React.ReactNode\n}\n\nconst IDENTITY_FIELDS = new Set(['name'])\nconst CONTACT_FIELDS = new Set(['phone', 'email'])\nconst ADDRESS_FIELDS = new Set(['address', 'city', 'state', 'country', 'postalCode'])\nconst SKIP_FIELDS = new Set(['isActive', 'status', 'tags', 'notes', 'isHeadquarters'])\nconst ALL_LOCATION_FIELDS = new Set([...IDENTITY_FIELDS, ...CONTACT_FIELDS, ...ADDRESS_FIELDS, ...SKIP_FIELDS])\n\nfunction FieldItem({ field, value, onChange, renderField, colSpan }: {\n field: FieldDef; value: any; onChange: (val: any) => void\n renderField: LocationFormLayoutProps['renderField']; colSpan?: boolean\n}) {\n return (\n <div className={`space-y-1.5 ${colSpan ? 'md:col-span-2' : ''}`}>\n <label className=\"text-sm font-medium\">\n {field.label}{field.required && <span className=\"text-destructive ml-0.5\">*</span>}\n </label>\n {renderField(field, value, onChange)}\n </div>\n )\n}\n\nexport function LocationFormLayout({ fields, fieldGroups, values, onChange, renderField }: LocationFormLayoutProps) {\n const nameField = fields.find((f) => f.key === 'name')\n const contactFields = fields.filter((f) => CONTACT_FIELDS.has(f.key))\n const addressFields = fields.filter((f) => ADDRESS_FIELDS.has(f.key))\n const notesField = fields.find((f) => f.key === 'notes')\n const hasActive = fields.some((f) => f.key === 'isActive')\n const hqField = fields.find((f) => f.key === 'isHeadquarters')\n\n // Project-specific fields\n const projectFields = fields.filter((f) => !ALL_LOCATION_FIELDS.has(f.key))\n\n const groupFieldMap = new Map<string, FieldDef[]>()\n const ungroupedProject: FieldDef[] = []\n for (const field of projectFields) {\n if (field.group) {\n const existing = groupFieldMap.get(field.group) ?? []\n existing.push(field)\n groupFieldMap.set(field.group, existing)\n } else {\n ungroupedProject.push(field)\n }\n }\n\n return (\n <div className=\"space-y-6\">\n {/* Identity — icon + name + active */}\n <Card>\n <CardContent className=\"pt-5\">\n <div className=\"flex gap-5\">\n <div className=\"flex h-20 w-20 shrink-0 items-center justify-center rounded-2xl bg-primary/10 text-primary\">\n <MapPin className=\"h-8 w-8\" />\n </div>\n <div className=\"flex-1 space-y-4\">\n <div className=\"flex items-start gap-4\">\n {nameField && (\n <div className=\"flex-1 space-y-1.5\">\n <label className=\"text-sm font-medium\">{nameField.label}{nameField.required && <span className=\"text-destructive ml-0.5\">*</span>}</label>\n {renderField(nameField, values[nameField.key], (val) => onChange(nameField.key, val))}\n </div>\n )}\n <div className=\"mt-6 flex items-center gap-3 shrink-0\">\n {hasActive && (\n <ActiveToggle active={values.isActive ?? true} onChange={(v) => onChange('isActive', v)} />\n )}\n </div>\n </div>\n {hqField && (\n <label className=\"flex items-center gap-2.5 cursor-pointer text-sm\">\n <input\n type=\"checkbox\"\n checked={!!values.isHeadquarters}\n onChange={(e) => onChange('isHeadquarters', e.target.checked)}\n className=\"h-4 w-4 rounded border-input\"\n />\n Headquarters\n </label>\n )}\n </div>\n </div>\n </CardContent>\n </Card>\n\n {/* Address */}\n {addressFields.length > 0 && (\n <div>\n <h3 className=\"text-sm font-semibold text-foreground\">Address</h3>\n <Card className=\"mt-1\">\n <CardContent className=\"pt-5\">\n <div className=\"grid gap-4 md:grid-cols-2\">\n {addressFields.map((field) => (\n <FieldItem key={field.key} field={field} value={values[field.key]} onChange={(val) => onChange(field.key, val)} renderField={renderField} colSpan={field.key === 'address'} />\n ))}\n </div>\n </CardContent>\n </Card>\n </div>\n )}\n\n {/* Contact */}\n {contactFields.length > 0 && (\n <div>\n <h3 className=\"text-sm font-semibold text-foreground\">Contact</h3>\n <Card className=\"mt-1\">\n <CardContent className=\"pt-5\">\n <div className=\"grid gap-4 md:grid-cols-2\">\n {contactFields.map((field) => (\n <FieldItem key={field.key} field={field} value={values[field.key]} onChange={(val) => onChange(field.key, val)} renderField={renderField} />\n ))}\n </div>\n </CardContent>\n </Card>\n </div>\n )}\n\n {/* Project-specific grouped fields */}\n {fieldGroups.map((group) => {\n const gFields = groupFieldMap.get(group.id)\n if (!gFields || gFields.length === 0) return null\n const cols = group.columns ?? 2\n return (\n <div key={group.id}>\n <h3 className=\"text-sm font-semibold text-foreground\">{group.label}</h3>\n <Card className=\"mt-1\">\n <CardContent className=\"pt-5\">\n <div className={`grid gap-4 ${cols >= 2 ? 'md:grid-cols-2' : ''}`}>\n {gFields.map((field) => (\n <FieldItem key={field.key} field={field} value={values[field.key]} onChange={(val) => onChange(field.key, val)} renderField={renderField} colSpan={field.span === 2} />\n ))}\n </div>\n </CardContent>\n </Card>\n </div>\n )\n })}\n\n {/* Ungrouped project fields */}\n {ungroupedProject.length > 0 && (\n <Card>\n <CardContent className=\"pt-5\">\n <div className=\"grid gap-4 md:grid-cols-2\">\n {ungroupedProject.map((field) => (\n <FieldItem key={field.key} field={field} value={values[field.key]} onChange={(val) => onChange(field.key, val)} renderField={renderField} colSpan={field.span === 2} />\n ))}\n </div>\n </CardContent>\n </Card>\n )}\n\n {/* Notes */}\n {notesField && (\n <Card>\n <CardContent className=\"pt-5\">\n <FieldItem field={notesField} value={values[notesField.key]} onChange={(val) => onChange(notesField.key, val)} renderField={renderField} />\n </CardContent>\n </Card>\n )}\n </div>\n )\n}\n","import React, { useState, useEffect, useRef, useCallback } from 'react'\nimport { Search, Plus, X, User, Loader2, Check } from 'lucide-react'\nimport { Input } from '@fayz-ai/ui'\nimport { Button } from '@fayz-ai/ui'\nimport { getSupabaseClientOptional } from '@fayz-ai/core'\nimport { useOrganizationStore } from '../../org'\n\ninterface Person {\n id: string\n name: string\n email?: string\n phone?: string\n kind: string\n}\n\ninterface PersonPickerProps {\n value?: string | null\n onChange: (personId: string | null, person?: Person) => void\n personKind?: string\n label?: string\n placeholder?: string\n onPersonData?: (data: { name: string; phone?: string; email?: string }) => void\n}\n\nexport function PersonPicker({\n value,\n onChange,\n personKind = 'customer',\n label = 'Person',\n placeholder = 'Search or type a name to add...',\n onPersonData,\n}: PersonPickerProps) {\n const [open, setOpen] = useState(false)\n const [query, setQuery] = useState('')\n const [results, setResults] = useState<Person[]>([])\n const [searching, setSearching] = useState(false)\n const [selected, setSelected] = useState<Person | null>(null)\n const [showCreate, setShowCreate] = useState(false)\n const [creating, setCreating] = useState(false)\n const searchTimer = useRef<ReturnType<typeof setTimeout> | null>(null)\n const inputRef = useRef<HTMLInputElement>(null)\n const containerRef = useRef<HTMLDivElement>(null)\n\n // New person form\n const [newPhone, setNewPhone] = useState('')\n const [newEmail, setNewEmail] = useState('')\n\n const tenantId = useOrganizationStore((s) => s.currentOrg?.id)\n\n // Load selected person on mount\n useEffect(() => {\n if (value && !selected) {\n const supabase = getSupabaseClientOptional() as any\n if (!supabase) return\n supabase\n .from('people')\n .select('id, name, email, phone, kind')\n .eq('id', value)\n .single()\n .then(({ data }: any) => {\n if (data) setSelected(data as Person)\n })\n }\n }, [value])\n\n // Close on outside click\n useEffect(() => {\n const handler = (e: MouseEvent) => {\n if (containerRef.current && !containerRef.current.contains(e.target as Node)) {\n setOpen(false)\n setShowCreate(false)\n }\n }\n document.addEventListener('mousedown', handler)\n return () => document.removeEventListener('mousedown', handler)\n }, [])\n\n const doSearch = useCallback(async (term: string) => {\n if (!term.trim() || !tenantId) { setResults([]); return }\n setSearching(true)\n try {\n const supabase = getSupabaseClientOptional() as any\n if (!supabase) return\n const { data } = await supabase\n .from('people')\n .select('id, name, email, phone, kind')\n .eq('tenant_id', tenantId)\n .ilike('name', `%${term}%`)\n .limit(6)\n setResults((data ?? []) as Person[])\n } finally {\n setSearching(false)\n }\n }, [tenantId])\n\n const handleInput = (val: string) => {\n setQuery(val)\n setShowCreate(false)\n if (!open) setOpen(true)\n if (searchTimer.current) clearTimeout(searchTimer.current)\n searchTimer.current = setTimeout(() => doSearch(val), 250)\n }\n\n const handleSelect = (person: Person) => {\n setSelected(person)\n onChange(person.id, person)\n onPersonData?.({ name: person.name, phone: person.phone, email: person.email })\n setOpen(false)\n setQuery('')\n setResults([])\n setShowCreate(false)\n }\n\n const handleStartCreate = () => {\n setShowCreate(true)\n setNewPhone('')\n setNewEmail('')\n }\n\n const handleCreate = async () => {\n if (!query.trim() || !tenantId) return\n setCreating(true)\n try {\n const supabase = getSupabaseClientOptional() as any\n if (!supabase) return\n const { data, error } = await supabase\n .from('people')\n .insert({\n tenant_id: tenantId,\n kind: personKind,\n name: query.trim(),\n phone: newPhone.trim() || null,\n email: newEmail.trim() || null,\n is_active: true,\n })\n .select('id, name, email, phone, kind')\n .single()\n if (error) throw error\n handleSelect(data as Person)\n } finally {\n setCreating(false)\n }\n }\n\n const handleClear = (e: React.MouseEvent) => {\n e.stopPropagation()\n setSelected(null)\n setQuery('')\n onChange(null)\n onPersonData?.({ name: '', phone: '', email: '' })\n setTimeout(() => inputRef.current?.focus(), 50)\n }\n\n const noResults = query.trim().length > 1 && !searching && results.length === 0\n\n return (\n <div ref={containerRef} className=\"relative\">\n {/* Selected state */}\n {selected && !open ? (\n <button\n type=\"button\"\n onClick={() => { setOpen(true); setQuery(''); setTimeout(() => inputRef.current?.focus(), 50) }}\n className=\"flex items-center gap-3 w-full rounded-lg border px-3 py-2.5 text-left hover:bg-muted bg-card shadow-button active:shadow-button-inset transition-colors\"\n >\n <div className=\"flex h-8 w-8 shrink-0 items-center justify-center rounded-full bg-primary/10 text-primary\">\n <User className=\"h-4 w-4\" />\n </div>\n <div className=\"flex-1 min-w-0\">\n <p className=\"text-sm font-medium truncate\">{selected.name}</p>\n <p className=\"text-xs text-muted-foreground truncate\">\n {[selected.phone, selected.email].filter(Boolean).join(' · ') || 'No contact info'}\n </p>\n </div>\n <div className=\"flex items-center gap-1 shrink-0\" onClick={(e) => e.stopPropagation()}>\n <span className=\"text-[10px] text-muted-foreground\">Change</span>\n <button type=\"button\" onClick={handleClear} className=\"p-1 text-muted-foreground hover:text-destructive rounded\">\n <X className=\"h-3.5 w-3.5\" />\n </button>\n </div>\n </button>\n ) : (\n /* Search input */\n <div className=\"relative\">\n <Search className=\"absolute left-3 top-1/2 -translate-y-1/2 h-4 w-4 text-muted-foreground pointer-events-none\" />\n <input\n ref={inputRef}\n type=\"text\"\n value={query}\n onChange={(e) => handleInput(e.target.value)}\n onFocus={() => { if (query) setOpen(true) }}\n placeholder={placeholder}\n className=\"flex h-10 w-full rounded-lg border border-input bg-background pl-10 pr-3 py-2 text-sm shadow-sm ring-offset-background placeholder:text-muted-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring\"\n />\n {searching && <Loader2 className=\"absolute right-3 top-1/2 -translate-y-1/2 h-4 w-4 animate-spin text-muted-foreground\" />}\n </div>\n )}\n\n {/* Dropdown */}\n {open && (query.trim().length > 0 || showCreate) && (\n <div className=\"fayz-glass-surface absolute z-50 mt-1 w-full rounded-lg border bg-popover shadow-lg overflow-hidden\">\n {/* Results */}\n {results.length > 0 && (\n <div className=\"max-h-52 overflow-y-auto\">\n {results.map((person) => (\n <button\n key={person.id}\n type=\"button\"\n onClick={() => handleSelect(person)}\n className=\"flex items-center gap-3 w-full px-3 py-2.5 text-left hover:bg-muted/50 transition-colors\"\n >\n <div className=\"flex h-8 w-8 shrink-0 items-center justify-center rounded-full bg-muted\">\n <User className=\"h-3.5 w-3.5 text-muted-foreground\" />\n </div>\n <div className=\"flex-1 min-w-0\">\n <div className=\"flex items-center gap-2\">\n <p className=\"text-sm font-medium truncate\">{person.name}</p>\n <span className=\"inline-flex items-center rounded-full bg-muted px-1.5 py-0.5 text-[10px] font-medium text-muted-foreground capitalize shrink-0\">\n {person.kind}\n </span>\n </div>\n <p className=\"text-xs text-muted-foreground truncate\">\n {[person.phone, person.email].filter(Boolean).join(' · ')}\n </p>\n </div>\n {person.id === value && <Check className=\"h-4 w-4 text-primary shrink-0\" />}\n </button>\n ))}\n </div>\n )}\n\n {/* No results — prompt to create */}\n {noResults && !showCreate && (\n <button\n type=\"button\"\n onClick={handleStartCreate}\n className=\"flex items-center gap-3 w-full px-3 py-3 text-left hover:bg-muted/50 transition-colors border-t border-dashed\"\n >\n <div className=\"flex h-8 w-8 shrink-0 items-center justify-center rounded-full bg-primary/10 text-primary\">\n <Plus className=\"h-4 w-4\" />\n </div>\n <div>\n <p className=\"text-sm font-medium\">Add \"<span className=\"text-primary\">{query.trim()}</span>\"</p>\n <p className=\"text-xs text-muted-foreground\">Create a new {label.toLowerCase()} with this name</p>\n </div>\n </button>\n )}\n\n {/* Also show create option when there ARE results */}\n {results.length > 0 && !showCreate && (\n <button\n type=\"button\"\n onClick={handleStartCreate}\n className=\"flex items-center gap-2 w-full px-3 py-2 text-left hover:bg-muted/50 transition-colors border-t text-xs text-muted-foreground\"\n >\n <Plus className=\"h-3 w-3\" />\n Add \"<span className=\"font-medium text-foreground\">{query.trim()}</span>\" as new {label.toLowerCase()}\n </button>\n )}\n\n {/* Inline create form */}\n {showCreate && (\n <div className=\"p-3 border-t space-y-3 bg-muted/20\">\n <div className=\"flex items-center gap-2\">\n <div className=\"flex h-6 w-6 shrink-0 items-center justify-center rounded-full bg-primary/10 text-primary\">\n <Plus className=\"h-3 w-3\" />\n </div>\n <p className=\"text-xs font-medium\">New {label}: <span className=\"text-primary\">{query.trim()}</span></p>\n </div>\n <div className=\"grid gap-2 sm:grid-cols-2\">\n <Input\n value={newPhone}\n onChange={(e) => setNewPhone(e.target.value)}\n placeholder=\"Phone\"\n className=\"h-8 text-xs\"\n />\n <Input\n value={newEmail}\n onChange={(e) => setNewEmail(e.target.value)}\n placeholder=\"Email\"\n type=\"email\"\n className=\"h-8 text-xs\"\n />\n </div>\n <div className=\"flex justify-end gap-2\">\n <Button type=\"button\" variant=\"ghost\" size=\"sm\" className=\"h-7 text-xs\" onClick={() => setShowCreate(false)}>\n Cancel\n </Button>\n <Button type=\"button\" size=\"sm\" className=\"h-7 text-xs\" onClick={handleCreate} disabled={creating}>\n {creating ? <Loader2 className=\"h-3 w-3 mr-1 animate-spin\" /> : <Check className=\"h-3 w-3 mr-1\" />}\n {creating ? 'Saving...' : 'Save & Select'}\n </Button>\n </div>\n </div>\n )}\n </div>\n )}\n </div>\n )\n}\n","import React from 'react'\nimport { Heart } from 'lucide-react'\nimport { Card, CardContent, getLucideIcon } from '@fayz-ai/ui'\nimport { ActiveToggle } from './ActiveToggle'\nimport { PersonPicker } from './PersonPicker'\nimport type { FieldDef, FieldGroup } from '@fayz-ai/core'\n\ninterface SubjectFormLayoutProps {\n fields: FieldDef[]\n allFields?: FieldDef[]\n fieldGroups: FieldGroup[]\n values: Record<string, any>\n onChange: (key: string, val: any) => void\n renderField: (field: FieldDef, value: any, onChange: (val: any) => void) => React.ReactNode\n entityIcon?: string\n}\n\nconst OWNER_FIELDS = new Set(['tutorName', 'tutorPhone', 'tutorId'])\nconst REFERRAL_FIELDS = new Set(['referringVetId', 'referringClinicId'])\nconst SKIP_FIELDS = new Set(['isActive', 'notes', 'tags', 'metadata'])\n\nfunction FieldItem({ field, value, onChange, renderField, colSpan }: {\n field: FieldDef; value: any; onChange: (val: any) => void\n renderField: SubjectFormLayoutProps['renderField']; colSpan?: boolean\n}) {\n return (\n <div className={`space-y-1.5 ${colSpan ? 'md:col-span-2' : ''}`}>\n <label className=\"text-sm font-medium\">\n {field.label}{field.required && <span className=\"text-destructive ml-0.5\">*</span>}\n </label>\n {renderField(field, value, onChange)}\n </div>\n )\n}\n\nexport function SubjectFormLayout({ fields, allFields, fieldGroups, values, onChange, renderField, entityIcon }: SubjectFormLayoutProps) {\n const all = allFields ?? fields\n const nameField = fields.find((f) => f.key === 'name')\n const hasActive = fields.some((f) => f.key === 'isActive')\n const notesField = fields.find((f) => f.key === 'notes')\n const hasOwnerPicker = all.some((f) => f.key === 'tutorId' || f.key === 'tutorName')\n const referralFields = fields.filter((f) => REFERRAL_FIELDS.has(f.key))\n\n // Main subject fields = everything except name, owner, referral, skip\n const allSkip = new Set([...OWNER_FIELDS, ...REFERRAL_FIELDS, ...SKIP_FIELDS, 'name'])\n const subjectFields = fields.filter((f) => !allSkip.has(f.key))\n\n // Group subject fields\n const groupFieldMap = new Map<string, FieldDef[]>()\n const ungrouped: FieldDef[] = []\n for (const field of subjectFields) {\n if (field.group) {\n const existing = groupFieldMap.get(field.group) ?? []\n existing.push(field)\n groupFieldMap.set(field.group, existing)\n } else {\n ungrouped.push(field)\n }\n }\n\n const IconComponent = getLucideIcon(entityIcon ?? 'Heart') ?? Heart\n\n return (\n <div className=\"space-y-6\">\n {/* Identity — icon + name + active */}\n <Card>\n <CardContent className=\"pt-5\">\n <div className=\"flex gap-5\">\n <div className=\"flex h-20 w-20 shrink-0 items-center justify-center rounded-2xl bg-primary/10 text-primary\">\n {React.createElement(IconComponent, { className: 'h-8 w-8' })}\n </div>\n <div className=\"flex-1 space-y-4\">\n <div className=\"flex items-start gap-4\">\n {nameField && (\n <div className=\"flex-1 space-y-1.5\">\n <label className=\"text-sm font-medium\">{nameField.label}{nameField.required && <span className=\"text-destructive ml-0.5\">*</span>}</label>\n {renderField(nameField, values[nameField.key], (val) => onChange(nameField.key, val))}\n </div>\n )}\n {hasActive && (\n <div className=\"mt-6 shrink-0\">\n <ActiveToggle active={values.isActive ?? true} onChange={(v) => onChange('isActive', v)} />\n </div>\n )}\n </div>\n {/* Ungrouped fields inline */}\n {ungrouped.length > 0 && (\n <div className=\"grid gap-4 sm:grid-cols-3\">\n {ungrouped.map((field) => (\n <FieldItem key={field.key} field={field} value={values[field.key]} onChange={(val) => onChange(field.key, val)} renderField={renderField} />\n ))}\n </div>\n )}\n </div>\n </div>\n </CardContent>\n </Card>\n\n {/* Grouped subject fields */}\n {fieldGroups.map((group) => {\n const gFields = groupFieldMap.get(group.id)\n if (!gFields || gFields.length === 0) return null\n const cols = group.columns ?? 2\n return (\n <div key={group.id}>\n <h3 className=\"text-sm font-semibold text-foreground\">{group.label}</h3>\n <Card className=\"mt-1\">\n <CardContent className=\"pt-5\">\n <div className={`grid gap-4 ${cols >= 2 ? 'md:grid-cols-2' : ''} ${cols >= 3 ? 'lg:grid-cols-3' : ''}`}>\n {gFields.map((field) => (\n <FieldItem key={field.key} field={field} value={values[field.key]} onChange={(val) => onChange(field.key, val)} renderField={renderField} colSpan={field.span === 2} />\n ))}\n </div>\n </CardContent>\n </Card>\n </div>\n )\n })}\n\n {/* Owner / Tutor — person picker */}\n {hasOwnerPicker && (\n <div>\n <h3 className=\"text-sm font-semibold text-foreground\">Owner / Tutor</h3>\n <Card className=\"mt-1\">\n <CardContent className=\"pt-5\">\n <PersonPicker\n value={values.tutorId}\n onChange={(personId) => onChange('tutorId', personId)}\n personKind=\"customer\"\n label=\"Tutor\"\n placeholder=\"Search or type a name to add...\"\n />\n </CardContent>\n </Card>\n </div>\n )}\n\n {/* Referral */}\n {referralFields.length > 0 && (\n <div>\n <h3 className=\"text-sm font-semibold text-foreground\">Referral</h3>\n <Card className=\"mt-1\">\n <CardContent className=\"pt-5\">\n <div className=\"grid gap-4 md:grid-cols-2\">\n {referralFields.map((field) => (\n <FieldItem key={field.key} field={field} value={values[field.key]} onChange={(val) => onChange(field.key, val)} renderField={renderField} />\n ))}\n </div>\n </CardContent>\n </Card>\n </div>\n )}\n\n {/* Notes */}\n {notesField && (\n <Card>\n <CardContent className=\"pt-5\">\n <FieldItem field={notesField} value={values[notesField.key]} onChange={(val) => onChange(notesField.key, val)} renderField={renderField} />\n </CardContent>\n </Card>\n )}\n </div>\n )\n}\n","import React, { useEffect, useState } from 'react'\nimport { Badge } from '@fayz-ai/ui'\nimport { getSupabaseClientOptional, getActiveTenantId } from '@fayz-ai/core'\nimport type { FieldRelation } from '@fayz-ai/core'\n\n// Relation field support for the CRUD engine: load a select's options from a\n// table at runtime so a foreign-key column stores a real id (e.g. uuid) instead\n// of a static string. Shared by the form input (RelationSelect) and the table\n// cell (RelationCell). Options are cached per (schema, table, fields, tenant,\n// filter) so the list + every cell reuse one query.\n\ntype Option = { value: string; label: string }\n\nconst cache = new Map<string, Promise<Option[]>>()\n\nfunction keyOf(r: FieldRelation): string {\n const tenant = r.tenantScoped !== false ? (getActiveTenantId() ?? '') : ''\n return JSON.stringify([\n r.schema ?? 'public', r.table, r.valueField ?? 'id', r.labelField ?? 'name',\n tenant, r.filter ?? null,\n ])\n}\n\nasync function fetchOptions(r: FieldRelation): Promise<Option[]> {\n const supabase = getSupabaseClientOptional() as any\n if (!supabase) return []\n const valueField = r.valueField ?? 'id'\n const labelField = r.labelField ?? 'name'\n let q = (r.schema ? supabase.schema(r.schema) : supabase)\n .from(r.table)\n .select(`${valueField}, ${labelField}`)\n if (r.tenantScoped !== false) {\n const tid = getActiveTenantId()\n if (tid) q = q.eq('tenant_id', tid)\n }\n if (r.filter) for (const [k, v] of Object.entries(r.filter)) q = q.eq(k, v)\n q = q.order(labelField, { ascending: true })\n const { data } = await q\n return (data ?? []).map((row: any) => ({\n value: String(row[valueField]),\n label: String(row[labelField] ?? row[valueField]),\n }))\n}\n\nexport function loadRelationOptions(r: FieldRelation): Promise<Option[]> {\n const k = keyOf(r)\n if (!cache.has(k)) {\n cache.set(k, fetchOptions(r).catch(() => { cache.delete(k); return [] }))\n }\n return cache.get(k)!\n}\n\n/** Drop cached relation options (call after creating/editing a related row). */\nexport function invalidateRelationOptions(): void {\n cache.clear()\n}\n\nexport function useRelationOptions(r: FieldRelation | undefined): {\n options: Option[]\n loading: boolean\n labelFor: (value: any) => string\n} {\n const [options, setOptions] = useState<Option[]>([])\n const [loading, setLoading] = useState(true)\n const dep = r ? keyOf(r) : 'none'\n useEffect(() => {\n let alive = true\n if (!r) { setLoading(false); return }\n setLoading(true)\n loadRelationOptions(r).then((opts) => {\n if (alive) { setOptions(opts); setLoading(false) }\n })\n return () => { alive = false }\n }, [dep]) // eslint-disable-line react-hooks/exhaustive-deps\n const labelFor = (value: any) => options.find((o) => o.value === String(value))?.label ?? ''\n return { options, loading, labelFor }\n}\n\nexport function RelationSelect({\n relation,\n value,\n onChange,\n className,\n required,\n placeholder,\n}: {\n relation?: FieldRelation\n value: any\n onChange: (value: any) => void\n className?: string\n required?: boolean\n placeholder?: string\n}) {\n const { options, loading } = useRelationOptions(relation)\n return (\n <select\n value={value ?? ''}\n onChange={(e) => onChange(e.target.value || null)}\n required={required}\n className={className}\n >\n <option value=\"\">{loading ? 'Loading…' : (placeholder ?? 'Select...')}</option>\n {options.map((o) => (\n <option key={o.value} value={o.value}>{o.label}</option>\n ))}\n </select>\n )\n}\n\nexport function RelationCell({ relation, value }: { relation?: FieldRelation; value: any }) {\n const { labelFor, loading } = useRelationOptions(relation)\n if (value == null || value === '') return <span className=\"text-muted-foreground\">—</span>\n const label = labelFor(value)\n return <Badge variant=\"secondary\">{label || (loading ? '…' : String(value))}</Badge>\n}\n","import React, { useState, useEffect } from 'react'\nimport { ArrowLeft, ImagePlus, Loader2 } from 'lucide-react'\nimport { Card, CardContent } from '@fayz-ai/ui'\nimport { Button } from '@fayz-ai/ui'\nimport { Input } from '@fayz-ai/ui'\nimport { Checkbox } from '@fayz-ai/ui'\nimport { CurrencyInput } from '@fayz-ai/ui'\nimport { MarkdownEditor } from '@fayz-ai/ui'\nimport { toast } from '@fayz-ai/ui'\nimport { useSaveBar, useBackHandler } from '@fayz-ai/ui'\nimport { PersonFormLayout } from './archetypes/PersonFormLayout'\nimport { ProductFormLayout } from './archetypes/ProductFormLayout'\nimport { ServiceFormLayout } from './archetypes/ServiceFormLayout'\nimport { LocationFormLayout } from './archetypes/LocationFormLayout'\nimport { SubjectFormLayout } from './archetypes/SubjectFormLayout'\nimport { useTranslation } from '@fayz-ai/core'\nimport { SubpageHeader } from '@fayz-ai/ui'\nimport type { EntityImageConfig } from '@fayz-ai/core'\nimport type { FieldDef, FieldGroup, EntityDef } from '@fayz-ai/core'\nimport type { FormLayout } from '@fayz-ai/core'\nimport { RelationSelect } from './relation-field'\nimport { useLimitGuard, invalidateLimit } from '../access'\n\ninterface CrudFormPageProps {\n entityDef: EntityDef\n mode: 'create' | 'edit'\n initialData?: Record<string, any>\n onSubmit: (data: Record<string, any>) => void | Promise<void>\n onCancel: () => void\n namePlural: string\n /** Embedded mode — no breadcrumb, compact layout. For use inside modals/panels. */\n embedded?: boolean\n /** Hide the internal breadcrumb while keeping the full-page SaveBar/Escape flow.\n * Use when a parent already renders its own header (e.g. SubpageHeader). */\n hideBreadcrumb?: boolean\n}\n\n/** Derive a currency symbol from an ISO code (e.g. USD → \"$\") when not given. */\nfunction currencySymbolFor(code: string | undefined, locale: string): string {\n if (!code) return 'R$'\n try {\n const parts = new Intl.NumberFormat(locale, { style: 'currency', currency: code }).formatToParts(0)\n return parts.find((p) => p.type === 'currency')?.value ?? code\n } catch {\n return code\n }\n}\n\nfunction getDefaultValues(fields: FieldDef[]): Record<string, any> {\n const values: Record<string, any> = {}\n for (const field of fields) {\n if (field.showInForm === false) continue\n // Computed fields are read-only and never part of the payload.\n if (field.type === 'computed') continue\n if (field.defaultValue != null) {\n values[field.key] = field.defaultValue\n } else {\n switch (field.type) {\n case 'boolean':\n values[field.key] = false\n break\n case 'number':\n case 'currency':\n values[field.key] = ''\n break\n default:\n values[field.key] = ''\n }\n }\n }\n return values\n}\n\nfunction renderField(field: FieldDef, value: any, onChange: (val: any) => void, allValues: Record<string, any> = {}) {\n const baseClass = 'flex h-9 w-full rounded-input border border-input bg-background px-3 py-1.5 text-sm shadow-sm ring-offset-background placeholder:text-muted-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring disabled:cursor-not-allowed disabled:opacity-50'\n\n switch (field.type) {\n case 'currency': {\n const locale = field.currencyLocale ?? 'pt-BR'\n return (\n <CurrencyInput\n value={Number(value) || 0}\n onChange={(n) => onChange(n)}\n currencyCode={field.currency}\n locale={locale}\n symbol={field.currencySymbol ?? currencySymbolFor(field.currency, locale)}\n />\n )\n }\n case 'segmented': {\n const options = (field.options ?? []).map((o) =>\n typeof o === 'string' ? { label: o, value: o, description: undefined } : o,\n )\n return (\n <div className=\"grid gap-2 sm:grid-cols-2 lg:grid-cols-4\">\n {options.map((o) => {\n const active = value === o.value\n return (\n <button\n key={o.value}\n type=\"button\"\n onClick={() => onChange(o.value)}\n className={`rounded-lg border-2 p-3 text-left transition-all ${\n active\n ? 'border-primary bg-primary/5'\n : 'border-transparent bg-muted/20 hover:bg-muted/40'\n }`}\n >\n <p className={`text-sm font-medium ${active ? 'text-primary' : ''}`}>{o.label}</p>\n {'description' in o && o.description && (\n <p className=\"text-[10px] text-muted-foreground mt-0.5 leading-tight\">{o.description}</p>\n )}\n </button>\n )\n })}\n </div>\n )\n }\n case 'computed': {\n const result = field.compute ? field.compute(allValues) : null\n const tone = result?.tone === 'positive' ? 'text-success'\n : result?.tone === 'negative' ? 'text-destructive'\n : 'text-foreground'\n return (\n <div className=\"mt-1 rounded-lg border bg-muted/20 px-3 py-2 text-sm tabular-nums text-right\">\n {result ? <span className={tone}>{result.display}</span> : <span className=\"text-muted-foreground\">—</span>}\n </div>\n )\n }\n case 'textarea':\n return (\n <textarea\n value={value ?? ''}\n onChange={(e) => onChange(e.target.value)}\n placeholder={field.placeholder}\n required={field.required}\n rows={2}\n className={`${baseClass} min-h-[60px] py-1.5`}\n />\n )\n case 'markdown':\n return (\n <MarkdownEditor\n value={value ?? ''}\n onChange={onChange}\n placeholder={field.placeholder}\n minRows={12}\n defaultMode=\"edit\"\n />\n )\n case 'relation':\n return (\n <RelationSelect\n relation={field.relation}\n value={value}\n onChange={onChange}\n className={baseClass}\n required={field.required}\n placeholder={field.placeholder ?? `Select ${field.label.toLowerCase()}...`}\n />\n )\n case 'select': {\n const options = (field.options ?? []).map((o) =>\n typeof o === 'string' ? { label: o, value: o } : o,\n )\n return (\n <select\n value={value ?? ''}\n onChange={(e) => onChange(e.target.value)}\n required={field.required}\n className={baseClass}\n >\n <option value=\"\">{field.placeholder ?? `Select ${field.label.toLowerCase()}...`}</option>\n {options.map((o) => (\n <option key={o.value} value={o.value}>{o.label}</option>\n ))}\n </select>\n )\n }\n case 'boolean':\n return (\n <label className=\"flex items-center gap-2.5 cursor-pointer\">\n <Checkbox\n checked={!!value}\n onChange={(checked) => onChange(checked)}\n />\n <span className=\"text-sm\">{field.label}</span>\n </label>\n )\n case 'number':\n return (\n <Input\n type=\"number\"\n value={value ?? ''}\n onChange={(e) => onChange(e.target.value === '' ? '' : Number(e.target.value))}\n placeholder={field.placeholder}\n required={field.required}\n min={field.min}\n max={field.max}\n />\n )\n case 'date':\n return <Input type=\"date\" value={value ?? ''} onChange={(e) => onChange(e.target.value)} required={field.required} />\n case 'datetime':\n return <Input type=\"datetime-local\" value={value ?? ''} onChange={(e) => onChange(e.target.value)} required={field.required} />\n case 'time':\n return <Input type=\"time\" value={value ?? ''} onChange={(e) => onChange(e.target.value)} required={field.required} />\n case 'color':\n return (\n <div className=\"flex items-center gap-2\">\n <input\n type=\"color\"\n value={value || '#6b7280'}\n onChange={(e) => onChange(e.target.value)}\n className=\"h-9 w-12 rounded-md border border-input cursor-pointer p-0.5\"\n />\n <Input\n type=\"text\"\n value={value ?? ''}\n onChange={(e) => onChange(e.target.value)}\n placeholder=\"#000000\"\n className=\"flex-1 font-mono text-xs\"\n />\n </div>\n )\n default:\n return (\n <Input\n type={field.type === 'email' ? 'email' : field.type === 'phone' ? 'tel' : field.type === 'url' ? 'url' : 'text'}\n value={value ?? ''}\n onChange={(e) => onChange(e.target.value)}\n placeholder={field.placeholder}\n required={field.required}\n />\n )\n }\n}\n\nfunction FormFieldItem({ field, value, onChange, allValues }: { field: FieldDef; value: any; onChange: (val: any) => void; allValues?: Record<string, any> }) {\n return (\n <div className={`grid gap-1 ${field.span === 2 ? 'md:col-span-2' : ''}`}>\n {field.type !== 'boolean' && (\n <label className=\"text-sm font-medium text-foreground\">\n {field.label}\n {field.required && <span className=\"text-destructive ml-0.5\">*</span>}\n </label>\n )}\n {renderField(field, value, onChange, allValues)}\n {field.hint && <p className=\"text-[10px] text-muted-foreground mt-0.5\">{field.hint}</p>}\n </div>\n )\n}\n\n/**\n * The image slot, wired. Renders the record's current image and, when the entity\n * supplies an `upload`, lets it be replaced. Upload attaches the file to an\n * existing record id, so in create mode the slot explains itself instead of\n * offering an action that cannot work yet.\n */\nfunction ImageSlot({\n image,\n row,\n canEdit,\n}: {\n image: EntityImageConfig\n row: Record<string, any>\n canEdit: boolean\n}) {\n const t = useTranslation()\n const inputRef = React.useRef<HTMLInputElement>(null)\n const [url, setUrl] = React.useState<string | undefined>(() => image.get(row))\n const [busy, setBusy] = React.useState(false)\n const [error, setError] = React.useState<string | null>(null)\n\n // The form mounts before the record is loaded in edit mode, so the initial\n // value can be undefined and arrive later.\n React.useEffect(() => { setUrl(image.get(row)) }, [image.get(row)])\n\n const pick = () => { if (canEdit && !busy) inputRef.current?.click() }\n\n const onFile = async (e: React.ChangeEvent<HTMLInputElement>) => {\n const file = e.target.files?.[0]\n e.target.value = ''\n if (!file || !image.upload) return\n setBusy(true)\n setError(null)\n try {\n setUrl(await image.upload(file, row))\n } catch (err: unknown) {\n setError(err instanceof Error ? err.message : String(err))\n } finally {\n setBusy(false)\n }\n }\n\n const editable = canEdit && Boolean(image.upload)\n\n return (\n <div className=\"shrink-0\">\n <div\n onClick={pick}\n role={editable ? 'button' : undefined}\n tabIndex={editable ? 0 : undefined}\n onKeyDown={(e) => { if (editable && (e.key === 'Enter' || e.key === ' ')) { e.preventDefault(); pick() } }}\n title={editable ? t('crud.form.changeImage') : undefined}\n className={`relative flex h-20 w-20 items-center justify-center overflow-hidden rounded-lg border-2 text-muted-foreground transition-colors ${\n url ? 'border-solid border-border' : 'border-dashed border-muted'\n } ${editable ? 'cursor-pointer hover:border-primary/30 hover:text-primary/50' : ''}`}\n >\n {url\n ? <img src={url} alt=\"\" className=\"h-full w-full object-cover\" />\n : <ImagePlus className=\"h-5 w-5\" />}\n {busy && (\n <span className=\"absolute inset-0 flex items-center justify-center bg-background/70 text-[10px]\">\n ...\n </span>\n )}\n </div>\n {editable && (\n <input\n ref={inputRef}\n type=\"file\"\n accept={image.accept ?? 'image/*'}\n className=\"hidden\"\n onChange={onFile}\n />\n )}\n {!canEdit && (\n <p className=\"mt-1 w-20 text-[10px] leading-tight text-muted-foreground\">\n {t('crud.form.imageAfterSave')}\n </p>\n )}\n {error && <p className=\"mt-1 w-20 text-[10px] leading-tight text-destructive\">{error}</p>}\n </div>\n )\n}\n\nfunction FormGroup({\n group,\n fields,\n values,\n onChange,\n image,\n canEditImage,\n}: {\n group: FieldGroup\n fields: FieldDef[]\n values: Record<string, any>\n onChange: (key: string, val: any) => void\n image?: EntityImageConfig\n canEditImage?: boolean\n}) {\n const cols = group.columns ?? 2\n\n const grid = (\n <div className={`grid gap-3 ${cols >= 2 ? 'md:grid-cols-2' : ''} ${cols >= 3 ? 'lg:grid-cols-3' : ''}`}>\n {fields.map((field) => (\n <FormFieldItem\n key={field.key}\n field={field}\n value={values[field.key]}\n onChange={(val) => onChange(field.key, val)}\n allValues={values}\n />\n ))}\n </div>\n )\n\n return (\n <div>\n <h3 className=\"text-sm font-semibold text-foreground\">{group.label}</h3>\n {group.description && (\n <p className=\"text-xs text-muted-foreground mt-0.5 mb-3\">{group.description}</p>\n )}\n <Card>\n <CardContent className=\"pt-4\">\n {group.imageSlot ? (\n <div className=\"flex gap-4\">\n {image\n ? <ImageSlot image={image} row={values} canEdit={Boolean(canEditImage)} />\n : (\n // No entity image config: keep the old decorative square.\n <div className=\"shrink-0\">\n <div className=\"flex h-20 w-20 items-center justify-center rounded-lg border-2 border-dashed border-muted text-muted-foreground\">\n <ImagePlus className=\"h-5 w-5\" />\n </div>\n </div>\n )}\n <div className=\"flex-1\">{grid}</div>\n </div>\n ) : (\n grid\n )}\n </CardContent>\n </Card>\n </div>\n )\n}\n\nexport function CrudFormPage({ entityDef, mode, initialData, onSubmit, onCancel, namePlural, embedded, hideBreadcrumb }: CrudFormPageProps) {\n const t = useTranslation()\n const formFields = entityDef.fields.filter((f) => f.showInForm !== false)\n const displayField = entityDef.displayField ?? entityDef.fields[0]?.key ?? 'id'\n const computeInit = () =>\n mode === 'edit' && initialData ? { ...getDefaultValues(formFields), ...initialData } : getDefaultValues(formFields)\n const [values, setValues] = useState<Record<string, any>>(computeInit)\n const [saving, setSaving] = useState(false)\n const initialRef = React.useRef<string>(JSON.stringify(values))\n\n useEffect(() => {\n const init = computeInit()\n setValues(init)\n initialRef.current = JSON.stringify(init)\n }, [mode, initialData])\n\n const computedKeys = new Set(formFields.filter((f) => f.type === 'computed').map((f) => f.key))\n\n // Plan quantity guard for CREATE. Hook is called unconditionally (rules of\n // hooks) with a safe empty key when the entity declares none; the guard then\n // resolves to 'ok'. Degrades to allow-all outside <AccessProvider>.\n const limitKey = entityDef.limitKey\n const guardLimit = useLimitGuard(limitKey ?? '')\n\n const submit = async () => {\n // Client-side plan cap: block the save (the guard opens the UpgradeModal)\n // before touching the store. Only CREATE consumes a new slot.\n if (mode === 'create' && limitKey && (await guardLimit(1)) === 'blocked') return\n setSaving(true)\n try {\n // Sanitize: convert empty strings to null so the DB doesn't choke on e.g. empty date fields.\n // Computed fields are read-only and never persisted.\n const sanitized: Record<string, any> = {}\n for (const [key, val] of Object.entries(values)) {\n if (computedKeys.has(key)) continue\n sanitized[key] = val === '' ? null : val\n }\n await onSubmit(sanitized)\n // Refresh the live count so gates/banners reflect the new row immediately.\n if (mode === 'create' && limitKey) invalidateLimit(limitKey)\n } catch (err: any) {\n const message = err?.message || 'Something went wrong'\n toast.error(t('crud.form.failedToSave', { entity: entityDef.name.toLowerCase() }), { description: message })\n } finally {\n setSaving(false)\n }\n }\n\n const handleSubmit = (e: React.FormEvent) => {\n e.preventDefault()\n void submit()\n }\n\n const dirty = JSON.stringify(values) !== initialRef.current\n\n // Discard reverts the form to its pristine state and stays on the page (the\n // SaveBar then hides). Leaving the page is a separate action — the breadcrumb\n // link, or pressing Escape again once there's nothing left to discard.\n const discard = () => { setValues(computeInit()) }\n\n // Full-page CRUD forms surface Save/Discard via the app-wide floating SaveBar.\n // Embedded forms (rendered inside other widgets) keep their inline buttons.\n useSaveBar({\n dirty: !embedded && dirty,\n saving,\n onSave: () => { void submit() },\n onDiscard: discard,\n saveLabel: mode === 'create' ? t('crud.form.addTitle', { entity: entityDef.name }) : t('crud.form.saveChanges'),\n })\n\n // Register \"leave to parent\" with the app-wide Escape key. While the form is\n // dirty the SaveBar owns Escape (→ discard); once pristine, Escape navigates\n // back — giving the two-step \"discard, then leave\" flow for free.\n useBackHandler(embedded ? undefined : onCancel)\n\n const handleChange = (key: string, val: any) => {\n setValues((prev) => ({ ...prev, [key]: val }))\n }\n\n const title = mode === 'create' ? t('crud.form.addTitle', { entity: entityDef.name }) : t('crud.form.editTitle', { entity: entityDef.name })\n const breadcrumbLabel = mode === 'create'\n ? t('crud.form.newBreadcrumb', { entity: entityDef.name })\n : (values[displayField] || initialData?.[displayField] || t('common.edit'))\n\n // Organize fields by groups\n const groups = entityDef.fieldGroups ?? []\n const groupFieldMap = new Map<string, FieldDef[]>()\n const ungroupedFields: FieldDef[] = []\n\n for (const field of formFields) {\n if (field.group) {\n const existing = groupFieldMap.get(field.group) ?? []\n existing.push(field)\n groupFieldMap.set(field.group, existing)\n } else {\n ungroupedFields.push(field)\n }\n }\n\n const hasGroups = groups.length > 0 || groupFieldMap.size > 0\n\n const renderGroup = (group: FieldGroup) => {\n const fields = groupFieldMap.get(group.id)\n if (!fields || fields.length === 0) return null\n return (\n <FormGroup\n key={group.id}\n group={group}\n fields={fields}\n values={values}\n onChange={handleChange}\n image={entityDef.image}\n canEditImage={mode === 'edit'}\n />\n )\n }\n\n // An archetype layout owns its own internal shape (name block, contact block,\n // addresses…), so the side rail is carved out ONE LEVEL UP instead: the side\n // groups and their fields are withheld from the archetype, which renders in\n // the main column, and they are rendered beside it. One change, and every\n // archetype layout gains the two-column form.\n const sideGroups = entityDef.formColumns === 2 && !embedded\n ? groups.filter((g) => g.column === 'side')\n : []\n const sideGroupIds = new Set(sideGroups.map((g) => g.id))\n const archetypeFields = sideGroupIds.size\n ? formFields.filter((f) => !f.group || !sideGroupIds.has(f.group))\n : formFields\n\n const archetypeLayoutProps = {\n fields: archetypeFields,\n allFields: entityDef.fields,\n fieldGroups: groups.filter((g) => !sideGroupIds.has(g.id)),\n values,\n onChange: handleChange,\n renderField,\n entityIcon: entityDef.icon,\n compact: embedded,\n }\n\n const withSideRail = (main: React.ReactNode) => {\n if (sideGroups.length === 0) return main\n return (\n <div className=\"grid gap-5 lg:grid-cols-3\">\n <div className=\"space-y-5 lg:col-span-2\">{main}</div>\n <div className=\"space-y-5\">{sideGroups.map(renderGroup)}</div>\n </div>\n )\n }\n\n function renderFormBody(layout?: FormLayout) {\n switch (layout) {\n case 'person':\n return withSideRail(<PersonFormLayout {...archetypeLayoutProps} />)\n case 'product':\n return withSideRail(<ProductFormLayout {...archetypeLayoutProps} />)\n case 'service':\n return withSideRail(<ServiceFormLayout {...archetypeLayoutProps} />)\n case 'location':\n return withSideRail(<LocationFormLayout {...archetypeLayoutProps} />)\n case 'subject':\n return withSideRail(<SubjectFormLayout {...archetypeLayoutProps} />)\n default:\n // Generic layout — ungrouped + grouped fields, main column only; the\n // side groups are appended by withSideRail (same path the archetypes\n // take, so there is one implementation of the split).\n return withSideRail(\n <div className=\"space-y-5\">\n {ungroupedFields.length > 0 && (\n <Card>\n <CardContent className=\"pt-5\">\n <div className={`grid gap-4 ${!hasGroups ? '' : 'md:grid-cols-2'}`}>\n {ungroupedFields.map((field) => (\n <FormFieldItem\n key={field.key}\n field={field}\n value={values[field.key]}\n onChange={(val) => handleChange(field.key, val)}\n allValues={values}\n />\n ))}\n </div>\n </CardContent>\n </Card>\n )}\n {groups.filter((g) => !sideGroupIds.has(g.id)).map(renderGroup)}\n </div>,\n )\n }\n }\n\n // O cabeçalho vai para a barra da shell, não para cima do formulário: o\n // título da barra e o do formulário eram a mesma palavra, uma linha acima da\n // outra, custando uma faixa inteira da tela.\n const header = (!embedded && !hideBreadcrumb) ? (\n <SubpageHeader title={breadcrumbLabel} parentLabel={namePlural} onBack={onCancel} />\n ) : null\n\n return (\n <div className={`w-full flex flex-col items-center ${embedded ? 'text-sm' : ''}`}>\n {/* A two-column form needs room for both: max-w-3xl would squeeze the\n side rail to a sliver and wrap every label in it. */}\n <div className={`w-full ${embedded ? 'space-y-3' : entityDef.formColumns === 2 ? 'max-w-6xl space-y-5' : 'max-w-3xl space-y-5'}`}>\n {header}\n {/* Breadcrumb + subtitle — hidden in embedded mode or when a parent owns the header */}\n {/* Form */}\n <form onSubmit={handleSubmit} className={embedded ? 'space-y-3' : 'space-y-5'}>\n {renderFormBody(entityDef.layout)}\n\n {/* Submit — embedded forms keep inline buttons; full-page forms use the floating SaveBar */}\n {embedded && (\n <div className=\"flex items-center justify-end gap-2 pt-1\">\n <Button type=\"button\" variant=\"outline\" size=\"sm\" onClick={onCancel} disabled={saving}>{t('common.cancel')}</Button>\n <Button type=\"submit\" size=\"sm\" disabled={saving}>\n {saving && <Loader2 className=\"animate-spin mr-1.5 h-3 w-3\" />}\n {saving ? t('common.saving') : mode === 'create' ? t('crud.form.addTitle', { entity: entityDef.name }) : t('crud.form.saveChanges')}\n </Button>\n </div>\n )}\n </form>\n </div>\n </div>\n )\n}\n","import React from 'react'\nimport { Card } from '@fayz-ai/ui'\n\n// ---------------------------------------------------------------------------\n// Esqueletos de carregamento das telas de CRUD.\n//\n// Um esqueleto tem UMA função: prometer a forma que vem a seguir, para a página\n// não saltar quando o dado chega. Por isso são dois e não um — ficha e\n// formulário não têm a mesma forma, e usar o da ficha no formulário promete um\n// herói com avatar e abas onde vão aparecer campos.\n//\n// Estavam escritos à mão dentro do CrudPage, duas vezes, e por serem JSX solto\n// nenhum plugin conseguia reaproveitá-los: a edição de produto do estoque\n// ficava com a área em branco enquanto carregava, que é a mesma tela sem a\n// promessa.\n// ---------------------------------------------------------------------------\n\n/** Migalha \"Pai / Registro\" — a primeira linha de qualquer tela interna. */\nfunction BreadcrumbBar() {\n return (\n <div className=\"flex items-center gap-1.5\">\n <div className=\"h-4 w-20 rounded bg-muted\" />\n <span className=\"text-muted-foreground\">/</span>\n <div className=\"h-4 w-28 rounded bg-muted\" />\n </div>\n )\n}\n\nexport interface CrudSkeletonProps {\n /** Esconde a migalha quando quem chama já desenhou a sua. */\n hideBreadcrumb?: boolean\n}\n\n/**\n * Ficha de um registro: herói (avatar, nome, selo), abas e linhas de campo.\n */\nexport function CrudDetailSkeleton({ hideBreadcrumb }: CrudSkeletonProps = {}) {\n return (\n <div className=\"space-y-6 animate-pulse\">\n {!hideBreadcrumb && <BreadcrumbBar />}\n <div className=\"flex items-start gap-5\">\n <div className=\"h-20 w-20 shrink-0 rounded-2xl bg-muted\" />\n <div className=\"flex-1 space-y-2 pt-1\">\n <div className=\"h-7 w-48 rounded bg-muted\" />\n <div className=\"h-4 w-32 rounded bg-muted\" />\n <div className=\"mt-1 h-5 w-16 rounded-full bg-muted\" />\n </div>\n <div className=\"flex shrink-0 gap-2\">\n <div className=\"h-9 w-20 rounded-md bg-muted\" />\n <div className=\"h-9 w-9 rounded-md bg-muted\" />\n </div>\n </div>\n <div className=\"h-px bg-border\" />\n <div className=\"flex gap-2\">\n <div className=\"h-8 w-20 rounded bg-muted\" />\n <div className=\"h-8 w-24 rounded bg-muted\" />\n </div>\n <Card>\n <div className=\"divide-y\">\n {Array.from({ length: 4 }).map((_, i) => (\n <div key={i} className=\"grid grid-cols-3 gap-4 px-5 py-3\">\n <div className=\"h-4 w-20 rounded bg-muted\" />\n <div className=\"col-span-2 h-4 w-32 rounded bg-muted\" />\n </div>\n ))}\n </div>\n </Card>\n </div>\n )\n}\n\nexport interface CrudFormSkeletonProps extends CrudSkeletonProps {\n /** Quantas seções o formulário costuma ter. Default 2. */\n groups?: number\n /** Formulário de duas colunas (com trilha lateral). */\n twoColumn?: boolean\n}\n\n/**\n * Formulário: seções com pares rótulo+campo, na mesma largura em que o\n * formulário de verdade vai abrir.\n */\nexport function CrudFormSkeleton({ hideBreadcrumb, groups = 2, twoColumn }: CrudFormSkeletonProps = {}) {\n const section = (key: number, rows: number) => (\n <Card key={key} className=\"p-5\">\n <div className=\"mb-4 h-4 w-32 rounded bg-muted\" />\n <div className=\"grid gap-4 sm:grid-cols-2\">\n {Array.from({ length: rows }).map((_, i) => (\n <div key={i} className=\"space-y-1.5\">\n <div className=\"h-3 w-24 rounded bg-muted\" />\n <div className=\"h-9 w-full rounded-input bg-muted\" />\n </div>\n ))}\n </div>\n </Card>\n )\n\n const main = <div className=\"space-y-5\">{Array.from({ length: groups }).map((_, i) => section(i, i === 0 ? 4 : 2))}</div>\n\n return (\n <div className=\"w-full animate-pulse\">\n <div className={`mx-auto w-full space-y-5 ${twoColumn ? 'max-w-6xl' : 'max-w-3xl'}`}>\n {!hideBreadcrumb && <BreadcrumbBar />}\n {twoColumn ? (\n <div className=\"grid gap-5 lg:grid-cols-3\">\n <div className=\"lg:col-span-2\">{main}</div>\n <div className=\"space-y-5\">{section(99, 2)}</div>\n </div>\n ) : main}\n </div>\n </div>\n )\n}\n","import React from 'react'\nimport type { FieldDef } from '@fayz-ai/core'\nimport { Badge } from '@fayz-ai/ui'\nimport { RelationCell } from './relation-field'\nimport {\n formatCurrency as formatCurrencyLocale,\n formatDate as formatDateLocale,\n formatDateTime as formatDateTimeLocale,\n} from '@fayz-ai/core'\n\nfunction formatCurrency(value: any, currency?: string): string {\n const num = typeof value === 'number' ? value : parseFloat(value)\n if (isNaN(num)) return '—'\n return formatCurrencyLocale(num, currency)\n}\n\nfunction formatDate(value: any): string {\n if (!value) return '—'\n return formatDateLocale(value)\n}\n\nfunction formatDateTime(value: any): string {\n if (!value) return '—'\n return formatDateTimeLocale(value)\n}\n\nexport interface ColumnDef {\n key: string\n label: string\n sortable: boolean\n render: (value: any, row: any) => React.ReactNode\n}\n\nexport interface FieldToColumnsOptions {\n /** Callback for inline field updates (e.g. toggle active) */\n onInlineUpdate?: (id: string, field: string, value: any) => void\n}\n\nfunction InlineToggle({ checked, onChange }: { checked: boolean; onChange: (val: boolean) => void }) {\n return (\n <button\n type=\"button\"\n role=\"switch\"\n aria-checked={checked}\n onClick={(e) => { e.stopPropagation(); onChange(!checked) }}\n className={`relative inline-flex h-5 w-9 shrink-0 cursor-pointer rounded-full border-2 border-transparent transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 ${\n checked ? 'bg-primary' : 'bg-muted'\n }`}\n >\n <span\n className={`pointer-events-none block h-4 w-4 rounded-full bg-white shadow-lg ring-0 transition-transform ${\n checked ? 'translate-x-4' : 'translate-x-0'\n }`}\n />\n </button>\n )\n}\n\nexport function fieldToColumns(fields: FieldDef[], options?: FieldToColumnsOptions): ColumnDef[] {\n return fields\n .filter((f) => f.showInTable !== false)\n .map((field): ColumnDef => {\n const sortable = field.sortable ?? ['text', 'number', 'currency', 'date', 'datetime', 'email'].includes(field.type)\n\n const render = field.renderCell ?? ((value: any, row: any): React.ReactNode => {\n if (value == null || value === '') return <span className=\"text-muted-foreground\">—</span>\n\n switch (field.type) {\n case 'currency':\n return <span>{formatCurrency(value, field.currency)}</span>\n case 'date':\n return <span>{formatDate(value)}</span>\n case 'datetime':\n return <span>{formatDateTime(value)}</span>\n case 'boolean':\n if (field.inlineToggle && options?.onInlineUpdate) {\n const handler = options.onInlineUpdate\n return (\n <InlineToggle\n checked={!!value}\n onChange={(val) => handler(row.id, field.key, val)}\n />\n )\n }\n return value ? (\n <svg className=\"h-4 w-4 text-success\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\">\n <polyline points=\"20 6 9 17 4 12\" />\n </svg>\n ) : (\n <span className=\"text-muted-foreground\">—</span>\n )\n case 'color':\n return (\n <span className=\"inline-flex items-center gap-1.5\">\n <span className=\"h-4 w-4 rounded-full border shrink-0\" style={{ backgroundColor: String(value) }} />\n <span className=\"text-xs text-muted-foreground\">{String(value)}</span>\n </span>\n )\n case 'relation':\n return <RelationCell relation={field.relation} value={value} />\n case 'select':\n return <Badge variant=\"secondary\">{String(value)}</Badge>\n case 'number':\n return <span>{typeof value === 'number' ? value.toLocaleString() : value}</span>\n default:\n return <span>{String(value)}</span>\n }\n })\n\n return { key: field.key, label: field.label, sortable, render }\n })\n}\n","import React from 'react'\nimport { Package } from 'lucide-react'\nimport { Card, getLucideIcon } from '@fayz-ai/ui'\nimport { Badge } from '@fayz-ai/ui'\nimport type { FieldDef, EntityDef } from '@fayz-ai/core'\nimport { formatCurrency, formatDate } from '@fayz-ai/core'\n\ninterface CrudCardGridProps<T> {\n items: T[]\n entityDef: EntityDef<T>\n onEdit: (item: T) => void\n onDelete: (item: T) => void\n}\n\nfunction formatValue(field: FieldDef, value: any): React.ReactNode {\n if (value == null || value === '') return null\n\n switch (field.type) {\n case 'currency': {\n const num = typeof value === 'number' ? value : parseFloat(value)\n if (isNaN(num)) return null\n return formatCurrency(num, field.currency)\n }\n case 'date':\n try { return formatDate(value) }\n catch { return String(value) }\n case 'boolean':\n return value ? 'Yes' : 'No'\n case 'select':\n return <Badge variant=\"secondary\" className=\"text-[10px]\">{String(value)}</Badge>\n case 'image':\n return null\n default:\n return String(value)\n }\n}\n\nexport function CrudCardGrid<T extends { id: string }>({ items, entityDef, onEdit, onDelete }: CrudCardGridProps<T>) {\n const displayField = entityDef.displayField ?? entityDef.fields[0]?.key ?? 'id'\n const imageField = entityDef.imageField\n const entityIcon = entityDef.icon\n const IconComponent = getLucideIcon(entityIcon) ?? Package\n const visibleFields = entityDef.fields.filter(\n (f) => f.showInTable !== false && f.key !== displayField && f.key !== imageField && f.type !== 'image'\n )\n\n return (\n <div className=\"grid gap-3 sm:grid-cols-2 lg:grid-cols-3\">\n {items.map((item) => {\n const record = item as any\n const imageUrl = imageField ? record[imageField] : null\n\n return (\n <Card\n key={record.id}\n className=\"flex items-center gap-4 p-3 cursor-pointer hover:bg-muted/30 transition-colors\"\n onClick={() => onEdit(item)}\n >\n {/* Thumbnail or icon */}\n {imageUrl ? (\n <img\n src={imageUrl}\n alt={record[displayField] ?? ''}\n className=\"h-14 w-14 shrink-0 rounded-lg object-cover\"\n />\n ) : (\n <div className=\"flex h-14 w-14 shrink-0 items-center justify-center rounded-lg bg-muted/50\">\n <IconComponent className=\"h-6 w-6 text-muted-foreground/40\" />\n </div>\n )}\n\n {/* Content */}\n <div className=\"flex-1 min-w-0\">\n <h3 className=\"text-sm font-semibold truncate\">{record[displayField] ?? record.id}</h3>\n <div className=\"flex items-center gap-2 mt-0.5 flex-wrap\">\n {visibleFields.slice(0, 3).map((field) => {\n const val = formatValue(field, record[field.key])\n if (val == null) return null\n return (\n <span key={field.key} className=\"text-xs text-muted-foreground\">\n {val}\n </span>\n )\n })}\n </div>\n </div>\n </Card>\n )\n })}\n </div>\n )\n}\n","import * as React from 'react'\nimport type { PermissionAction } from '@fayz-ai/core'\nimport { usePermissionOptional } from './context'\n\ninterface PermissionGateProps {\n feature: string\n action: PermissionAction\n children: React.ReactNode\n fallback?: React.ReactNode\n}\n\n/** Renders children only when the current user has the given feature+action. */\nexport function PermissionGate({ feature, action, children, fallback }: PermissionGateProps) {\n const can = usePermissionOptional()\n if (!can(feature, action)) return <>{fallback ?? null}</>\n return <>{children}</>\n}\n","import * as React from 'react'\nimport { UpgradePrompt } from './UpgradePrompt'\nimport { useAccessOptional, useLimit, useUpgradeModalStore } from './access-contract'\n\n// ---------------------------------------------------------------------------\n// EntitlementGate — plan-level gate. Renders children only when the current\n// plan entitles `feature`; otherwise the fallback (default: an inline\n// UpgradePrompt). Role gating stays with the native PermissionGate — this is\n// strictly the plan axis.\n// ---------------------------------------------------------------------------\n\nexport interface EntitlementGateProps {\n feature: string\n children: React.ReactNode\n fallback?: React.ReactNode\n}\n\nexport function EntitlementGate({ feature, children, fallback }: EntitlementGateProps) {\n const access = useAccessOptional()\n if (access.entitled(feature)) return <>{children}</>\n return <>{fallback ?? <UpgradePrompt inline feature={feature} />}</>\n}\n\n// ---------------------------------------------------------------------------\n// LimitGate — quantity cap gate for \"+ Add\" style actions. When the limit is\n// reached, the children are dimmed and any click is intercepted (capture phase)\n// to open the global UpgradeModal instead of firing the underlying handler.\n// Below the cap it's a transparent pass-through.\n// ---------------------------------------------------------------------------\n\nexport interface LimitGateProps {\n limitKey: string\n children: React.ReactNode\n className?: string\n}\n\nexport function LimitGate({ limitKey, children, className }: LimitGateProps) {\n const limit = useLimit(limitKey)\n const openModal = useUpgradeModalStore((s) => s.open)\n\n if (!limit.atLimit) return <>{children}</>\n\n const intercept = (e: React.MouseEvent) => {\n e.preventDefault()\n e.stopPropagation()\n openModal({ limitKey })\n }\n\n return (\n <span\n className={className}\n onClickCapture={intercept}\n style={{ cursor: 'not-allowed' }}\n // Dim to signal the cap while keeping the trigger discoverable.\n data-limit-reached=\"\"\n >\n <span className=\"pointer-events-none opacity-60\" aria-disabled>\n {children}\n </span>\n </span>\n )\n}\n","import React, { useMemo } from 'react'\nimport { AlertTriangle, ArrowDown, ArrowUp, ArrowUpDown, Check, Download, Inbox, RefreshCw, Search, Upload } from 'lucide-react'\nimport * as LucideIcons from 'lucide-react'\nimport type { ColumnDef as TanStackColumnDef } from '@tanstack/react-table'\nimport { useTranslation } from '@fayz-ai/core'\nimport type { EntityDef } from '@fayz-ai/core'\nimport { Card } from '@fayz-ai/ui'\nimport { Button } from '@fayz-ai/ui'\nimport { DataTable } from '@fayz-ai/ui'\nimport { Dropdown, DropdownTrigger, DropdownContent, DropdownItem, DropdownLabel, DropdownSeparator } from '@fayz-ai/ui'\nimport { FilterChip, HeaderTabs, Hint, StatTiles, cn, type HeaderTab, type StatTileData } from '@fayz-ai/ui'\nimport { fieldToColumns } from './fieldToColumn'\nimport { CrudCardGrid } from './CrudCardGrid'\nimport { PermissionGate } from '../permissions/PermissionGate'\nimport { LimitGate } from '../components/billing/gates'\n\n/** A resolved facet: a field plus the options to render. */\nexport interface CrudFacet {\n field: string\n options: { value: string; label: string }[]\n allLabel?: string\n /** Nome acessível do filtro (\"Status\"). A pastilha mostra o VALOR escolhido,\n * então sem isto um leitor de tela anunciaria só \"Ativo\". */\n label?: string\n /** 'tabs' promotes this facet into the header strip. See EntityDef.facets. */\n display?: 'pills' | 'tabs'\n}\n\n/**\n * A sibling list this one sits beside — rendered in the header strip next to (or\n * instead of) the facet tabs, as a link rather than a filter. This is what turns\n * Clientes / Grupos / Segmentos into one destination with three views instead of\n * three unrelated sidebar entries.\n */\nexport interface CrudNavTab {\n id: string\n label: string\n icon?: React.ComponentType<{ className?: string }>\n /** Fires when the tab is picked. The active tab's handler is never called. */\n onSelect: () => void\n}\n\n/** Sentinel for the facet tab that clears the filter — no field value is ''. */\nconst ALL_TAB = '__all__'\n\n/** The entity's own lucide icon, for its empty state. Resolved by name off the\n * lucide export map rather than a curated table: every EntityDef already\n * carries an icon name, and a second hand-maintained map is a second place for\n * a new entity to silently fall back to a generic box. */\nfunction getEntityIcon(name: string): React.ComponentType<{ className?: string; strokeWidth?: number }> {\n const icons = LucideIcons as unknown as Record<string, React.ComponentType<{ className?: string; strokeWidth?: number }>>\n return icons[name] ?? Inbox\n}\n\nexport interface CrudListViewProps<T extends { id: string }> {\n entityDef: EntityDef<T>\n /** TanStack columns. When omitted, derived from entityDef.fields (no actions column). */\n columns?: TanStackColumnDef<T, any>[]\n /** null = initial load (skeleton); [] = empty state. */\n items: T[] | null\n total: number\n display?: 'table' | 'cards'\n /** Search box — rendered when onSearchChange is provided. */\n search?: string\n onSearchChange?: (value: string) => void\n searchPlaceholder?: string\n /** Facet pills below the search box. */\n facets?: CrudFacet[]\n activeFilters?: Record<string, string | undefined>\n onFacetChange?: (field: string, value: string | undefined) => void\n onNew?: () => void\n addLabel?: string\n onRowClick?: (row: T) => void\n /** Delete action for the card grid (table actions live in the columns). */\n onDelete?: (row: T) => void\n onImport?: () => void\n onExport?: () => void\n feature?: string\n readOnly?: boolean\n emptyMessage?: string\n /** Sibling views shown as header tabs. `activeNavTab` marks which is this one. */\n navTabs?: CrudNavTab[]\n activeNavTab?: string\n /** Extra controls placed in the header action row, before the New button. */\n headerActions?: React.ReactNode\n /** Summary tiles between the header and the table. */\n stats?: StatTileData[]\n /** Refetch the list. Renders the toolbar's refresh button when provided. */\n onRefresh?: () => void\n /** Sort by a field key. Called again with the same key to flip direction. */\n onSort?: (field: string) => void\n /** Pick the sort FIELD without touching the direction. Falls back to onSort. */\n onSortField?: (field: string) => void\n /** Set the direction explicitly (the menu says \"Crescente\"/\"Decrescente\"). */\n onSortDir?: (dir: 'asc' | 'desc') => void\n sortBy?: string\n sortDir?: 'asc' | 'desc'\n /** Last read failure. Renders a banner above the table so a broken list is\n * never mistaken for an empty one. */\n error?: string | null\n}\n\n/**\n * The canonical generic list — header (count + New + import/export), search,\n * faceted filter pills, and a DataTable/card grid. Decoupled from data and\n * routing: feed it `items` and callbacks. Used by CrudPage (store-backed) and by\n * plugins that own their data/routing (e.g. the inventory product list).\n */\nexport function CrudListView<T extends { id: string }>({\n entityDef,\n columns,\n items,\n total,\n display = 'table',\n search,\n onSearchChange,\n searchPlaceholder,\n facets,\n activeFilters,\n onFacetChange,\n onNew,\n addLabel,\n onRowClick,\n onDelete,\n onImport,\n onExport,\n feature,\n readOnly,\n emptyMessage,\n navTabs,\n activeNavTab,\n headerActions,\n stats,\n onRefresh,\n onSort,\n onSortField,\n onSortDir,\n sortBy,\n sortDir,\n error,\n}: CrudListViewProps<T>) {\n const t = useTranslation()\n const namePlural = entityDef.namePlural ?? entityDef.name + 's'\n const displayField = entityDef.displayField ?? entityDef.fields[0]?.key ?? 'id'\n\n const derivedColumns = useMemo<TanStackColumnDef<T, any>[]>(() => {\n return fieldToColumns(entityDef.fields).map((col) => ({\n accessorKey: col.key,\n header: col.label,\n // A ordenação NÃO mora na coluna. Com uma setinha por cabeçalho, a linha\n // de títulos vira uma fileira de controles e ainda assim só ordena pelo\n // que está visível — o dropdown de ordenar ao lado da busca lista todos\n // os campos e diz a direção com todas as letras.\n enableSorting: false,\n cell: ({ row }: any) => {\n const value = row.original[col.key]\n const rendered = col.render(value, row.original)\n return col.key === displayField\n ? <span className=\"font-medium text-foreground\">{rendered}</span>\n : rendered\n },\n }))\n }, [entityDef.fields, displayField])\n\n const tanColumns = columns ?? derivedColumns\n\n const isInitialLoad = items === null\n const isEmpty = items !== null && items.length === 0\n const hasImportExport = Boolean(onImport || onExport)\n\n // The header strip. Sibling views (navTabs) outrank a status facet for the\n // slot: they change WHAT you're looking at, the facet only narrows it, and\n // stacking both would put two tab strips in one header. A list with both\n // keeps the facet as pills in the body, where it already lived.\n const facetTab = facets?.find((f) => f.display === 'tabs')\n const headerTabs: HeaderTab[] | null = navTabs?.length\n ? navTabs.map((t) => ({ value: t.id, label: t.label, icon: t.icon }))\n : facetTab\n ? [\n { value: ALL_TAB, label: facetTab.allLabel ?? t('crud.list.allFacet') },\n ...facetTab.options.map((o) => ({ value: o.value, label: o.label })),\n ]\n : null\n const headerTabValue = navTabs?.length\n ? (activeNavTab ?? navTabs[0]!.id)\n : (activeFilters?.[facetTab?.field ?? ''] ?? ALL_TAB)\n const onHeaderTabChange = (next: string) => {\n if (navTabs?.length) navTabs.find((t) => t.id === next)?.onSelect()\n else if (facetTab) onFacetChange?.(facetTab.field, next === ALL_TAB ? undefined : next)\n }\n // Facets still rendered as pills below the search box — everything the header\n // strip did not take.\n const pillFacets = facets?.filter((f) => f !== facetTab)\n\n const newButton = onNew && !readOnly\n ? <Button onClick={onNew}>{addLabel ?? t('crud.list.addEntity', { entity: entityDef.name })}</Button>\n : null\n\n // Compose the create action's gates: RBAC (PermissionGate, role axis) then the\n // plan quantity cap (LimitGate, plan axis). At the cap, LimitGate dims the\n // button and intercepts the click to open the global UpgradeModal.\n const gatedNewButton = newButton\n ? (() => {\n const roleGated = feature\n ? <PermissionGate feature={feature} action=\"create\">{newButton}</PermissionGate>\n : newButton\n return entityDef.limitKey\n ? <LimitGate limitKey={entityDef.limitKey}>{roleGated}</LimitGate>\n : roleGated\n })()\n : null\n\n // An empty list is the screen a merchant sees FIRST, on every entity, before\n // they have done anything. A one-line \"no results\" in a table cell wastes it;\n // this says what the thing is and offers the one action that fixes it.\n const isFiltered = Boolean(search?.trim()) ||\n Object.values(activeFilters ?? {}).some((v) => v != null)\n const EmptyIcon = getEntityIcon(entityDef.icon)\n const emptyState = (\n <div className=\"flex flex-col items-center gap-1 py-6\">\n <EmptyIcon className=\"mb-2 h-9 w-9 text-muted-foreground/40\" strokeWidth={1.5} />\n <p className=\"text-base font-semibold text-foreground\">\n {emptyMessage ?? (isFiltered\n ? t('crud.list.emptyFiltered', { entities: namePlural.toLowerCase() })\n : t('crud.list.empty', { entities: namePlural.toLowerCase() }))}\n </p>\n {/* Under a filter the fix is to clear it, not to create a record — so the\n create button stays out of the way there. */}\n {!isFiltered && (\n <>\n <p className=\"max-w-sm text-sm text-muted-foreground\">\n {t('crud.list.emptyHint', { entities: namePlural.toLowerCase() })}\n </p>\n {gatedNewButton && <div className=\"mt-3\">{gatedNewButton}</div>}\n </>\n )}\n </div>\n )\n\n // Import is a page-level act (it opens a wizard and creates records), so it\n // stays in the header. Export/refresh/sort act on the rows in front of you\n // and move down into the table toolbar, next to the search that filters them.\n // Import sits left of a hairline divider, the create action right of it: one\n // brings records in from elsewhere, the other makes a new one here. Export,\n // refresh and sort are NOT here — they act on the rows in front of you, so\n // they live in the table toolbar next to the search that filters them.\n const actions = (\n <div className=\"flex items-center gap-2\">\n {headerActions}\n {onImport && (\n <Button variant=\"outline\" onClick={onImport}>\n <Upload className=\"mr-2 h-4 w-4\" />\n {t('crud.import.action')}\n </Button>\n )}\n {onImport && gatedNewButton && <span className=\"h-6 w-px bg-border\" aria-hidden />}\n {gatedNewButton}\n </div>\n )\n\n // Ordenável ≠ visível. Enquanto a ordenação morava no cabeçalho da tabela as\n // duas coisas eram a mesma — só dava para ordenar pelo que estava desenhado.\n // Fora do cabeçalho, esconder uma coluna não tem por que tirar o campo do\n // menu; e \"criado em\"/\"última edição\", que quase nenhuma lista mostra, são\n // justamente por onde mais se quer ordenar.\n const sortableColumns = useMemo(() => {\n const declared = entityDef.fields\n .filter((f) => f.sortable !== false)\n .map((f) => ({ key: f.key, label: f.label }))\n const has = new Set(declared.map((f) => f.key))\n\n // Só oferecidos se o registro REALMENTE os carrega — um item do menu que\n // não muda a ordem é pior que a ausência dele.\n const sample = items?.[0] as Record<string, unknown> | undefined\n const implicit = [\n { key: 'createdAt', label: t('crud.list.sortCreatedAt') },\n { key: 'updatedAt', label: t('crud.list.sortUpdatedAt') },\n ].filter((f) => !has.has(f.key) && sample != null && sample[f.key] != null)\n\n return [...declared, ...implicit]\n }, [entityDef.fields, items, t])\n\n const iconBtn = 'flex h-8 w-8 shrink-0 items-center justify-center rounded-md text-muted-foreground transition-colors hover:bg-muted hover:text-foreground'\n\n const searchBox = onSearchChange ? (\n <div className=\"relative\">\n <Search className=\"pointer-events-none absolute left-2.5 top-1/2 h-3.5 w-3.5 -translate-y-1/2 text-muted-foreground\" />\n <input\n type=\"text\"\n placeholder={searchPlaceholder ?? t('crud.list.search', { entities: namePlural.toLowerCase() })}\n value={search ?? ''}\n onChange={(e) => onSearchChange(e.target.value)}\n // Borderless on purpose: the card already draws the boundary, and a\n // second box inside it would be a frame inside a frame.\n className=\"w-full bg-transparent py-1.5 pl-8 pr-3 text-sm placeholder:text-muted-foreground focus:outline-none\"\n />\n </div>\n ) : null\n\n // Um filtro = uma pastilha, ao lado da busca. Ver FilterChip: a fileira de\n // opções abertas empurrava a tabela para baixo com opções que não interessam\n // depois de escolhida.\n // Um filtro sem opções não filtra nada: renderizá-lo daria uma pastilha que\n // abre um menu vazio.\n const usableFacets = pillFacets?.filter((f) => f.options.length > 0)\n const facetChips = usableFacets && usableFacets.length > 0 ? (\n <div className=\"flex shrink-0 flex-wrap items-center gap-1.5\">\n {usableFacets.map((facet) => (\n <FilterChip\n key={facet.field}\n label={facet.label}\n allLabel={facet.allLabel ?? t('crud.list.allFacet')}\n options={facet.options}\n value={activeFilters?.[facet.field]}\n onChange={(next) => onFacetChange?.(facet.field, next)}\n />\n ))}\n </div>\n ) : null\n\n const tableTools = (onSort || onRefresh || onExport) ? (\n <div className=\"flex shrink-0 items-center gap-0.5\">\n {onSort && sortableColumns.length > 0 && (\n <Dropdown>\n <DropdownTrigger asChild>\n <Hint label={t('crud.list.sort')}>\n <button\n type=\"button\"\n aria-label={t('crud.list.sort')}\n className={cn(iconBtn, sortBy && 'text-foreground')}\n >\n {/* O ícone já mostra a direção em vigor: com a ordenação escondida\n num menu, um ↕ neutro deixaria \"ordenado por quê, para que\n lado\" invisível até abrir o menu. */}\n {sortBy\n ? (sortDir === 'desc' ? <ArrowDown className=\"h-4 w-4\" /> : <ArrowUp className=\"h-4 w-4\" />)\n : <ArrowUpDown className=\"h-4 w-4\" />}\n </button>\n </Hint>\n </DropdownTrigger>\n <DropdownContent align=\"end\">\n <DropdownLabel>{t('crud.list.sortBy')}</DropdownLabel>\n {sortableColumns.map((f) => (\n <DropdownItem key={f.key} onClick={() => onSortField?.(f.key)}>\n {f.label}\n {sortBy === f.key && <Check className=\"ml-auto h-3.5 w-3.5 shrink-0 pl-1\" />}\n </DropdownItem>\n ))}\n {sortBy && (\n <>\n <DropdownSeparator />\n {/* Ascendente/descendente escrito, não um símbolo: \"↑\" não diz\n se é A→Z ou Z→A para quem chega na tela. */}\n <DropdownItem onClick={() => onSortDir?.('asc')}>\n <ArrowUp className=\"mr-2 h-3.5 w-3.5 shrink-0 text-muted-foreground\" />\n {t('crud.list.sortAsc')}\n {sortDir !== 'desc' && <Check className=\"ml-auto h-3.5 w-3.5 shrink-0 pl-1\" />}\n </DropdownItem>\n <DropdownItem onClick={() => onSortDir?.('desc')}>\n <ArrowDown className=\"mr-2 h-3.5 w-3.5 shrink-0 text-muted-foreground\" />\n {t('crud.list.sortDesc')}\n {sortDir === 'desc' && <Check className=\"ml-auto h-3.5 w-3.5 shrink-0 pl-1\" />}\n </DropdownItem>\n </>\n )}\n </DropdownContent>\n </Dropdown>\n )}\n {onRefresh && (\n <Hint label={t('crud.list.refresh')}>\n <button type=\"button\" aria-label={t('crud.list.refresh')} onClick={onRefresh} className={iconBtn}>\n <RefreshCw className=\"h-4 w-4\" />\n </button>\n </Hint>\n )}\n {onExport && (\n <Hint label={t('crud.export.action')}>\n <button type=\"button\" aria-label={t('crud.export.action')} onClick={onExport} className={iconBtn}>\n <Download className=\"h-4 w-4\" />\n </button>\n </Hint>\n )}\n </div>\n ) : null\n\n return (\n <div className=\"space-y-6\">\n {/* No <h1> here. The shell's top bar already names the page from the\n active nav entry, and printing the same word again 60px below it was\n the title twice on every list in the app. This row is tabs-left,\n actions-right; with no tabs it collapses to just the actions. */}\n <div className=\"flex flex-wrap items-center justify-between gap-3\">\n {headerTabs ? (\n <HeaderTabs\n tabs={headerTabs}\n value={headerTabValue}\n onChange={onHeaderTabChange}\n aria-label={namePlural}\n />\n ) : <span />}\n {actions}\n </div>\n\n {error && (\n <div className=\"flex items-start gap-2 rounded-lg border border-destructive/30 bg-destructive/5 px-4 py-3 text-sm\">\n <AlertTriangle className=\"mt-0.5 h-4 w-4 shrink-0 text-destructive\" />\n <div className=\"min-w-0\">\n <p className=\"font-medium text-foreground\">\n {t('crud.list.loadFailed', { entities: namePlural.toLowerCase() })}\n </p>\n {/* The raw message, not a euphemism: \"relation does not exist\" and\n \"permission denied\" need completely different fixes, and only\n the real text tells you which one you have. */}\n <p className=\"mt-0.5 break-words text-muted-foreground\">{error}</p>\n </div>\n {onRefresh && (\n <Button variant=\"outline\" size=\"sm\" className=\"ml-auto shrink-0\" onClick={onRefresh}>\n {t('crud.list.refresh')}\n </Button>\n )}\n </div>\n )}\n\n {stats && stats.length > 0 && <StatTiles tiles={stats} loading={isInitialLoad} />}\n\n {display === 'cards' ? (\n // The card grid keeps the search box floating above it: there is no\n // table chrome for a toolbar to sit flush against.\n <>\n {(searchBox || facetChips) && (\n <div className=\"flex flex-wrap items-center gap-2\">\n {searchBox && <div className=\"min-w-0 max-w-sm flex-1\">{searchBox}</div>}\n {facetChips}\n </div>\n )}\n {isInitialLoad ? (\n <div className=\"grid gap-4 sm:grid-cols-2 lg:grid-cols-3\">\n {Array.from({ length: 2 }).map((_, i) => (\n <Card key={i} className=\"overflow-hidden\">\n <div className=\"p-5 space-y-3\">\n <div className=\"h-5 w-2/3 animate-pulse rounded bg-muted\" />\n <div className=\"space-y-2\">\n <div className=\"flex justify-between\"><div className=\"h-4 w-20 animate-pulse rounded bg-muted\" /><div className=\"h-4 w-16 animate-pulse rounded bg-muted\" /></div>\n <div className=\"flex justify-between\"><div className=\"h-4 w-24 animate-pulse rounded bg-muted\" /><div className=\"h-4 w-12 animate-pulse rounded bg-muted\" /></div>\n </div>\n </div>\n </Card>\n ))}\n </div>\n ) : (\n <CrudCardGrid\n items={items ?? []}\n entityDef={entityDef as EntityDef<any>}\n onEdit={(item) => onRowClick?.(item as T)}\n onDelete={(item) => onDelete?.(item as T)}\n />\n )}\n </>\n ) : (\n /* Search, table tools and the table are ONE surface. They act on the\n same rows, so a search box floating on the page background above a\n separate table card read as two unrelated controls. */\n <Card className=\"overflow-hidden\">\n {(searchBox || facetChips || tableTools) && (\n <div className=\"flex flex-wrap items-center gap-2 border-b border-border px-3 py-2\">\n <div className=\"min-w-[10rem] flex-1\">{searchBox}</div>\n {facetChips}\n {tableTools}\n </div>\n )}\n <DataTable\n variant=\"bare\"\n // A seta no cabeçalho é o rastro do menu de ordenar: ele fecha e,\n // sem ela, nada na tela dizia por qual coluna a lista foi ordenada.\n sortIndicator={sortBy ? { columnId: sortBy, dir: sortDir ?? 'asc' } : undefined}\n columns={tanColumns}\n data={isInitialLoad || isEmpty ? [] : (items ?? [])}\n loading={isInitialLoad}\n skeletonRows={isInitialLoad ? 3 : undefined}\n emptyMessage={emptyState}\n onRowClick={(row) => onRowClick?.(row as T)}\n />\n </Card>\n )}\n </div>\n )\n}\n","import React, { useCallback, useEffect, useState } from 'react'\nimport { MapPin, Star, Pencil, Trash2, Plus } from 'lucide-react'\nimport {\n Card, CardContent, Badge, Button, Input, ConfirmDialog,\n Modal, ModalContent, ModalHeader, ModalTitle, ModalDescription, ModalFooter,\n Select, SelectTrigger, SelectValue, SelectContent, SelectItem,\n} from '@fayz-ai/ui'\nimport { getSupabaseClientOptional, getActiveTenantId, useTranslation } from '@fayz-ai/core'\nimport { toast } from '../../components/notifications/ToastProvider'\n\n// ---------------------------------------------------------------------------\n// Addresses tab — generic on purpose. public.addresses is a CORE table (spine\n// migration @fayz-ai/db 017_core_addresses), so any app with a person record\n// gets this: a client's delivery addresses, a supplier's pickup point, a staff\n// member's home address. Nothing here is shop-specific.\n//\n// Rows are read by owner_id alone, without an owner_type filter, because a\n// person can be reached from two sides today: a core `people` row, or a\n// module's own customer row that mirrors it (the shop's plg_shop_customers\n// keeps the same id). Both resolve to the same address book. Rows WRITTEN here\n// are stamped 'person' — the spine's canonical owner kind.\n// ---------------------------------------------------------------------------\n\nexport interface AddressRow {\n id: string\n label: string | null\n recipient: string | null\n phone: string | null\n postal_code: string\n street: string\n number: string | null\n complement: string | null\n district: string | null\n city: string\n state: string\n country: string\n is_default: boolean\n kind: string\n}\n\n/** The editable shape. Separate from AddressRow: no id, every field a string. */\ninterface AddressForm {\n label: string\n kind: string\n recipient: string\n phone: string\n postal_code: string\n street: string\n number: string\n complement: string\n district: string\n city: string\n state: string\n is_default: boolean\n}\n\nconst EMPTY_FORM: AddressForm = {\n label: '', kind: 'both', recipient: '', phone: '', postal_code: '', street: '',\n number: '', complement: '', district: '', city: '', state: '', is_default: false,\n}\n\nfunction toForm(a: AddressRow): AddressForm {\n return {\n label: a.label ?? '', kind: a.kind, recipient: a.recipient ?? '', phone: a.phone ?? '',\n postal_code: a.postal_code, street: a.street, number: a.number ?? '',\n complement: a.complement ?? '', district: a.district ?? '', city: a.city,\n state: a.state, is_default: a.is_default,\n }\n}\n\nconst SPAN_CLASS: Record<number, string> = {\n 1: 'sm:col-span-1', 2: 'sm:col-span-2', 3: 'sm:col-span-3',\n 4: 'sm:col-span-4', 6: 'sm:col-span-6',\n}\n\n/** Label + control, wired by htmlFor/id so the label is actually clickable and\n * the control is reachable by its accessible name. */\nfunction Field({ id, label, required, span, children }: {\n id: string\n label: string\n required?: boolean\n span: number\n children: React.ReactNode\n}) {\n return (\n <div className={SPAN_CLASS[span]}>\n <label htmlFor={`address-${id}`} className=\"text-xs text-muted-foreground\">\n {label}{required ? ' *' : ''}\n </label>\n {children}\n </div>\n )\n}\n\nfunction formatLine(a: AddressRow): string {\n // Rua, número — complemento · bairro · cidade/UF · CEP, skipping whatever is\n // missing so a partial address never renders stray commas.\n const streetLine = [a.street, a.number].filter(Boolean).join(', ')\n const withComplement = a.complement ? `${streetLine} — ${a.complement}` : streetLine\n return [withComplement, a.district, `${a.city}/${a.state}`, a.postal_code]\n .filter((part) => part && part !== '—' && part !== '/')\n .join(' · ')\n}\n\nexport function AddressesTab({ item }: { item?: unknown }) {\n const t = useTranslation()\n const record = item as { id?: string } | undefined\n const [rows, setRows] = useState<AddressRow[]>([])\n const [loading, setLoading] = useState(true)\n const [error, setError] = useState<string | null>(null)\n\n const [editing, setEditing] = useState<AddressRow | null>(null)\n const [formOpen, setFormOpen] = useState(false)\n const [form, setForm] = useState<AddressForm>(EMPTY_FORM)\n const [saving, setSaving] = useState(false)\n const [deleting, setDeleting] = useState<AddressRow | null>(null)\n\n const ownerId = record?.id\n\n // getSupabaseClientOptional is loosely typed at this layer; the query shape is\n // asserted here rather than pulling supabase-js into the UI package.\n const db = () => getSupabaseClientOptional() as unknown as { from: (t: string) => any } | null\n\n const load = useCallback(async () => {\n const client = db()\n if (!client || !ownerId) { setLoading(false); return }\n setLoading(true)\n setError(null)\n const { data, error: err } = await client\n .from('addresses')\n .select('*')\n .eq('owner_id', ownerId)\n .order('is_default', { ascending: false })\n if (err) setError(err.message)\n else setRows((data ?? []) as AddressRow[])\n setLoading(false)\n }, [ownerId])\n\n useEffect(() => { void load() }, [load])\n\n const openCreate = () => { setEditing(null); setForm(EMPTY_FORM); setFormOpen(true) }\n const openEdit = (a: AddressRow) => { setEditing(a); setForm(toForm(a)); setFormOpen(true) }\n\n const set = <K extends keyof AddressForm>(key: K, value: AddressForm[K]) =>\n setForm((prev) => ({ ...prev, [key]: value }))\n\n // CEP, street and city are what make an address findable; the rest is optional.\n const canSave = form.postal_code.trim() !== '' && form.street.trim() !== '' && form.city.trim() !== ''\n\n const handleSave = async () => {\n const client = db()\n if (!client || !ownerId || !canSave) return\n const tenantId = getActiveTenantId()\n if (!tenantId) { toast.error(t('crud.archetype.addresses.noTenant')); return }\n\n setSaving(true)\n try {\n const values = {\n label: form.label.trim() || null,\n kind: form.kind,\n recipient: form.recipient.trim() || null,\n phone: form.phone.trim() || null,\n postal_code: form.postal_code.trim(),\n street: form.street.trim(),\n number: form.number.trim() || null,\n complement: form.complement.trim() || null,\n district: form.district.trim() || null,\n city: form.city.trim(),\n state: form.state.trim().toUpperCase(),\n is_default: form.is_default,\n }\n\n // addresses_one_default_idx is a UNIQUE partial index on\n // (owner_type, owner_id, kind) WHERE is_default — the previous default\n // must be cleared BEFORE this row claims the flag, or the write fails.\n if (form.is_default) {\n let q = client.from('addresses').update({ is_default: false })\n .eq('owner_id', ownerId).eq('kind', form.kind).eq('is_default', true)\n if (editing) q = q.neq('id', editing.id)\n const { error: clearErr } = await q\n if (clearErr) throw clearErr\n }\n\n const { error: err } = editing\n ? await client.from('addresses').update(values).eq('id', editing.id)\n : await client.from('addresses').insert({\n ...values,\n tenant_id: tenantId,\n owner_type: 'person',\n owner_id: ownerId,\n })\n if (err) throw err\n\n setFormOpen(false)\n await load()\n toast.success(editing ? t('crud.archetype.addresses.updated') : t('crud.archetype.addresses.created'))\n } catch (e: any) {\n toast.error(t('crud.archetype.addresses.saveFailed'), { description: e?.message })\n } finally {\n setSaving(false)\n }\n }\n\n const handleDelete = async () => {\n const client = db()\n if (!client || !deleting) return\n const { error: err } = await client.from('addresses').delete().eq('id', deleting.id)\n setDeleting(null)\n if (err) { toast.error(t('crud.archetype.addresses.deleteFailed'), { description: err.message }); return }\n await load()\n toast.success(t('crud.archetype.addresses.deleted'))\n }\n\n if (loading) {\n return (\n <Card><CardContent className=\"space-y-2 py-6\">\n <div className=\"h-4 w-56 animate-pulse rounded bg-muted/40\" />\n <div className=\"h-4 w-40 animate-pulse rounded bg-muted/30\" />\n </CardContent></Card>\n )\n }\n\n if (error) {\n return (\n <div className=\"rounded-lg border border-red-200 bg-red-50 px-4 py-3 text-sm text-red-800\">\n <p className=\"font-medium\">{t('crud.archetype.addresses.loadFailed')}</p>\n <p className=\"mt-1 text-red-700\">{error}</p>\n </div>\n )\n }\n\n return (\n <div className=\"space-y-3\">\n <div className=\"flex justify-end\">\n <Button size=\"sm\" onClick={openCreate}>\n <Plus className=\"mr-1.5 h-3.5 w-3.5\" /> {t('crud.archetype.addresses.add')}\n </Button>\n </div>\n\n {rows.length === 0 ? (\n <Card><CardContent className=\"flex flex-col items-center justify-center py-12 text-center\">\n <div className=\"mb-3 flex h-12 w-12 items-center justify-center rounded-full bg-muted\">\n <MapPin className=\"h-5 w-5 text-muted-foreground\" />\n </div>\n <p className=\"text-sm font-medium\">{t('crud.archetype.addresses.emptyTitle')}</p>\n <p className=\"mt-1 max-w-xs text-xs text-muted-foreground\">\n {t('crud.archetype.addresses.emptyDescription')}\n </p>\n </CardContent></Card>\n ) : (\n <div className=\"space-y-2\">\n {rows.map((a) => (\n <Card key={a.id}>\n <CardContent className=\"flex items-start gap-3 py-3\">\n <MapPin className=\"mt-0.5 h-4 w-4 shrink-0 text-muted-foreground\" />\n <div className=\"min-w-0 flex-1\">\n <div className=\"flex flex-wrap items-center gap-2\">\n <span className=\"text-sm font-medium\">\n {a.label ?? t('crud.archetype.addresses.fallbackLabel')}\n </span>\n {a.is_default && (\n <Badge variant=\"secondary\" className=\"gap-1 text-[10px]\">\n <Star className=\"h-2.5 w-2.5\" /> {t('crud.archetype.addresses.default')}\n </Badge>\n )}\n {a.kind !== 'both' && (\n <Badge variant=\"secondary\" className=\"text-[10px]\">\n {t(`crud.archetype.addresses.kind.${a.kind}`)}\n </Badge>\n )}\n </div>\n <p className=\"mt-0.5 text-sm text-muted-foreground\">{formatLine(a)}</p>\n {(a.recipient || a.phone) && (\n <p className=\"mt-0.5 text-xs text-muted-foreground\">\n {[a.recipient, a.phone].filter(Boolean).join(' · ')}\n </p>\n )}\n </div>\n <div className=\"flex shrink-0 gap-1\">\n {/* Named for the ADDRESS, not just \"Editar\": the person\n detail header already owns a plain Editar/Excluir pair,\n and two identical accessible names on one screen is a\n coin flip for a screen reader user. */}\n <Button variant=\"ghost\" size=\"sm\" onClick={() => openEdit(a)}\n aria-label={t('crud.archetype.addresses.editTitle')}>\n <Pencil className=\"h-3.5 w-3.5\" />\n </Button>\n <Button variant=\"ghost\" size=\"sm\" onClick={() => setDeleting(a)}\n aria-label={t('crud.archetype.addresses.deleteTitle')}>\n <Trash2 className=\"h-3.5 w-3.5 text-destructive\" />\n </Button>\n </div>\n </CardContent>\n </Card>\n ))}\n </div>\n )}\n\n <Modal open={formOpen} onOpenChange={setFormOpen}>\n <ModalContent size=\"lg\">\n <ModalHeader>\n <ModalTitle>\n {editing ? t('crud.archetype.addresses.editTitle') : t('crud.archetype.addresses.addTitle')}\n </ModalTitle>\n <ModalDescription>{t('crud.archetype.addresses.formDescription')}</ModalDescription>\n </ModalHeader>\n\n <div className=\"grid grid-cols-1 gap-3 px-6 sm:grid-cols-6\">\n <Field id=\"label\" span={3} label={t('crud.archetype.addresses.field.label')}>\n <Input id=\"address-label\" value={form.label} onChange={(e) => set('label', e.target.value)}\n placeholder={t('crud.archetype.addresses.labelPlaceholder')} />\n </Field>\n <Field id=\"kind\" span={3} label={t('crud.archetype.addresses.field.kind')}>\n <Select value={form.kind} onValueChange={(v: string) => set('kind', v)}>\n <SelectTrigger id=\"address-kind\"><SelectValue /></SelectTrigger>\n <SelectContent>\n <SelectItem value=\"both\">{t('crud.archetype.addresses.kind.both')}</SelectItem>\n <SelectItem value=\"shipping\">{t('crud.archetype.addresses.kind.shipping')}</SelectItem>\n <SelectItem value=\"billing\">{t('crud.archetype.addresses.kind.billing')}</SelectItem>\n </SelectContent>\n </Select>\n </Field>\n\n <Field id=\"postal_code\" span={2} required label={t('crud.archetype.addresses.field.postalCode')}>\n <Input id=\"address-postal_code\" value={form.postal_code}\n onChange={(e) => set('postal_code', e.target.value)} placeholder=\"00000-000\" />\n </Field>\n <Field id=\"street\" span={4} required label={t('crud.archetype.addresses.field.street')}>\n <Input id=\"address-street\" value={form.street} onChange={(e) => set('street', e.target.value)} />\n </Field>\n\n <Field id=\"number\" span={2} label={t('crud.archetype.addresses.field.number')}>\n <Input id=\"address-number\" value={form.number} onChange={(e) => set('number', e.target.value)} />\n </Field>\n <Field id=\"complement\" span={4} label={t('crud.archetype.addresses.field.complement')}>\n <Input id=\"address-complement\" value={form.complement} onChange={(e) => set('complement', e.target.value)} />\n </Field>\n\n <Field id=\"district\" span={3} label={t('crud.archetype.addresses.field.district')}>\n <Input id=\"address-district\" value={form.district} onChange={(e) => set('district', e.target.value)} />\n </Field>\n <Field id=\"city\" span={2} required label={t('crud.archetype.addresses.field.city')}>\n <Input id=\"address-city\" value={form.city} onChange={(e) => set('city', e.target.value)} />\n </Field>\n <Field id=\"state\" span={1} label={t('crud.archetype.addresses.field.state')}>\n <Input id=\"address-state\" value={form.state} onChange={(e) => set('state', e.target.value)}\n maxLength={2} placeholder=\"UF\" />\n </Field>\n\n <Field id=\"recipient\" span={3} label={t('crud.archetype.addresses.field.recipient')}>\n <Input id=\"address-recipient\" value={form.recipient} onChange={(e) => set('recipient', e.target.value)} />\n </Field>\n <Field id=\"phone\" span={3} label={t('crud.archetype.addresses.field.phone')}>\n <Input id=\"address-phone\" value={form.phone} onChange={(e) => set('phone', e.target.value)} />\n </Field>\n\n <label className=\"flex items-center gap-2 text-sm sm:col-span-6\">\n <input type=\"checkbox\" checked={form.is_default}\n onChange={(e) => set('is_default', e.target.checked)} className=\"h-4 w-4\" />\n {t('crud.archetype.addresses.setDefault')}\n </label>\n </div>\n\n <ModalFooter>\n <Button variant=\"ghost\" onClick={() => setFormOpen(false)} disabled={saving}>\n {t('common.cancel')}\n </Button>\n <Button onClick={() => void handleSave()} disabled={!canSave || saving}>\n {saving ? t('common.saving') : t('common.save')}\n </Button>\n </ModalFooter>\n </ModalContent>\n </Modal>\n\n <ConfirmDialog\n open={deleting !== null}\n variant=\"destructive\"\n title={t('crud.archetype.addresses.deleteTitle')}\n description={deleting ? formatLine(deleting) : ''}\n confirmLabel={t('common.delete')}\n cancelLabel={t('common.cancel')}\n onConfirm={() => void handleDelete()}\n onCancel={() => setDeleting(null)}\n />\n </div>\n )\n}\n","import React from 'react'\nimport { Clock, FileText, CalendarDays } from 'lucide-react'\nimport { Card, CardContent } from '@fayz-ai/ui'\nimport { Badge } from '@fayz-ai/ui'\n// Lazy: the schedule editor is a heavy leaf (~33 KB src) only needed on the\n// schedule tab — keep it out of the entry chunk.\nconst ScheduleEditor = React.lazy(() =>\n import('./ScheduleEditor').then((m) => ({ default: m.ScheduleEditor })),\n)\nimport { AddressesTab } from './AddressesTab'\nimport { useTranslation } from '@fayz-ai/core'\nimport { usePluginRuntimeOptional as usePluginsOptional } from '@fayz-ai/core'\nimport { getWidgetsForZone } from '@fayz-ai/core'\n\nfunction ComingSoon({ icon: Icon, title, description }: { icon: React.ElementType; title: string; description: string }) {\n const t = useTranslation()\n return (\n <Card>\n <CardContent className=\"flex flex-col items-center justify-center py-12 text-center\">\n <div className=\"flex h-12 w-12 items-center justify-center rounded-full bg-muted mb-3\">\n <Icon className=\"h-5 w-5 text-muted-foreground\" />\n </div>\n <p className=\"text-sm font-medium\">{title}</p>\n <p className=\"text-xs text-muted-foreground mt-1 max-w-xs\">{description}</p>\n <Badge variant=\"secondary\" className=\"mt-3 text-[10px]\">{t('crud.archetype.comingSoon')}</Badge>\n </CardContent>\n </Card>\n )\n}\n\n// AccessTab is imported from ./AccessTab\n\nexport function ActivityTab() {\n const t = useTranslation()\n return (\n <ComingSoon\n icon={Clock}\n title={t('crud.archetype.activity.title')}\n description={t('crud.archetype.activity.description')}\n />\n )\n}\n\nexport function DocumentsTab({ item }: { item?: any }) {\n const t = useTranslation()\n const runtime = usePluginsOptional()\n\n // Check if a plugin provides a documents widget (e.g., custom_forms)\n const widgets = runtime ? getWidgetsForZone(runtime, 'person.detail.documents') : []\n\n if (widgets.length > 0 && item) {\n const w = widgets[0]\n const Widget = w.component as React.ComponentType<any>\n return (\n <Widget\n item={item}\n config={w.config}\n runtime={runtime?.context}\n plugin={w.plugin}\n widget={w}\n />\n )\n }\n\n return (\n <ComingSoon\n icon={FileText}\n title={t('crud.archetype.documents.title')}\n description={t('crud.archetype.documents.description')}\n />\n )\n}\n\nexport function FinancialTab({ item }: { item?: any }) {\n const runtime = usePluginsOptional()\n const widgets = runtime ? getWidgetsForZone(runtime, 'person.detail.financial') : []\n if (widgets.length > 0 && item) {\n const w = widgets[0]\n const Widget = w.component as React.ComponentType<any>\n return (\n <Widget\n item={item}\n config={w.config}\n runtime={runtime?.context}\n plugin={w.plugin}\n widget={w}\n />\n )\n }\n return null\n}\n\nexport function ScheduleTab({ item }: { item: any }) {\n const t = useTranslation()\n if (!item?.id) {\n return (\n <ComingSoon\n icon={CalendarDays}\n title={t('crud.archetype.schedule.title')}\n description={t('crud.archetype.schedule.description')}\n />\n )\n }\n return (\n <React.Suspense fallback={null}>\n <ScheduleEditor assigneeId={item.id} />\n </React.Suspense>\n )\n}\n\nexport const PERSON_DETAIL_TABS = [\n { id: 'schedule', label: 'Schedule', icon: 'CalendarDays', component: ScheduleTab, visibleFor: ['staff'] },\n // Core table (public.addresses), so every app with a person record gets this:\n // delivery addresses for a client, pickup point for a supplier, home address\n // for staff. Not shop-specific.\n { id: 'addresses', label: 'Endereços', icon: 'MapPin', component: AddressesTab },\n { id: 'documents', label: 'Documents', icon: 'FileText', component: DocumentsTab },\n // Per-person financial statement — only shown when the financial plugin contributes\n // its widget (see requiresWidgetZone). Clients = paid invoices; staff = commissions.\n { id: 'financial', label: 'Statement', icon: 'DollarSign', component: FinancialTab, requiresWidgetZone: 'person.detail.financial' },\n { id: 'activity', label: 'Activity', icon: 'Clock', component: ActivityTab },\n]\n","import React from 'react'\nimport { BarChart3, Truck, Tag, Clock } from 'lucide-react'\nimport { Card, CardContent } from '@fayz-ai/ui'\nimport { Badge } from '@fayz-ai/ui'\nimport { useTranslation } from '@fayz-ai/core'\n\nfunction ComingSoon({ icon: Icon, title, description }: { icon: React.ElementType; title: string; description: string }) {\n const t = useTranslation()\n return (\n <Card>\n <CardContent className=\"flex flex-col items-center justify-center py-12 text-center\">\n <div className=\"flex h-12 w-12 items-center justify-center rounded-full bg-muted mb-3\">\n <Icon className=\"h-5 w-5 text-muted-foreground\" />\n </div>\n <p className=\"text-sm font-medium\">{title}</p>\n <p className=\"text-xs text-muted-foreground mt-1 max-w-xs\">{description}</p>\n <Badge variant=\"secondary\" className=\"mt-3 text-[10px]\">{t('crud.archetype.comingSoon')}</Badge>\n </CardContent>\n </Card>\n )\n}\n\nexport function InventoryTab() {\n const t = useTranslation()\n return (\n <ComingSoon\n icon={BarChart3}\n title={t('crud.archetype.inventory.title')}\n description={t('crud.archetype.inventory.description')}\n />\n )\n}\n\nexport function SuppliersTab() {\n const t = useTranslation()\n return (\n <ComingSoon\n icon={Truck}\n title={t('crud.archetype.suppliers.title')}\n description={t('crud.archetype.suppliers.description')}\n />\n )\n}\n\nexport function PricingTab() {\n const t = useTranslation()\n return (\n <ComingSoon\n icon={Tag}\n title={t('crud.archetype.pricing.title')}\n description={t('crud.archetype.pricing.description')}\n />\n )\n}\n\nexport function ProductActivityTab() {\n const t = useTranslation()\n return (\n <ComingSoon\n icon={Clock}\n title={t('crud.archetype.productActivity.title')}\n description={t('crud.archetype.productActivity.description')}\n />\n )\n}\n\nexport const PRODUCT_DETAIL_TABS = [\n { id: 'inventory', label: 'Inventory', component: InventoryTab },\n { id: 'suppliers', label: 'Suppliers', component: SuppliersTab },\n { id: 'pricing', label: 'Pricing', component: PricingTab },\n { id: 'activity', label: 'Activity', component: ProductActivityTab },\n]\n","import React from 'react'\nimport { CalendarDays, Tag, Clock } from 'lucide-react'\nimport { Card, CardContent } from '@fayz-ai/ui'\nimport { Badge } from '@fayz-ai/ui'\nimport { useTranslation } from '@fayz-ai/core'\n\nfunction ComingSoon({ icon: Icon, title, description }: { icon: React.ElementType; title: string; description: string }) {\n const t = useTranslation()\n return (\n <Card>\n <CardContent className=\"flex flex-col items-center justify-center py-12 text-center\">\n <div className=\"flex h-12 w-12 items-center justify-center rounded-full bg-muted mb-3\">\n <Icon className=\"h-5 w-5 text-muted-foreground\" />\n </div>\n <p className=\"text-sm font-medium\">{title}</p>\n <p className=\"text-xs text-muted-foreground mt-1 max-w-xs\">{description}</p>\n <Badge variant=\"secondary\" className=\"mt-3 text-[10px]\">{t('crud.archetype.comingSoon')}</Badge>\n </CardContent>\n </Card>\n )\n}\n\nexport function AvailabilityTab() {\n const t = useTranslation()\n return (\n <ComingSoon\n icon={CalendarDays}\n title={t('crud.archetype.availability.title')}\n description={t('crud.archetype.availability.description')}\n />\n )\n}\n\nexport function ServicePricingTab() {\n const t = useTranslation()\n return (\n <ComingSoon\n icon={Tag}\n title={t('crud.archetype.servicePricing.title')}\n description={t('crud.archetype.servicePricing.description')}\n />\n )\n}\n\nexport function ServiceActivityTab() {\n const t = useTranslation()\n return (\n <ComingSoon\n icon={Clock}\n title={t('crud.archetype.serviceActivity.title')}\n description={t('crud.archetype.serviceActivity.description')}\n />\n )\n}\n\nexport const SERVICE_DETAIL_TABS = [\n { id: 'availability', label: 'Availability', component: AvailabilityTab },\n { id: 'pricing', label: 'Pricing', component: ServicePricingTab },\n { id: 'activity', label: 'Activity', component: ServiceActivityTab },\n]\n","import React from 'react'\nimport { Users, CalendarDays, BarChart3, Clock } from 'lucide-react'\nimport { Card, CardContent } from '@fayz-ai/ui'\nimport { Badge } from '@fayz-ai/ui'\nimport { useTranslation } from '@fayz-ai/core'\n\nfunction ComingSoon({ icon: Icon, title, description }: { icon: React.ElementType; title: string; description: string }) {\n const t = useTranslation()\n return (\n <Card>\n <CardContent className=\"flex flex-col items-center justify-center py-12 text-center\">\n <div className=\"flex h-12 w-12 items-center justify-center rounded-full bg-muted mb-3\">\n <Icon className=\"h-5 w-5 text-muted-foreground\" />\n </div>\n <p className=\"text-sm font-medium\">{title}</p>\n <p className=\"text-xs text-muted-foreground mt-1 max-w-xs\">{description}</p>\n <Badge variant=\"secondary\" className=\"mt-3 text-[10px]\">{t('crud.archetype.comingSoon')}</Badge>\n </CardContent>\n </Card>\n )\n}\n\nexport function MembersTab() {\n const t = useTranslation()\n return (\n <ComingSoon\n icon={Users}\n title={t('crud.archetype.members.title')}\n description={t('crud.archetype.members.description')}\n />\n )\n}\n\nexport function LocationScheduleTab() {\n const t = useTranslation()\n return (\n <ComingSoon\n icon={CalendarDays}\n title={t('crud.archetype.locationSchedule.title')}\n description={t('crud.archetype.locationSchedule.description')}\n />\n )\n}\n\nexport function LocationStatsTab() {\n const t = useTranslation()\n return (\n <ComingSoon\n icon={BarChart3}\n title={t('crud.archetype.locationStats.title')}\n description={t('crud.archetype.locationStats.description')}\n />\n )\n}\n\nexport function LocationActivityTab() {\n const t = useTranslation()\n return (\n <ComingSoon\n icon={Clock}\n title={t('crud.archetype.locationActivity.title')}\n description={t('crud.archetype.locationActivity.description')}\n />\n )\n}\n\nexport const LOCATION_DETAIL_TABS = [\n { id: 'members', label: 'Team', component: MembersTab },\n { id: 'schedule', label: 'Hours', component: LocationScheduleTab },\n { id: 'stats', label: 'Statistics', component: LocationStatsTab },\n { id: 'activity', label: 'Activity', component: LocationActivityTab },\n]\n","import React from 'react'\nimport { ExternalLink } from 'lucide-react'\n\ninterface EntityLinkProps {\n /** The entity ID to link to */\n entityId: string\n /** The base path of the CRUD page (e.g. '/registry/tutors') */\n basePath: string\n /** Display label */\n children: React.ReactNode\n /** Optional className */\n className?: string\n}\n\n/**\n * Reusable link to a CRUD entity detail page.\n * Uses hash-based routing: navigates to `#basePath/entityId`\n */\nexport function EntityLink({ entityId, basePath, children, className }: EntityLinkProps) {\n const href = `#${basePath}/${entityId}`\n\n return (\n <a\n href={href}\n className={`inline-flex items-center gap-1 text-primary hover:underline transition-colors ${className ?? ''}`}\n >\n {children}\n <ExternalLink className=\"h-3 w-3 opacity-50\" />\n </a>\n )\n}\n\n/**\n * Registry of known entity paths by person kind.\n * Projects can extend this via the `registerEntityPath` function.\n */\nconst ENTITY_PATHS: Record<string, string> = {\n customer: '/registry/tutors',\n professional: '/registry/veterinarians',\n organization: '/registry/clinics',\n supplier: '/registry/suppliers',\n staff: '/registry/staff',\n}\n\n/** Register a custom path for a person kind */\nexport function registerEntityPath(kind: string, basePath: string) {\n ENTITY_PATHS[kind] = basePath\n}\n\n/** Get the CRUD base path for a person kind */\nexport function getPersonPath(kind: string): string | null {\n return ENTITY_PATHS[kind] ?? null\n}\n\n/**\n * Smart link that auto-resolves the path based on person kind.\n * Falls back to non-linked text if no path is registered.\n */\nexport function PersonLink({ personId, kind, children, className }: {\n personId: string\n kind: string\n children: React.ReactNode\n className?: string\n}) {\n const basePath = getPersonPath(kind)\n if (!basePath) {\n return <span className={className}>{children}</span>\n }\n return (\n <EntityLink entityId={personId} basePath={basePath} className={className}>\n {children}\n </EntityLink>\n )\n}\n","import React, { useEffect, useState } from 'react'\nimport { User, Clock, FileText } from 'lucide-react'\nimport { Card, CardContent } from '@fayz-ai/ui'\nimport { Badge, PhoneLink } from '@fayz-ai/ui'\nimport { PersonLink } from './EntityLink'\nimport { getSupabaseClientOptional } from '@fayz-ai/core'\nimport { useTranslation } from '@fayz-ai/core'\n\nfunction ComingSoon({ icon: Icon, title, description }: { icon: React.ElementType; title: string; description: string }) {\n const t = useTranslation()\n return (\n <Card>\n <CardContent className=\"flex flex-col items-center justify-center py-12 text-center\">\n <div className=\"flex h-12 w-12 items-center justify-center rounded-full bg-muted mb-3\">\n <Icon className=\"h-5 w-5 text-muted-foreground\" />\n </div>\n <p className=\"text-sm font-medium\">{title}</p>\n <p className=\"text-xs text-muted-foreground mt-1 max-w-xs\">{description}</p>\n <Badge variant=\"secondary\" className=\"mt-3 text-[10px]\">{t('crud.archetype.comingSoon')}</Badge>\n </CardContent>\n </Card>\n )\n}\n\nexport function OwnerTab({ item }: { item: any }) {\n const t = useTranslation()\n const [person, setPerson] = useState<any>(null)\n const [loading, setLoading] = useState(true)\n\n useEffect(() => {\n const tutorId = item?.tutorId\n if (!tutorId) { setLoading(false); return }\n\n const supabase = getSupabaseClientOptional() as any\n if (!supabase) { setLoading(false); return }\n\n supabase\n .from('people')\n .select('*')\n .eq('id', tutorId)\n .single()\n .then(({ data }: any) => {\n setPerson(data)\n setLoading(false)\n }, () => setLoading(false))\n }, [item?.tutorId])\n\n if (loading) {\n return (\n <Card>\n <CardContent className=\"py-8 flex justify-center\">\n <div className=\"h-5 w-5 animate-spin rounded-full border-2 border-muted border-t-primary\" />\n </CardContent>\n </Card>\n )\n }\n\n if (!person) {\n return (\n <Card>\n <CardContent className=\"flex flex-col items-center justify-center py-12 text-center\">\n <div className=\"flex h-12 w-12 items-center justify-center rounded-full bg-muted mb-3\">\n <User className=\"h-5 w-5 text-muted-foreground\" />\n </div>\n <p className=\"text-sm font-medium\">{t('crud.archetype.owner.noOwner')}</p>\n <p className=\"text-xs text-muted-foreground mt-1\">{t('crud.archetype.owner.assignHint')}</p>\n </CardContent>\n </Card>\n )\n }\n\n const fields: Array<{ label: string; value: string; href?: string; phone?: boolean }> = [\n { label: t('crud.archetype.owner.name'), value: person.name },\n // `phone: true` em vez de href: quem sabe montar o link de um telefone é o\n // PhoneLink — o número gravado pode vir sem DDI, com máscara, ou impróprio\n // para link nenhum.\n { label: t('crud.archetype.owner.phone'), value: person.phone, phone: true },\n { label: t('crud.archetype.owner.email'), value: person.email, href: person.email ? `mailto:${person.email}` : undefined },\n { label: t('crud.archetype.owner.document'), value: person.document_number },\n { label: t('crud.archetype.owner.address'), value: [person.address, person.city, person.state].filter(Boolean).join(', ') },\n ].filter((f) => f.value)\n\n return (\n <Card>\n <CardContent className=\"pt-5\">\n <div className=\"flex items-start gap-4 mb-4\">\n <div className=\"flex h-12 w-12 shrink-0 items-center justify-center rounded-full bg-primary/10 text-primary\">\n <User className=\"h-5 w-5\" />\n </div>\n <div className=\"flex-1\">\n <PersonLink personId={person.id} kind={person.kind} className=\"text-base font-semibold\">\n {person.name}\n </PersonLink>\n <div className=\"flex items-center gap-2 mt-0.5\">\n <Badge variant=\"secondary\" className=\"text-[10px] capitalize\">{person.kind}</Badge>\n <Badge variant={person.is_active ? 'default' : 'secondary'} className=\"text-[10px]\">\n {person.is_active ? t('crud.archetype.owner.active') : t('crud.archetype.owner.inactive')}\n </Badge>\n </div>\n </div>\n </div>\n <dl className=\"divide-y\">\n {fields.map((f) => (\n <div key={f.label} className=\"grid grid-cols-3 gap-4 py-2.5\">\n <dt className=\"text-sm text-muted-foreground\">{f.label}</dt>\n <dd className=\"col-span-2 text-sm\">\n {f.phone ? (\n <PhoneLink phone={f.value} className=\"text-primary\" />\n ) : f.href ? (\n <a href={f.href} className=\"text-primary hover:underline\">{f.value}</a>\n ) : f.value}\n </dd>\n </div>\n ))}\n </dl>\n </CardContent>\n </Card>\n )\n}\n\nexport function SubjectHistoryTab() {\n const t = useTranslation()\n return (\n <ComingSoon\n icon={Clock}\n title={t('crud.archetype.history.title')}\n description={t('crud.archetype.history.description')}\n />\n )\n}\n\nexport function SubjectDocumentsTab() {\n const t = useTranslation()\n return (\n <ComingSoon\n icon={FileText}\n title={t('crud.archetype.subjectDocuments.title')}\n description={t('crud.archetype.subjectDocuments.description')}\n />\n )\n}\n\nexport const SUBJECT_DETAIL_TABS = [\n { id: 'owner', label: 'Owner', component: OwnerTab },\n { id: 'history', label: 'History', component: SubjectHistoryTab },\n { id: 'documents', label: 'Documents', component: SubjectDocumentsTab },\n]\n","import React, { useCallback, useEffect, useState } from 'react'\nimport { Edit, Trash2, Eye } from 'lucide-react'\nimport * as LucideIcons from 'lucide-react'\nimport type { LucideIcon } from 'lucide-react'\nimport { Card, CardContent } from '@fayz-ai/ui'\nimport { Button } from '@fayz-ai/ui'\nimport { Badge } from '@fayz-ai/ui'\nimport { SubpageHeader } from '@fayz-ai/ui'\nimport { Tabs, TabsList, TabsTrigger, TabsContent } from '@fayz-ai/ui'\nimport { Separator } from '@fayz-ai/ui'\nimport { PhoneLink } from '@fayz-ai/ui'\nimport { Markdown } from '@fayz-ai/ui'\nimport { WidgetSlot } from '../plugins/WidgetSlot'\nimport { formatCurrency } from '@fayz-ai/core'\nimport { PERSON_DETAIL_TABS } from './archetypes/PersonDetailTabs'\nimport { PRODUCT_DETAIL_TABS } from './archetypes/ProductDetailTabs'\nimport { SERVICE_DETAIL_TABS } from './archetypes/ServiceDetailTabs'\nimport { LOCATION_DETAIL_TABS } from './archetypes/LocationDetailTabs'\nimport { SUBJECT_DETAIL_TABS } from './archetypes/SubjectDetailTabs'\nimport { useTranslation } from '@fayz-ai/core'\nimport { usePluginRuntimeOptional, getWidgetsForZone } from '@fayz-ai/core'\nimport type { EntityDef, FieldDef, FieldGroup, FormLayout, DetailTab } from '@fayz-ai/core'\n\ninterface CrudDetailPageProps {\n entityDef: EntityDef\n item: Record<string, any>\n namePlural: string\n basePath: string\n initialTab?: string\n onBack: () => void\n onEdit?: () => void\n onDelete?: () => void\n feature?: string\n /** Embedded mode — compact hero, no breadcrumb, no hash nav. For use inside modals/panels. */\n embedded?: boolean\n}\n\nfunction formatValue(field: FieldDef, value: any, t?: (key: string) => string): React.ReactNode {\n if (value == null || value === '') return <span className=\"text-muted-foreground/50\">—</span>\n\n if (field.renderCell) return field.renderCell(value, {})\n\n switch (field.type) {\n case 'boolean':\n return (\n <Badge variant={value ? 'default' : 'secondary'}>\n {value ? (t?.('common.yes') ?? 'Yes') : (t?.('common.no') ?? 'No')}\n </Badge>\n )\n case 'currency': {\n const num = typeof value === 'number' ? value : parseFloat(value)\n return isNaN(num) ? value : formatCurrency(num, field.currency)\n }\n case 'color':\n return (\n <span className=\"inline-flex items-center gap-2\">\n <span className=\"h-5 w-5 rounded-full border shrink-0\" style={{ backgroundColor: String(value) }} />\n <span className=\"text-xs font-mono text-muted-foreground\">{String(value)}</span>\n </span>\n )\n case 'date':\n try { return new Date(value).toLocaleDateString() } catch { return value }\n case 'datetime':\n try { return new Date(value).toLocaleString() } catch { return value }\n case 'select': {\n const options = (field.options ?? []).map((o) => typeof o === 'string' ? { label: o, value: o } : o)\n const match = options.find((o) => o.value === value)\n return <Badge variant=\"secondary\">{match?.label ?? value}</Badge>\n }\n case 'image':\n return value ? (\n <img src={value} alt=\"\" className=\"h-16 w-16 rounded-lg object-cover\" />\n ) : null\n case 'email':\n return <a href={`mailto:${value}`} className=\"text-primary hover:underline\">{value}</a>\n case 'phone':\n return <PhoneLink phone={String(value)} className=\"text-primary\" />\n case 'url':\n return <a href={value} target=\"_blank\" rel=\"noopener noreferrer\" className=\"text-primary hover:underline\">{value}</a>\n case 'textarea':\n return <p className=\"whitespace-pre-wrap\">{value}</p>\n case 'markdown':\n return value ? <Markdown source={String(value)} /> : null\n default:\n return String(value)\n }\n}\n\nfunction FieldRow({ field, value, t, compact }: { field: FieldDef; value: any; t?: (key: string) => string; compact?: boolean }) {\n return (\n <div className={`grid grid-cols-3 gap-4 ${compact ? 'py-1.5' : 'py-3'}`}>\n <dt className={`font-medium text-muted-foreground ${compact ? 'text-xs' : 'text-sm'}`}>{field.label}</dt>\n <dd className={`col-span-2 text-foreground ${compact ? 'text-xs' : 'text-sm'}`}>{formatValue(field, value, t)}</dd>\n </div>\n )\n}\n\nfunction FieldGroupSection({\n group,\n fields,\n item,\n compact,\n}: {\n group: FieldGroup\n fields: FieldDef[]\n item: Record<string, any>\n compact?: boolean\n}) {\n const tFn = useTranslation()\n const cols = group.columns ?? 2\n\n return (\n <div>\n <h3 className={`font-semibold text-foreground ${compact ? 'text-xs mb-0.5' : 'text-sm mb-1'}`}>{group.label}</h3>\n {group.description && (\n <p className={`text-muted-foreground ${compact ? 'text-[10px] mb-1.5' : 'text-xs mb-3'}`}>{group.description}</p>\n )}\n <Card>\n <CardContent className=\"p-0\">\n <dl className={`grid divide-y ${cols >= 2 ? 'md:grid-cols-2 md:divide-y-0' : ''}`}>\n {fields.map((field) => (\n <div key={field.key} className={compact ? 'px-3' : 'px-5'}>\n <FieldRow field={field} value={item[field.key]} t={tFn} compact={compact} />\n </div>\n ))}\n </dl>\n </CardContent>\n </Card>\n </div>\n )\n}\n\nfunction OverviewTab({\n entityDef,\n item,\n compact,\n}: {\n entityDef: EntityDef\n item: Record<string, any>\n compact?: boolean\n}) {\n const tFn = useTranslation()\n const detailFields = entityDef.fields.filter(\n (f) => f.showInDetail !== false && f.key !== 'id' && f.key !== entityDef.displayField && f.key !== entityDef.imageField\n )\n\n // Group fields\n const groups = entityDef.fieldGroups ?? []\n const ungroupedFields = detailFields.filter((f) => !f.group)\n\n // Build group → fields map\n const groupFieldMap = new Map<string, FieldDef[]>()\n for (const field of detailFields) {\n if (field.group) {\n const existing = groupFieldMap.get(field.group) ?? []\n existing.push(field)\n groupFieldMap.set(field.group, existing)\n }\n }\n\n return (\n <div className={compact ? 'space-y-3' : 'space-y-6'}>\n {/* Ungrouped fields */}\n {ungroupedFields.length > 0 && (\n <Card>\n <CardContent className=\"p-0\">\n <dl className=\"divide-y\">\n {ungroupedFields.map((field) => (\n <div key={field.key} className={compact ? 'px-3' : 'px-5'}>\n <FieldRow field={field} value={item[field.key]} t={tFn} compact={compact} />\n </div>\n ))}\n </dl>\n </CardContent>\n </Card>\n )}\n\n {/* Grouped fields */}\n {groups.map((group) => {\n const fields = groupFieldMap.get(group.id)\n if (!fields || fields.length === 0) return null\n return (\n <FieldGroupSection key={group.id} group={group} fields={fields} item={item} compact={compact} />\n )\n })}\n\n {/* Catch any grouped fields without a matching FieldGroup definition */}\n {Array.from(groupFieldMap.entries()).map(([groupId, fields]) => {\n if (groups.some((g) => g.id === groupId)) return null\n return (\n <FieldGroupSection\n key={groupId}\n group={{ id: groupId, label: groupId.charAt(0).toUpperCase() + groupId.slice(1) }}\n fields={fields}\n item={item}\n compact={compact}\n />\n )\n })}\n </div>\n )\n}\n\n/** @internal exportado para teste — a resolução das abas do arquétipo. */\nexport function getArchetypeTabs(layout?: FormLayout, archetypeKind?: string): DetailTab[] {\n let tabs: DetailTab[]\n switch (layout) {\n case 'person':\n tabs = PERSON_DETAIL_TABS\n break\n case 'product':\n tabs = PRODUCT_DETAIL_TABS\n break\n case 'service':\n tabs = SERVICE_DETAIL_TABS\n break\n case 'location':\n tabs = LOCATION_DETAIL_TABS\n break\n case 'subject':\n tabs = SUBJECT_DETAIL_TABS\n break\n default:\n tabs = []\n }\n // `visibleFor` é uma restrição, não uma preferência: a aba de escala do\n // arquétipo de pessoa se declara `visibleFor: ['staff']` porque grade semanal\n // de expediente só faz sentido para quem atende. Filtrar só quando a entidade\n // declara um archetypeKind invertia isso — quem NÃO declara kind (uma tela que\n // mistura cliente, fornecedor e contato numa entidade só) via todas as abas\n // restritas, inclusive a de expediente na ficha de quem contrata.\n //\n // Sem kind declarado a entidade não é nenhum dos kinds da lista, então a aba\n // restrita fica de fora. Quem quiser uma dessas abas declara o kind, ou a\n // redeclara em `detailTabs` — tab da entidade ganha do arquétipo por id.\n return tabs.filter((tab) => !tab.visibleFor || (archetypeKind ? tab.visibleFor.includes(archetypeKind) : false))\n}\n\nfunction mergeDetailTabs(archetypeTabs: DetailTab[], entityTabs: DetailTab[]): DetailTab[] {\n const merged = new Map<string, DetailTab>()\n\n for (const tab of entityTabs) merged.set(tab.id, tab)\n for (const tab of archetypeTabs) {\n if (!merged.has(tab.id)) merged.set(tab.id, tab)\n }\n\n return Array.from(merged.values())\n}\n\nfunction normalizeTabId(value?: string): string | undefined {\n return value?.split('?')[0]\n}\n\nfunction resolveActiveTab(initialTab: string | undefined, tabs: DetailTab[]): string {\n const normalized = normalizeTabId(initialTab)\n if (!normalized) return 'overview'\n if (normalized === 'overview') return 'overview'\n\n const direct = tabs.find((tab) => tab.id === normalized)\n if (direct) return direct.id\n\n const alias = tabs.find((tab) => (tab as DetailTab & { aliases?: string[] }).aliases?.includes(normalized))\n return alias?.id ?? 'overview'\n}\n\n// `DetailTab.icon` é um nome do lucide, igual ao ícone de nav, de aba de\n// settings e de widget de dashboard — e em todos esses o sdk resolve contra o\n// pacote inteiro. Aqui era um mapa de 14 nomes escrito à mão, e o que não\n// estivesse nele sumia sem aviso: uma aba com `icon: 'Receipt'` renderizava sem\n// ícone nenhum, sem erro de tipo e sem log. Resolver como o resto já resolve\n// mata a classe do bug em vez de acrescentar mais um nome à lista.\n/** @internal exportado para teste — resolve `DetailTab.icon` contra o lucide. */\nexport function resolveTabIcon(name: string): LucideIcon | null {\n const icon = (LucideIcons as unknown as Record<string, LucideIcon | undefined>)[name]\n // O módulo do lucide também exporta coisas que não são ícone (createLucideIcon,\n // tipos), então só passa o que dá pra renderizar.\n return typeof icon === 'function' || typeof icon === 'object' ? (icon ?? null) : null\n}\n\nexport function CrudDetailPage({\n entityDef,\n item,\n namePlural,\n basePath,\n initialTab,\n onBack,\n onEdit,\n onDelete,\n feature,\n embedded,\n}: CrudDetailPageProps) {\n const t = useTranslation()\n const displayField = entityDef.displayField ?? entityDef.fields[0]?.key ?? 'id'\n const displayValue = item[displayField] ?? 'Untitled'\n const subtitleValue = entityDef.subtitleField ? item[entityDef.subtitleField] : null\n // `imageField` only reaches a plain string column. Entities whose image lives\n // somewhere richer (a product's images[] relation, say) supply `image.get`,\n // and without consulting it the hero fell back to the initial letter even for\n // records that clearly have a photo.\n const imageValue = entityDef.image?.get(item) ?? (entityDef.imageField ? item[entityDef.imageField] : null)\n const initial = typeof displayValue === 'string' ? displayValue.charAt(0).toUpperCase() : '?'\n\n // Merge archetype tabs + custom entity tabs. Entity-specific tabs win by id\n // so vertical apps can replace generic person/product tabs without duplicates.\n const runtime = usePluginRuntimeOptional()\n const archetypeTabs = getArchetypeTabs(entityDef.layout, entityDef.data?.archetypeKind)\n const customTabs = mergeDetailTabs(archetypeTabs, entityDef.detailTabs ?? [])\n // Drop tabs that require a plugin-contributed widget when none is registered\n // (e.g. the financial statement tab only appears when the financial plugin is active).\n .filter((tab) => !tab.requiresWidgetZone || (runtime ? getWidgetsForZone(runtime, tab.requiresWidgetZone).length > 0 : false))\n .filter((tab) => !(tab as DetailTab & { hidden?: boolean }).hidden)\n const entityId = entityDef.name.toLowerCase().replace(/\\s+/g, '-')\n const widgetZone = `${entityId}.detail.tabs`\n\n // Resolve initial tab — allow compatibility aliases, fallback to \"overview\".\n const activeTab = resolveActiveTab(initialTab, customTabs)\n const [selectedTab, setSelectedTab] = useState(activeTab)\n\n useEffect(() => {\n setSelectedTab(activeTab)\n }, [activeTab])\n\n const handleTabChange = useCallback((value: string) => {\n setSelectedTab(value)\n if (embedded) return\n const detailPath = `${basePath}/${item.id}`\n const newHash = value === 'overview' ? detailPath : `${detailPath}/${value}`\n window.history.replaceState(null, '', `#${newHash}`)\n }, [basePath, item.id, embedded])\n\n // O cabeçalho vai para a barra da shell, não para cima do hero: empilhados,\n // a barra dizia \"Clientes\" e a linha de baixo \"Clientes / Carvalho\" — o nome\n // da seção duas vezes, com uma linha de distância.\n //\n // SubpageHeader e não um breadcrumb próprio: é o MESMO desenho de \"← título\" que\n // formulário, pedido e modelo de e-mail usam. Três desenhos da mesma seta era\n // o que havia antes.\n const headerNode = React.useMemo(\n () => embedded ? null : (\n <SubpageHeader title={displayValue} parentLabel={namePlural} onBack={onBack} />\n ),\n [embedded, displayValue, namePlural, onBack],\n )\n\n return (\n <div className={embedded ? 'space-y-4' : 'space-y-6'}>\n {headerNode}\n {/* Hero */}\n <div className={`flex items-start ${embedded ? 'gap-3' : 'gap-5'}`}>\n {/* Avatar / Image */}\n {imageValue ? (\n <img\n src={imageValue}\n alt={displayValue}\n className={`shrink-0 object-cover shadow-sm ${embedded ? 'h-10 w-10 rounded-xl' : 'h-20 w-20 rounded-2xl'}`}\n />\n ) : (\n <div className={`flex shrink-0 items-center justify-center bg-primary/10 text-primary font-bold shadow-sm ${embedded ? 'h-10 w-10 rounded-xl text-sm' : 'h-20 w-20 rounded-2xl text-2xl'}`}>\n {initial}\n </div>\n )}\n\n <div className=\"flex-1 min-w-0\">\n <div className=\"flex items-center gap-2\">\n <h1 className={`font-bold text-foreground truncate ${embedded ? 'text-base' : 'text-2xl'}`}>{displayValue}</h1>\n {item.status && (\n <Badge variant=\"secondary\" className=\"shrink-0\">\n {typeof item.status === 'string' ? item.status.charAt(0).toUpperCase() + item.status.slice(1) : item.status}\n </Badge>\n )}\n {item.is_active !== undefined && (\n <Badge variant={item.is_active ? 'default' : 'secondary'} className=\"shrink-0\">\n {item.is_active ? t('common.active') : t('common.inactive')}\n </Badge>\n )}\n </div>\n {subtitleValue && (\n <p className={`text-muted-foreground mt-0.5 ${embedded ? 'text-xs' : ''}`}>{subtitleValue}</p>\n )}\n </div>\n\n {(onEdit || onDelete) && (\n <div className=\"flex items-center gap-1.5 shrink-0\">\n {onEdit && (\n <Button variant=\"outline\" size={embedded ? 'xs' as any : 'sm'} onClick={onEdit} className={embedded ? 'h-7 px-2 text-xs gap-1' : ''}>\n <Edit className={embedded ? 'h-3 w-3' : 'h-4 w-4 mr-1.5'} />\n {t('common.edit')}\n </Button>\n )}\n {onDelete && (\n <Button variant=\"outline\" size={embedded ? 'xs' as any : 'sm'} className={`text-destructive hover:text-destructive ${embedded ? 'h-7 w-7 p-0' : ''}`} onClick={onDelete}>\n <Trash2 className={embedded ? 'h-3 w-3' : 'h-4 w-4'} />\n </Button>\n )}\n </div>\n )}\n </div>\n\n {!embedded && <Separator />}\n\n {/* Tabs */}\n <Tabs value={selectedTab} onValueChange={handleTabChange}>\n <TabsList className={`max-w-full justify-start overflow-x-auto scrollbar-none${embedded ? ' h-8' : ''}`}>\n <TabsTrigger value=\"overview\" className={`gap-1.5 ${embedded ? 'text-xs px-2 py-1' : ''}`}>\n <Eye className={embedded ? 'h-3 w-3' : 'h-3.5 w-3.5'} />\n {t('common.overview')}\n </TabsTrigger>\n {customTabs.map((tab) => {\n const translated = t(`crud.tabs.${tab.id}`)\n const label = translated.startsWith('crud.tabs.') ? tab.label : translated\n const TabIcon = tab.icon ? resolveTabIcon(tab.icon) : null\n return (\n <TabsTrigger key={tab.id} value={tab.id} className={`gap-1.5 ${embedded ? 'text-xs px-2 py-1' : ''}`}>\n {TabIcon && <TabIcon className={embedded ? 'h-3 w-3' : 'h-3.5 w-3.5'} />}\n {label}\n </TabsTrigger>\n )\n })}\n </TabsList>\n\n <TabsContent value=\"overview\" className={embedded ? 'mt-2' : 'mt-4'}>\n <OverviewTab entityDef={entityDef} item={item} compact={embedded} />\n </TabsContent>\n\n {customTabs.map((tab) => (\n <TabsContent key={tab.id} value={tab.id} className=\"mt-4\">\n {tab.component ? (\n React.createElement(tab.component, { item, entityDef, ...(tab.props ?? {}) })\n ) : (\n <Card>\n <CardContent className=\"flex items-center justify-center py-12\">\n <p className=\"text-muted-foreground\">{t('common.noContent')}</p>\n </CardContent>\n </Card>\n )}\n </TabsContent>\n ))}\n </Tabs>\n\n {/* Widget zone for plugin tab injection */}\n <WidgetSlot zone={widgetZone} />\n </div>\n )\n}\n","import React from 'react'\nimport {\n Modal,\n ModalContent,\n ModalHeader,\n ModalTitle,\n ModalDescription,\n ModalFooter,\n} from '@fayz-ai/ui'\nimport { Button } from '@fayz-ai/ui'\nimport { useTranslation } from '@fayz-ai/core'\n\ninterface DeleteConfirmDialogProps {\n open: boolean\n onClose: () => void\n onConfirm: () => void\n entityName: string\n displayValue?: string\n}\n\nexport function DeleteConfirmDialog({ open, onClose, onConfirm, entityName, displayValue }: DeleteConfirmDialogProps) {\n const t = useTranslation()\n return (\n <Modal open={open} onOpenChange={(isOpen) => { if (!isOpen) onClose() }}>\n <ModalContent>\n <ModalHeader>\n <ModalTitle>{t('crud.delete.title', { entity: entityName })}</ModalTitle>\n <ModalDescription>\n {displayValue\n ? t('crud.delete.confirmNamed', { displayValue })\n : t('crud.delete.confirmGeneric', { entity: entityName.toLowerCase() })}\n </ModalDescription>\n </ModalHeader>\n <ModalFooter>\n <Button variant=\"outline\" onClick={onClose}>{t('common.cancel')}</Button>\n <Button variant=\"destructive\" onClick={onConfirm}>{t('common.delete')}</Button>\n </ModalFooter>\n </ModalContent>\n </Modal>\n )\n}\n","import { exportCSV } from '@fayz-ai/core'\nimport type { CSVColumn } from '@fayz-ai/core'\nimport type { EntityDef } from '@fayz-ai/core'\n\nexport function exportToCSV<T extends Record<string, any>>(\n items: T[],\n entityDef: EntityDef,\n): void {\n const columns: CSVColumn[] = entityDef.fields\n .filter((f) => f.showInTable !== false)\n .map((f) => ({ key: f.key, label: f.label }))\n\n const namePlural = entityDef.namePlural ?? entityDef.name + 's'\n const filename = `${namePlural.toLowerCase().replace(/\\s+/g, '-')}-export`\n\n exportCSV(columns, items, filename)\n}\n","import type { FieldDef, EntityFieldRules } from '../types/crud'\n\n/** Merge tenant field-rule overrides into static FieldDef[]. Pure & testable. */\nexport function applyFieldRules(\n fields: FieldDef[],\n rules: EntityFieldRules | undefined,\n): FieldDef[] {\n if (!rules) return fields\n return fields.map((f) => {\n const override = rules[f.key]\n if (!override) return f\n return { ...f, ...override }\n })\n}\n","import { useMemo } from 'react'\nimport { useOrganizationStore } from '../stores/organization.store'\nimport { applyFieldRules } from '../lib/apply-field-rules'\nimport type { FieldDef, TenantFieldRules, EntityFieldRules } from '../types/crud'\n\nexport function useFieldRules(entityKey: string) {\n const settings = useOrganizationStore((s) => s.currentOrg?.settings)\n const fieldRules = (settings as Record<string, unknown> | undefined)?.fieldRules as\n | TenantFieldRules\n | undefined\n\n return useMemo(() => {\n const rules: EntityFieldRules | undefined = fieldRules?.[entityKey]\n return {\n rules,\n applyRules: (fields: FieldDef[]) => applyFieldRules(fields, rules),\n }\n }, [entityKey, fieldRules])\n}\n","import React, { useEffect, useState, useRef, useCallback, useMemo } from 'react'\nimport { Pencil, Trash2 } from 'lucide-react'\nimport type { ColumnDef as TanStackColumnDef } from '@tanstack/react-table'\nimport { useOrganizationStore } from '../org'\nimport { useTranslation } from '@fayz-ai/core'\nimport { Card } from '@fayz-ai/ui'\nimport { Button } from '@fayz-ai/ui'\nimport { CrudFormPage } from './CrudFormPage'\nimport { CrudDetailSkeleton, CrudFormSkeleton } from './CrudSkeletons'\nimport { CrudListView, type CrudFacet, type CrudNavTab } from './CrudListView'\nimport type { StatTileData } from '@fayz-ai/ui'\nimport { CrudDetailPage } from './CrudDetailPage'\nimport { DeleteConfirmDialog } from './DeleteConfirmDialog'\n// Lazy: the import wizard (CSV parsing + mapping UI, ~23 KB src) is rarely\n// opened — keep it out of the entry chunk.\nconst ImportWizard = React.lazy(() =>\n import('./ImportWizard').then((m) => ({ default: m.ImportWizard })),\n)\nimport { exportToCSV } from './csv-export'\nimport { fieldToColumns } from './fieldToColumn'\nimport { PermissionGate } from '../permissions/PermissionGate'\nimport { useLimitGuard, invalidateLimit } from '../access'\nimport { useFieldRules } from '../hooks/useFieldRules'\nimport { deriveEntityKey, useDataChanged } from '@fayz-ai/core'\nimport { toast } from '@fayz-ai/ui'\nimport { getSupabaseClientOptional } from '@fayz-ai/core'\nimport type { EntityDef } from '@fayz-ai/core'\nimport type { CrudStore } from '../stores/createCrudStore'\nimport type { ImportRowError } from './ImportWizard'\n\ntype CrudDisplay = 'table' | 'cards'\n\ninterface CrudPageProps<T extends { id: string }> {\n entityDef: EntityDef<T>\n useStore: () => CrudStore<T>\n basePath: string\n display: CrudDisplay\n feature?: string\n /** If true, hides create/edit/delete actions — list and detail view only */\n readOnly?: boolean\n /** Sibling lists shown as header tabs (see CrudListView). List view only. */\n navTabs?: CrudNavTab[]\n activeNavTab?: string\n /** Summary tiles for the list, derived from the rows currently loaded. */\n stats?: (items: T[] | null, total: number) => StatTileData[]\n}\n\nfunction getRouteDepth(sub: string): number {\n if (sub === '' || sub === '/') return 0 // list\n if (sub === '/new') return 1 // create\n if (sub.endsWith('/edit')) return 2 // edit\n return 1 // detail\n}\n\nfunction normalizeCrudBasePath(basePath: string): string {\n const normalized = `/${basePath}`.replace(/\\/+/g, '/')\n return normalized.length > 1 ? normalized.replace(/\\/+$/, '') : normalized\n}\n\nfunction crudPath(basePath: string, ...parts: Array<string | undefined>): string {\n return normalizeCrudBasePath([basePath, ...parts.filter(Boolean)].join('/'))\n}\n\nfunction setCrudHash(basePath: string, ...parts: Array<string | undefined>): void {\n window.location.hash = crudPath(basePath, ...parts)\n}\n\nfunction useSubRoute(basePath: string) {\n const normalizedBasePath = normalizeCrudBasePath(basePath)\n const getSub = () => {\n const hash = normalizeCrudBasePath(window.location.hash.slice(1) || '/')\n if (hash === normalizedBasePath) return ''\n return hash.startsWith(`${normalizedBasePath}/`) ? hash.slice(normalizedBasePath.length) : ''\n }\n\n const [sub, setSub] = useState(getSub)\n const [direction, setDirection] = useState<'forward' | 'back'>('forward')\n const prevDepthRef = useRef(getRouteDepth(getSub()))\n\n useEffect(() => {\n const handler = () => {\n const next = getSub()\n const nextDepth = getRouteDepth(next)\n setDirection(nextDepth > prevDepthRef.current ? 'forward' : 'back')\n prevDepthRef.current = nextDepth\n setSub(next)\n }\n window.addEventListener('hashchange', handler)\n return () => window.removeEventListener('hashchange', handler)\n }, [normalizedBasePath])\n\n return { sub, direction }\n}\n\n/** Convert our FieldDef-based columns to TanStack ColumnDef for DataTable */\nfunction useCrudColumns<T extends { id: string }>(\n entityDef: EntityDef<T>,\n options?: {\n basePath?: string\n onDelete?: (item: T) => void\n onInlineUpdate?: (id: string, field: string, value: any) => void\n feature?: string\n readOnly?: boolean\n },\n): TanStackColumnDef<T, any>[] {\n const displayField = entityDef.displayField ?? entityDef.fields[0]?.key ?? 'id'\n const cols = fieldToColumns(entityDef.fields, { onInlineUpdate: options?.onInlineUpdate })\n\n return useMemo(() => {\n const tanCols: TanStackColumnDef<T, any>[] = cols.map((col) => ({\n accessorKey: col.key,\n header: col.label,\n // Ordenar é ato da barra de ferramentas, não do cabeçalho: uma seta por\n // coluna transformava a linha de títulos numa fileira de botões e ainda\n // só alcançava as colunas visíveis. Ver o dropdown em CrudListView.\n enableSorting: false,\n cell: ({ row }: any) => {\n const value = row.original[col.key]\n const rendered = col.render(value, row.original)\n return col.key === displayField\n ? <span className=\"font-medium text-foreground\">{rendered}</span>\n : rendered\n },\n }))\n\n // Actions column\n if (!options?.readOnly && options?.basePath) {\n tanCols.push({\n id: 'actions',\n header: '',\n enableSorting: false,\n cell: ({ row }: any) => {\n const id = row.original.id\n const editBtn = (\n <Button variant=\"ghost\" size=\"icon\" className=\"h-8 w-8\"\n onClick={(e: React.MouseEvent) => { e.stopPropagation(); setCrudHash(options.basePath!, id, 'edit') }}>\n <Pencil className=\"h-4 w-4\" />\n </Button>\n )\n const deleteBtn = options.onDelete ? (\n <Button variant=\"ghost\" size=\"icon\" className=\"h-8 w-8 text-destructive hover:text-destructive\"\n onClick={(e: React.MouseEvent) => { e.stopPropagation(); options.onDelete!(row.original) }}>\n <Trash2 className=\"h-4 w-4\" />\n </Button>\n ) : null\n return (\n <div className=\"flex items-center justify-end gap-1\">\n {options.feature ? (\n <>\n <PermissionGate feature={options.feature} action=\"edit\">{editBtn}</PermissionGate>\n {deleteBtn && <PermissionGate feature={options.feature} action=\"delete\">{deleteBtn}</PermissionGate>}\n </>\n ) : (\n <>{editBtn}{deleteBtn}</>\n )}\n </div>\n )\n },\n })\n }\n\n return tanCols\n }, [cols, displayField, options?.basePath, options?.onDelete, options?.feature, options?.readOnly])\n}\n\nexport function CrudPage<T extends { id: string }>({ entityDef: rawEntityDef, useStore, basePath, display, feature, readOnly, navTabs, activeNavTab, stats }: CrudPageProps<T>) {\n const store = useStore()\n const t = useTranslation()\n const normalizedBasePath = normalizeCrudBasePath(basePath)\n const { sub, direction } = useSubRoute(normalizedBasePath)\n\n // Apply tenant field-rule overrides (required / visibility) before passing down\n const entityKey = deriveEntityKey(rawEntityDef)\n const { applyRules } = useFieldRules(entityKey)\n const entityDef = useMemo(() => ({\n ...rawEntityDef,\n fields: applyRules(rawEntityDef.fields),\n }), [rawEntityDef, applyRules]) as EntityDef<T>\n const [deleteItem, setDeleteItem] = useState<T | null>(null)\n const [searchInput, setSearchInput] = useState('')\n const [importOpen, setImportOpen] = useState(false)\n const [activeFilters, setActiveFilters] = useState<Record<string, string | undefined>>({})\n const activeFiltersRef = useRef<Record<string, string | undefined>>({})\n\n const namePlural = entityDef.namePlural ?? entityDef.name + 's'\n const displayField = entityDef.displayField ?? entityDef.fields[0]?.key ?? 'id'\n\n // Resolve declared facets (entityDef.facets) into pill options from each field.\n const resolvedFacets = useMemo<CrudFacet[]>(() => {\n return (entityDef.facets ?? []).map((f) => {\n const field = entityDef.fields.find((x) => x.key === f.field)\n // Campo booleano não tem `options` — e sem elas o filtro aparecia com uma\n // única entrada (\"Todas\") e nada para escolher. Sim/Não são as opções de\n // um booleano; não havia por que o entity ter de escrevê-las.\n const options = field?.type === 'boolean'\n ? [{ value: 'true', label: t('common.yes') }, { value: 'false', label: t('common.no') }]\n : (field?.options ?? []).map((o) =>\n typeof o === 'string' ? { value: o, label: o } : { value: o.value, label: o.label },\n )\n // O rótulo do campo vira o nome acessível da pastilha: ela mostra o VALOR\n // (\"Ativo\"), então sem isto um leitor de tela não diria de que filtro é.\n return { field: f.field, options, allLabel: f.allLabel, display: f.display, label: field?.label }\n })\n }, [entityDef, t])\n\n const handleFacetChange = useCallback((field: string, value: string | undefined) => {\n const next = { ...activeFiltersRef.current }\n if (value == null) delete next[field]\n else next[field] = value\n activeFiltersRef.current = next\n setActiveFilters(next)\n store.setQuery({ filters: next })\n }, [store])\n\n // Sort lives here, not in the table: the store owns the query, so picking a\n // column from the toolbar and clicking a column header have to end up in the\n // same place or the two controls would disagree about what is sorted.\n const [sort, setSort] = useState<{ by?: string; dir: 'asc' | 'desc' }>({\n by: entityDef.defaultSort,\n dir: entityDef.defaultSortDir ?? 'asc',\n })\n const handleSort = useCallback((field: string) => {\n setSort((prev) => {\n // Re-picking the active field flips direction; a new field starts ascending.\n const next: { by?: string; dir: 'asc' | 'desc' } = prev.by === field\n ? { by: field, dir: prev.dir === 'asc' ? 'desc' : 'asc' }\n : { by: field, dir: 'asc' }\n store.setQuery({ sortBy: next.by, sortDir: next.dir })\n return next\n })\n }, [store])\n\n // Campo e direção viraram duas escolhas separadas porque no menu elas SÃO\n // duas linhas: reclicar o campo ativo ali significaria \"escolhi este de novo\",\n // não \"inverta\" — e a lista viraria de cabeça para baixo sem ninguém pedir.\n const handleSortField = useCallback((field: string) => {\n setSort((prev) => {\n const next = { by: field, dir: prev.dir }\n store.setQuery({ sortBy: next.by, sortDir: next.dir })\n return next\n })\n }, [store])\n\n const handleSortDir = useCallback((dir: 'asc' | 'desc') => {\n setSort((prev) => {\n const next = { by: prev.by, dir }\n store.setQuery({ sortBy: next.by, sortDir: next.dir })\n return next\n })\n }, [store])\n\n const searchTimer = useRef<ReturnType<typeof setTimeout> | null>(null)\n const handleInlineUpdate = useCallback(async (id: string, field: string, value: any) => {\n await store.update(id, { [field]: value } as any)\n }, [store])\n const tanColumns = useCrudColumns(entityDef, { basePath: normalizedBasePath, onDelete: readOnly ? undefined : (item) => setDeleteItem(item), onInlineUpdate: handleInlineUpdate, feature, readOnly })\n const currentOrgId = useOrganizationStore((s) => s.currentOrg?.id)\n const guardImport = useLimitGuard(entityDef.limitKey ?? '')\n\n useEffect(() => {\n if (currentOrgId) store.fetch()\n }, [currentOrgId])\n\n // Read failures used to be swallowed by the store, so a missing table or an\n // RLS denial looked exactly like an empty list. Keyed on `errorAt`, not on the\n // message, so the same failure repeating still tells the user.\n useEffect(() => {\n if (!store.error) return\n toast.error(t('crud.list.loadFailed', { entities: namePlural.toLowerCase() }))\n console.warn(`[crud] failed to load ${namePlural}`, store.error)\n }, [store.errorAt])\n\n // Someone else wrote to this table — the assistant, another tab, a webhook.\n // The list is showing that data right now, so it reloads itself instead of\n // waiting for the user to discover the screen is stale.\n useDataChanged(\n { table: entityDef.data?.table, entityKey: deriveEntityKey(entityDef), archetype: entityDef.data?.archetype },\n () => { if (currentOrgId) store.fetch() },\n [currentOrgId],\n )\n\n const navigateToList = () => { setCrudHash(normalizedBasePath) }\n const animClass = direction === 'forward' ? 'saas-nav-forward' : 'saas-nav-back'\n\n const handleImport = useCallback(async (\n rows: Record<string, any>[],\n onProgress: (processed: number, total: number) => void,\n ): Promise<{ success: number; errors: ImportRowError[] }> => {\n // Guard: refuse import if not connected to Supabase (would silently go to mock)\n if (!getSupabaseClientOptional() as any) {\n return {\n success: 0,\n errors: [{ row: 0, message: t('crud.import.noConnection') }],\n }\n }\n\n // Plan quantity guard BEFORE the batch insert: adding `rows.length` rows must\n // stay within the plan cap. When it would exceed, the guard opens the global\n // UpgradeModal; we also surface a clear toast + a wizard error row and abort.\n if (entityDef.limitKey && (await guardImport(rows.length)) === 'blocked') {\n toast.error(t('crud.import.limitExceeded'))\n return {\n success: 0,\n errors: [{ row: 0, message: t('crud.import.limitExceeded') }],\n }\n }\n\n const { success, results } = await store.createMany(rows, {\n batchSize: 10,\n onProgress,\n })\n\n // Refresh the live count so gates/banners reflect the imported rows.\n if (success > 0 && entityDef.limitKey) invalidateLimit(entityDef.limitKey)\n\n const errors: ImportRowError[] = []\n for (let i = 0; i < results.length; i++) {\n if (results[i].error) {\n errors.push({ row: i + 2, message: results[i].error! })\n }\n }\n\n if (success > 0) {\n toast.success(t('crud.import.toastSuccess', { count: String(success) }))\n }\n return { success, errors }\n }, [store, t, guardImport, entityDef.limitKey])\n\n const handleExport = useCallback(() => {\n const items = store.items\n if (!items || items.length === 0) {\n toast.error(t('crud.export.noData'))\n return\n }\n exportToCSV(items as any, entityDef)\n toast.success(t('crud.export.toastSuccess', { count: String(items.length) }))\n }, [store.items, entityDef, t])\n\n // Determine which view to show\n let viewKey = 'list'\n let content: React.ReactNode = null\n\n if (sub === '/new' && !readOnly) {\n viewKey = 'new'\n content = (\n <CrudFormPage\n entityDef={entityDef}\n mode=\"create\"\n namePlural={namePlural}\n onCancel={navigateToList}\n onSubmit={async (data) => {\n await store.create(data)\n navigateToList()\n }}\n />\n )\n } else if (sub === '/new' && readOnly) {\n // readOnly — redirect back to list\n navigateToList()\n } else if (sub.endsWith('/edit') && !readOnly) {\n const id = sub.slice(1, -5)\n const item = store.getById(id)\n viewKey = `edit-${id}`\n\n if (!item && store.items === null) {\n // Esqueleto de FORMULÁRIO: é para um formulário que esta tela vai abrir.\n // Antes usava o esqueleto da ficha — herói com avatar e abas — e a página\n // prometia uma forma e entregava outra.\n content = <CrudFormSkeleton twoColumn={entityDef.formColumns === 2} />\n } else if (!item) {\n content = (\n <div className=\"space-y-6\">\n <nav className=\"flex items-center gap-1.5 text-sm text-muted-foreground\">\n <button type=\"button\" onClick={navigateToList} className=\"hover:text-foreground transition-colors\">{namePlural}</button>\n <span>/</span>\n <span className=\"text-foreground font-medium\">{t('common.notFound')}</span>\n </nav>\n <div className=\"text-center py-12\">\n <p className=\"text-muted-foreground mb-4\">{t('crud.detail.notFound', { entity: entityDef.name })}</p>\n <Button onClick={navigateToList}>{t('crud.detail.backTo', { entities: namePlural })}</Button>\n </div>\n </div>\n )\n } else {\n content = (\n <CrudFormPage\n entityDef={entityDef}\n mode=\"edit\"\n initialData={item as any}\n namePlural={namePlural}\n onCancel={() => { setCrudHash(normalizedBasePath, id) }}\n onSubmit={async (data) => {\n await store.update(id, data as Partial<T>)\n setCrudHash(normalizedBasePath, id)\n }}\n />\n )\n }\n } else if (sub.endsWith('/edit') && readOnly) {\n // readOnly — redirect to detail view\n const id = sub.slice(1, -5)\n setCrudHash(normalizedBasePath, id)\n } else if (sub.startsWith('/') && sub.length > 1) {\n // Parse /uuid or /uuid/tab-name\n const subParts = sub.slice(1).split('/')\n const id = subParts[0]\n const initialTab = subParts[1]?.split('?')[0] || undefined\n const item = store.getById(id)\n viewKey = `detail-${id}`\n\n if (!item && store.items === null) {\n content = <CrudDetailSkeleton />\n } else if (!item) {\n content = (\n <div className=\"space-y-6\">\n <nav className=\"flex items-center gap-1.5 text-sm text-muted-foreground\">\n <button type=\"button\" onClick={navigateToList} className=\"hover:text-foreground transition-colors\">{namePlural}</button>\n <span>/</span>\n <span className=\"text-foreground font-medium\">{t('common.notFound')}</span>\n </nav>\n <div className=\"text-center py-12\">\n <p className=\"text-muted-foreground mb-4\">{t('crud.detail.notFound', { entity: entityDef.name })}</p>\n <Button onClick={navigateToList}>{t('crud.detail.backTo', { entities: namePlural })}</Button>\n </div>\n </div>\n )\n } else {\n content = (\n <CrudDetailPage\n entityDef={entityDef}\n item={item as any}\n namePlural={namePlural}\n basePath={normalizedBasePath}\n initialTab={initialTab}\n onBack={navigateToList}\n onEdit={readOnly ? undefined : () => { setCrudHash(normalizedBasePath, id, 'edit') }}\n onDelete={readOnly ? undefined : () => setDeleteItem(item)}\n feature={feature}\n />\n )\n }\n } else {\n // List view — delegated to the shared CrudListView (header, search, facet\n // pills, table/cards). Data + routing stay here (store-backed).\n const handleSearch = (value: string) => {\n setSearchInput(value)\n if (searchTimer.current) clearTimeout(searchTimer.current)\n searchTimer.current = setTimeout(() => {\n store.setQuery({ search: value || undefined })\n }, 350)\n }\n\n const hasSearch = entityDef.fields.some((f) => f.searchable)\n\n content = (\n <CrudListView\n entityDef={entityDef}\n columns={tanColumns}\n items={store.items}\n total={store.total}\n display={display}\n search={searchInput}\n onSearchChange={hasSearch ? handleSearch : undefined}\n facets={resolvedFacets}\n activeFilters={activeFilters}\n onFacetChange={handleFacetChange}\n onNew={() => setCrudHash(normalizedBasePath, 'new')}\n onRowClick={(row) => setCrudHash(normalizedBasePath, (row as any).id)}\n onDelete={(item) => setDeleteItem(item)}\n onImport={() => setImportOpen(true)}\n onExport={handleExport}\n feature={feature}\n readOnly={readOnly}\n navTabs={navTabs}\n activeNavTab={activeNavTab}\n stats={stats?.(store.items, store.total)}\n error={store.error}\n onRefresh={() => { void store.fetch() }}\n onSort={handleSort}\n onSortField={handleSortField}\n onSortDir={handleSortDir}\n sortBy={sort.by}\n sortDir={sort.dir}\n />\n )\n }\n\n const handleDeleteConfirm = async () => {\n if (!deleteItem) return\n const id = (deleteItem as any).id\n setDeleteItem(null)\n // Await the removal so the (cache-invalidated) list refetch completes and the\n // deleted row is gone before we settle on the list view — previously this was\n // fire-and-forget and raced with navigation, leaving a ghost row behind.\n try {\n await store.remove(id)\n } finally {\n navigateToList()\n }\n }\n\n return (\n <>\n <div key={viewKey} className={animClass}>\n {content}\n </div>\n <DeleteConfirmDialog\n open={deleteItem !== null}\n onClose={() => setDeleteItem(null)}\n onConfirm={handleDeleteConfirm}\n entityName={entityDef.name}\n displayValue={deleteItem ? (deleteItem as any)[displayField] : undefined}\n />\n <React.Suspense fallback={null}>\n <ImportWizard\n open={importOpen}\n onClose={() => setImportOpen(false)}\n entityDef={entityDef as EntityDef<any>}\n onImport={handleImport}\n />\n </React.Suspense>\n </>\n )\n}\n","import { create } from 'zustand'\nimport type { DataProvider, CrudQuery } from '@fayz-ai/core'\nimport { emitDomainEvent, entityEventKey, getActiveTenantId } from '@fayz-ai/core'\n\nexport interface CrudState<T> {\n items: T[] | null\n total: number\n loading: boolean\n query: CrudQuery\n /**\n * Last read failure, or null. These used to be swallowed entirely — a missing\n * table, an RLS denial or a malformed select all rendered as a cheerful\n * \"nothing here yet\", which is the same screen an empty store shows, so a\n * broken list was indistinguishable from a new one.\n *\n * `errorAt` bumps on every failure so a repeat of the SAME message still\n * reads as a new event to whoever is watching it.\n */\n error: string | null\n errorAt: number\n}\n\nexport interface ImportBatchResult<T> {\n item?: T\n error?: string\n}\n\nexport interface CrudActions<T> {\n fetch: () => Promise<void>\n create: (data: any) => Promise<T>\n /** Batch create without per-item list refetch. Calls onProgress after each batch. Single fetch at the end. */\n createMany: (\n rows: any[],\n options?: { batchSize?: number; onProgress?: (processed: number, total: number) => void },\n ) => Promise<{ success: number; results: ImportBatchResult<T>[] }>\n update: (id: string, data: Partial<T>) => Promise<T>\n remove: (id: string) => Promise<void>\n setQuery: (query: Partial<CrudQuery>) => void\n getById: (id: string) => T | undefined\n}\n\nexport type CrudStore<T> = CrudState<T> & CrudActions<T>\n\n/**\n * Identidade do cadastro, para o evento saber de quem está falando.\n *\n * Opcional porque nem todo store é um cadastro do app (o painel de plugins\n * monta stores para listas internas). Sem ela o store funciona igual e não\n * emite — melhor calar do que emitir `registry.undefined.created`.\n */\nexport interface CrudStoreEntity {\n entityKey: string\n label: string\n}\n\nexport function createCrudStore<T extends { id: string }>(\n dataProvider: DataProvider<T>,\n entity?: CrudStoreEntity,\n) {\n // ---------------------------------------------------------------------------\n // O ponto onde todo cadastro do sistema passa.\n //\n // Cliente, fornecedor, produto, profissional: em todos os apps, criar e\n // editar chegam aqui. Emitir daqui é o que faz \"cliente cadastrado\" existir\n // para automações, webhooks e auditoria sem que cada app se lembre de avisar.\n //\n // O envelope não leva a linha inteira de propósito — só id, nome e qual\n // cadastro. Ver a nota em core/entity/events.ts.\n // ---------------------------------------------------------------------------\n function emit(action: 'created' | 'updated' | 'deleted' | 'imported', payload: Record<string, unknown>) {\n if (!entity) return\n const id = typeof payload.record_id === 'string' ? payload.record_id : undefined\n emitDomainEvent(\n entityEventKey(entity.entityKey, action),\n { entity_label: entity.label, ...payload },\n {\n tenantId: getActiveTenantId(),\n subject: id ? { type: entity.entityKey, id } : null,\n },\n )\n }\n\n /** O nome que a pessoa reconhece na linha do tempo. Cada cadastro guarda o\n * seu num campo diferente, e um evento sem nome legível vira \"registro\". */\n function displayName(item: any): string {\n return item?.name ?? item?.title ?? item?.fullName ?? item?.full_name ?? item?.id ?? ''\n }\n\n // Dedup: track the current in-flight fetch to avoid duplicate requests\n let inflightFetch: Promise<void> | null = null\n let lastQueryKey = ''\n // When the last identical query SETTLED. The in-flight check alone only\n // catches overlapping calls; it misses the very common pattern of two mounts\n // in quick succession (React StrictMode's double-effect in dev, a remount on\n // org resolve, a data-changed event landing right after the initial load),\n // where the first request finishes before the second starts. That produced\n // the duplicate request per page. A short freshness window collapses those\n // into one without making the list feel stale — writes invalidate it\n // explicitly, so this never serves data the user just changed.\n let lastSettledAt = 0\n const FRESH_MS = 1500\n\n function queryKey(query: CrudQuery): string {\n return JSON.stringify(query)\n }\n\n function invalidate() {\n inflightFetch = null\n lastQueryKey = ''\n lastSettledAt = 0\n }\n\n return create<CrudStore<T>>((set, get) => ({\n items: null,\n total: 0,\n loading: false,\n query: {},\n error: null,\n errorAt: 0,\n\n async fetch() {\n const currentKey = queryKey(get().query)\n\n // Same query already in flight — ride along instead of firing a second.\n if (inflightFetch && currentKey === lastQueryKey) {\n return inflightFetch\n }\n // Same query answered a moment ago and we already hold the rows.\n if (\n currentKey === lastQueryKey &&\n get().items !== null &&\n Date.now() - lastSettledAt < FRESH_MS\n ) {\n return\n }\n\n lastQueryKey = currentKey\n set({ loading: true })\n\n const promise = (async () => {\n try {\n const result = await dataProvider.list(get().query)\n set({ items: result.data, total: result.total, loading: false, error: null })\n } catch (err) {\n // Keep whatever rows we had — a failed refresh should not blank a\n // list that was fine a second ago — but say that it failed.\n set({\n items: get().items ?? [],\n loading: false,\n error: err instanceof Error ? err.message : String(err),\n errorAt: Date.now(),\n })\n } finally {\n inflightFetch = null\n lastSettledAt = Date.now()\n }\n })()\n\n inflightFetch = promise\n return promise\n },\n\n async create(data) {\n const item = await dataProvider.create(data)\n emit('created', { record_id: item?.id, record_name: displayName(item) })\n invalidate()\n await get().fetch()\n return item\n },\n\n async createMany(rows, options) {\n const batchSize = options?.batchSize ?? 10\n let success = 0\n const results: ImportBatchResult<T>[] = new Array(rows.length)\n\n for (let i = 0; i < rows.length; i += batchSize) {\n const batch = rows.slice(i, i + batchSize)\n const settled = await Promise.allSettled(\n batch.map((row) => dataProvider.create(row)),\n )\n for (let j = 0; j < settled.length; j++) {\n const r = settled[j]\n if (r.status === 'fulfilled' && r.value?.id) {\n success++\n results[i + j] = { item: r.value }\n } else {\n const msg = r.status === 'rejected' ? (r.reason?.message ?? 'Error') : 'No record returned'\n results[i + j] = { error: msg }\n }\n }\n options?.onProgress?.(Math.min(i + batch.length, rows.length), rows.length)\n }\n\n // UM evento para a planilha inteira, não um por linha. Uma importação é\n // um ato — e um catálogo de 5.000 clientes não pode virar 5.000\n // boas-vindas porque alguém subiu um CSV.\n if (success > 0) emit('imported', { record_count: String(success) })\n\n // Single list refresh after all inserts\n invalidate()\n await get().fetch()\n\n return { success, results }\n },\n\n async update(id, data) {\n const item = await dataProvider.update(id, data)\n emit('updated', { record_id: id, record_name: displayName(item) })\n invalidate()\n await get().fetch()\n return item\n },\n\n async remove(id) {\n // O nome é lido ANTES da exclusão: depois dela a linha não existe mais, e\n // uma auditoria que só diz \"registro 8f14e45f foi excluído\" não responde\n // a pergunta que alguém vai fazer meses depois.\n const removed = get().items?.find((item) => item.id === id)\n await dataProvider.remove(id)\n emit('deleted', { record_id: id, record_name: displayName(removed) })\n // Optimistically drop the row so the list updates immediately. withCache\n // invalidates the table on remove() and the refetch below reconciles, but\n // the optimistic update guarantees the deleted row never lingers as a\n // \"ghost\" until a hard reload — even if the refetch is momentarily served\n // a stale, in-flight cached list.\n set((s) => ({\n items: s.items ? s.items.filter((item) => item.id !== id) : s.items,\n total: Math.max(0, s.total - 1),\n }))\n invalidate()\n await get().fetch()\n },\n\n setQuery(partial) {\n set((s) => ({ query: { ...s.query, ...partial } }))\n queueMicrotask(() => get().fetch())\n },\n\n getById(id) {\n return (get().items ?? []).find((item) => item.id === id)\n },\n }))\n}\n","import React, { useMemo } from 'react'\nimport { CrudPage } from './CrudPage'\nimport type { CrudNavTab } from './CrudListView'\nimport type { StatTileData } from '@fayz-ai/ui'\nimport { createCrudStore } from '../stores/createCrudStore'\nimport { resolveDataProvider } from '@fayz-ai/core'\nimport { registerEntity, deriveEntityKey } from '@fayz-ai/core'\nimport type { EntityDef } from '@fayz-ai/core'\nimport type { DataProvider } from '@fayz-ai/core'\n\ninterface CreateCrudPageOptions<T extends { id: string }> {\n mockData?: T[]\n dataProvider?: DataProvider<T>\n /** List display mode: 'table' (default) or 'cards' */\n display?: 'table' | 'cards'\n /** Feature ID for permission gating on CRUD actions */\n feature?: string\n /**\n * Sibling lists this one heads a tab strip with (Clientes / Grupos /\n * Segmentos). Built lazily per render so a tab can navigate — the routing\n * primitive isn't available at module scope, where the page is defined.\n */\n navTabs?: () => CrudNavTab[]\n /** Which of `navTabs` is this page. */\n activeNavTab?: string\n /** If true, hides create/edit/delete actions — list and detail view only. */\n readOnly?: boolean\n /** Summary tiles for the list, derived from the rows currently loaded. */\n stats?: (items: T[] | null, total: number) => StatTileData[]\n}\n\nexport function createCrudPage<T extends { id: string }>(\n entityDef: EntityDef<T>,\n options?: CreateCrudPageOptions<T>,\n): React.ComponentType & { __crudBasePath?: string } {\n const display = options?.display ?? 'table'\n\n // A identidade que os eventos de cadastro carregam. Vem da MESMA função que\n // nomeia a entidade no registro, para que o evento emitido e o evento\n // declarado no catálogo nunca falem de chaves diferentes.\n const storeEntity = { entityKey: deriveEntityKey(entityDef), label: entityDef.name }\n\n // If an explicit dataProvider was given, use it eagerly (no lazy resolution needed)\n let eagerStore: ReturnType<typeof createCrudStore<T>> | null = null\n if (options?.dataProvider) {\n eagerStore = createCrudStore(options.dataProvider, storeEntity)\n }\n\n const GeneratedCrudPage: React.FC & { __crudBasePath?: string } = () => {\n // Lazy provider resolution — runs at render time when Supabase is already initialized\n const useStore = useMemo(() => {\n if (eagerStore) return eagerStore\n const provider = resolveDataProvider(entityDef, options?.mockData)\n return createCrudStore(provider, storeEntity)\n }, [])\n\n const basePath = GeneratedCrudPage.__crudBasePath ?? '/'\n return (\n <CrudPage\n entityDef={entityDef as EntityDef<any>}\n useStore={useStore as any}\n basePath={basePath}\n display={display}\n feature={options?.feature}\n readOnly={options?.readOnly}\n navTabs={options?.navTabs?.()}\n activeNavTab={options?.activeNavTab}\n stats={options?.stats}\n />\n )\n }\n\n GeneratedCrudPage.displayName = `CrudPage(${entityDef.name})`\n ;(GeneratedCrudPage as any).__isCrudPage = true\n ;(GeneratedCrudPage as any).__entityDef = entityDef\n\n registerEntity({\n entityKey: deriveEntityKey(entityDef),\n label: entityDef.name,\n labelPlural: entityDef.namePlural ?? entityDef.name,\n icon: entityDef.icon,\n fields: entityDef.fields,\n source: 'app',\n archetype: entityDef.data?.archetype,\n entityDef: entityDef as EntityDef,\n mockData: options?.mockData as Array<{ id: string }> | undefined,\n })\n\n return GeneratedCrudPage\n}\n","import { createCrudPage } from '../../crud/createCrudPage'\n// Core's EntityDef (the type createCrudPage consumes) carries `limitKey` for\n// plan quantity gating; the shell alias does not.\nimport type { EntityDef } from '@fayz-ai/core'\n\nexport const locationEntityDef: EntityDef = {\n name: 'Location',\n namePlural: 'Locations',\n icon: 'MapPin',\n layout: 'location',\n displayField: 'name',\n subtitleField: 'city',\n defaultSort: 'name',\n // Plan quantity cap — the generic CRUD (CrudFormPage/CrudPage/CrudListView)\n // guards create/import and dims \"+ Add\" at the cap. Core declares 'locations'.\n limitKey: 'locations',\n fields: [\n { key: 'name', label: 'Name', type: 'text', required: true, showInTable: true, searchable: true },\n { key: 'phone', label: 'Phone', type: 'phone', showInTable: true },\n { key: 'city', label: 'City', type: 'text', showInTable: true },\n { key: 'state', label: 'State', type: 'text', showInTable: true },\n { key: 'address', label: 'Address', type: 'text' },\n { key: 'country', label: 'Country', type: 'text', defaultValue: 'BR' },\n { key: 'postalCode', label: 'Postal Code', type: 'text' },\n { key: 'email', label: 'Email', type: 'email' },\n { key: 'isHeadquarters', label: 'Headquarters', type: 'boolean', showInTable: true },\n { key: 'isActive', label: 'Active', type: 'boolean', showInTable: true, defaultValue: true, inlineToggle: true },\n { key: 'notes', label: 'Notes', type: 'textarea' },\n ],\n data: {\n table: 'locations',\n tenantScoped: true,\n searchColumns: ['name', 'city', 'state'],\n defaults: { kind: 'branch' },\n },\n}\n\nexport const LocationsCrudPage = createCrudPage(locationEntityDef)\n// Set basePath for hash-based sub-routing inside settings tab\n;(LocationsCrudPage as any).__crudBasePath = '/settings/locations'\n","import * as React from 'react'\nimport { useState, useMemo, useCallback } from 'react'\nimport { ChevronDown, ChevronRight, RotateCcw, Loader2, Search, ChevronsUpDown } from 'lucide-react'\nimport { cn } from '../../lib/cn'\nimport { Card, CardContent, getLucideIcon } from '@fayz-ai/ui'\nimport { Button } from '@fayz-ai/ui'\nimport { Checkbox } from '@fayz-ai/ui'\nimport { useTranslation } from '../../hooks/useTranslation'\nimport type { RegisteredEntity } from '../../lib/entity-registry'\nimport type { TenantFieldRules, EntityFieldRules, FieldRuleOverride, FieldDef } from '../../types/crud'\n\ninterface FieldRulesSettingsProps {\n entities: RegisteredEntity[]\n rules: TenantFieldRules\n onSave: (rules: TenantFieldRules) => Promise<void>\n}\n\ntype OverrideKey = keyof FieldRuleOverride\n\nconst RULE_COLUMNS: { key: OverrideKey; labelKey: string }[] = [\n { key: 'required', labelKey: 'settings.fieldRules.required' },\n { key: 'showInForm', labelKey: 'settings.fieldRules.inForm' },\n { key: 'showInTable', labelKey: 'settings.fieldRules.inTable' },\n { key: 'showInDetail', labelKey: 'settings.fieldRules.inDetail' },\n]\n\n/** Core SaaS archetypes — shown in the main section */\nconst CORE_ARCHETYPES = new Set([\n 'person', 'product', 'service', 'category', 'order', 'location',\n])\n\n/** Priority order for sorting core entities */\nconst ARCHETYPE_ORDER: Record<string, number> = {\n person: 0,\n service: 1,\n product: 2,\n category: 3,\n order: 4,\n location: 5,\n}\n\nfunction isCoreEntity(entity: RegisteredEntity): boolean {\n if (entity.archetype && CORE_ARCHETYPES.has(entity.archetype)) return true\n const prefix = entity.entityKey.split(':')[0]\n return CORE_ARCHETYPES.has(prefix)\n}\n\nfunction entitySortKey(entity: RegisteredEntity): number {\n const prefix = entity.archetype ?? entity.entityKey.split(':')[0]\n return ARCHETYPE_ORDER[prefix] ?? 99\n}\n\n/** Group structure for plugin entities */\ninterface PluginGroup {\n pluginId: string\n pluginName: string\n pluginIcon: string\n entities: RegisteredEntity[]\n}\n\n// ---------------------------------------------------------------------------\n// Field helpers\n// ---------------------------------------------------------------------------\n\nfunction getDefaultValue(field: FieldDef, key: OverrideKey): boolean {\n switch (key) {\n case 'required':\n return field.required ?? false\n case 'showInForm':\n return field.showInForm !== false\n case 'showInTable':\n return field.showInTable !== false\n case 'showInDetail':\n return field.showInDetail !== false\n }\n}\n\nfunction getEffectiveValue(\n field: FieldDef,\n key: OverrideKey,\n rules: EntityFieldRules | undefined,\n): boolean {\n const override = rules?.[field.key]?.[key]\n if (override != null) return override\n return getDefaultValue(field, key)\n}\n\nfunction isFieldModified(\n field: FieldDef,\n rules: EntityFieldRules | undefined,\n): boolean {\n if (!rules?.[field.key]) return false\n return RULE_COLUMNS.some((col) => {\n const override = rules[field.key]?.[col.key]\n return override != null && override !== getDefaultValue(field, col.key)\n })\n}\n\nfunction countModified(\n fields: FieldDef[],\n rules: EntityFieldRules | undefined,\n): number {\n if (!rules) return 0\n return fields.filter((f) => isFieldModified(f, rules)).length\n}\n\nfunction resolveIcon(iconName: string): React.ComponentType<any> | null {\n return getLucideIcon(iconName) ?? null\n}\n\nfunction matchesSearch(entity: RegisteredEntity, q: string): boolean {\n return (\n entity.label.toLowerCase().includes(q) ||\n entity.labelPlural.toLowerCase().includes(q) ||\n entity.entityKey.toLowerCase().includes(q)\n )\n}\n\n// ---------------------------------------------------------------------------\n// EntityAccordion\n// ---------------------------------------------------------------------------\n\nfunction EntityAccordion({\n entity,\n rules,\n onToggle,\n onReset,\n}: {\n entity: RegisteredEntity\n rules: EntityFieldRules | undefined\n onToggle: (entityKey: string, fieldKey: string, ruleKey: OverrideKey, value: boolean) => void\n onReset: (entityKey: string) => void\n}) {\n const { t } = useTranslation()\n const [open, setOpen] = useState(false)\n const modified = countModified(entity.fields, rules)\n const Icon = resolveIcon(entity.icon)\n\n return (\n <Card>\n <button\n type=\"button\"\n onClick={() => setOpen(!open)}\n className=\"flex w-full items-center gap-3 px-5 py-3.5 text-left\"\n >\n {open ? (\n <ChevronDown className=\"h-4 w-4 shrink-0 text-muted-foreground\" />\n ) : (\n <ChevronRight className=\"h-4 w-4 shrink-0 text-muted-foreground\" />\n )}\n {Icon && <Icon className=\"h-4 w-4 shrink-0 text-muted-foreground\" />}\n <span className=\"text-sm font-semibold flex-1\">{entity.labelPlural || entity.label}</span>\n {modified > 0 && (\n <span className=\"text-xs text-primary font-medium tabular-nums\">\n {t('settings.fieldRules.modified', { count: String(modified) })}\n </span>\n )}\n </button>\n\n {open && (\n <CardContent className=\"pt-0 pb-4 px-5\">\n <div className=\"overflow-x-auto\">\n <table className=\"w-full text-sm\">\n <thead>\n <tr className=\"border-b\">\n <th className=\"text-left font-medium text-muted-foreground py-2 pr-4 w-[40%]\">\n {t('settings.fieldRules.field')}\n </th>\n {RULE_COLUMNS.map((col) => (\n <th\n key={col.key}\n className=\"text-center font-medium text-muted-foreground py-2 px-3 w-[15%]\"\n >\n {t(col.labelKey)}\n </th>\n ))}\n </tr>\n </thead>\n <tbody>\n {entity.fields.map((field) => {\n const fieldModified = isFieldModified(field, rules)\n return (\n <tr\n key={field.key}\n className={cn(\n 'border-b last:border-0',\n fieldModified && 'bg-primary/[0.03]',\n )}\n >\n <td className=\"py-2.5 pr-4\">\n <div className=\"flex items-center gap-2\">\n <span className=\"text-foreground\">{field.label}</span>\n {fieldModified && (\n <span className=\"h-1.5 w-1.5 rounded-full bg-primary shrink-0\" />\n )}\n </div>\n </td>\n {RULE_COLUMNS.map((col) => {\n const effective = getEffectiveValue(field, col.key, rules)\n const defaultVal = getDefaultValue(field, col.key)\n const overridden = rules?.[field.key]?.[col.key]\n const isModified = overridden != null && overridden !== defaultVal\n return (\n <td key={col.key} className=\"text-center py-2.5 px-3\">\n <div className=\"inline-flex items-center gap-1\">\n <Checkbox\n checked={effective}\n onChange={(val) =>\n onToggle(entity.entityKey, field.key, col.key, val)\n }\n />\n {isModified && (\n <span className=\"h-1.5 w-1.5 rounded-full bg-primary shrink-0\" />\n )}\n </div>\n </td>\n )\n })}\n </tr>\n )\n })}\n </tbody>\n </table>\n </div>\n\n {modified > 0 && (\n <div className=\"flex justify-end pt-3\">\n <Button\n variant=\"ghost\"\n size=\"sm\"\n onClick={(e) => {\n e.stopPropagation()\n onReset(entity.entityKey)\n }}\n >\n <RotateCcw className=\"h-3.5 w-3.5 mr-1.5\" />\n {t('settings.fieldRules.resetDefaults')}\n </Button>\n </div>\n )}\n </CardContent>\n )}\n </Card>\n )\n}\n\n// ---------------------------------------------------------------------------\n// Section components\n// ---------------------------------------------------------------------------\n\nfunction SectionHeader({ label }: { label: string }) {\n return (\n <h3 className=\"text-xs font-semibold uppercase tracking-wider text-muted-foreground px-1\">\n {label}\n </h3>\n )\n}\n\nfunction PluginSectionHeader({ name, iconName }: { name: string; iconName: string }) {\n const Icon = resolveIcon(iconName)\n return (\n <div className=\"flex items-center gap-2 px-1\">\n {Icon && <Icon className=\"h-3.5 w-3.5 text-muted-foreground\" />}\n <h3 className=\"text-xs font-semibold uppercase tracking-wider text-muted-foreground\">\n {name}\n </h3>\n </div>\n )\n}\n\n// ---------------------------------------------------------------------------\n// Main component\n// ---------------------------------------------------------------------------\n\nexport function FieldRulesSettings({ entities, rules: initialRules, onSave }: FieldRulesSettingsProps) {\n const { t } = useTranslation()\n const [draft, setDraft] = useState<TenantFieldRules>(initialRules)\n const [saving, setSaving] = useState(false)\n const [search, setSearch] = useState('')\n const [showMore, setShowMore] = useState(false)\n\n React.useEffect(() => {\n setDraft(initialRules)\n }, [initialRules])\n\n const isDirty = useMemo(\n () => JSON.stringify(draft) !== JSON.stringify(initialRules),\n [draft, initialRules],\n )\n\n // Split entities: core standalone → standalone non-core → grouped by plugin\n const { coreEntities, standaloneEntities, pluginGroups } = useMemo(() => {\n const q = search.trim().toLowerCase()\n\n const core: RegisteredEntity[] = []\n const standalone: RegisteredEntity[] = []\n const pluginMap = new Map<string, PluginGroup>()\n\n for (const entity of entities) {\n if (q && !matchesSearch(entity, q)) continue\n\n if (entity.source === 'plugin' && entity.pluginId) {\n // Group under plugin\n let group = pluginMap.get(entity.pluginId)\n if (!group) {\n group = {\n pluginId: entity.pluginId,\n pluginName: entity.pluginName ?? entity.pluginId,\n pluginIcon: entity.pluginIcon ?? 'Puzzle',\n entities: [],\n }\n pluginMap.set(entity.pluginId, group)\n }\n group.entities.push(entity)\n } else if (isCoreEntity(entity)) {\n core.push(entity)\n } else {\n standalone.push(entity)\n }\n }\n\n // Sort core by archetype priority, then alphabetically\n core.sort((a, b) => {\n const orderDiff = entitySortKey(a) - entitySortKey(b)\n if (orderDiff !== 0) return orderDiff\n return (a.labelPlural || a.label).localeCompare(b.labelPlural || b.label)\n })\n\n standalone.sort((a, b) =>\n (a.labelPlural || a.label).localeCompare(b.labelPlural || b.label),\n )\n\n // Sort entities within each plugin group alphabetically\n const groups = Array.from(pluginMap.values())\n for (const group of groups) {\n group.entities.sort((a, b) =>\n (a.labelPlural || a.label).localeCompare(b.labelPlural || b.label),\n )\n }\n // Sort plugin groups by plugin name\n groups.sort((a, b) => a.pluginName.localeCompare(b.pluginName))\n\n return {\n coreEntities: core,\n standaloneEntities: standalone,\n pluginGroups: groups,\n }\n }, [entities, search])\n\n const isSearching = search.trim().length > 0\n const hasExtras = standaloneEntities.length > 0 || pluginGroups.length > 0\n const showExtras = hasExtras && (showMore || isSearching)\n const extraCount = standaloneEntities.length + pluginGroups.reduce((sum, g) => sum + g.entities.length, 0)\n const hasNoResults = coreEntities.length === 0 && !hasExtras\n\n const handleToggle = useCallback(\n (entityKey: string, fieldKey: string, ruleKey: OverrideKey, value: boolean) => {\n setDraft((prev) => {\n const entityRules = { ...prev[entityKey] }\n const fieldOverride = { ...entityRules[fieldKey] }\n fieldOverride[ruleKey] = value\n entityRules[fieldKey] = fieldOverride\n return { ...prev, [entityKey]: entityRules }\n })\n },\n [],\n )\n\n const handleReset = useCallback((entityKey: string) => {\n setDraft((prev) => {\n const next = { ...prev }\n delete next[entityKey]\n return next\n })\n }, [])\n\n const handleSave = async () => {\n setSaving(true)\n try {\n const cleaned: TenantFieldRules = {}\n for (const [entityKey, entityRules] of Object.entries(draft)) {\n const entity = entities.find((e) => e.entityKey === entityKey)\n if (!entity) continue\n\n const cleanedEntity: EntityFieldRules = {}\n for (const [fieldKey, override] of Object.entries(entityRules)) {\n const field = entity.fields.find((f) => f.key === fieldKey)\n if (!field) continue\n\n const cleanedOverride: FieldRuleOverride = {}\n let hasOverride = false\n for (const col of RULE_COLUMNS) {\n const val = override[col.key]\n if (val != null && val !== getDefaultValue(field, col.key)) {\n cleanedOverride[col.key] = val\n hasOverride = true\n }\n }\n if (hasOverride) {\n cleanedEntity[fieldKey] = cleanedOverride\n }\n }\n if (Object.keys(cleanedEntity).length > 0) {\n cleaned[entityKey] = cleanedEntity\n }\n }\n\n await onSave(cleaned)\n } finally {\n setSaving(false)\n }\n }\n\n const renderAccordions = (list: RegisteredEntity[]) =>\n list.map((entity) => (\n <EntityAccordion\n key={entity.entityKey}\n entity={entity}\n rules={draft[entity.entityKey]}\n onToggle={handleToggle}\n onReset={handleReset}\n />\n ))\n\n return (\n <div className=\"space-y-6\">\n {/* Header + Save */}\n <div className=\"flex items-start justify-between gap-4\">\n <div>\n <h2 className=\"text-lg font-semibold\">{t('settings.fieldRules')}</h2>\n <p className=\"text-sm text-muted-foreground mt-0.5\">\n {t('settings.fieldRules.subtitle')}\n </p>\n </div>\n <Button onClick={handleSave} disabled={!isDirty || saving} className=\"shrink-0\">\n {saving && <Loader2 className=\"mr-2 h-4 w-4 animate-spin\" />}\n {t('common.save')}\n </Button>\n </div>\n\n {/* Search */}\n {entities.length > 4 && (\n <div className=\"relative max-w-sm\">\n <Search className=\"absolute left-2.5 top-1/2 -translate-y-1/2 h-3.5 w-3.5 text-muted-foreground\" />\n <input\n type=\"text\"\n placeholder={t('settings.fieldRules.searchPlaceholder')}\n value={search}\n onChange={(e) => setSearch(e.target.value)}\n className=\"w-full rounded-input border border-input bg-card shadow-[inset_0_1px_0_rgb(0_0_0_/0.06)] pl-8 pr-3 py-2 text-sm focus:outline-none focus:ring-2 focus:ring-ring\"\n />\n </div>\n )}\n\n {hasNoResults ? (\n <p className=\"text-sm text-muted-foreground py-8 text-center\">\n {t('settings.fieldRules.noEntities')}\n </p>\n ) : (\n <div className=\"space-y-6\">\n {/* Core register types — always visible */}\n {coreEntities.length > 0 && (\n <div className=\"space-y-2\">\n <SectionHeader label={t('settings.fieldRules.coreRegisters')} />\n {renderAccordions(coreEntities)}\n </div>\n )}\n\n {/* Extras: standalone + plugin groups — behind \"Load more\" */}\n {showExtras && (\n <>\n {/* Standalone non-core, non-plugin entities */}\n {standaloneEntities.length > 0 && (\n <div className=\"space-y-2\">\n <SectionHeader label={t('settings.fieldRules.otherRegisters')} />\n {renderAccordions(standaloneEntities)}\n </div>\n )}\n\n {/* Plugin groups — each with plugin name + icon header */}\n {pluginGroups.map((group) => (\n <div key={group.pluginId} className=\"space-y-2\">\n <PluginSectionHeader\n name={group.pluginName}\n iconName={group.pluginIcon}\n />\n {renderAccordions(group.entities)}\n </div>\n ))}\n </>\n )}\n\n {/* Load more / show less toggle */}\n {hasExtras && !isSearching && (\n <button\n type=\"button\"\n onClick={() => setShowMore(!showMore)}\n className=\"flex w-full items-center justify-center gap-2 rounded-lg border border-dashed py-3 text-sm text-muted-foreground hover:text-foreground hover:border-border transition-colors\"\n >\n <ChevronsUpDown className=\"h-4 w-4\" />\n {showMore\n ? t('settings.fieldRules.showLess')\n : t('settings.fieldRules.showMore', { count: String(extraCount) })}\n </button>\n )}\n </div>\n )}\n </div>\n )\n}\n","import type { FieldDef, EntityDef } from '../types/crud'\nimport type { EntityArchetype } from '../types/entities'\n\nexport interface RegisteredEntity {\n entityKey: string\n label: string\n labelPlural: string\n icon: string\n fields: FieldDef[]\n source: 'page' | 'plugin'\n archetype?: EntityArchetype\n pluginId?: string\n pluginName?: string\n pluginIcon?: string\n}\n\nconst registry = new Map<string, RegisteredEntity>()\n\nexport function deriveEntityKey(entityDef: EntityDef): string {\n if (entityDef.data?.archetypeKind) {\n return `${entityDef.data.archetype ?? ''}:${entityDef.data.archetypeKind}`\n }\n if (entityDef.data?.archetype) {\n return entityDef.data.archetype\n }\n return entityDef.data?.table ?? entityDef.name\n}\n\nexport function registerEntity(entity: RegisteredEntity): void {\n registry.set(entity.entityKey, entity)\n}\n\nexport function getRegisteredEntities(): RegisteredEntity[] {\n return Array.from(registry.values())\n}\n\nexport function getEntityByKey(key: string): RegisteredEntity | undefined {\n return registry.get(key)\n}\n","import { FieldRulesSettings } from './FieldRulesSettings'\nimport { useOrganizationStore } from '../../stores/organization.store'\n// Native org adapter — see ConnectedCompanySettings. The shell org-context\n// provider is never mounted, so the old import yielded a null adapter (no-op save).\nimport { useOrgAdapterOptional } from '../../org'\nimport { getRegisteredEntities } from '../../lib/entity-registry'\nimport { toast } from '../notifications/ToastProvider'\nimport { useTranslation } from '../../hooks/useTranslation'\nimport type { TenantFieldRules, TenantSettings } from '../../types'\n\nfunction extractFieldRules(settings: unknown): TenantFieldRules {\n if (!settings || typeof settings !== 'object') return {}\n return (settings as Record<string, unknown>).fieldRules as TenantFieldRules ?? {}\n}\n\nexport function ConnectedFieldRulesSettings() {\n const { t } = useTranslation()\n const currentOrg = useOrganizationStore((s) => s.currentOrg)\n const setCurrentOrg = useOrganizationStore((s) => s.setCurrentOrg)\n const adapter = useOrgAdapterOptional()\n const entities = getRegisteredEntities()\n const rules = extractFieldRules(currentOrg?.settings)\n\n const handleSave = async (newRules: TenantFieldRules) => {\n if (!adapter || !currentOrg) return\n\n try {\n const currentSettings = (currentOrg.settings ?? {}) as Record<string, unknown>\n const updated = await adapter.updateOrg(currentOrg.id, {\n settings: {\n ...currentSettings,\n fieldRules: newRules,\n },\n })\n setCurrentOrg(updated)\n toast.success(t('settings.fieldRules.saved'))\n } catch (err: any) {\n toast.error(t('settings.fieldRules.saveFailed'), { description: err?.message })\n }\n }\n\n return (\n <FieldRulesSettings\n entities={entities}\n rules={rules}\n onSave={handleSave}\n />\n )\n}\n","import * as React from 'react'\nimport { Crown } from 'lucide-react'\nimport { Modal, ModalContent, ModalHeader, ModalTitle, ModalDescription, ModalBody, ModalFooter, Button } from '@fayz-ai/ui'\nimport { useTranslation } from '../../hooks/useTranslation'\nimport { useBillingStore } from '../../stores/billing.store'\nimport { usePermissionsStore } from '../../permissions'\nimport { useOrganizationStore } from '../../org/store'\nimport { navigateTo } from '../../app/routing'\nimport { useUpgradeModalStore, useLimit, featureDisplayName } from './access-contract'\n\n// ---------------------------------------------------------------------------\n// UpgradeModal — the single global upgrade dialog. Mounted once in the shell\n// (see AdminShell). Opened imperatively via useUpgradeModalStore().open({...})\n// by LimitGate / useLimitGuard (limitKey context) or feature gates (feature\n// context). Radix dialog WITH a ModalTitle for a11y (regression guard: B25).\n// ---------------------------------------------------------------------------\n\n/** Inner body — only mounted while a context is present, so useLimit(limitKey)\n * runs against a real key (hooks stay unconditional inside this component). */\nfunction UpgradeModalBody({ limitKey, feature }: { limitKey?: string; feature?: string }) {\n const { t } = useTranslation()\n const tr = (key: string, fallback: string, params?: Record<string, string | number>) => {\n let v = t(key)\n if (!v || v === key) v = fallback\n if (params) for (const [k, val] of Object.entries(params)) v = v.replace(`{${k}}`, String(val)).replace(`{{${k}}}`, String(val))\n return v\n }\n\n const close = useUpgradeModalStore((s) => s.close)\n const plans = useBillingStore((s) => s.plans)\n const features = usePermissionsStore((s) => s.features)\n const currentOrg = useOrganizationStore((s) => s.currentOrg)\n const currentPlan = plans.find((p) => p.id === (currentOrg?.plan || 'free'))\n const planName = currentPlan?.name ?? tr('billing.free', 'Free')\n\n const limit = useLimit(limitKey ?? '')\n\n const featureLabel = feature ? featureDisplayName(features.find((f) => f.id === feature)?.label ?? feature) : null\n const limitLabel = limitKey\n ? (tr(`limit.label.${limitKey}`, limitKey))\n : null\n\n const title = featureLabel && !limitKey\n ? tr('upgrade.unlock', 'Unlock {feature}', { feature: featureLabel })\n : tr('upgrade.title', 'Premium feature')\n const description = limitKey\n ? tr('limit.reached', \"You've reached the {label} limit of the {plan} plan.\", { label: limitLabel ?? limitKey, plan: planName })\n : featureLabel\n ? tr('upgrade.descriptionFeature', 'The {feature} feature is available on a higher plan. Upgrade to unlock it.', { feature: featureLabel })\n : tr('upgrade.description', 'This feature is available on a higher plan. Upgrade to unlock it.')\n\n const goToPlans = () => {\n close()\n navigateTo('/settings/subscription')\n }\n\n return (\n <ModalContent size=\"md\">\n <ModalHeader>\n <span className=\"mb-2 flex h-11 w-11 items-center justify-center rounded-xl bg-amber-400/15 text-amber-500\">\n <Crown className=\"h-5 w-5\" />\n </span>\n <ModalTitle>{title}</ModalTitle>\n <ModalDescription>{description}</ModalDescription>\n </ModalHeader>\n\n {limitKey && !limit.unlimited && (\n <ModalBody>\n <div className=\"rounded-lg border bg-muted/30 px-4 py-3\">\n <div className=\"flex items-center justify-between text-sm\">\n <span className=\"text-muted-foreground\">{limitLabel}</span>\n <span className=\"font-semibold text-foreground\">\n {limit.used} / {limit.max}\n </span>\n </div>\n </div>\n </ModalBody>\n )}\n\n <ModalFooter>\n <Button variant=\"outline\" onClick={close}>\n {tr('common.cancel', 'Cancel')}\n </Button>\n <Button onClick={goToPlans}>\n <Crown className=\"mr-1.5 h-4 w-4\" />\n {tr('upgrade.cta', 'View plans')}\n </Button>\n </ModalFooter>\n </ModalContent>\n )\n}\n\nexport function UpgradeModal() {\n const current = useUpgradeModalStore((s) => s.current)\n const close = useUpgradeModalStore((s) => s.close)\n\n return (\n <Modal open={current !== null} onOpenChange={(open) => { if (!open) close() }}>\n {current !== null && <UpgradeModalBody limitKey={current.limitKey} feature={current.feature} />}\n </Modal>\n )\n}\n","import * as React from 'react'\nimport { AlertTriangle, X } from 'lucide-react'\nimport { Button } from '@fayz-ai/ui'\nimport { useTranslation } from '../../hooks/useTranslation'\nimport { navigateTo } from '../../app/routing'\nimport { useLimit, type LimitInfo } from './access-contract'\n\n// ---------------------------------------------------------------------------\n// SoftLimitBanner — discreet, persistent notice at the top of the content when\n// a monitored limit is EXCEEDED (used > max), not merely reached. This is the\n// Notion-style soft-limit path: the public booking flow (storefront\n// createCustomer) never blocks the end client, so a tenant can overshoot its cap\n// — the admin sees this banner nudging an upgrade. Dismissable for the session.\n//\n// `keys` are the limit keys to monitor; the shell derives them from\n// `manifest.billing.softLimitKeys` (documented seam). Each key mounts a probe so\n// hooks stay unconditional even as the list is config-driven.\n// ---------------------------------------------------------------------------\n\nfunction LimitProbe({ limitKey, onReport }: { limitKey: string; onReport: (key: string, info: LimitInfo) => void }) {\n const info = useLimit(limitKey)\n React.useEffect(() => {\n onReport(limitKey, info)\n }, [limitKey, info, onReport])\n return null\n}\n\nexport function SoftLimitBanner({ keys }: { keys: string[] }) {\n const { t } = useTranslation()\n const tr = (key: string, fallback: string, params?: Record<string, string | number>) => {\n let v = t(key)\n if (!v || v === key) v = fallback\n if (params) for (const [k, val] of Object.entries(params)) v = v.replace(`{${k}}`, String(val)).replace(`{{${k}}}`, String(val))\n return v\n }\n\n const [over, setOver] = React.useState<Record<string, boolean>>({})\n const [dismissed, setDismissed] = React.useState<Record<string, boolean>>({})\n\n const report = React.useCallback((key: string, info: LimitInfo) => {\n const isOver = !info.unlimited && !info.loading && info.used > info.max\n setOver((prev) => {\n if (isOver === Boolean(prev[key])) return prev\n return { ...prev, [key]: isOver }\n })\n }, [])\n\n // Stable key list (avoid remounting probes each render).\n const monitored = React.useMemo(() => Array.from(new Set(keys)), [keys])\n\n const activeKey = monitored.find((k) => over[k] && !dismissed[k])\n\n return (\n <>\n {monitored.map((k) => (\n <LimitProbe key={k} limitKey={k} onReport={report} />\n ))}\n {activeKey && (\n <div className=\"mb-3 flex flex-wrap items-center gap-3 rounded-lg border border-amber-400/50 bg-amber-50/70 px-4 py-2.5 text-sm dark:bg-amber-950/25\">\n <AlertTriangle className=\"h-4 w-4 shrink-0 text-amber-600 dark:text-amber-400\" />\n <span className=\"min-w-0 flex-1 text-foreground\">\n {tr('banner.overLimit', \"You've exceeded the {label} limit of your plan — upgrade to keep growing.\", {\n label: tr(`limit.label.${activeKey}`, activeKey),\n })}\n </span>\n <Button size=\"sm\" onClick={() => navigateTo('/settings/subscription')}>\n {tr('upgrade.cta', 'View plans')}\n </Button>\n <button\n type=\"button\"\n aria-label={tr('common.close', 'Close')}\n className=\"rounded p-1 text-muted-foreground transition-colors hover:bg-amber-400/20 hover:text-foreground\"\n onClick={() => setDismissed((prev) => ({ ...prev, [activeKey]: true }))}\n >\n <X className=\"h-4 w-4\" />\n </button>\n </div>\n )}\n </>\n )\n}\n","import * as React from 'react'\nimport {\n AppShell,\n type NavigationItem,\n type BottomNavItem,\n type MobileHeaderVariant,\n ModuleLayoutProvider,\n PageTransition,\n type ModuleNavVariant,\n Dropdown,\n DropdownTrigger,\n DropdownContent,\n DropdownItem,\n DropdownLabel,\n DropdownSeparator,\n Skeleton,\n useLayoutStore,\n Popover,\n PopoverTrigger,\n PopoverContent,\n} from '@fayz-ai/ui'\nimport type { CommandItem } from '../components/layout/CommandPalette'\nimport { useGlobalSearch } from '../hooks/useGlobalSearch'\nimport { useAuth } from '@fayz-ai/auth'\nimport { AuthGate, SetPasswordPage, usePasswordSetupGate, type LoginAmbassador } from '@fayz-ai/plugin-auth'\nimport { usePluginRuntime, resolvePluginComponent, useTranslation, deriveEntityKey } from '@fayz-ai/core'\nimport type { PermissionAction, PluginNavigationEntry, PluginRouteDefinition, PluginSettingsTab, SystemPermission } from '@fayz-ai/core'\n\n/** Route/nav RBAC requirement (mirror of core's PluginPermissionRequirement,\n * which is not re-exported from the package index). */\ntype PermissionRequirement = { feature: string; action: PermissionAction }\nimport { useAdminPath, navigateTo, matchRoute, routeScore, normalizeAdminPath } from './routing'\nimport type { CustomPage, AppSiteConfig } from './config'\nimport type { AuthProvider } from '@fayz-ai/core'\nimport { setEntityRouteMap, type EntityRouteEntry } from '../lib/entity-routes'\nimport { usePermissionOptional } from '../permissions/context'\nimport { usePermissionsStore } from '../permissions'\nimport { useTenantOptional } from '../org/context'\nimport { WidgetSlot } from '../plugins/WidgetSlot'\nimport { useNavContributionsStore } from './nav-contributions.store'\nimport { SeuSiteWidget } from '../projects/SeuSiteWidget'\nimport { useRightRailStore, readRightRailWidth, writeRightRailWidth } from '../components/right-rail'\nimport { RightRail } from '../components/RightRail'\nimport { useNotifications } from '../hooks/useNotifications'\nimport { NotificationInbox } from '../components/notifications/NotificationInbox'\nimport { SettingsPage, useCoreSettingsTabs, type SettingsTab } from '../components/settings/SettingsPage'\nimport { ConnectConsentPage } from '../components/connect'\nimport { TeamTab } from '../components/organization/TeamTab'\nimport { PermissionProfilesTab } from '../components/organization/PermissionProfilesTab'\nimport { LocationsCrudPage } from '../components/settings/LocationsCrudPage'\nimport { ConnectedFieldRulesSettings } from '../components/settings/ConnectedFieldRulesSettings'\n// Lazy heavy leaves: the command palette pulls the cmdk graph and the billing\n// page is only visited from settings — both stay out of the entry chunk.\nconst CommandPalette = React.lazy(() =>\n import('../components/layout/CommandPalette').then((m) => ({ default: m.CommandPalette })),\n)\nconst SubscriptionPage = React.lazy(() =>\n import('../components/billing/SubscriptionPage').then((m) => ({ default: m.SubscriptionPage })),\n)\nimport { UpgradeOverlay, UpgradeModal, SoftLimitBanner, useAccessOptional, getPlanEntitlements } from '../components/billing'\nimport { useBillingStore, resolvePlanBadge } from '../billing'\nimport { ArrowLeft, Bell, Building2, Check, ChevronsUpDown, CreditCard, Crown, LogOut, MapPin, Puzzle, Settings as SettingsIcon, ShieldAlert, ShieldCheck, SlidersHorizontal, Sparkles, UserCog, Users } from 'lucide-react'\nimport { getLucideIcon } from '@fayz-ai/ui'\n\n// ---------------------------------------------------------------------------\n// AdminShell — the working admin surface. Mounted INSIDE the providers (see\n// AdminProviders). Reads the resolved plugin runtime for navigation + routes,\n// wires the @fayz-ai/ui AppShell, and switches the main content on the hash path.\n// Custom pages (config.pages / manifest pages already resolved to components)\n// are merged into the same nav + route table.\n// ---------------------------------------------------------------------------\n\nexport interface AdminShellProps {\n appName: string\n layout?: 'sidebar' | 'topbar' | 'minimal'\n logo?: React.ReactNode\n /**\n * Icon-only mark, for square contexts where the full logo cannot fit.\n *\n * `logo` is usually a wordmark, and a wordmark squeezed into a 48px badge is\n * either cropped or illegible. Screens that need a square use this and fall\n * back to the app's initial — never to a cropped wordmark.\n */\n markLogo?: React.ReactNode\n pages?: CustomPage[]\n requireAuth?: boolean\n loginTagline?: string\n loginDescription?: string\n loginLogo?: React.ReactNode\n loginLayout?: 'split' | 'centered'\n loginAmbassadors?: LoginAmbassador[]\n loginAmbassadorsLabel?: string\n showOAuth?: boolean\n oauthProviders?: Exclude<AuthProvider, 'email'>[]\n showSettings?: boolean\n showOrgSettings?: boolean\n /** Show the workspace/org switcher at the sidebar top. Default: true.\n * Single-org apps (config.org.multiOrg === false) get false from the\n * scaffold so B2C users never see an organization concept. */\n showOrgSwitcher?: boolean\n /** Show the branding (\"Identidade Visual\") + company \"Geral\" settings tabs.\n * Default: true. B2C apps pass false to hide org-identity settings. */\n showBranding?: boolean\n /** Wrap the main content in an inset \"framed\" card (default: true). The\n * sidebar is always flush/full-height. */\n contentFrame?: boolean\n /** How module-internal navigation renders. Defaults to 'tabs' for the\n * 'sidebar' layout and 'rail' for 'topbar'. */\n moduleNav?: ModuleNavVariant\n /** Mobile bottom tab bar, passed straight through to AppShell. */\n bottomNav?: BottomNavItem[]\n /** Fired when a bottom-nav `action` item (e.g. the center \"+\") is tapped. */\n onBottomNavAction?: (id: string) => void\n /** Mobile header treatment (<md), passed straight through to AppShell. */\n mobileHeader?: MobileHeaderVariant\n /** Components mounted once inside the shell, rendering nothing visible. Used\n * for app-level runtime nav contributions and similar always-on behavior. */\n shellMounts?: React.ComponentType[]\n /** Extra content rendered in the sidebar bottom region, above the user row\n * (below the built-in \"Seu site\" project widget). */\n sidebarFooter?: React.ReactNode\n /** Render nav-group children as bare labels with an elbow on the active one,\n * instead of an icon each. See Sidebar's `navChildConnector`. */\n navChildConnector?: boolean\n /** App's own fayz site — fallback for the \"Seu site\" widget (mock/standalone). */\n site?: AppSiteConfig\n}\n\n// ---------------------------------------------------------------------------\n// WorkspaceSwitcher — sub-account / workspace selector at the sidebar top.\n// Drives the native tenant context (useTenant). switchOrg re-hydrates the org\n// (getOrg + members + permission profiles), so picking a workspace actually\n// reloads the members list, role dropdowns and permission checks — the old\n// setCurrentOrg(partial) path only swapped the name and left stores stale.\n// ---------------------------------------------------------------------------\n\nfunction WorkspaceSwitcher({ variant = 'sidebar', collapsed = false }: { variant?: 'sidebar' | 'topbar'; collapsed?: boolean }) {\n const tenant = useTenantOptional()\n const currentOrg = tenant?.org ?? null\n const t = useTranslation()\n // Collapsed sidebar (w-16): the switcher shrinks to just its icon — the name\n // and chevron would overflow the narrow rail.\n const iconOnly = collapsed && variant === 'sidebar'\n if (!tenant) return null\n // Org still hydrating → hold the slot with a trigger-shaped skeleton instead\n // of collapsing to nothing and popping in later (layout shift in the bar).\n if (!currentOrg) {\n if (!tenant.loading) return null\n return (\n <div\n className={\n iconOnly\n ? 'flex items-center justify-center rounded-button border border-sidebar-border/60 bg-sidebar-accent/30 p-1.5'\n : variant === 'topbar'\n ? 'flex w-[180px] items-center gap-2 rounded-button border border-sidebar-border/60 bg-sidebar-accent/30 px-2 py-1.5'\n : 'flex w-full items-center gap-2 rounded-button border border-sidebar-border/60 bg-sidebar-accent/30 px-2 py-1.5'\n }\n >\n <Skeleton className=\"h-6 w-6 shrink-0 rounded-button bg-sidebar-accent\" />\n {!iconOnly && <Skeleton className=\"h-4 flex-1 rounded-button bg-sidebar-accent\" />}\n </div>\n )\n }\n\n const { userOrgs, switchOrg, loading } = tenant\n const Building = Building2\n const Chevron = ChevronsUpDown\n const options = userOrgs.length\n ? userOrgs\n : [{ orgId: currentOrg.id, orgName: currentOrg.name, orgSlug: currentOrg.slug }]\n const isSingle = options.length <= 1\n const tr = (key: string, fallback: string) => {\n const v = t(key)\n return !v || v === key ? fallback : v\n }\n\n return (\n <Dropdown>\n <DropdownTrigger asChild>\n <button\n className={\n iconOnly\n // Collapsed rail: square icon button, no name/chevron.\n ? 'flex items-center justify-center rounded-button border border-sidebar-border/60 bg-sidebar-accent/30 p-1.5 text-left transition-colors hover:bg-sidebar-accent disabled:opacity-70'\n : variant === 'topbar'\n // Inline beside the topbar logo (same bg-sidebar surface): compact,\n // capped width instead of filling the row.\n ? 'flex max-w-[220px] items-center gap-2 rounded-button border border-sidebar-border/60 bg-sidebar-accent/30 px-2 py-1.5 text-left transition-colors hover:bg-sidebar-accent disabled:opacity-70'\n : 'flex w-full items-center gap-2 rounded-button border border-sidebar-border/60 bg-sidebar-accent/30 px-2 py-1.5 text-left transition-colors hover:bg-sidebar-accent disabled:opacity-70'\n }\n disabled={loading}\n title={iconOnly ? currentOrg.name : undefined}\n >\n <span className=\"flex h-6 w-6 shrink-0 items-center justify-center rounded-button bg-sidebar-accent text-sidebar-accent-foreground\">\n <Building className=\"h-3.5 w-3.5\" />\n </span>\n {!iconOnly && (\n <>\n <span className=\"min-w-0 flex-1 truncate text-sm font-medium text-sidebar-foreground\">{currentOrg.name}</span>\n <Chevron className=\"h-3.5 w-3.5 shrink-0 text-sidebar-muted\" />\n </>\n )}\n </button>\n </DropdownTrigger>\n {/* Plain popover-toned dropdown (light in light mode) — only the TRIGGER\n matches the dark sidebar/topbar surface it sits on. */}\n <DropdownContent align=\"start\" className=\"w-56\">\n <DropdownLabel>{tr('organization.workspaces', 'Workspaces')}</DropdownLabel>\n <DropdownSeparator />\n {options.map((m) => (\n <DropdownItem\n key={m.orgId}\n onClick={() => { if (m.orgId !== currentOrg.id) void switchOrg(m.orgId) }}\n className=\"flex items-center gap-2\"\n >\n <span className=\"min-w-0 flex-1 truncate\">{m.orgName}</span>\n {currentOrg.id === m.orgId && <Check className=\"h-4 w-4 shrink-0\" />}\n </DropdownItem>\n ))}\n {isSingle && (\n <p className=\"px-2 py-1.5 text-xs text-muted-foreground\">\n {tr('organization.onlyWorkspace', 'This is your only workspace.')}\n </p>\n )}\n </DropdownContent>\n </Dropdown>\n )\n}\n\n// ---------------------------------------------------------------------------\n// AdminUserMenu — user dropdown rendered in the sidebar bottom row.\n// ---------------------------------------------------------------------------\n\n/** Small plan pill shown next to the user across both menus. */\nfunction PlanBadge({ badge }: { badge: { label: string; paid: boolean } }) {\n return (\n <span\n className={\n badge.paid\n ? 'inline-flex items-center gap-1 rounded-full border border-amber-400/40 bg-amber-400/15 px-2 py-0.5 text-[10px] font-semibold text-amber-600 dark:text-amber-300'\n : 'inline-flex items-center gap-1 rounded-full border border-border bg-muted px-2 py-0.5 text-[10px] font-medium text-muted-foreground'\n }\n >\n {badge.paid ? <Crown className=\"h-3 w-3\" /> : <Sparkles className=\"h-3 w-3\" />}\n {badge.label}\n </span>\n )\n}\n\nfunction AdminUserMenu({\n user,\n planBadge,\n onProfile,\n onSettings,\n onBilling,\n onSignOut,\n profileLabel,\n settingsLabel,\n subscriptionLabel,\n signOutLabel,\n}: {\n user?: { fullName?: string; email: string; avatarUrl?: string }\n planBadge?: { label: string; paid: boolean } | null\n onProfile?: () => void\n onSettings?: () => void\n onBilling?: () => void\n onSignOut?: () => void\n profileLabel: string\n settingsLabel: string\n subscriptionLabel: string\n signOutLabel: string\n}) {\n if (!user) return null\n const name = user.fullName?.trim() || user.email\n const initials =\n name.replace(/[^A-Za-z0-9]/g, ' ').trim().split(/\\s+/).map((w) => w[0]).slice(0, 2).join('').toUpperCase() ||\n (user.email[0]?.toUpperCase() ?? '?')\n return (\n <Dropdown>\n <DropdownTrigger asChild>\n <button className=\"flex w-full min-w-0 items-center gap-2.5 rounded-button px-2 py-1.5 text-left transition-colors hover:bg-sidebar-accent\">\n <span className=\"flex h-8 w-8 shrink-0 items-center justify-center overflow-hidden rounded-full bg-sidebar-accent text-xs font-semibold text-sidebar-accent-foreground\">\n {user.avatarUrl ? (\n <img src={user.avatarUrl} alt=\"\" className=\"h-full w-full object-cover\" />\n ) : (\n initials\n )}\n </span>\n <span className=\"min-w-0 flex-1 truncate text-xs font-medium text-sidebar-foreground\">{name}</span>\n </button>\n </DropdownTrigger>\n {/* The menu is a popover, not part of the sidebar: it keeps the neutral\n popover surface so it reads as floating above the dark rail. */}\n <DropdownContent align=\"start\" className=\"w-60\">\n <DropdownLabel className=\"truncate text-muted-foreground\">{user.email}</DropdownLabel>\n <DropdownSeparator />\n {onProfile && (\n <DropdownItem onClick={onProfile} className=\"flex items-center gap-2\">\n <UserCog className=\"h-4 w-4 shrink-0\" />\n <span className=\"flex-1\">{profileLabel}</span>\n </DropdownItem>\n )}\n {onSettings && (\n <DropdownItem onClick={onSettings} className=\"flex items-center gap-2\">\n <SettingsIcon className=\"h-4 w-4 shrink-0\" />\n <span className=\"flex-1\">{settingsLabel}</span>\n </DropdownItem>\n )}\n {onBilling && (\n <DropdownItem onClick={onBilling} className=\"flex items-center gap-2\">\n <CreditCard className=\"h-4 w-4 shrink-0\" />\n <span className=\"flex-1\">{subscriptionLabel}</span>\n {planBadge && <PlanBadge badge={planBadge} />}\n </DropdownItem>\n )}\n <DropdownSeparator />\n {onSignOut && (\n <DropdownItem onClick={onSignOut} className=\"flex items-center gap-2\">\n <LogOut className=\"h-4 w-4 shrink-0\" />\n <span className=\"flex-1\">{signOutLabel}</span>\n </DropdownItem>\n )}\n </DropdownContent>\n </Dropdown>\n )\n}\n\n// ---------------------------------------------------------------------------\n// AccessDenied — rendered in place of a page/plugin route whose declared\n// permission the current user does not hold (RBAC route guard).\n// ---------------------------------------------------------------------------\n\nfunction AccessDenied({ tr }: { tr: (key: string, fallback: string) => string }) {\n return (\n <div className=\"flex h-full flex-col items-center justify-center p-12 text-center\">\n <ShieldAlert className=\"mb-3 h-10 w-10 text-muted-foreground\" />\n <p className=\"text-lg font-semibold text-foreground\">\n {tr('shell.accessDenied.title', 'Access restricted')}\n </p>\n <p className=\"mt-1 max-w-sm text-sm text-muted-foreground\">\n {tr('shell.accessDenied.message', \"You don't have permission to view this page.\")}\n </p>\n </div>\n )\n}\n\n// ---------------------------------------------------------------------------\n// AdminNotifications — the sidebar notification bell. Fetches once on mount\n// (degrades to an empty inbox if the notifications table/store is unavailable)\n// and opens a functional inbox popover with mark-read / mark-all-read wired.\n// ---------------------------------------------------------------------------\n\nfunction AdminNotifications() {\n const { notifications, unreadCount, fetchNotifications, markAsRead, markAllAsRead } = useNotifications()\n const [open, setOpen] = React.useState(false)\n const fetchedRef = React.useRef(false)\n React.useEffect(() => {\n if (fetchedRef.current) return\n fetchedRef.current = true\n void fetchNotifications()\n }, [fetchNotifications])\n\n return (\n <Popover open={open} onOpenChange={setOpen}>\n <PopoverTrigger asChild>\n <button\n className=\"relative inline-flex shrink-0 items-center justify-center rounded-button p-2 text-sidebar-muted transition-colors hover:bg-sidebar-accent/50 hover:text-sidebar-accent-foreground\"\n aria-label={unreadCount > 0 ? `${unreadCount} unread notifications` : 'Notifications'}\n >\n <Bell className=\"h-4 w-4\" />\n {unreadCount > 0 && (\n <span className=\"absolute right-1 top-1 h-2 w-2 rounded-full bg-destructive\" />\n )}\n </button>\n </PopoverTrigger>\n <PopoverContent align=\"end\" sideOffset={8} className=\"w-80 p-0\">\n <NotificationInbox\n notifications={notifications}\n onMarkRead={markAsRead}\n onMarkAllRead={markAllAsRead}\n />\n </PopoverContent>\n </Popover>\n )\n}\n\nfunction navEntryToItem(entry: PluginNavigationEntry): NavigationItem {\n return {\n id: entry.id ?? `${entry.route}`,\n label: entry.label,\n icon: entry.icon ?? 'LayoutTemplate',\n route: entry.route,\n section: entry.section,\n badge: entry.badge,\n href: entry.href,\n permission: entry.permission as NavigationItem['permission'],\n }\n}\n\ntype OrderedNavigationItem = NavigationItem & { position: number; indexChild?: boolean }\n\n/**\n * Children list a parent starts with once it adopts its first sub-path child:\n * normally a self-link so the parent's own route stays reachable, but empty\n * when the entry opted out via `indexChild: false`.\n */\nfunction seedChildren(parent: OrderedNavigationItem): OrderedNavigationItem[] {\n if (parent.indexChild === false) return []\n return [{ ...parent, id: `${parent.id}:index`, children: undefined, position: -1 }]\n}\n\ninterface RouteEntry {\n path: string\n Component: React.ComponentType<Record<string, unknown>>\n /** Render edge-to-edge with no page padding wrapper (chat, kanban, canvas). */\n fullBleed?: boolean\n /** RBAC guard — when set and unsatisfied the route renders <AccessDenied>. */\n permission?: PermissionRequirement\n /** Título declarado pela rota — ganha do nome do item de menu. */\n title?: string\n /** Rota do pai: habilita o \"←\" da barra sem a página desenhar um. */\n parentRoute?: string\n}\n\nfunction registerEntityRoute(\n component: unknown,\n path: string,\n entityRouteMap: Map<string, EntityRouteEntry>,\n): void {\n const entityDef = (component as any)?.__entityDef\n if (!entityDef?.data) return\n\n if (entityDef.data.archetypeKind) {\n entityRouteMap.set(`${entityDef.data.archetype ?? ''}:${entityDef.data.archetypeKind}`, { path, detail: true })\n } else if (entityDef.data.archetype) {\n entityRouteMap.set(entityDef.data.archetype, { path, detail: true })\n }\n // Also claim it under the entity key — the only route a non-archetype CRUD\n // page has, and how global search keys its results.\n entityRouteMap.set(deriveEntityKey(entityDef), { path, detail: true })\n}\n\n/** A plugin page claiming archetypes it displays, list-level only. A CRUD page\n * for the same archetype always wins. */\nfunction registerDeclaredEntityRoutes(\n keys: string[] | undefined,\n path: string,\n entityRouteMap: Map<string, EntityRouteEntry>,\n): void {\n for (const key of keys ?? []) {\n if (entityRouteMap.get(key)?.detail) continue\n entityRouteMap.set(key, { path, detail: false })\n }\n}\n\nfunction sectionOrder(section: NavigationItem['section']): number {\n return section === 'main' ? 0 : section === 'secondary' ? 1 : 2\n}\n\nfunction compareNavigation(a: NavigationItem & { position?: number }, b: NavigationItem & { position?: number }): number {\n const sectionDelta = sectionOrder(a.section) - sectionOrder(b.section)\n if (sectionDelta !== 0) return sectionDelta\n return (a.position ?? 0) - (b.position ?? 0)\n}\n\nfunction findModuleParent(\n item: OrderedNavigationItem,\n items: OrderedNavigationItem[],\n): OrderedNavigationItem | null {\n const candidates = items\n .filter((candidate) =>\n candidate.section === item.section &&\n candidate.route !== item.route &&\n item.route.startsWith(`${candidate.route}/`)\n )\n .sort((a, b) => b.route.length - a.route.length)\n\n return candidates[0] ?? null\n}\n\nfunction pageToNavigationItem(page: CustomPage, fallbackPosition: number): OrderedNavigationItem | null {\n if (!page.label) return null\n return {\n id: `page:${page.path}`,\n label: page.label,\n icon: page.icon ?? 'FileText',\n route: page.path,\n section: page.section ?? 'main',\n badge: page.badge,\n href: page.href,\n permission: page.permission,\n position: page.position ?? fallbackPosition,\n children: page.children\n ?.filter((child) => child.nav !== false)\n .map((child, index) => pageToNavigationItem(child, index))\n .filter((item): item is OrderedNavigationItem => Boolean(item)),\n }\n}\n\nfunction collectPageRoutes(\n pages: CustomPage[],\n out: RouteEntry[] = [],\n entityRouteMap: Map<string, EntityRouteEntry> = new Map(),\n): RouteEntry[] {\n for (const page of pages) {\n if (page.component && page.path !== '/settings') {\n if ((page.component as any).__isCrudPage) {\n ;(page.component as any).__crudBasePath = page.path\n registerEntityRoute(page.component, page.path, entityRouteMap)\n }\n const Component = page.component as React.ComponentType<Record<string, unknown>>\n out.push({ path: page.path, Component, permission: page.permission })\n out.push({ path: `${page.path}/*`, Component, permission: page.permission })\n }\n if (page.children?.length) collectPageRoutes(page.children, out, entityRouteMap)\n }\n return out\n}\n\nfunction buildSettingsTabs(\n pluginTabs: PluginSettingsTab[],\n can: (feature: string, action?: PermissionAction) => boolean,\n hasSystem: (perm: SystemPermission) => boolean,\n t: (key: string, params?: Record<string, string | number>) => string,\n showOrgSettings: boolean,\n hasBilling: boolean,\n): SettingsTab[] {\n const settingsTabs: SettingsTab[] = []\n\n // Subscription — present whenever billing is configured, gated (like the other\n // org tabs) on the system `manage_billing` permission. Route: /settings/subscription.\n if (hasBilling && hasSystem('manage_billing')) {\n const subLabel = t('settings.subscription')\n settingsTabs.push({\n id: 'subscription',\n label: subLabel === 'settings.subscription' ? 'Subscription' : subLabel,\n // CreditCard everywhere the LINK appears (menus + settings nav) — Crown\n // is reserved for the paid-plan badge. 'Crown' also isn't in the\n // sidebar ICON_MAP, which made the settings rail fall back to Home.\n icon: <CreditCard className=\"h-4 w-4\" />,\n iconName: 'CreditCard',\n component: (\n <React.Suspense fallback={null}>\n <SubscriptionPage />\n </React.Suspense>\n ),\n })\n }\n\n if (showOrgSettings) {\n // Org-management tabs are gated on the profile's SYSTEM permissions (the\n // grants-based can() has no team/permissions/locations feature). Owner and\n // no-RBAC profiles pass hasSystem() through, so the owner is never blocked.\n if (hasSystem('manage_team'))\n settingsTabs.push({ id: 'team', label: t('settings.team'), icon: <Users className=\"h-4 w-4\" />, iconName: 'Users', component: <TeamTab /> })\n if (hasSystem('manage_permissions'))\n settingsTabs.push({ id: 'permissions', label: t('settings.permissions'), icon: <ShieldCheck className=\"h-4 w-4\" />, iconName: 'ShieldCheck', component: <PermissionProfilesTab /> })\n if (hasSystem('manage_settings')) {\n settingsTabs.push(\n { id: 'locations', label: t('settings.locations'), icon: <MapPin className=\"h-4 w-4\" />, iconName: 'MapPin', component: <LocationsCrudPage /> },\n { id: 'field-rules', label: t('settings.fieldRules'), icon: <SlidersHorizontal className=\"h-4 w-4\" />, iconName: 'SlidersHorizontal', component: <ConnectedFieldRulesSettings /> },\n )\n }\n }\n\n for (const tab of pluginTabs) {\n if (tab.permission && !can(tab.permission.feature, tab.permission.action)) continue\n if (!tab.component) continue\n\n const IconComp = tab.icon ? getLucideIcon(tab.icon) ?? Puzzle : Puzzle\n const labelKey = `settings.plugin.${tab.id}`\n const translated = t(labelKey)\n settingsTabs.push({\n id: tab.id,\n label: translated === labelKey ? tab.label : translated,\n icon: React.createElement(IconComp as React.ComponentType<{ className?: string }>, { className: 'h-4 w-4' }),\n iconName: tab.icon ?? 'Puzzle',\n component: React.createElement(tab.component),\n // Flag plugin-contributed tabs so SettingsPage draws the core/plugins divider.\n isPlugin: true,\n })\n }\n\n return settingsTabs\n}\n\nfunction AdminShellInner({ appName, layout = 'sidebar', logo, pages = [], showSettings = true, showOrgSettings = false, showBranding = true, showOrgSwitcher = true, contentFrame = true, moduleNav, bottomNav, onBottomNavAction, mobileHeader, shellMounts = [], sidebarFooter, navChildConnector, site }: AdminShellProps) {\n const runtime = usePluginRuntime()\n const t = useTranslation()\n const can = usePermissionOptional()\n // Composed access (role × plan). Nav + route guard use this to distinguish a\n // role denial (hide / AccessDenied) from a plan denial (Crown badge / UpgradePrompt).\n const access = useAccessOptional()\n const currentProfile = usePermissionsStore((s) => s.currentProfile)\n // Org-management (system) permission check. A null profile (owner / no RBAC\n // loaded) passes through so the owner is never blocked — the grants-based\n // owner bypass lives in permissions/context.tsx and is not duplicated here.\n const hasSystem = React.useCallback(\n (perm: SystemPermission) => {\n if (!currentProfile) return true\n // Owner is never blocked (mirrors the owner bypass in permissions/context).\n if (currentProfile.id === 'owner' || currentProfile.name?.toLowerCase() === 'owner') return true\n return currentProfile.systemPermissions?.includes(perm) ?? false\n },\n [currentProfile],\n )\n const tr = (key: string, fallback: string) => {\n const v = t(key)\n return !v || v === key ? fallback : v\n }\n const path = useAdminPath()\n const { user, signOut } = useAuth()\n\n // Rendered here because AppShell is the only element that can narrow the\n // content. Nothing renders until a panel is registered AND the rail is open.\n const railOpen = useRightRailStore((s) => s.open)\n const railHasPanels = useRightRailStore((s) => s.panels.length > 0)\n // Mounted whenever a panel exists so the column can animate its width; the\n // rail itself renders nothing while closed, so no panel runs in the dark.\n const rightRail = railHasPanels ? <RightRail frame={contentFrame} /> : null\n const setRailMounted = useRightRailStore((s) => s.setMounted)\n React.useEffect(() => {\n setRailMounted(true)\n return () => setRailMounted(false)\n }, [setRailMounted])\n\n // Sanfona: on a narrow viewport, opening the assistant rail auto-collapses the\n // sidebar to reclaim horizontal room; closing it (or widening the viewport)\n // restores the sidebar. We only undo the collapse WE triggered, so a sidebar\n // the user collapsed by hand stays collapsed after the rail closes.\n const setSidebarCollapsed = useLayoutStore((s) => s.setSidebarCollapsed)\n const railAutoCollapsedRef = React.useRef(false)\n React.useEffect(() => {\n if (layout !== 'sidebar') return\n const RAIL_NARROW_BELOW = 1024 // Tailwind lg — below this the rail + full sidebar crowd the content.\n const apply = () => {\n const narrow = typeof window !== 'undefined' && window.innerWidth < RAIL_NARROW_BELOW\n if (railOpen && narrow) {\n if (!useLayoutStore.getState().sidebarCollapsed) {\n railAutoCollapsedRef.current = true\n setSidebarCollapsed(true)\n }\n } else if (railAutoCollapsedRef.current) {\n railAutoCollapsedRef.current = false\n setSidebarCollapsed(false)\n }\n }\n apply()\n window.addEventListener('resize', apply)\n return () => window.removeEventListener('resize', apply)\n }, [railOpen, layout, setSidebarCollapsed])\n // Read once per mount: the user's dragged width is restored on load, and\n // every later drag reports back through onRightRailWidthChange.\n const [railWidth] = React.useState(() => readRightRailWidth())\n\n // Billing surface — plans are seeded into the store from `config.billing` (see\n // BillingInitializer). A non-empty plan list is the signal that billing is\n // configured: it drives the Subscription settings tab, the user-menu item, and\n // the current-plan badge shown next to the user.\n const billingPlans = useBillingStore((s) => s.plans)\n const hasBilling = billingPlans.length > 0\n const orgPlan = useTenantOptional()?.org?.plan\n const planBadge = React.useMemo(\n () => (hasBilling ? resolvePlanBadge(orgPlan, billingPlans) : null),\n [hasBilling, orgPlan, billingPlans],\n )\n // Soft-limit monitoring — every limit key the active plan declares. The banner\n // only surfaces a key whose usage EXCEEDS its cap (used > max), the Notion-style\n // overshoot path (e.g. public bookings pushing clients past the free cap).\n const softLimitKeys = React.useMemo(() => {\n const plan = billingPlans.find((p) => p.id === (orgPlan || 'free'))\n return Object.keys(getPlanEntitlements(plan)?.limits ?? {})\n }, [billingPlans, orgPlan])\n\n // Runtime nav contributions (per-tenant, data-driven entries pushed via\n // useNavContribution). The object ref only changes when a contributor sets or\n // clears, so it is a safe memo dependency.\n const navContributions = useNavContributionsStore((s) => s.contributions)\n\n // Navigation: plugin entries + custom pages (deduped, plugin order preserved).\n const navigation = React.useMemo<NavigationItem[]>(() => {\n // Plugin entries whose route is a sub-path of another plugin entry nest as\n // its children (same rule pages get below) — e.g. the courses modules\n // (/courses/members, /courses/sales…) group under /courses instead of\n // scattering across the rail. Sort by position first so parents land\n // before their children.\n // Runtime contributions (e.g. per-tenant sales channels) merge in alongside\n // static plugin nav and go through the same nesting/gating below.\n const contributed = Object.values(navContributions).flat()\n const flat = [...runtime.navigation, ...contributed]\n .map((entry) => ({ ...navEntryToItem(entry), position: entry.position, indexChild: entry.indexChild }))\n .sort(compareNavigation)\n const items: OrderedNavigationItem[] = []\n for (const item of flat) {\n const parent = findModuleParent(item, items)\n if (parent) {\n const children = parent.children ?? seedChildren(parent)\n if (!children.some((child) => child.route === item.route)) {\n parent.children = [...children, item].sort(compareNavigation)\n }\n continue\n }\n items.push(item)\n }\n for (const [index, page] of pages.entries()) {\n // `nav: false` routes the page but keeps it out of the sidebar/topbar nav\n // (mobile-only pages reached via bottomNav/avatar). Routes are still built\n // from `pages` in collectPageRoutes below, so the page remains navigable.\n if (page.nav === false) continue\n const item = pageToNavigationItem(page, index + 1000)\n if (!item) continue\n\n const parent = findModuleParent(item, items)\n if (parent) {\n const children = parent.children ?? seedChildren(parent)\n if (!children.some((child) => child.route === item.route)) {\n parent.children = [...children, item].sort(compareNavigation)\n }\n continue\n }\n\n items.push(item)\n }\n // Access-aware nav gating. Role denial hides the entry (owner/no-profile pass\n // through). Plan denial KEEPS it (freemium discovery) with a Crown badge that\n // leads to the route's UpgradePrompt. Children follow the same rule.\n const decide = (perm?: NavigationItem['permission']): { keep: boolean; premium: boolean } => {\n if (!perm) return { keep: true, premium: false }\n const d = access.can(perm.feature, perm.action)\n if (!d.allowed && d.reason === 'role') return { keep: false, premium: false }\n return { keep: true, premium: !d.allowed && d.reason === 'plan' }\n }\n return items\n .map((item): OrderedNavigationItem | null => {\n const dec = decide(item.permission)\n if (!dec.keep) return null\n const children = item.children\n ?.map((child): NavigationItem | null => {\n const cd = decide(child.permission)\n return cd.keep ? { ...child, premium: cd.premium } : null\n })\n .filter((c): c is NavigationItem => c !== null)\n return { ...item, premium: dec.premium, children }\n })\n .filter((item): item is OrderedNavigationItem => item !== null)\n .sort(compareNavigation)\n }, [runtime.navigation, navContributions, pages, access])\n\n // Command palette (⌘K + the topbar Search button). The palette owns the ⌘K\n // key listener, so it must be MOUNTED for the shortcut to work — the topbar\n // Search button drives the same shared layout store.\n const commandPaletteOpen = useLayoutStore((s) => s.commandPaletteOpen)\n const setCommandPaletteOpen = useLayoutStore((s) => s.setCommandPaletteOpen)\n const commandItems = React.useMemo<CommandItem[]>(() => {\n const navGroup = tr('layout.commandPalette.navigation', 'Navigation')\n const items: CommandItem[] = []\n for (const nav of navigation) {\n items.push({ id: nav.id, label: nav.label, icon: nav.icon, group: navGroup, action: () => navigateTo(nav.route) })\n for (const child of nav.children ?? []) {\n items.push({ id: child.id, label: `${nav.label} · ${child.label}`, icon: child.icon, group: navGroup, action: () => navigateTo(child.route) })\n }\n }\n return items\n }, [navigation])\n // The palette's other half: records, not pages.\n const globalSearch = useGlobalSearch()\n\n // Route table: plugin routes + custom pages, most-specific-first.\n const routes = React.useMemo<RouteEntry[]>(() => {\n const list: RouteEntry[] = []\n const entityRouteMap = new Map<string, EntityRouteEntry>()\n for (const r of runtime.routes as PluginRouteDefinition[]) {\n const Component = resolvePluginComponent(r) as React.ComponentType<Record<string, unknown>> | undefined\n if (Component) {\n // Same treatment custom pages get in collectPageRoutes: a generated CRUD\n // page needs to know the path it was mounted at, otherwise its \"new\" and\n // \"edit\" links resolve against '/' (e.g. /new instead of /shop/products/new).\n if ((Component as any).__isCrudPage) {\n ;(Component as any).__crudBasePath = r.path\n registerEntityRoute(Component, r.path, entityRouteMap)\n }\n registerDeclaredEntityRoutes(r.entityRoutes, r.path, entityRouteMap)\n const meta = { title: r.title, parentRoute: r.parentRoute }\n list.push({ path: r.path, Component, fullBleed: r.fullBleed, permission: r.permission, ...meta })\n list.push({ path: `${r.path}/*`, Component, fullBleed: r.fullBleed, permission: r.permission, ...meta })\n }\n }\n if (showSettings) list.push({ path: '/settings/*', Component: SettingsPage as React.ComponentType<Record<string, unknown>> })\n if (showSettings) list.push({ path: '/settings', Component: SettingsPage as React.ComponentType<Record<string, unknown>> })\n collectPageRoutes(pages, list, entityRouteMap)\n setEntityRouteMap(entityRouteMap)\n return list.sort((a, b) => routeScore(b.path) - routeScore(a.path))\n }, [runtime.routes, pages, showSettings])\n\n const match = React.useMemo(() => {\n for (const r of routes) {\n const params = matchRoute(r.path, path)\n if (params) return { route: r, params }\n }\n return null\n }, [routes, path])\n\n // Treat '/' as the index: redirect to the first nav entry once it's known.\n React.useEffect(() => {\n if (!match && (path === '/' || path === '') && navigation.length > 0) {\n navigateTo(navigation[0]!.route)\n }\n }, [match, path, navigation])\n\n const ActiveComponent = match?.route.Component\n const activeParams = match?.params ?? {}\n const settingsTabs = React.useMemo(\n () => buildSettingsTabs(runtime.settingsTabs as PluginSettingsTab[], can, hasSystem, t, showOrgSettings, hasBilling),\n [runtime.settingsTabs, can, hasSystem, t, showOrgSettings, hasBilling],\n )\n\n // Resolved chrome routes: profile lands on a dedicated /perfil|/profile page\n // if one is registered, else the Settings → Profile tab; billing only when a\n // matching route actually exists (no dead nav item otherwise).\n const profileRoute = React.useMemo(() => {\n const explicit = routes.find((r) => r.path === '/perfil' || r.path === '/profile')\n if (explicit) return explicit.path\n return showSettings ? '/settings/profile' : null\n }, [routes, showSettings])\n const onProfile = profileRoute ? () => navigateTo(profileRoute) : undefined\n // Subscription lives at the always-present /settings/subscription tab whenever\n // billing is configured — no need to hunt for a standalone billing route.\n const onBilling = hasBilling && showSettings ? () => navigateTo('/settings/subscription') : undefined\n\n // Contextual /settings sidebar (desktop sidebar layout only): the app rail is\n // replaced by \"← Back to home\" + the settings links, so settings isn't a menu\n // inside a menu. `coreSettingsTabs` mirrors what SettingsPage renders.\n const coreSettingsTabs = useCoreSettingsTabs({ showCompany: showBranding, showBranding })\n const allSettingsTabs = React.useMemo(\n () => [...coreSettingsTabs, ...settingsTabs],\n [coreSettingsTabs, settingsTabs],\n )\n const inSettings = showSettings && layout === 'sidebar' && (path === '/settings' || path.startsWith('/settings/'))\n const homeRoute = navigation[0]?.route ?? '/'\n // With the contextual sidebar the shell owns settings navigation, so it also\n // owns the active tab: parse it from the URL and drive SettingsPage as a\n // controlled component (bare /settings → first tab). This is what makes\n // clicking another settings link actually swap the content.\n const activeSettingsTab = inSettings\n ? (path === '/settings'\n ? allSettingsTabs[0]?.id\n : path.slice('/settings/'.length).split('/')[0])\n : undefined\n const settingsNavigation = React.useMemo<NavigationItem[]>(\n () => allSettingsTabs.map((tab) => ({\n id: `settings:${tab.id}`,\n label: tab.label,\n icon: tab.iconName ?? 'Settings',\n route: `/settings/${tab.id}`,\n // Plugin tabs land in the second group so the sidebar can head them\n // \"Plugins\", matching the divider the in-page nav used to draw.\n section: tab.isPlugin ? 'secondary' : 'main',\n })),\n [allSettingsTabs],\n )\n\n const shellUser = user\n ? { fullName: user.fullName ?? user.email, email: user.email, avatarUrl: user.avatarUrl }\n : undefined\n\n // Module-internal nav style: explicit override, else by layout (GHL-style\n // tabs for sidebar products, left rail for topbar products).\n const moduleVariant: ModuleNavVariant = moduleNav ?? (layout === 'sidebar' ? 'tabs' : 'rail')\n\n // The layout owns the page title (shown in the top header), derived from the\n // active navigation entry — individual pages don't render their own title.\n //\n // Ordem de precedência: o que a ROTA declara ganha do item de menu. Uma tela\n // fora do menu (`/orders/new`) casava só com o prefixo do pai e era rotulada\n // \"Pedidos\"; agora ela se nomeia.\n const activePageTitle = React.useMemo(() => {\n if (path === '/settings' || path.startsWith('/settings/')) return tr('common.settings', 'Settings')\n if (match?.route.title) return match.route.title\n // CHILDREN COUNT. Only top-level entries were considered here, so every\n // page inside a group was titled with its parent — /orders/customers read\n // \"Pedidos\". Longest route wins, so the most specific match names the page.\n const candidates = [...navigation, ...navigation.flatMap((n) => n.children ?? [])]\n .filter((n) => n.route)\n .sort((a, b) => b.route.length - a.route.length)\n const hit = candidates.find((n) =>\n n.route === '/' ? path === '/' || path === '' : path === n.route || path.startsWith(n.route + '/') || path.startsWith(n.route),\n )\n return hit?.label ?? candidates.find((n) => n.route === '/')?.label ?? ''\n }, [navigation, path, tr, match])\n\n // O \"←\" declarado pela rota, com o rótulo do item de menu correspondente.\n const parentBack = React.useMemo(() => {\n const parent = match?.route.parentRoute\n if (!parent) return undefined\n const entries = [...navigation, ...navigation.flatMap((n) => n.children ?? [])]\n // Menu primeiro; depois o título declarado pela própria rota-pai. Sem o\n // segundo, voltar para uma tela FORA do menu (o pai também é oculto) caía\n // num \"Voltar\" genérico — foi o que aconteceu em Entrega, cujo pai é\n // /store, que não está no menu.\n const label = entries.find((n) => n.route === parent)?.label\n ?? routes.find((r) => r.path === parent)?.title\n ?? tr('common.back', 'Back')\n return { onBack: () => navigateTo(parent), label }\n }, [match, navigation, routes, tr])\n\n // Access-aware route guard. A role denial renders <AccessDenied>; a plan denial\n // renders the page behind a blurred <UpgradeOverlay> paywall (teaser + upgrade\n // cards) instead of pretending the page doesn't exist.\n const routeDecision = match?.route.permission\n ? access.can(match.route.permission.feature, match.route.permission.action)\n : { allowed: true as const }\n const activeContent = ActiveComponent ? (\n !routeDecision.allowed ? (\n routeDecision.reason === 'plan' ? (\n // The gated page keeps rendering behind the paywall (blurred teaser).\n <UpgradeOverlay feature={match!.route.permission!.feature}>\n <ActiveComponent {...activeParams} />\n </UpgradeOverlay>\n ) : (\n <AccessDenied tr={tr} />\n )\n ) : match.route.path === '/settings' || match.route.path === '/settings/*' ? (\n <SettingsPage tabs={allSettingsTabs} showCompany={showBranding} showBranding={showBranding} hideNav={inSettings} activeTabId={activeSettingsTab} />\n ) : (\n <ActiveComponent {...activeParams} />\n )\n ) : null\n\n const settingsBackLink = (\n <button\n onClick={() => navigateTo(homeRoute)}\n className=\"flex w-full items-center gap-2 rounded-button px-2.5 py-1.5 text-[13px] font-medium text-sidebar-foreground/80 transition-colors hover:bg-sidebar-accent/60 hover:text-sidebar-accent-foreground\"\n >\n <ArrowLeft className=\"h-4 w-4 shrink-0\" />\n <span className=\"truncate\">{tr('settings.backToHome', 'Back to home')}</span>\n </button>\n )\n\n return (\n <ModuleLayoutProvider variant={moduleVariant}>\n <AppShell\n variant={layout}\n contentFrame={contentFrame}\n navigation={inSettings ? settingsNavigation : navigation}\n sidebarSectionLabels={inSettings ? {\n main: tr('settings.navLinks', 'Settings links'),\n secondary: tr('common.plugins', 'Plugins'),\n } : undefined}\n // Entering settings pushes forward (new rail in from the right); going\n // back to the app rail reverses it.\n sidebarNavKey={inSettings ? 'settings' : 'app'}\n sidebarNavDirection={inSettings ? 'forward' : 'back'}\n sidebarNavChildConnector={navChildConnector}\n logo={logo ?? <span className=\"text-lg font-bold\">{appName}</span>}\n user={shellUser}\n pageTitle={activePageTitle}\n // Rota que declara `parentRoute` ganha o \"← Pai\" sem escrever um. O nome\n // do pai sai do próprio menu, então a migalha diz \"← Pedidos\" e não um\n // \"Voltar\" genérico — e continua certa se o rótulo do menu mudar.\n pageBack={parentBack}\n // Bare /settings renders the first tab, so highlight it in the rail too.\n currentPath={inSettings && path === '/settings' ? `/settings/${allSettingsTabs[0]?.id ?? ''}` : path}\n bottomNav={bottomNav}\n onBottomNavAction={onBottomNavAction}\n mobileHeader={mobileHeader}\n onNavigate={(route) => navigateTo(route)}\n onSignOut={() => { void signOut() }}\n onProfile={onProfile}\n onBilling={onBilling}\n onSettings={() => navigateTo('/settings')}\n userPlan={planBadge ? { label: planBadge.label, paid: planBadge.paid } : undefined}\n billingLabel={tr('settings.subscription', 'Subscription')}\n sidebarTopContent={inSettings ? settingsBackLink : showOrgSwitcher ? <WorkspaceSwitcher /> : undefined}\n // Sidebar bottom region (above the user row): the \"Seu site\" project widget\n // (self-hides when the tenant has no projects), plus any app footer content.\n sidebarFooterContent={inSettings ? undefined : (\n <>\n <SeuSiteWidget\n fallback={site}\n onEdit={site?.editRoute ? () => navigateTo(site.editRoute!) : undefined}\n />\n {sidebarFooter}\n </>\n )}\n // Topbar layout has no sidebar top slot — the switcher rides beside the\n // logo instead (and in the mobile drawer). Sidebar layout keeps using\n // sidebarTopContent above, so this stays undefined there (no double render).\n orgSwitcher={layout === 'topbar' && !inSettings && showOrgSwitcher ? <WorkspaceSwitcher variant=\"topbar\" /> : undefined}\n topbarStart={<WidgetSlot zone=\"shell.topbar.start\" />}\n topbarEnd={<WidgetSlot zone=\"shell.topbar.end\" />}\n rightRail={rightRail}\n rightRailOpen={railOpen}\n defaultRightRailWidth={railWidth}\n onRightRailWidthChange={writeRightRailWidth}\n rightRailResizeLabel={tr('shell.rightRail.resize', 'Resize panel')}\n notificationSlot={<AdminNotifications />}\n userMenuSlot={\n <AdminUserMenu\n user={shellUser}\n planBadge={planBadge}\n onProfile={onProfile}\n onSettings={() => navigateTo('/settings')}\n onBilling={onBilling}\n onSignOut={() => { void signOut() }}\n profileLabel={tr('settings.profile', 'Profile')}\n settingsLabel={tr('settings.title', 'Settings')}\n subscriptionLabel={tr('settings.subscription', 'Subscription')}\n signOutLabel={tr('auth.signOut', 'Sign out')}\n />\n }\n >\n {/* Invisible app-level mounts (runtime nav contributions, etc.). */}\n {shellMounts.map((Mount, i) => <Mount key={i} />)}\n {activeContent ? (\n <PageTransition\n transitionKey={match?.route.path ?? path}\n className={match?.route.fullBleed ? 'h-full min-h-0' : undefined}\n >\n {match?.route.fullBleed\n ? <div className=\"h-full min-h-0 overflow-hidden\">{activeContent}</div>\n : (\n <div className=\"space-y-4 p-3 md:space-y-6 md:p-6\">\n {softLimitKeys.length > 0 && <SoftLimitBanner keys={softLimitKeys} />}\n {activeContent}\n </div>\n )}\n </PageTransition>\n ) : (\n <div className=\"flex h-full flex-col items-center justify-center p-12 text-center\">\n <p className=\"text-lg font-semibold text-foreground\">\n {navigation.length ? tr('common.notFound', 'Page not found') : tr('common.welcome', 'Welcome')}\n </p>\n {navigation.length > 0 && (\n <button\n className=\"mt-3 text-sm text-primary underline\"\n onClick={() => navigateTo(navigation[0]!.route)}\n >\n {navigation[0]!.label}\n </button>\n )}\n </div>\n )}\n </AppShell>\n <React.Suspense fallback={null}>\n <CommandPalette\n commands={commandItems}\n open={commandPaletteOpen}\n onOpenChange={setCommandPaletteOpen}\n onEntitySearch={globalSearch.search}\n onEntitySelect={globalSearch.select}\n />\n </React.Suspense>\n {/* Global upgrade dialog — opened imperatively by LimitGate / useLimitGuard. */}\n <UpgradeModal />\n </ModuleLayoutProvider>\n )\n}\n\n/** The shell + an auth gate in front of it. */\n/**\n * `/connect` — the consent screen an external agent redirects the user to.\n *\n * Handled here, above AdminShellInner, on purpose. It needs the AuthGate (only\n * a signed-in person can grant access to their organization's data, and the\n * gate already knows how to send them to login and back) but NOT the admin\n * chrome: a sidebar and a module nav around an approval dialog invite the user\n * to wander off mid-decision. Mounting it in the shell rather than asking each\n * app to add a route means every fayz app can be connected to, without an\n * app-side change.\n */\nfunction isConnectRoute(): boolean {\n return normalizeAdminPath(window.location.pathname) === '/connect'\n}\n\nexport function AdminShell(props: AdminShellProps) {\n // Before anything else: a recovery link the user just clicked, or an invitee\n // who still has no password of their own. Both arrive WITH a session (GoTrue\n // signs them in off the link), so the AuthGate would wave them through into\n // the app and never ask — which is why \"reset password\" appeared to do nothing.\n const passwordSetup = usePasswordSetupGate()\n if (passwordSetup.reason) {\n return (\n <SetPasswordPage\n reason={passwordSetup.reason}\n appName={props.appName}\n logo={props.loginLogo ?? props.logo}\n expired={passwordSetup.expired}\n checking={passwordSetup.checking}\n onSuccess={passwordSetup.complete}\n />\n )\n }\n\n if (isConnectRoute()) {\n return (\n <AuthGate\n requireAuth\n appName={props.appName}\n logo={props.logo}\n loginLogo={props.loginLogo}\n layout={props.loginLayout}\n showOAuth={props.showOAuth}\n oauthProviders={props.oauthProviders}\n >\n {/* markLogo, not logo: the consent badge is square. */}\n <ConnectConsentPage appName={props.appName} logo={props.markLogo} />\n </AuthGate>\n )\n }\n return (\n <AuthGate\n requireAuth={props.requireAuth ?? true}\n appName={props.appName}\n logo={props.logo}\n loginLogo={props.loginLogo}\n layout={props.loginLayout}\n tagline={props.loginTagline}\n description={props.loginDescription}\n loginAmbassadors={props.loginAmbassadors}\n loginAmbassadorsLabel={props.loginAmbassadorsLabel}\n showOAuth={props.showOAuth}\n oauthProviders={props.oauthProviders}\n >\n <AdminShellInner {...props} />\n </AuthGate>\n )\n}\nAdminShell.displayName = 'AdminShell'\n","import * as React from 'react'\nimport type { OrgAdapter, AuthAdapter } from '@fayz-ai/core'\nimport {\n PluginRuntimeProvider,\n resolvePluginRuntime,\n I18nProvider,\n coreTranslations,\n mergeTranslations,\n setCurrentLocale,\n} from '@fayz-ai/core'\nimport {\n AuthProvider,\n createAuthRuntime,\n type AuthLayout,\n type AuthPluginOptions,\n type ResolvedAuthPlugin,\n type LoginAmbassador,\n} from '@fayz-ai/plugin-auth'\nimport { NavTransitionProvider } from '@fayz-ai/ui'\nimport { createFayzSupabaseClient, getFayzSupabaseClientOptional } from '../data/client'\nimport { OrgProvider } from '../org/context'\nimport { createSupabaseOrgAdapter } from '../org/adapters/supabase'\nimport { createMockOrgAdapter } from '../org/adapters/mock'\nimport { useOrganizationStore } from '../org/store'\nimport { PermissionsProvider } from '../permissions/context'\nimport { AccessProvider } from '../access/context'\nimport { ToastProvider } from '../components/notifications/ToastProvider'\nimport { Sparkles } from 'lucide-react'\nimport { ChatFab, ChatConversation } from '../components/chat'\nimport { NotesRailPanel } from '../components/notes/NotesPanel'\nimport { useChatStore } from '../stores/chat.store'\nimport { useRightRailPanel, useRightRailStore } from '../components/right-rail'\nimport { resolveFayzAgentConnection, getFayzAgentClient } from '../lib/fayz-agent'\nimport { useAuthStore } from '@fayz-ai/auth'\nimport { useBillingStore } from '../billing/store'\nimport type { Plan } from '@fayz-ai/core'\nimport type { PlanConfig } from '../types/billing'\nimport { useThemeStore } from '../stores/theme.store'\nimport { useLocaleStore, readPersistedLocale } from '../stores/locale.store'\nimport { resolveTheme, isSaasTheme } from '../theme/utils'\nimport { AdminShell } from './AdminShell'\nimport { useAdminPath } from './routing'\nimport type { FayzAppConfig } from './config'\n\n// ---------------------------------------------------------------------------\n// Adapter resolution\n// ---------------------------------------------------------------------------\n\nfunction isResolvedAuthPlugin(value: FayzAppConfig['auth']): value is ResolvedAuthPlugin {\n return Boolean(value && 'kind' in value && value.kind === 'auth')\n}\n\nfunction resolveAuthRuntime(config: FayzAppConfig): ResolvedAuthPlugin {\n const auth = config.auth\n if (isResolvedAuthPlugin(auth)) return auth\n\n const provider = auth?.provider ?? auth?.adapter ?? (config.supabaseUrl ? 'supabase' : 'mock')\n const oauth = auth?.oauth ?? {\n enabled: auth?.showOAuth ?? false,\n providers: auth?.oauthProviders ?? ['google'],\n }\n\n return createAuthRuntime({\n provider,\n requireAuth: auth?.requireAuth ?? true,\n layout: auth?.layout ?? auth?.loginLayout,\n logo: auth?.logo ?? auth?.loginLogo,\n tagline: auth?.tagline ?? auth?.loginTagline,\n description: auth?.description ?? auth?.loginDescription,\n loginAmbassadors: auth?.loginAmbassadors,\n loginAmbassadorsLabel: auth?.loginAmbassadorsLabel,\n oauth,\n routes: auth?.routes,\n supabase: {\n url: auth?.supabase?.url ?? config.supabaseUrl,\n anonKey: auth?.supabase?.anonKey ?? config.supabaseAnonKey,\n client: auth?.supabase?.client ?? getFayzSupabaseClientOptional() ?? undefined,\n callbackUrl: auth?.supabase?.callbackUrl,\n resetPasswordUrl: auth?.supabase?.resetPasswordUrl,\n },\n } satisfies AuthPluginOptions)\n}\n\nexport function getAuthShellProps(auth: FayzAppConfig['auth']): {\n requireAuth?: boolean\n loginTagline?: string\n loginDescription?: string\n loginLogo?: React.ReactNode\n loginLayout?: AuthLayout\n loginAmbassadors?: LoginAmbassador[]\n loginAmbassadorsLabel?: string\n showOAuth?: boolean\n oauthProviders?: Exclude<import('@fayz-ai/core').AuthProvider, 'email'>[]\n} {\n if (!auth) return {}\n if (isResolvedAuthPlugin(auth)) {\n return {\n requireAuth: auth.requireAuth,\n loginTagline: auth.tagline,\n loginDescription: auth.description,\n loginLogo: auth.logo,\n loginLayout: auth.layout,\n loginAmbassadors: auth.loginAmbassadors,\n loginAmbassadorsLabel: auth.loginAmbassadorsLabel,\n showOAuth: auth.oauth.enabled,\n oauthProviders: auth.oauth.providers,\n }\n }\n return {\n requireAuth: auth.requireAuth,\n loginTagline: auth.tagline ?? auth.loginTagline,\n loginDescription: auth.description ?? auth.loginDescription,\n loginLogo: auth.logo ?? auth.loginLogo,\n loginLayout: auth.layout ?? auth.loginLayout,\n loginAmbassadors: auth.loginAmbassadors,\n loginAmbassadorsLabel: auth.loginAmbassadorsLabel,\n showOAuth: auth.oauth?.enabled ?? auth.showOAuth,\n oauthProviders: auth.oauth?.providers ?? auth.oauthProviders,\n }\n}\n\nfunction resolveOrgAdapter(config: FayzAppConfig, authAdapter?: AuthAdapter): OrgAdapter {\n const org = config.org\n if (org?.adapter && typeof org.adapter === 'object') return org.adapter as OrgAdapter\n\n const strategy = org?.adapter ?? (config.supabaseUrl ? 'supabase' : 'mock')\n // The app declares its own business roles via permissions.defaultProfiles; pass\n // their identity (id/name/description) to both adapters so the role SET is\n // app-owned, not baked into the SDK.\n const declaredRoles = config.permissions?.defaultProfiles?.map((p) => ({\n id: p.id,\n name: p.name,\n description: p.description,\n }))\n // Inject the resolved auth adapter so the org adapter can DELIVER invites (send\n // the e-mail + create the auth user) — org owns the audit row + role, auth owns delivery.\n // siteUrl is the deployment-fixed origin the container injects as VITE_APP_URL, so\n // invite links point at the real host instead of the admin's current window origin\n // (which is a preview/localhost URL during dev). Must also be allow-listed in Supabase.\n if (strategy === 'supabase')\n return createSupabaseOrgAdapter({\n roles: declaredRoles,\n authAdapter,\n siteUrl: import.meta.env.VITE_APP_URL,\n })\n return createMockOrgAdapter(config.permissions?.defaultProfiles)\n}\n\nfunction buildI18nConfig(config: FayzAppConfig): {\n defaultLocale: string\n supported: string[]\n translations: Record<string, Record<string, string>>\n} {\n const defaultLocale = config.locale?.default ?? 'en'\n const supported = config.locale?.supported ?? [defaultLocale, 'pt-BR']\n\n const pluginTranslations: Array<Record<string, Record<string, string>>> = []\n for (const plugin of config.plugins ?? []) {\n if (plugin.locales) pluginTranslations.push(plugin.locales)\n }\n\n const translations = mergeTranslations(\n coreTranslations,\n ...pluginTranslations,\n config.locale?.translations,\n )\n\n return { defaultLocale, supported, translations }\n}\n\n// ---------------------------------------------------------------------------\n// BillingInitializer — seeds the billing store from config on mount\n// ---------------------------------------------------------------------------\n\nfunction BillingInitializer({ config }: { config: FayzAppConfig }) {\n const setPlans = useBillingStore((s) => s.setPlans)\n const setCheckout = useBillingStore((s) => s.setCheckout)\n React.useEffect(() => {\n if (config.billing?.plans) setPlans(config.billing.plans.map(normalizeBillingPlan))\n // Seed the payment-gateway seam so the shell's Subscription page can route\n // plan changes through it (Stripe/Pix) instead of a direct updateOrg.\n setCheckout(config.billing?.onCheckout ?? null)\n }, [config.billing, setPlans, setCheckout])\n return null\n}\n\nfunction normalizeBillingPlan(plan: PlanConfig): Plan {\n return {\n id: plan.id,\n name: plan.name,\n description: plan.description,\n price: plan.priceMonthly ?? plan.prices?.monthly ?? 0,\n currency: plan.currency ?? 'USD',\n interval: 'month',\n features: plan.features,\n highlighted: plan.popular,\n stripePriceId: undefined,\n // Preserve structured entitlements onto the runtime Plan — the access engine\n // reads these to enforce feature gates + quantity caps. (Previously dropped\n // here, leaving plan limits dead.)\n entitlements: plan.entitlements,\n }\n}\n\nfunction ThemeInitializer({ config }: { config: FayzAppConfig }) {\n const initialize = useThemeStore((s) => s.initialize)\n const setOverrides = useThemeStore((s) => s.setOverrides)\n const setMode = useThemeStore((s) => s.setMode)\n\n React.useEffect(() => {\n if (config.theme) {\n const resolved = isSaasTheme(config.theme)\n ? resolveTheme(config.theme)\n : config.theme\n setOverrides(resolved)\n }\n if (config.defaultThemeMode && typeof window !== 'undefined' && !localStorage.getItem('saas-core:theme-mode')) {\n setMode(config.defaultThemeMode)\n }\n initialize()\n }, [config.defaultThemeMode, config.theme, initialize, setMode, setOverrides])\n\n return null\n}\n\n// Publishes config.team.personKinds into the org store so the Person-first Team\n// screen knows which person kinds to list. Empty = legacy membership-only mode.\nfunction TeamInitializer({ config }: { config: FayzAppConfig }) {\n const setTeamPersonKinds = useOrganizationStore((s) => s.setTeamPersonKinds)\n const kinds = config.team?.personKinds\n React.useEffect(() => {\n setTeamPersonKinds(kinds ?? [])\n }, [setTeamPersonKinds, kinds])\n return null\n}\n\n/** Registers the assistant as the rail's Chat tab and keeps the chat store in\n * step with which tab is showing. One direction per effect — neither store\n * drives the other in a loop. */\nfunction ChatRailPanel({ config }: { config: FayzAppConfig }) {\n const chatOpen = useChatStore((s) => s.isOpen)\n const setChatOpen = useChatStore((s) => s.setOpen)\n const openPanel = useRightRailStore((s) => s.openPanel)\n const railOpen = useRightRailStore((s) => s.open)\n const railActive = useRightRailStore((s) => s.active)\n\n const apiEndpoint = config.chat?.apiEndpoint\n const systemPrompt = config.chat?.systemPrompt\n const agent = config.chat?.agent\n const voice = config.chat?.voice\n const whatsapp = config.chat?.whatsapp\n\n // Stable identity — a new component per render would remount the transcript.\n const Component = React.useMemo(() => {\n const Panel = () => (\n <ChatConversation\n apiEndpoint={apiEndpoint}\n systemPrompt={systemPrompt}\n agent={agent}\n voice={voice}\n whatsapp={whatsapp}\n />\n )\n Panel.displayName = 'ChatRailPanelBody'\n return Panel\n }, [apiEndpoint, systemPrompt, agent, voice, whatsapp])\n\n // Recent sessions count (neutral badge). Seeded here because the store only\n // fills when the conversation mounts — the badge should show before that.\n const conversations = useChatStore((s) => s.conversations)\n const setConversations = useChatStore((s) => s.setConversations)\n const user = useAuthStore((s) => s.user)\n const connection = React.useMemo(() => resolveFayzAgentConnection(agent), [agent])\n React.useEffect(() => {\n if (!connection) return\n getFayzAgentClient(connection)\n .listConversations(user?.id)\n .then(setConversations)\n .catch(() => {})\n }, [connection, user?.id, setConversations])\n\n useRightRailPanel(\n React.useMemo(\n () => ({\n id: 'chat',\n label: 'Chat',\n icon: Sparkles,\n order: 10,\n badge: { count: conversations.length },\n Component,\n }),\n [Component, conversations.length],\n ),\n )\n\n React.useEffect(() => {\n if (chatOpen) openPanel('chat')\n }, [chatOpen, openPanel])\n\n React.useEffect(() => {\n if (!(railOpen && railActive === 'chat')) setChatOpen(false)\n }, [railOpen, railActive, setChatOpen])\n\n return null\n}\n\n// ---------------------------------------------------------------------------\n// AdminProviders — the provider stack shared by the admin factory/createSaasApp\n// sugar path AND the manifest-driven AdminScaffold. Resolves adapters + i18n\n// once (stable refs) and recomputes the plugin runtime reactively as the path\n// changes, so route-scoped widget visibility stays correct.\n//\n// AuthProvider → OrgProvider → PluginRuntimeProvider\n// → PermissionsProvider → I18nProvider → (BillingInitializer + children)\n// ---------------------------------------------------------------------------\n\nexport function AdminProviders({ config, children }: { config: FayzAppConfig; children: React.ReactNode }) {\n const currentOrg = useOrganizationStore((s) => s.currentOrg)\n const hasFayzAgent = React.useMemo(\n () => !!resolveFayzAgentConnection(config.chat?.agent),\n [config.chat?.agent],\n )\n // An app that asked for chat, or a project with a Fayz agent injected by env.\n const assistantEnabled = config.chat?.enabled !== false && (!!config.chat || hasFayzAgent)\n const surface = config.chat?.surface ?? 'dock'\n // Always mounted: with the rail open the FAB stays put as the minimize\n // control, so the same corner opens and closes the companion column.\n //\n // Except on /connect. That screen asks the user to hand an outside agent\n // access to their organization's data, and an assistant floating over the\n // decision is both a distraction and a mixed message — the page is about\n // granting a capability, not using one. This lives here rather than in\n // AdminShell because the FAB is mounted by the providers, above it.\n const onConsentScreen =\n typeof window !== 'undefined' && window.location.pathname.replace(/\\/+$/, '').endsWith('/connect')\n const showFab = assistantEnabled && surface === 'dock' && !onConsentScreen\n\n // Resolve adapters / i18n once per config identity.\n const resolved = React.useMemo(() => {\n if (config.supabaseUrl && config.supabaseAnonKey) {\n createFayzSupabaseClient(config.supabaseUrl, config.supabaseAnonKey)\n }\n const i18n = buildI18nConfig(config)\n // Locale is resolved HERE, in the render phase, not in an effect below:\n // plugin components read the core locale while they render, so an effect\n // lands one paint too late — which is why every app used to hand-call\n // `setCurrentLocale` in its main.tsx. The user's persisted pick wins; the\n // config default is only the first-visit fallback.\n setCurrentLocale(readPersistedLocale() ?? i18n.defaultLocale)\n useLocaleStore.getState().hydrateDefault(i18n.defaultLocale)\n const authRuntime = resolveAuthRuntime(config)\n return {\n authRuntime,\n orgAdapter: resolveOrgAdapter(config, authRuntime.adapter),\n i18n,\n plugins: config.plugins ?? [],\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [config])\n\n // Recompute the plugin runtime when the hash path or tenant changes\n // (route-scoped visibility + tenant-scoped plugin data providers).\n const path = useAdminPath()\n const runtime = React.useMemo(\n () =>\n resolvePluginRuntime({\n plugins: resolved.plugins,\n context: {\n tenant: currentOrg\n ? {\n id: currentOrg.id,\n slug: currentOrg.slug,\n verticalId: currentOrg.verticalId,\n plan: currentOrg.plan,\n }\n : null,\n user: null,\n currentPath: path,\n matchedPath: path,\n layout: config.layout ?? 'sidebar',\n },\n }),\n [resolved.plugins, path, config.layout, currentOrg],\n )\n\n return (\n <AuthProvider adapter={resolved.authRuntime.adapter}>\n <OrgProvider\n adapter={resolved.orgAdapter}\n autoCreate={config.org?.autoCreate ?? true}\n cacheTtlMs={config.org?.cacheTtlMs}\n >\n <PluginRuntimeProvider value={runtime}>\n <PermissionsProvider config={config.permissions}>\n <AccessProvider limitDeclarations={config.billing?.limitDeclarations}>\n <I18nProvider value={resolved.i18n}>\n <ThemeInitializer config={config} />\n <TeamInitializer config={config} />\n <BillingInitializer config={config} />\n <ToastProvider />\n {assistantEnabled && surface === 'dock' && <ChatRailPanel config={config} />}\n <NotesRailPanel />\n <NavTransitionProvider value={config.navTransition ?? 'slide'}>\n {children}\n </NavTransitionProvider>\n {showFab && (\n <ChatFab\n apiEndpoint={config.chat?.apiEndpoint}\n systemPrompt={config.chat?.systemPrompt}\n agent={config.chat?.agent}\n voice={config.chat?.voice}\n mobile={!config.bottomNav?.length}\n />\n )}\n </I18nProvider>\n </AccessProvider>\n </PermissionsProvider>\n </PluginRuntimeProvider>\n </OrgProvider>\n </AuthProvider>\n )\n}\nAdminProviders.displayName = 'AdminProviders'\n\n// ---------------------------------------------------------------------------\n// createFayzApp — declarative admin app factory (sugar over the manifest path;\n// equivalent to renderApp(defineSaas(config)), sharing AdminProviders +\n// AdminShell with the scaffold).\n//\n// const App = createFayzApp({ name: 'Glow Studio', plugins: [...] })\n// export default App\n// ---------------------------------------------------------------------------\n\nexport function createFayzApp(config: FayzAppConfig): React.ComponentType {\n const authShellProps = getAuthShellProps(config.auth)\n function FayzApp({ children }: { children?: React.ReactNode }) {\n return (\n <AdminProviders config={config}>\n {children ?? (\n <AdminShell\n appName={config.name}\n logo={config.logo}\n layout={config.layout}\n contentFrame={config.contentFrame}\n moduleNav={config.moduleNav}\n bottomNav={config.bottomNav}\n pages={config.pages}\n shellMounts={config.shellMounts}\n sidebarFooter={config.sidebarFooter}\n navChildConnector={config.navChildConnector}\n site={config.site}\n {...authShellProps}\n showSettings\n showOrgSettings={config.orgSettings ?? Boolean(config.org)}\n showBranding={config.branding ?? true}\n />\n )}\n </AdminProviders>\n )\n }\n FayzApp.displayName = `FayzApp(${config.name})`\n return FayzApp\n}\n","import type {\n AgentContract,\n AIToolContract,\n EntityContract,\n EntityDef,\n FeatureDeclaration,\n LimitDeclaration,\n PluginAITool,\n PluginManifest,\n RegisteredEntity,\n} from '@fayz-ai/core'\nimport { getAllEntities, deriveEntityKey } from '@fayz-ai/core'\nimport { mergeLimitDeclarations } from '@fayz-ai/core/access'\nimport { coreAITools, buildDataPrimitiveTools } from '../lib/core-ai-tools'\nimport { CORE_LIMIT_DECLARATIONS, entityDerivedLimitDeclarations } from '../access/limits-registry'\nimport { CORE_QUERY_ENTITIES } from './core-entities'\nimport type { FayzAppConfig } from './config'\n\n// ---------------------------------------------------------------------------\n// deriveAgentContract — FayzAppConfig → the manifest v3 `agent` section +\n// resolved `limitDeclarations`. This is the \"capabilities are derived, never\n// configured\" principle applied to the server side: everything the Fayz broker\n// needs to operate the app without a browser is PROJECTED from what the app\n// already declares (entities, plugins, permissions, billing), never re-typed.\n// Pure data out — safe to run at defineSaas time and in `fayz manifest emit`.\n// ---------------------------------------------------------------------------\n\nfunction projectEntity(key: string, label: string, labelPlural: string | undefined, def: EntityDef): EntityContract | null {\n const data = def.data\n if (!data?.table) return null\n return {\n key,\n label,\n ...(labelPlural ? { labelPlural } : {}),\n ...(def.limitKey ? { limitKey: def.limitKey } : {}),\n ...(def.permission ? { permission: def.permission } : {}),\n data: {\n table: data.table,\n ...(data.schema ? { schema: data.schema } : {}),\n ...(data.tenantScoped !== undefined ? { tenantScoped: data.tenantScoped } : {}),\n ...(data.tenantIdColumn ? { tenantIdColumn: data.tenantIdColumn } : {}),\n ...(data.searchColumns ? { searchColumns: data.searchColumns } : {}),\n ...(data.selectColumns ? { selectColumns: data.selectColumns } : {}),\n ...(data.columnMap ? { columnMap: data.columnMap } : {}),\n ...(data.archetype ? { archetype: data.archetype } : {}),\n ...(data.archetypeKind ? { archetypeKind: data.archetypeKind } : {}),\n ...(data.filters ? { filters: data.filters } : {}),\n },\n fields: (def.fields ?? []).map((f) => ({\n key: f.key,\n label: f.label,\n type: f.type,\n ...(f.required ? { required: true } : {}),\n ...(f.searchable ? { searchable: true } : {}),\n // The hint is the only place a field says what it EXPECTS rather than\n // what it is called — an owner id to look up, a default not to restate.\n // Dropping it here is what left the agent guessing at write time.\n ...(f.hint ? { hint: f.hint } : {}),\n ...(Array.isArray(f.options) && f.options.length\n ? { options: f.options.map((o) => (typeof o === 'string' ? o : o.value)) }\n : {}),\n ...(f.relation?.table ? { relationTable: f.relation.table } : {}),\n })),\n }\n}\n\nfunction projectTool(tool: PluginAITool, pluginId?: string): AIToolContract {\n return {\n id: tool.id,\n name: tool.name,\n description: tool.description,\n mode: tool.mode,\n ...(tool.parameters ? { parameters: tool.parameters } : {}),\n ...(tool.permission ? { permission: tool.permission } : {}),\n ...(tool.limitKey ? { limitKey: tool.limitKey } : {}),\n ...(tool.execution ? { execution: tool.execution } : {}),\n // Persist tools default to human confirmation — an agent never clicks a\n // gated button, so the contract is where the guard is declared.\n ...(tool.mode === 'persist' ? { requiresConfirmation: tool.requiresConfirmation ?? true } : {}),\n ...(pluginId ? { pluginId } : {}),\n ...(tool.category ? { category: tool.category } : {}),\n }\n}\n\n/** Merge plugin-declared features with the app's own, app wins by id — the\n * same rule PermissionsProvider applies to the live matrix. */\nfunction mergeFeatureDeclarations(\n plugins: PluginManifest[],\n appFeatures: FeatureDeclaration[] | undefined,\n): FeatureDeclaration[] {\n const byId = new Map<string, FeatureDeclaration>()\n for (const plugin of plugins) {\n for (const f of plugin.declaredFeatures ?? []) byId.set(f.id, f)\n }\n for (const f of appFeatures ?? []) byId.set(f.id, f)\n return Array.from(byId.values())\n}\n\nexport interface DerivedAgentSections {\n agent: AgentContract\n limitDeclarations: LimitDeclaration[]\n}\n\nexport function deriveAgentContract(\n config: FayzAppConfig,\n entities: RegisteredEntity[] = getAllEntities(),\n): DerivedAgentSections {\n const plugins = config.plugins ?? []\n\n // --- Entities: registered CRUD entities + plugin registry entities --------\n const entityContracts: EntityContract[] = []\n for (const e of entities) {\n if (!e.entityDef) continue\n const projected = projectEntity(e.entityKey, e.label, e.labelPlural, e.entityDef)\n if (projected) entityContracts.push(projected)\n }\n const registries: NonNullable<AgentContract['registries']> = []\n for (const plugin of plugins) {\n for (const registry of plugin.registries ?? []) {\n const entityKey = `${plugin.id}:${registry.id}`\n registries.push({\n pluginId: plugin.id,\n id: registry.id,\n entityKey,\n ...(registry.readOnly ? { readOnly: true } : {}),\n })\n const projected = projectEntity(\n entityKey,\n registry.entity.name,\n registry.entity.namePlural,\n registry.entity,\n )\n if (projected) entityContracts.push(projected)\n }\n for (const q of plugin.queryEntities ?? []) {\n const projected = projectEntity(q.key, q.entity.name, q.entity.namePlural, q.entity)\n if (projected) entityContracts.push(projected)\n }\n }\n for (const q of config.agentContract?.queryEntities ?? []) {\n const projected = projectEntity(q.key, q.entity.name, q.entity.namePlural, q.entity)\n if (projected) entityContracts.push(projected)\n }\n // Spine tables whose surface is a detail TAB, not a page — no app declares\n // them as CRUD entities, so without this the agent cannot see them at all.\n for (const q of CORE_QUERY_ENTITIES) {\n const projected = projectEntity(q.key, q.entity.name, q.entity.namePlural, q.entity)\n if (projected) entityContracts.push(projected)\n }\n\n // --- Tools: core + derived reads + plugin-declared --------------------------\n const tools: AIToolContract[] = []\n // Core handlers run in the surface (org store / router) — client plane.\n for (const tool of coreAITools) {\n tools.push({ ...projectTool(tool), execution: { plane: 'client' } })\n }\n // The data primitives: one search + one aggregate over every entity/registry.\n // `entity: '*'` = the target arrives as the call's `entity` argument; the\n // executor resolves it against `agent.entities` and enforces that entity's\n // own read permission.\n const registryMap = new Map(plugins.map((p) => [p.id, p.registries ?? []]))\n const queryEntities = [\n ...plugins.flatMap((p) => p.queryEntities ?? []),\n ...(config.agentContract?.queryEntities ?? []),\n // CORE_QUERY_ENTITIES is NOT listed here — buildDataPrimitiveTools merges\n // it in itself, for every caller. It is projected into `entityContracts`\n // above because that list is what the server-plane executor resolves a\n // tool call's `entity` argument against.\n ]\n for (const tool of buildDataPrimitiveTools({ entities, registries: registryMap, queryEntities })) {\n tools.push({ ...projectTool(tool), execution: { plane: 'server', kind: 'entity_read', entity: '*' } })\n }\n // Plugin-authored tools keep their declared execution (persist tools bind to\n // RPCs via `execution: { kind:'rpc' }`; absent ⇒ client-plane executor).\n for (const plugin of plugins) {\n for (const tool of plugin.aiTools ?? []) {\n tools.push(projectTool(tool, plugin.id))\n }\n }\n\n // --- Limits: the same 4-layer merge the AccessProvider publishes ----------\n const limitDeclarations = mergeLimitDeclarations(\n CORE_LIMIT_DECLARATIONS,\n entityDerivedLimitDeclarations(entities),\n plugins.flatMap((p) => p.declaredLimits ?? []),\n config.billing?.limitDeclarations,\n )\n\n // --- RPCs: plugin-shipped + app-shipped ------------------------------------\n const rpcs = [\n ...plugins.flatMap((p) => p.declaredRpcs ?? []),\n ...(config.agentContract?.rpcs ?? []),\n ]\n\n const agent: AgentContract = {\n ...(config.chat?.title || config.chat?.systemPrompt\n ? {\n persona: {\n ...(config.chat.title ? { name: config.chat.title } : {}),\n ...(config.chat.systemPrompt ? { systemPrompt: config.chat.systemPrompt } : {}),\n },\n }\n : {}),\n executionPlane: config.agentContract?.executionPlane ?? 'client',\n entities: entityContracts,\n tools,\n ...(registries.length ? { registries } : {}),\n declaredFeatures: mergeFeatureDeclarations(plugins, config.permissions?.features),\n ...(rpcs.length ? { rpcs } : {}),\n ...(config.agentContract?.knowledge ? { domainKnowledge: config.agentContract.knowledge } : {}),\n }\n\n return { agent, limitDeclarations }\n}\n","import * as React from 'react'\nimport {\n registerScaffold,\n defineApp,\n getPluginFactory,\n getComponent,\n} from '@fayz-ai/core'\nimport type {\n AppManifest,\n PluginManifest,\n LocaleConfig,\n PermissionsConfig,\n BillingConfig as ManifestBillingConfig,\n} from '@fayz-ai/core'\nimport { AdminProviders, getAuthShellProps } from './admin-app'\nimport { AdminShell } from './AdminShell'\nimport { deriveAgentContract } from './derive-contract'\nimport type { FayzAppConfig, CustomPage } from './config'\n\n// ---------------------------------------------------------------------------\n// Admin scaffold — renders an admin app from a pure-data AppManifest. Mirrors\n// the storefront scaffold's dual path: defineSaas turns a FayzAppConfig into a\n// manifest (the sugar→data direction), and AdminScaffold turns a manifest back\n// into the provider stack + shell (the data→render direction). Plugins live in\n// the manifest as PluginRefs (id + JSON config) and are resolved to live\n// PluginManifests through the plugin-factory registry, exactly the contract a\n// generated app's plugins.generated.ts populates.\n// ---------------------------------------------------------------------------\n\nfunction slug(name: string): string {\n return name.toLowerCase().replace(/[^a-z0-9]+/g, '-').replace(/^-|-$/g, '') || 'app'\n}\n\nconst liveConfigOption = '__fayzLiveConfigRef'\nconst liveSaasConfigs = new Map<string, FayzAppConfig>()\n\nfunction getAuthRequireAuth(config: FayzAppConfig): boolean {\n return config.auth?.requireAuth ?? true\n}\n\nfunction getLiveConfigRef(id: string): string {\n return `code:${id}`\n}\n\n/** Fayz/Saas config → AppManifest (sugar → data). During the Beauty/Resto\n * migration, config-authored apps keep a live config ref so renderApp can\n * preserve code-backed plugins and custom pages while the JSON manifest path\n * matures. Serialized manifests still resolve through plugin/page registries. */\nexport function defineSaas(config: FayzAppConfig): AppManifest {\n const id = slug(config.name)\n const configRef = getLiveConfigRef(id)\n liveSaasConfigs.set(configRef, config)\n const { agent, limitDeclarations } = deriveAgentContract(config)\n return defineApp({\n id,\n name: config.name,\n backend: config.supabaseUrl\n ? { provider: 'supabase', url: config.supabaseUrl }\n : { provider: 'mock' },\n locale: config.locale as LocaleConfig | undefined,\n theme: config.theme as Record<string, unknown> | undefined,\n permissions: config.permissions,\n billing: config.billing as ManifestBillingConfig | undefined,\n limitDeclarations,\n agent,\n surfaces: {\n admin: {\n scaffold: 'admin',\n plugins: (config.plugins ?? []).map((p) => ({ id: p.id })),\n options: {\n [liveConfigOption]: configRef,\n layout: config.layout ?? 'sidebar',\n requireAuth: getAuthRequireAuth(config),\n },\n },\n },\n })\n}\n\n/** Resolve a manifest's PluginRefs into live PluginManifests via the\n * plugin-factory registry. Unknown ids are skipped with a console warning so a\n * partial install degrades instead of crashing. */\nfunction resolvePlugins(manifest: AppManifest, surfaceName: string): PluginManifest[] {\n const refs = manifest.surfaces[surfaceName]?.plugins ?? []\n const plugins: PluginManifest[] = []\n for (const ref of refs) {\n if (ref.enabled === false) continue\n const factory = getPluginFactory(ref.id)\n if (!factory) {\n // eslint-disable-next-line no-console\n console.warn(`[@fayz-ai/admin] No plugin factory registered for \"${ref.id}\". Did plugins.generated.ts run?`)\n continue\n }\n plugins.push(factory(ref.config) as PluginManifest)\n }\n return plugins\n}\n\n/** Resolve manifest pages that reference a registered component id into the\n * CustomPage shape the shell renders. (entity/blocks pages are handled by the\n * plugins that own them; component pages are the app-level escape hatch.) */\nfunction resolvePages(manifest: AppManifest, surfaceName: string): CustomPage[] {\n const pages = manifest.surfaces[surfaceName]?.pages ?? []\n const out: CustomPage[] = []\n for (const p of pages) {\n if (!p.component) continue\n const Component = getComponent(p.component) as React.ComponentType | undefined\n if (!Component) {\n // eslint-disable-next-line no-console\n console.warn(`[@fayz-ai/admin] Manifest page \"${p.path}\" references unregistered component \"${p.component}\".`)\n continue\n }\n out.push({ path: p.path, label: p.label, icon: p.icon, section: p.section, component: Component })\n }\n return out\n}\n\n/** AppManifest → FayzAppConfig (data → render). */\nfunction manifestToFayzConfig(manifest: AppManifest, surfaceName: string): FayzAppConfig {\n const options = (manifest.surfaces[surfaceName]?.options ?? {}) as Record<string, unknown>\n const liveConfigRef = options[liveConfigOption]\n const liveConfig = typeof liveConfigRef === 'string' ? liveSaasConfigs.get(liveConfigRef) : undefined\n if (liveConfig) return liveConfig\n\n return {\n name: manifest.name,\n supabaseUrl: manifest.backend?.provider === 'supabase' ? manifest.backend.url : undefined,\n plugins: resolvePlugins(manifest, surfaceName),\n pages: resolvePages(manifest, surfaceName),\n theme: manifest.theme as FayzAppConfig['theme'],\n layout: (options.layout as FayzAppConfig['layout']) ?? 'sidebar',\n locale: manifest.locale as LocaleConfig | undefined,\n permissions: manifest.permissions as PermissionsConfig | undefined,\n billing: manifest.billing as FayzAppConfig['billing'],\n auth: { requireAuth: (options.requireAuth as boolean) ?? true },\n }\n}\n\nexport function AdminScaffold({ manifest, surface }: { manifest: AppManifest; surface: string }) {\n const config = React.useMemo(() => manifestToFayzConfig(manifest, surface), [manifest, surface])\n const authShellProps = React.useMemo(() => getAuthShellProps(config.auth), [config.auth])\n\n return (\n <AdminProviders config={config}>\n {/* Every shell-shaping field of FayzAppConfig has to be forwarded HERE,\n not only in AdminApp: an app rendered via renderApp(manifest) lands on\n this scaffold, and a field missing here is a config key that silently\n does nothing. sidebarFooter, shellMounts and site were all being\n dropped that way. */}\n <AdminShell\n appName={config.name}\n logo={config.logo}\n markLogo={config.markLogo}\n layout={config.layout}\n contentFrame={config.contentFrame}\n moduleNav={config.moduleNav}\n bottomNav={config.bottomNav}\n onBottomNavAction={config.onBottomNavAction}\n mobileHeader={config.mobileHeader}\n pages={config.pages}\n shellMounts={config.shellMounts}\n sidebarFooter={config.sidebarFooter}\n navChildConnector={config.navChildConnector}\n site={config.site}\n {...authShellProps}\n showSettings\n showOrgSettings={config.orgSettings ?? Boolean(config.org)}\n showOrgSwitcher={config.org?.multiOrg !== false}\n showBranding={config.branding ?? true}\n />\n </AdminProviders>\n )\n}\nAdminScaffold.displayName = 'AdminScaffold'\n\n// Registration is lazy (called from renderApp/createFayzApp) so that importing\n// the @fayz-ai/admin barrel stays side-effect-free and tree-shakable.\nlet adminScaffoldRegistered = false\nexport function registerAdminScaffold(): void {\n if (adminScaffoldRegistered) return\n adminScaffoldRegistered = true\n registerScaffold('admin', AdminScaffold, { source: 'sdk', label: 'Admin' })\n}\n","import React, { useEffect, useState, useMemo, useCallback } from 'react'\nimport {\n CalendarDays, FileText, CircleDashed, CircleEllipsis, CircleCheckBig,\n CircleAlert, Ban, ShoppingBag, Clock, UserX, ExternalLink,\n} from 'lucide-react'\nimport type { ColumnDef } from '@tanstack/react-table'\nimport { ListView } from '@fayz-ai/ui'\nimport { useTranslation } from '../../hooks/useTranslation'\nimport type { EntityDef } from '../../types/crud'\nimport type { ClientDocument, ClientDocumentStage, ClientOrdersProvider, ClientOrdersNavigator, ClientOrdersStageFilter } from '../../types/client-orders'\n\n// ---------------------------------------------------------------------------\n// Stage badge config\n// ---------------------------------------------------------------------------\n\ninterface StageDef {\n icon: React.ElementType\n color: string\n labelKey: string\n}\n\nconst STAGE_CONFIG: Record<string, StageDef> = {\n draft: { icon: CircleDashed, color: 'bg-muted text-muted-foreground', labelKey: 'crud.orders.stage.draft' },\n quoted: { icon: FileText, color: 'bg-info-soft text-info-soft-foreground', labelKey: 'crud.orders.stage.quoted' },\n booked: { icon: CalendarDays, color: 'bg-magic-soft text-magic-soft-foreground', labelKey: 'crud.orders.stage.booked' },\n invoiced: { icon: FileText, color: 'bg-warning-soft text-warning-soft-foreground', labelKey: 'crud.orders.stage.invoiced' },\n paid: { icon: CircleCheckBig, color: 'bg-success-soft text-success-soft-foreground', labelKey: 'crud.orders.stage.paid' },\n partial: { icon: CircleEllipsis, color: 'bg-warning-soft text-warning-soft-foreground', labelKey: 'crud.orders.stage.partial' },\n overdue: { icon: CircleAlert, color: 'bg-destructive-soft text-destructive-soft-foreground', labelKey: 'crud.orders.stage.overdue' },\n cancelled: { icon: Ban, color: 'bg-muted text-muted-foreground', labelKey: 'crud.orders.stage.cancelled' },\n no_show: { icon: UserX, color: 'bg-destructive-soft text-destructive-soft-foreground', labelKey: 'crud.orders.stage.no_show' },\n completed: { icon: CircleCheckBig, color: 'bg-success-soft text-success-soft-foreground', labelKey: 'crud.orders.stage.completed' },\n}\n\n// ---------------------------------------------------------------------------\n// Column definitions\n// ---------------------------------------------------------------------------\n\nfunction useColumns(\n currency: { code: string; locale: string },\n t: (key: string) => string,\n onBookingClick?: (orderId: string) => void,\n onInvoiceClick?: (orderId: string) => void,\n): ColumnDef<ClientDocument, any>[] {\n return useMemo(() => [\n {\n accessorKey: 'date',\n header: t('crud.orders.columnDate'),\n size: 140,\n cell: ({ row }) => {\n const doc = row.original\n const dateStr = new Date(doc.date).toLocaleDateString(currency.locale, { day: '2-digit', month: 'short', year: '2-digit' })\n // If this order has a booking time, make it a clickable link\n if (doc.startsAt && onBookingClick) {\n const time = new Date(doc.startsAt).toLocaleTimeString(currency.locale, { hour: '2-digit', minute: '2-digit' })\n return (\n <button\n type=\"button\"\n onClick={(e) => { e.stopPropagation(); onBookingClick(doc.id) }}\n className=\"inline-flex items-center gap-1 text-xs text-magic hover:underline whitespace-nowrap\"\n >\n <CalendarDays className=\"h-3 w-3\" />\n {dateStr} {time}\n </button>\n )\n }\n return <span className=\"text-xs text-muted-foreground whitespace-nowrap\">{dateStr}</span>\n },\n },\n {\n id: 'stage',\n header: t('crud.orders.columnStage'),\n size: 120,\n cell: ({ row }) => {\n const cfg = STAGE_CONFIG[row.original.stage] ?? STAGE_CONFIG.draft\n const Icon = cfg.icon\n const translated = t(cfg.labelKey)\n const label = translated.startsWith('crud.orders.stage.') ? row.original.stage : translated\n return (\n <span className={`inline-flex items-center gap-1 rounded-full px-2 py-0.5 text-[10px] font-medium ${cfg.color}`}>\n <Icon className=\"h-2.5 w-2.5\" />\n {label}\n </span>\n )\n },\n },\n {\n accessorKey: 'referenceNumber',\n header: '#',\n size: 100,\n cell: ({ getValue }) => {\n const num = getValue() as string | undefined\n return num\n ? <span className=\"text-xs font-mono text-muted-foreground\">#{num}</span>\n : <span className=\"text-muted-foreground\">—</span>\n },\n },\n {\n accessorKey: 'description',\n header: t('crud.orders.columnDescription'),\n cell: ({ getValue }) => (\n <span className=\"text-sm truncate max-w-[200px] block\">\n {(getValue() as string) || '—'}\n </span>\n ),\n },\n {\n accessorKey: 'total',\n header: t('crud.orders.columnAmount'),\n size: 120,\n cell: ({ row }) => {\n const doc = row.original\n const val = doc.total\n if (!val) return <span className=\"text-muted-foreground\">—</span>\n const formatted = new Intl.NumberFormat(currency.locale, { style: 'currency', currency: currency.code }).format(val)\n const isFinancial = ['invoiced', 'paid', 'partial', 'overdue'].includes(doc.stage)\n // If invoiced/paid and has a reference, link to invoice detail\n if (isFinancial && onInvoiceClick) {\n return (\n <button\n type=\"button\"\n onClick={(e) => { e.stopPropagation(); onInvoiceClick(doc.id) }}\n className={`inline-flex items-center gap-1 font-medium text-sm text-primary hover:underline ${doc.stage === 'cancelled' ? 'line-through text-muted-foreground' : ''}`}\n >\n {formatted}\n <ExternalLink className=\"h-2.5 w-2.5\" />\n </button>\n )\n }\n return (\n <span className={`font-medium text-sm ${doc.stage === 'cancelled' ? 'line-through text-muted-foreground' : ''}`}>\n {formatted}\n </span>\n )\n },\n },\n ], [currency, t, onBookingClick, onInvoiceClick])\n}\n\n// ---------------------------------------------------------------------------\n// Tab Component\n// ---------------------------------------------------------------------------\n\nexport function ClientOrdersTab({\n item,\n entityDef,\n provider,\n navigator,\n initialStage,\n stageFilters,\n onBookingClick,\n onInvoiceClick,\n currency = { code: 'BRL', locale: 'pt-BR' },\n}: {\n item: any\n entityDef: EntityDef\n provider: ClientOrdersProvider\n navigator?: ClientOrdersNavigator\n initialStage?: string\n stageFilters?: ClientOrdersStageFilter[]\n onBookingClick?: (orderId: string) => void\n onInvoiceClick?: (orderId: string) => void\n currency?: { code: string; locale: string }\n}) {\n const { t } = useTranslation()\n const [docs, setDocs] = useState<ClientDocument[]>([])\n const [total, setTotal] = useState(0)\n const [loading, setLoading] = useState(true)\n const [stageFilter, setStageFilter] = useState<string | undefined>(initialStage)\n\n const clientId = item.id as string\n\n const fetchDocs = useCallback(async () => {\n setLoading(true)\n try {\n const result = await provider.getDocuments({\n clientId,\n stages: stageFilter ? [stageFilter] : undefined,\n })\n setDocs(result.data)\n setTotal(result.total)\n } catch {\n setDocs([])\n setTotal(0)\n } finally {\n setLoading(false)\n }\n }, [clientId, stageFilter, provider])\n\n useEffect(() => { fetchDocs() }, [fetchDocs])\n\n useEffect(() => {\n setStageFilter(initialStage)\n }, [initialStage])\n\n const columns = useColumns(currency, t, onBookingClick, onInvoiceClick)\n\n const tags = useMemo(() => stageFilters ?? [\n { value: 'booked', label: t('crud.orders.stage.booked') },\n { value: 'invoiced', label: t('crud.orders.stage.invoiced') },\n { value: 'paid', label: t('crud.orders.stage.paid') },\n { value: 'quoted', label: t('crud.orders.stage.quoted') },\n ], [stageFilters, t])\n\n return (\n <ListView<ClientDocument>\n columns={columns}\n data={docs}\n loading={loading}\n searchPlaceholder={t('crud.orders.searchPlaceholder')}\n tags={tags}\n allTagLabel={t('crud.orders.all')}\n activeTag={stageFilter}\n onTagChange={(v: any) => setStageFilter(v)}\n onRowClick={navigator ? (row: any) => navigator.onNavigate(row) : undefined}\n emptyIcon={ShoppingBag}\n emptyMessage={t('crud.orders.noDocuments')}\n />\n )\n}\n","import * as React from 'react'\nimport { AlertTriangle } from 'lucide-react'\nimport { PageHeader, Skeleton } from '@fayz-ai/ui'\n\n// ---------------------------------------------------------------------------\n// Shared archetype ORDER DETAIL — the presentation both plugin-shop and\n// plugin-courses render for a public.orders row (header, customer, items,\n// totals, and the receivable's installment schedule). Domain specifics (shop's\n// fulfillment/delivery; a booking link; etc.) are injected via `extraSections`,\n// and domain actions (e.g. \"Registrar recebimento\") via `actions`.\n//\n// The component is PURELY presentational: each plugin loads its data (from its\n// own source of truth — canonically public.orders) and maps it to OrderDetailData.\n// This removes the ~identical JSX that was copied between the two order details.\n// ---------------------------------------------------------------------------\n\nexport type OrderDetailTone = 'success' | 'warning' | 'destructive' | 'muted' | 'info'\n\nconst TONE_CLASS: Record<OrderDetailTone, string> = {\n success: 'bg-emerald-100 text-emerald-800 dark:bg-emerald-900/40 dark:text-emerald-300',\n warning: 'bg-amber-100 text-amber-800 dark:bg-amber-900/40 dark:text-amber-300',\n destructive: 'bg-red-100 text-red-800 dark:bg-red-900/40 dark:text-red-300',\n info: 'bg-sky-100 text-sky-800 dark:bg-sky-900/40 dark:text-sky-300',\n muted: 'bg-muted text-muted-foreground',\n}\n\nexport interface OrderDetailBadge {\n label: string\n tone?: OrderDetailTone\n}\n\nexport interface OrderDetailItem {\n id?: string\n name: string\n description?: string | null\n imageUrl?: string | null\n quantity: number\n /** Pre-formatted money strings (the plugin owns locale/currency). */\n unitPrice: string\n total: string\n}\n\nexport interface OrderDetailTotalRow {\n label: string\n value: string\n strong?: boolean\n muted?: boolean\n}\n\nexport interface OrderDetailInstallment {\n number: number\n amount: string\n status: string\n statusTone?: OrderDetailTone\n dueDate?: string | null\n paymentDate?: string | null\n note?: string | null\n}\n\nexport interface OrderDetailReceivable {\n referenceNumber?: string | null\n statusBadge?: OrderDetailBadge\n rows: OrderDetailTotalRow[] // Faturado / Recebido / Saldo\n installments: OrderDetailInstallment[]\n /** Domain actions under the schedule (e.g. shop's \"Registrar recebimento\"). */\n actions?: React.ReactNode\n emptyLabel?: string\n}\n\nexport interface OrderDetailData {\n title: string\n badges?: OrderDetailBadge[]\n /**\n * Substitui as etiquetas por um controle próprio quando o estágio não é só\n * informação — o orçamento troca de status ali mesmo, por um dropdown. Sem\n * isto a tela teria de escolher entre a anatomia comum e a ação que ela tem.\n */\n badgesNode?: React.ReactNode\n subtitle?: string | null // e.g. formatted date\n customer: { name?: string | null; email?: string | null; onClick?: () => void }\n /** Override the default customer block content (e.g. shop's PersonLink). */\n customerNode?: React.ReactNode\n items: OrderDetailItem[]\n itemsLabel?: string\n totalsLabel?: string\n totals: OrderDetailTotalRow[]\n paymentMethod?: string | null\n paidAt?: string | null\n receivable?: OrderDetailReceivable | null\n receivableLabel?: string\n /** Blocos na coluna ESTREITA, ao lado do pedido: cliente, endereço, histórico. */\n extraSections?: React.ReactNode\n /**\n * Blocos na coluna LARGA, abaixo dos itens. É onde cabe o que tem largura de\n * tabela — expedições, devoluções —, que espremido na lateral quebra cada\n * linha em três.\n */\n mainSections?: React.ReactNode\n actions?: React.ReactNode\n /**\n * A faixa de números do topo — total, itens, forma de pagamento, quando foi\n * feito. São os quatro fatos que se olha antes de qualquer outra coisa numa\n * tela de pedido, e antes ficavam espalhados: o total no fim da tabela, a\n * data ao lado do título, a forma de pagamento dentro de um cartão.\n */\n stats?: { id?: string; label: string; value: React.ReactNode; icon?: React.ComponentType<{ className?: string }> }[]\n errorBanner?: React.ReactNode\n onBack?: () => void\n backLabel?: string\n /** Attention strip under the header — \"this order has items waiting to be\n * fulfilled\" and the like. The action that resolves it belongs in `actions`. */\n banner?: { tone: 'warning' | 'info'; message: React.ReactNode }\n}\n\nfunction Badge({ badge }: { badge: OrderDetailBadge }) {\n return (\n <span className={`inline-flex items-center rounded-full px-2 py-0.5 text-xs font-medium ${TONE_CLASS[badge.tone ?? 'muted']}`}>\n {badge.label}\n </span>\n )\n}\n\nexport function OrderDetailBlock({ title, hint, children }: { title: string; hint?: string; children: React.ReactNode }) {\n return (\n <div className=\"rounded-lg border bg-card p-4\">\n <div className=\"mb-2\">\n <h3 className=\"text-sm font-medium\">{title}</h3>\n {hint && <p className=\"text-xs text-muted-foreground\">{hint}</p>}\n </div>\n {children}\n </div>\n )\n}\n\nexport function OrderDetailRow({ label, value, strong, muted }: { label: string; value: React.ReactNode; strong?: boolean; muted?: boolean }) {\n return (\n <div className=\"flex items-center justify-between py-0.5\">\n <span className={muted ? 'text-muted-foreground' : ''}>{label}</span>\n <span className={`tabular-nums ${strong ? 'font-semibold' : ''} ${muted ? 'text-muted-foreground' : ''}`}>{value}</span>\n </div>\n )\n}\n\nexport function OrderDetailSkeleton() {\n return (\n <div className=\"space-y-4\">\n <Skeleton className=\"h-4 w-20\" />\n <div className=\"flex flex-wrap items-center gap-3\">\n <Skeleton className=\"h-8 w-48\" />\n <Skeleton className=\"h-5 w-20 rounded-full\" />\n <Skeleton className=\"h-4 w-32\" />\n </div>\n <div className=\"grid gap-4 lg:grid-cols-3\">\n <div className=\"space-y-4 lg:col-span-2\">\n {[6, 4].map((r, i) => (\n <div key={i} className=\"rounded-lg border bg-card p-4\">\n <Skeleton className=\"h-4 w-24\" />\n <div className=\"mt-3 space-y-2\">\n {Array.from({ length: r }).map((_, j) => <Skeleton key={j} className=\"h-3 w-full\" />)}\n </div>\n </div>\n ))}\n </div>\n <div className=\"space-y-4\">\n <div className=\"rounded-lg border bg-card p-4\"><Skeleton className=\"h-4 w-20\" /><Skeleton className=\"mt-3 h-3 w-32\" /></div>\n </div>\n </div>\n </div>\n )\n}\n\nexport function OrderDetailView(props: OrderDetailData) {\n const {\n title, badges = [], subtitle, customer, items, totals, paymentMethod, paidAt,\n receivable, extraSections, mainSections, actions, stats = [], errorBanner, onBack,\n itemsLabel = 'Itens', totalsLabel = 'Pagamento', receivableLabel = 'Contas a receber',\n backLabel = 'Voltar',\n banner,\n } = props\n\n return (\n <div className=\"space-y-4\">\n {/* \"← Pedido #1138\" mora na barra da shell. O <h1> aqui embaixo repetia\n exatamente o que a barra já dizia — o número do pedido duas vezes,\n uma linha de distância. Agora a primeira linha do corpo é o que a\n barra NÃO carrega: em que pé o pedido está e o que dá para fazer com\n ele. */}\n <PageHeader title={title} parentLabel={backLabel} onBack={onBack} />\n\n {(badges.length > 0 || props.badgesNode || subtitle || actions) && (\n <div className=\"flex flex-wrap items-center gap-2\">\n {props.badgesNode ?? badges.map((b, i) => <Badge key={i} badge={b} />)}\n {subtitle && <span className=\"text-sm text-muted-foreground\">{subtitle}</span>}\n {actions && <div className=\"ml-auto flex flex-wrap items-center gap-2\">{actions}</div>}\n </div>\n )}\n\n {stats.length > 0 && (\n <div className=\"grid gap-3 sm:grid-cols-2 lg:grid-cols-4\">\n {stats.map((tile, i) => (\n <div key={tile.id ?? i} className=\"rounded-lg border bg-card p-3\">\n <div className=\"flex items-start justify-between gap-2\">\n <p className=\"text-xs text-muted-foreground\">{tile.label}</p>\n {tile.icon && <tile.icon className=\"h-4 w-4 shrink-0 text-muted-foreground/70\" />}\n </div>\n <p className=\"mt-1 truncate text-lg font-semibold\">{tile.value}</p>\n </div>\n ))}\n </div>\n )}\n\n {banner && (\n <div className={\n banner.tone === 'warning'\n ? 'flex items-center gap-3 rounded-lg border border-amber-200 bg-amber-50 px-4 py-3 text-sm text-amber-900'\n : 'flex items-center gap-3 rounded-lg border border-border bg-muted/40 px-4 py-3 text-sm'\n }>\n <AlertTriangle className=\"h-4 w-4 shrink-0\" />\n <span className=\"min-w-0 flex-1\">{banner.message}</span>\n </div>\n )}\n\n {errorBanner}\n\n <div className=\"grid gap-4 lg:grid-cols-3\">\n <div className=\"space-y-4 lg:col-span-2\">\n <OrderDetailBlock title={itemsLabel} hint={`${items.length} item(ns)`}>\n <div className=\"divide-y\">\n {items.map((item, i) => (\n <div key={item.id ?? i} className=\"flex items-center gap-3 py-2\">\n {item.imageUrl\n ? <img src={item.imageUrl} alt=\"\" className=\"h-10 w-10 shrink-0 rounded object-cover\" />\n : <div className=\"h-10 w-10 shrink-0 rounded bg-muted\" />}\n <div className=\"min-w-0 flex-1\">\n <p className=\"truncate text-sm font-medium\">{item.name}</p>\n {item.description && <p className=\"truncate text-xs text-muted-foreground\">{item.description}</p>}\n </div>\n <span className=\"text-sm text-muted-foreground tabular-nums\">{item.quantity} × {item.unitPrice}</span>\n <span className=\"w-24 text-right text-sm font-medium tabular-nums\">{item.total}</span>\n </div>\n ))}\n </div>\n </OrderDetailBlock>\n\n <OrderDetailBlock title={totalsLabel}>\n <div className=\"text-sm\">\n {totals.map((r, i) => <OrderDetailRow key={i} label={r.label} value={r.value} strong={r.strong} muted={r.muted} />)}\n {(paymentMethod || paidAt) && (\n <div className=\"mt-3 border-t pt-2\">\n {paymentMethod && <OrderDetailRow label=\"Forma de pagamento\" value={paymentMethod} />}\n {paidAt && <OrderDetailRow label=\"Pago em\" value={paidAt} />}\n </div>\n )}\n </div>\n </OrderDetailBlock>\n\n {receivable !== undefined && (\n <OrderDetailBlock title={receivableLabel} hint=\"O mesmo registro que o Financeiro lê\">\n {!receivable || receivable.installments.length === 0 ? (\n <p className=\"text-sm text-muted-foreground\">{receivable?.emptyLabel ?? 'Sem conta a receber.'}</p>\n ) : (\n <div className=\"text-sm\">\n {(receivable.referenceNumber || receivable.statusBadge) && (\n <div className=\"mb-2 flex flex-wrap items-center gap-2\">\n {receivable.referenceNumber && <span className=\"font-mono font-semibold\">{receivable.referenceNumber}</span>}\n {receivable.statusBadge && <Badge badge={receivable.statusBadge} />}\n </div>\n )}\n {receivable.rows.map((r, i) => <OrderDetailRow key={i} label={r.label} value={r.value} strong={r.strong} muted={r.muted} />)}\n <div className=\"mt-3 space-y-1.5 border-t pt-2\">\n {receivable.installments.map((inst) => (\n <div key={inst.number} className=\"flex items-center gap-2\">\n <span className=\"w-6 shrink-0 text-xs font-medium text-muted-foreground\">#{inst.number}</span>\n <span className=\"text-xs text-muted-foreground\">{inst.dueDate ?? '—'}</span>\n <span className=\"tabular-nums\">{inst.amount}</span>\n <span className={`inline-flex items-center rounded-full px-2 py-0.5 text-[10px] font-medium ${TONE_CLASS[inst.statusTone ?? 'muted']}`}>{inst.status}</span>\n {inst.paymentDate && <span className=\"text-xs text-muted-foreground\">· {inst.paymentDate}</span>}\n {inst.note && <span className=\"text-xs text-muted-foreground\">· {inst.note}</span>}\n </div>\n ))}\n </div>\n {receivable.actions && <div className=\"mt-4 flex flex-wrap gap-2\">{receivable.actions}</div>}\n </div>\n )}\n </OrderDetailBlock>\n )}\n\n {mainSections}\n </div>\n\n <div className=\"space-y-4\">\n <OrderDetailBlock title=\"Cliente\">\n {props.customerNode ?? (\n <div className=\"text-sm\">\n {customer.onClick\n ? <button onClick={customer.onClick} className=\"font-medium text-primary hover:underline\">{customer.name ?? '—'}</button>\n : <div className=\"font-medium text-foreground\">{customer.name ?? '—'}</div>}\n <div className=\"text-muted-foreground\">{customer.email ?? '—'}</div>\n </div>\n )}\n </OrderDetailBlock>\n {extraSections}\n </div>\n </div>\n </div>\n )\n}\nOrderDetailView.displayName = 'OrderDetailView'\n","import * as React from 'react'\nimport { Check, ChevronDown, Plus, Trash2, X } from 'lucide-react'\nimport { CurrencyInput, PageHeader, SearchSelect, Skeleton } from '@fayz-ai/ui'\nimport type { EntityLookupMap } from '../archetype-lookup'\n\n// ---------------------------------------------------------------------------\n// Shared archetype ORDER FORM — o par que faltava do OrderDetailView.\n//\n// Orçamento, fatura e pedido são o MESMO documento em três estágios: alguém,\n// uma lista de linhas, um total. Mesmo assim cada tela desenhava a sua: o\n// orçamento punha os dados à esquerda e os itens à direita, a fatura punha uma\n// faixa de campos no topo, o pedido seguia o detalhe. Trocar de uma para outra\n// era trocar de produto.\n//\n// A anatomia aqui é a MESMA do detalhe (OrderDetailView), de propósito — o que\n// você preenche cai no lugar onde depois vai ler:\n//\n// ← Orçamentos / Novo orçamento ← barra da shell\n// [chips de status] [ações]\n// ┌───────────────────────┬───────────┐\n// │ Itens (2/3) │ Cliente │ ← trilho estreito: quem, quando,\n// │ linhas + total │ Detalhes │ condições, observações\n// │ mainSections │ Parcelas │\n// └───────────────────────┴───────────┘\n//\n// Os blocos do trilho estreito usam o MESMO OrderDetailBlock do detalhe, então\n// o cartão \"Cliente\" do formulário e o do detalhe têm o mesmo traço.\n//\n// O componente é PURAMENTE apresentacional: cada plugin guarda o seu estado e\n// grava pelo seu store. O que ele NÃO faz mais é decidir onde as coisas ficam.\n// ---------------------------------------------------------------------------\n\n/** Bloco do trilho estreito — o mesmo desenho do detalhe. */\nexport { OrderDetailBlock as OrderFormBlock } from './OrderDetailView'\n\nexport interface OrderFormItemType {\n value: string\n label: string\n}\n\n/** Os campos que uma linha edita. O plugin mapeia o seu item para isto. */\nexport interface OrderFormItemValue {\n itemKind: string\n description: string\n quantity: number\n unitPrice: number\n discount?: number\n surcharge?: number\n /** Id do produto/serviço escolhido no catálogo, quando o tipo é lookup. */\n referenceId?: string\n}\n\nexport interface OrderFormItemLabels {\n item: string\n description: string\n descriptionPlaceholder: string\n noDescription: string\n qty: string\n unitPrice: string\n discount: string\n surcharge: string\n adjustments: string\n removeAdjustments: string\n done: string\n}\n\nconst ITEM_LABELS: OrderFormItemLabels = {\n item: 'Item',\n description: 'Descrição',\n descriptionPlaceholder: 'Descrição do item',\n noDescription: 'Sem descrição',\n qty: 'Qtd',\n unitPrice: 'Preço unitário',\n discount: 'Desconto',\n surcharge: 'Acréscimo',\n adjustments: 'Desconto / acréscimo',\n removeAdjustments: 'Remover ajustes',\n done: 'Concluído',\n}\n\nexport interface OrderFormItemRowProps extends OrderFormItemValue {\n index: number\n itemTypes: OrderFormItemType[]\n currency: { code: string; locale: string; symbol: string }\n /** Formatação de dinheiro do plugin (locale/moeda são dele). */\n formatMoney: (value: number) => string\n expanded: boolean\n onToggle: () => void\n onChange: (patch: Partial<OrderFormItemValue>) => void\n onRemove: () => void\n entityLookups?: EntityLookupMap\n /** Pílulas de tipo na linha. Ocultas quando nenhum tipo tem catálogo. */\n showTypeSelector?: boolean\n /** Campo de acréscimo ao lado do desconto (faturas têm; orçamentos não). */\n allowSurcharge?: boolean\n labels?: Partial<OrderFormItemLabels>\n}\n\n/**\n * A linha do documento: fechada é uma linha de extrato (nº, tipo, descrição,\n * qtd × preço, total); aberta é o formulário dela. Era código copiado entre o\n * orçamento e a fatura, com as duas cópias já divergindo em detalhes (a fatura\n * commitava a linha no Enter, o orçamento não).\n */\nexport function OrderFormItemRow({\n index, itemKind, description, quantity, unitPrice, discount, surcharge, referenceId,\n itemTypes, currency, formatMoney, expanded, onToggle, onChange, onRemove,\n entityLookups = {}, showTypeSelector = true, allowSurcharge = false, labels,\n}: OrderFormItemRowProps) {\n const l = { ...ITEM_LABELS, ...labels }\n const total = quantity * unitPrice - (discount ?? 0) + (surcharge ?? 0)\n const kindLabel = itemTypes.find((tp) => tp.value === itemKind)?.label ?? itemKind\n const hasAdjustments = (discount ?? 0) > 0 || (surcharge ?? 0) > 0\n const [showAdjustments, setShowAdjustments] = React.useState(hasAdjustments)\n const lookup = entityLookups[itemKind]\n\n // Enter em qualquer campo da linha fecha a linha (o mesmo que \"Concluído\").\n function handleFieldKeyDown(e: React.KeyboardEvent) {\n if (e.key === 'Enter' && !e.shiftKey) {\n e.preventDefault()\n onToggle()\n }\n }\n\n return (\n <div className=\"border-b last:border-0\">\n {/* Linha fechada */}\n <div\n className=\"group flex cursor-pointer items-center gap-2 px-4 py-3 transition-colors hover:bg-muted/30\"\n onClick={onToggle}\n >\n <ChevronDown className={`h-3 w-3 shrink-0 text-muted-foreground transition-transform ${expanded ? 'rotate-0' : '-rotate-90'}`} />\n <span className=\"w-5 shrink-0 text-[10px] font-medium text-muted-foreground\">{index + 1}.</span>\n <span className=\"inline-flex shrink-0 items-center rounded bg-muted px-1.5 py-0.5 text-[9px] font-medium text-muted-foreground\">{kindLabel}</span>\n <span className=\"min-w-0 flex-1 truncate text-sm\">\n {description || <span className=\"italic text-muted-foreground\">{l.noDescription}</span>}\n </span>\n <span className=\"shrink-0 text-xs text-muted-foreground tabular-nums\">{quantity} × {formatMoney(unitPrice)}</span>\n <span className=\"min-w-[80px] shrink-0 text-right text-sm font-semibold tabular-nums\">{formatMoney(total)}</span>\n <button\n type=\"button\"\n onClick={(e) => { e.stopPropagation(); onRemove() }}\n className=\"shrink-0 p-1 text-muted-foreground opacity-0 transition-all hover:text-destructive group-hover:opacity-100\"\n >\n <Trash2 className=\"h-3 w-3\" />\n </button>\n </div>\n\n {/* Linha aberta — edição */}\n {expanded && (\n <div className=\"ml-8 space-y-3 bg-muted/10 px-4 pb-4 pt-1\">\n {showTypeSelector && itemTypes.length > 1 && (\n <div className=\"flex flex-wrap gap-1.5\">\n {itemTypes.map((tp) => (\n <button\n key={tp.value}\n type=\"button\"\n onClick={() => onChange({ itemKind: tp.value })}\n className={`rounded-full px-2.5 py-1 text-[10px] font-medium transition-colors ${\n itemKind === tp.value ? 'bg-primary text-primary-foreground' : 'bg-muted text-muted-foreground hover:bg-muted/80'\n }`}\n >\n {tp.label}\n </button>\n ))}\n </div>\n )}\n\n <div className=\"grid grid-cols-12 gap-3\">\n <div className=\"col-span-6 sm:col-span-7\">\n {lookup ? (\n <SearchSelect\n label={l.item}\n // Sem `value` o SearchSelect mostra o placeholder, e uma linha\n // já preenchida reabria escrita \"Descrição…\". Nem todo\n // documento guarda o id do item do catálogo (o orçamento não),\n // então a descrição serve de valor quando o id não existe.\n value={referenceId ?? (description ? description : '')}\n displayValue={description}\n loadOnOpen\n onChange={(id, opt) => {\n const price = (opt?.data as { price?: number } | undefined)?.price\n onChange({\n referenceId: id || undefined,\n description: opt?.label ?? '',\n ...(price != null ? { unitPrice: price } : {}),\n })\n }}\n onSearch={async (q) => {\n const results = await lookup.search(q)\n return results.map((r) => ({ id: r.id, label: r.label, subtitle: r.subtitle, group: r.group, data: r }))\n }}\n placeholder={`${l.item}…`}\n renderOption={(opt) => (\n <div className=\"min-w-0 flex-1\">\n <p className=\"truncate text-sm\">{opt.label}</p>\n {opt.subtitle && <p className=\"text-[10px] text-muted-foreground\">{opt.subtitle}</p>}\n </div>\n )}\n />\n ) : (\n <>\n <label className=\"text-[10px] font-medium text-muted-foreground\">{l.description}</label>\n <input\n type=\"text\"\n value={description}\n onChange={(e) => onChange({ description: e.target.value })}\n onKeyDown={handleFieldKeyDown}\n placeholder={l.descriptionPlaceholder}\n autoFocus\n className=\"mt-0.5 w-full rounded-input border border-input bg-card px-2.5 py-1.5 text-sm shadow-[inset_0_1px_0_rgb(0_0_0_/0.06)] focus:outline-none focus:ring-2 focus:ring-ring\"\n />\n </>\n )}\n </div>\n <div className=\"col-span-2 sm:col-span-1\">\n <label className=\"text-[10px] font-medium text-muted-foreground\">{l.qty}</label>\n <input\n type=\"number\"\n min={1}\n value={quantity}\n onChange={(e) => onChange({ quantity: Number(e.target.value) || 1 })}\n onKeyDown={handleFieldKeyDown}\n className=\"mt-0.5 w-full rounded-input border border-input bg-card px-2 py-1.5 text-center text-sm shadow-[inset_0_1px_0_rgb(0_0_0_/0.06)] focus:outline-none focus:ring-2 focus:ring-ring\"\n />\n </div>\n <div className=\"col-span-4\" onKeyDown={handleFieldKeyDown}>\n <CurrencyInput\n label={l.unitPrice}\n value={unitPrice}\n onChange={(v) => onChange({ unitPrice: v })}\n symbol={currency.symbol}\n locale={currency.locale}\n currencyCode={currency.code}\n />\n </div>\n </div>\n\n {/* Ajustes — escondidos até serem pedidos: a maioria das linhas não\n tem desconto, e dois campos vazios em toda linha viram ruído. */}\n {!showAdjustments ? (\n <button\n type=\"button\"\n onClick={() => setShowAdjustments(true)}\n className=\"inline-flex items-center gap-1 text-xs text-muted-foreground transition-colors hover:text-foreground\"\n >\n <Plus className=\"h-3 w-3\" /> {allowSurcharge ? l.adjustments : l.discount}\n </button>\n ) : (\n <div className=\"flex items-end gap-3\">\n <div className=\"flex-1\">\n <CurrencyInput\n label={l.discount}\n value={discount ?? 0}\n onChange={(v) => onChange({ discount: v })}\n symbol={currency.symbol}\n locale={currency.locale}\n currencyCode={currency.code}\n />\n </div>\n {allowSurcharge && (\n <div className=\"flex-1\">\n <CurrencyInput\n label={l.surcharge}\n value={surcharge ?? 0}\n onChange={(v) => onChange({ surcharge: v })}\n symbol={currency.symbol}\n locale={currency.locale}\n currencyCode={currency.code}\n />\n </div>\n )}\n <button\n type=\"button\"\n onClick={() => { onChange({ discount: 0, ...(allowSurcharge ? { surcharge: 0 } : {}) }); setShowAdjustments(false) }}\n className=\"mb-2 p-1 text-muted-foreground transition-colors hover:text-destructive\"\n title={l.removeAdjustments}\n >\n <X className=\"h-3.5 w-3.5\" />\n </button>\n </div>\n )}\n\n <div className=\"flex justify-end pt-1\">\n <button\n type=\"button\"\n onClick={onToggle}\n className=\"inline-flex items-center gap-1 rounded-md px-2.5 py-1 text-[11px] text-muted-foreground transition-colors hover:bg-muted/50 hover:text-foreground\"\n >\n <Check className=\"h-3 w-3\" /> {l.done}\n </button>\n </div>\n </div>\n )}\n </div>\n )\n}\nOrderFormItemRow.displayName = 'OrderFormItemRow'\n\n/** O passo \"de que tipo é a linha?\" antes de criar uma. */\nexport function OrderFormAddItemStep({ itemTypes, onSelect, onCancel, label = 'Que tipo de item?', cancelLabel = 'Cancelar' }: {\n itemTypes: OrderFormItemType[]\n onSelect: (kind: string) => void\n onCancel: () => void\n label?: string\n cancelLabel?: string\n}) {\n return (\n <div className=\"animate-in fade-in-0 slide-in-from-top-1 border-b bg-primary/5 px-4 py-3\">\n <p className=\"mb-2 text-xs font-medium text-muted-foreground\">{label}</p>\n <div className=\"flex flex-wrap gap-2\">\n {itemTypes.map((tp) => (\n <button\n key={tp.value}\n type=\"button\"\n onClick={() => onSelect(tp.value)}\n className=\"inline-flex items-center gap-1.5 rounded-lg border-2 border-transparent bg-card px-4 py-2 text-sm font-medium shadow-sm transition-all hover:border-primary hover:shadow-md\"\n >\n {tp.label}\n </button>\n ))}\n <button\n type=\"button\"\n onClick={onCancel}\n className=\"inline-flex items-center rounded-lg px-3 py-2 text-xs text-muted-foreground transition-colors hover:text-foreground\"\n >\n {cancelLabel}\n </button>\n </div>\n </div>\n )\n}\n\nexport interface OrderFormItemsCardProps {\n label?: string\n addLabel?: string\n onAdd?: () => void\n /** Nº de linhas — o rodapé só aparece quando há alguma. */\n count: number\n countLabel?: string\n totalLabel?: string\n total?: React.ReactNode\n /** O passo de escolher o tipo, quando aberto. */\n header?: React.ReactNode\n emptyLabel?: string\n emptyActionLabel?: string\n children?: React.ReactNode\n}\n\n/** O cartão largo: cabeçalho com \"Adicionar item\", as linhas, o total no pé. */\nexport function OrderFormItemsCard({\n label = 'Itens', addLabel = 'Adicionar item', onAdd, count, countLabel,\n totalLabel = 'Total', total, header, emptyLabel = 'Nenhum item adicionado',\n emptyActionLabel = 'Adicione o primeiro item', children,\n}: OrderFormItemsCardProps) {\n return (\n <div className=\"flex flex-col overflow-hidden rounded-lg border bg-card\">\n <div className=\"flex items-center justify-between border-b px-4 py-3\">\n <h3 className=\"text-sm font-medium\">{label}</h3>\n {onAdd && (\n <button\n type=\"button\"\n onClick={onAdd}\n className=\"inline-flex items-center gap-1.5 rounded-lg border border-primary bg-primary px-3 py-1.5 text-xs font-medium text-primary-foreground shadow-button-primary transition-colors hover:bg-primary/90 active:shadow-button-inset\"\n >\n <Plus className=\"h-3 w-3\" /> {addLabel}\n </button>\n )}\n </div>\n\n <div className=\"flex-1\">\n {header}\n {count === 0 && !header ? (\n <div className=\"py-12 text-center\">\n <p className=\"text-sm text-muted-foreground\">{emptyLabel}</p>\n {onAdd && (\n <button type=\"button\" onClick={onAdd} className=\"mt-1 text-xs text-primary hover:underline\">\n {emptyActionLabel}\n </button>\n )}\n </div>\n ) : children}\n </div>\n\n {count > 0 && (\n <div className=\"mt-auto flex items-center justify-between border-t bg-muted/20 px-4 py-3\">\n <span className=\"text-xs text-muted-foreground\">{countLabel ?? `${count} item(ns)`}</span>\n <div className=\"text-right\">\n <span className=\"text-xs text-muted-foreground\">{totalLabel}: </span>\n <span className=\"text-lg font-bold tabular-nums\">{total}</span>\n </div>\n </div>\n )}\n </div>\n )\n}\n\nexport interface OrderFormViewProps {\n title: React.ReactNode\n /** Para onde a seta volta (\"Orçamentos\"). */\n parentLabel?: string\n onBack?: () => void\n /** Chips de estágio / etiquetas, na mesma linha das ações. */\n badges?: React.ReactNode\n subtitle?: string | null\n /** Botões da direita — \"Enviar\", \"Cancelar fatura\". Salvar mora na SaveBar. */\n actions?: React.ReactNode\n /** Faixa de atenção sob o cabeçalho. */\n banner?: React.ReactNode\n /** A coluna LARGA: o cartão de itens e o que tiver largura de tabela. */\n children: React.ReactNode\n /** Blocos na coluna ESTREITA: cliente, datas, parcelas, observações. */\n sideSections: React.ReactNode\n}\n\nexport function OrderFormView({\n title, parentLabel, onBack, badges, subtitle, actions, banner, children, sideSections,\n}: OrderFormViewProps) {\n return (\n <div className=\"space-y-4\">\n {/* \"← Orçamentos / Novo\" mora na barra da shell — o mesmo cabeçalho do\n detalhe, para a ida e a volta terem a mesma primeira linha. */}\n <PageHeader title={title} parentLabel={parentLabel} onBack={onBack} />\n\n {(badges || subtitle || actions) && (\n <div className=\"flex flex-wrap items-center gap-2\">\n {badges}\n {subtitle && <span className=\"text-sm text-muted-foreground\">{subtitle}</span>}\n {actions && <div className=\"ml-auto flex flex-wrap items-center gap-2\">{actions}</div>}\n </div>\n )}\n\n {banner}\n\n <div className=\"grid gap-4 lg:grid-cols-3\">\n <div className=\"space-y-4 lg:col-span-2\">{children}</div>\n <div className=\"space-y-4\">{sideSections}</div>\n </div>\n </div>\n )\n}\nOrderFormView.displayName = 'OrderFormView'\n\n/** Esqueleto com a MESMA silhueta do formulário — sem ele a tela \"pula\". */\nexport function OrderFormSkeleton() {\n return (\n <div className=\"space-y-4\">\n <Skeleton className=\"h-4 w-20\" />\n <div className=\"flex flex-wrap items-center gap-2\">\n <Skeleton className=\"h-6 w-20 rounded-full\" />\n <Skeleton className=\"h-6 w-20 rounded-full\" />\n </div>\n <div className=\"grid gap-4 lg:grid-cols-3\">\n <div className=\"space-y-4 lg:col-span-2\">\n <div className=\"rounded-lg border bg-card\">\n <div className=\"border-b px-4 py-3\"><Skeleton className=\"h-4 w-24\" /></div>\n <div className=\"space-y-3 p-4\">\n {[1, 2].map((i) => (\n <div key={i} className=\"flex items-center gap-3\">\n <Skeleton className=\"h-4 w-4\" />\n <Skeleton className=\"h-4 flex-1\" />\n <Skeleton className=\"h-4 w-20\" />\n </div>\n ))}\n </div>\n </div>\n </div>\n <div className=\"space-y-4\">\n {[3, 2].map((rows, i) => (\n <div key={i} className=\"rounded-lg border bg-card p-4\">\n <Skeleton className=\"h-4 w-20\" />\n <div className=\"mt-3 space-y-2\">\n {Array.from({ length: rows }).map((_, j) => <Skeleton key={j} className=\"h-8 w-full\" />)}\n </div>\n </div>\n ))}\n </div>\n </div>\n </div>\n )\n}\n","import * as React from 'react'\nimport { DataTable, HeaderTabs, type HeaderTab } from '@fayz-ai/ui'\nimport type { ColumnDef } from '@tanstack/react-table'\n\n// ---------------------------------------------------------------------------\n// Shared archetype ORDER LIST — the list chrome both plugin-shop and\n// plugin-courses render for a table of orders/sales: page header (title +\n// subtitle + actions), an optional KPI row, and a clickable DataTable with\n// loading skeleton + empty state. Columns are declared per-plugin (they differ:\n// shop shows fulfillment, courses shows installments) but the layout, row-click,\n// skeleton and empty behaviour are unified here.\n// ---------------------------------------------------------------------------\n\nexport interface OrderListColumn<T> {\n key: string\n header: string\n align?: 'left' | 'right'\n render: (row: T) => React.ReactNode\n}\n\nexport interface OrderListStat {\n label: string\n value: string\n hint?: string\n}\n\nexport interface OrderListViewProps<T> {\n title?: string\n subtitle?: string\n actions?: React.ReactNode\n /** Sibling lists this one heads a tab strip with (Pedidos / Assinaturas).\n * Same slot and same primitive CrudListView uses — a list whose siblings are\n * NOT in the menu reaches them from here instead of a second nav entry. */\n navTabs?: HeaderTab[]\n /** Which of `navTabs` is this page. */\n activeNavTab?: string\n onNavTabChange?: (id: string) => void\n stats?: OrderListStat[]\n columns: OrderListColumn<T>[]\n rows: T[]\n loading?: boolean\n empty: string\n onRowClick?: (row: T) => void\n}\n\nfunction StatCard({ stat }: { stat: OrderListStat }) {\n return (\n <div className=\"rounded-lg border bg-card p-5\">\n <p className=\"text-sm text-muted-foreground\">{stat.label}</p>\n <p className=\"mt-1 text-2xl font-bold text-foreground\">{stat.value}</p>\n {stat.hint && <p className=\"mt-0.5 text-xs text-muted-foreground\">{stat.hint}</p>}\n </div>\n )\n}\n\nexport function OrderListView<T>({\n title, subtitle, actions, stats, columns, rows, loading, empty, onRowClick,\n navTabs, activeNavTab, onNavTabChange,\n}: OrderListViewProps<T>) {\n const cols = React.useMemo<ColumnDef<T>[]>(\n () => columns.map((c) => ({\n id: c.key,\n header: () => <div className={c.align === 'right' ? 'text-right' : ''}>{c.header}</div>,\n cell: ({ row }) => <div className={c.align === 'right' ? 'text-right' : ''}>{c.render(row.original)}</div>,\n })),\n [columns],\n )\n\n return (\n // Sem padding e sem max-width próprios: a shell já envolve toda página em\n // `p-3 md:p-6` (AdminShell). Reaplicar `p-6 md:p-8` aqui empurrava a lista\n // 32px à direita do título na barra de topo e de todas as outras telas.\n <div>\n {navTabs && navTabs.length > 0 && (\n // Mesma linha de CrudListView: abas à esquerda, ações à direita.\n <div className=\"mb-6 flex flex-wrap items-center justify-between gap-3\">\n <HeaderTabs\n tabs={navTabs}\n value={activeNavTab ?? navTabs[0]!.value}\n onChange={(v) => onNavTabChange?.(v)}\n />\n {actions}\n </div>\n )}\n\n {!navTabs?.length && (title || subtitle || actions) && (\n <div className=\"mb-6 flex items-start justify-between gap-4\">\n <div>\n {title && <h1 className=\"text-2xl font-bold text-foreground\">{title}</h1>}\n {subtitle && <p className=\"mt-1 text-sm text-muted-foreground\">{subtitle}</p>}\n </div>\n {actions}\n </div>\n )}\n\n {stats && stats.length > 0 && (\n <div className=\"mb-4 grid grid-cols-2 gap-3 sm:grid-cols-3 lg:grid-cols-4\">\n {stats.map((s, i) => <StatCard key={i} stat={s} />)}\n </div>\n )}\n\n <DataTable\n columns={cols}\n data={rows}\n emptyMessage={empty}\n loading={loading}\n onRowClick={onRowClick ? (row: T) => onRowClick(row) : undefined}\n />\n </div>\n )\n}\nOrderListView.displayName = 'OrderListView'\n","// ---------------------------------------------------------------------------\n// Factory: creates a ClientOrdersProvider that queries public.orders\n// for a given client (party_id). The UI keeps the historical \"stage\" language,\n// but current archetype schemas expose this lifecycle as orders.status.\n// ---------------------------------------------------------------------------\n\nimport type { ClientOrdersProvider, ClientOrdersQuery, ClientDocument, ClientDocumentStage } from '../types/client-orders'\nimport { getSupabaseClientOptional } from './supabase'\n\nconst STAGE_FILTER_MAP: Record<string, string[]> = {\n quoted: ['draft', 'quoted'],\n booked: ['booked', 'scheduled', 'confirmed', 'in_progress', 'completed'],\n invoiced: ['invoiced', 'partial', 'overdue'],\n paid: ['paid'],\n}\n\n/**\n * A shop order's lifecycle is not in `status` (open/archived/cancelled) but in\n * the payment state the shop plugin mirrors into metadata. Without this every\n * storefront purchase showed up as \"rascunho\" on the customer's record — the\n * same tab, the same table, but reading the wrong column for that kind.\n */\nfunction mapShopOrderToStage(row: { status?: string | null; metadata?: Record<string, unknown> | null }): ClientDocumentStage {\n if (row.status === 'cancelled') return 'cancelled'\n switch (String(row.metadata?.financial_status ?? '')) {\n case 'paid': return 'paid'\n case 'partially_refunded': return 'partial'\n case 'refunded':\n case 'voided': return 'cancelled'\n default: return 'invoiced' // placed, awaiting payment\n }\n}\n\nfunction mapOrderStatusToStage(status: string | null | undefined): ClientDocumentStage {\n switch (status) {\n case 'scheduled':\n case 'confirmed':\n case 'in_progress':\n return 'booked'\n case 'completed':\n return 'completed'\n case 'invoiced':\n case 'paid':\n case 'partial':\n case 'overdue':\n case 'cancelled':\n case 'no_show':\n case 'quoted':\n case 'draft':\n return status\n default:\n return 'draft'\n }\n}\n\nexport function createClientOrdersProvider(): ClientOrdersProvider {\n return {\n async getDocuments(query: ClientOrdersQuery): Promise<{ data: ClientDocument[]; total: number }> {\n const supabase = getSupabaseClientOptional()\n if (!supabase) return { data: [], total: 0 }\n\n try {\n let qb = supabase\n .from('orders')\n .select('id, kind, status, total, reference_number, notes, metadata, created_at', { count: 'exact' })\n .eq('party_id', query.clientId)\n\n // Filter by stage groups against the current schema's status column.\n if (query.stages && query.stages.length > 0) {\n const allStages = query.stages.flatMap((s) => STAGE_FILTER_MAP[s] ?? [s])\n qb = qb.in('status', allStages)\n }\n\n qb = qb.order('created_at', { ascending: false })\n\n const page = query.page ?? 1\n const pageSize = query.pageSize ?? 50\n qb = qb.range((page - 1) * pageSize, page * pageSize - 1)\n\n const { data, count } = await qb\n const orderIds = (data ?? []).map((row: any) => row.id).filter(Boolean)\n\n const bookingStartsByOrderId = new Map<string, string>()\n if (orderIds.length > 0) {\n const { data: bookings } = await supabase\n .from('appointments')\n .select('order_id, starts_at')\n .in('order_id', orderIds)\n\n for (const booking of bookings ?? []) {\n if (booking.order_id && booking.starts_at && !bookingStartsByOrderId.has(booking.order_id)) {\n bookingStartsByOrderId.set(booking.order_id, booking.starts_at)\n }\n }\n }\n\n const results: ClientDocument[] = (data ?? []).map((row: any) => {\n const meta = (row.metadata ?? {}) as Record<string, unknown>\n const startsAt = bookingStartsByOrderId.get(row.id)\n return {\n id: row.id,\n kind: row.kind as string,\n stage: row.kind === 'shop'\n ? mapShopOrderToStage(row)\n : mapOrderStatusToStage(row.status as string | null | undefined),\n referenceNumber: row.reference_number ?? undefined,\n date: startsAt?.slice(0, 10) ?? (row.created_at as string)?.slice(0, 10) ?? '',\n startsAt,\n total: Number(row.total) || 0,\n // A paid shop order has no separate paidAmount; the total is what\n // was settled.\n paidAmount: Number(meta.paidAmount)\n || (row.kind === 'shop' && meta.financial_status === 'paid' ? Number(row.total) || 0 : 0),\n description: (meta.itemsSummary as string) ?? (meta.serviceNames as string) ?? row.notes ?? undefined,\n createdAt: row.created_at as string,\n }\n })\n\n return { data: results, total: count ?? results.length }\n } catch {\n return { data: [], total: 0 }\n }\n },\n }\n}\n","import { getSupabaseClientOptional } from '@fayz-ai/core'\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\nexport interface EntityLookupResult {\n id: string\n label: string\n subtitle?: string\n group?: string\n icon?: string\n price?: number\n data?: Record<string, unknown>\n}\n\nexport type EntityLookupMap = Record<string, EntityLookup>\n\nexport interface EntityLookup {\n search(query: string): Promise<EntityLookupResult[]>\n getById(id: string): Promise<EntityLookupResult | null>\n list?(): Promise<EntityLookupResult[]>\n}\n\nexport type ArchetypeType = 'person' | 'product' | 'service' | 'location'\n\n// ---------------------------------------------------------------------------\n// Archetype display config\n// ---------------------------------------------------------------------------\n\nconst ARCHETYPE_DISPLAY: Record<ArchetypeType, {\n table: string\n labelField: string\n subtitleFields: string[]\n priceField?: string\n groupField?: string\n}> = {\n person: { table: 'people', labelField: 'name', subtitleFields: ['phone'], groupField: 'kind' },\n product: { table: 'products', labelField: 'name', subtitleFields: ['sku', 'description'], priceField: 'price' },\n service: { table: 'services', labelField: 'name', subtitleFields: ['duration_minutes', 'description'], priceField: 'price' },\n location: { table: 'locations', labelField: 'name', subtitleFields: ['city', 'address'], groupField: 'kind' },\n}\n\ninterface ArchetypeLookupConfig {\n archetype: ArchetypeType\n kind?: string | string[]\n kindLabels?: Record<string, string>\n limit?: number\n subtitleFields?: string[]\n}\n\nfunction toResult(\n row: Record<string, unknown>,\n display: typeof ARCHETYPE_DISPLAY[ArchetypeType],\n kindLabels?: Record<string, string>,\n): EntityLookupResult {\n const label = String(row[display.labelField] ?? row.name ?? '')\n const subtitleParts = display.subtitleFields\n .map((f) => row[f])\n .filter(Boolean)\n .map((v) => {\n if (typeof v === 'number') return `${v}min`\n return String(v)\n })\n\n let group: string | undefined\n if (display.groupField && row[display.groupField]) {\n const rawGroup = String(row[display.groupField])\n group = kindLabels?.[rawGroup] ?? rawGroup\n }\n\n return {\n id: String(row.id),\n label,\n subtitle: subtitleParts.length > 0 ? subtitleParts.join(' · ') : undefined,\n group,\n price: display.priceField ? Number(row[display.priceField]) || undefined : undefined,\n data: row,\n }\n}\n\n/**\n * Create an EntityLookup that queries a core archetype table via Supabase.\n * Returns empty results if Supabase is not configured.\n */\nexport function createArchetypeLookup(config: ArchetypeLookupConfig): EntityLookup {\n const baseDisplay = ARCHETYPE_DISPLAY[config.archetype]\n const display = config.subtitleFields\n ? { ...baseDisplay, subtitleFields: config.subtitleFields }\n : baseDisplay\n const limit = config.limit ?? 20\n const kinds = config.kind\n ? Array.isArray(config.kind) ? config.kind : [config.kind]\n : undefined\n\n function applyKindFilter(qb: any) {\n if (kinds && kinds.length === 1) return qb.eq('kind', kinds[0])\n if (kinds && kinds.length > 1) return qb.in('kind', kinds)\n return qb\n }\n\n return {\n async search(query: string) {\n const supabase = getSupabaseClientOptional() as any\n if (!supabase) return []\n\n let qb = supabase\n .from(display.table)\n .select('*')\n .order(display.labelField, { ascending: true })\n .limit(limit)\n\n qb = config.archetype === 'service'\n ? qb.or('is_active.eq.true,is_active.is.null')\n : qb.eq('is_active', true)\n\n if (query) qb = qb.ilike(display.labelField, `%${query}%`)\n qb = applyKindFilter(qb)\n\n const { data } = await qb\n return (data ?? []).map((row: Record<string, unknown>) =>\n toResult(row, display, config.kindLabels),\n )\n },\n\n async list() {\n const supabase = getSupabaseClientOptional() as any\n if (!supabase) return []\n\n let qb = supabase\n .from(display.table)\n .select('*')\n .order(display.labelField, { ascending: true })\n .limit(limit)\n\n qb = config.archetype === 'service'\n ? qb.or('is_active.eq.true,is_active.is.null')\n : qb.eq('is_active', true)\n\n qb = applyKindFilter(qb)\n\n const { data } = await qb\n return (data ?? []).map((row: Record<string, unknown>) =>\n toResult(row, display, config.kindLabels),\n )\n },\n\n async getById(id: string) {\n const supabase = getSupabaseClientOptional() as any\n if (!supabase) return null\n\n const { data } = await supabase\n .from(display.table)\n .select('*')\n .eq('id', id)\n .single()\n\n return data\n ? toResult(data as Record<string, unknown>, display, config.kindLabels)\n : null\n },\n }\n}\n","import React from 'react'\n\n/**\n * Page stub for modules that are planned but not built yet.\n * Usage: { path: '/marketing', label: 'Marketing', icon: 'Megaphone', component: createPlaceholder('Marketing') }\n */\nexport function createPlaceholder(title: string, description?: string): React.FC {\n return function PlaceholderPage() {\n return React.createElement(\n 'div',\n { className: 'mx-auto max-w-4xl' },\n React.createElement('h1', { className: 'text-3xl font-bold text-foreground' }, title),\n description\n ? React.createElement('p', { className: 'mt-1 text-muted-foreground' }, description)\n : null,\n React.createElement(\n 'div',\n { className: 'mt-8 flex items-center justify-center rounded-card border border-dashed border-border bg-card p-16' },\n React.createElement(\n 'div',\n { className: 'text-center' },\n React.createElement('p', { className: 'text-lg font-medium text-muted-foreground' }, 'Coming Soon'),\n React.createElement(\n 'p',\n { className: 'mt-1 text-sm text-muted-foreground/70' },\n 'This module is being built as a plugin.',\n ),\n ),\n ),\n )\n }\n}\n","import React from 'react'\nimport { cn } from '@fayz-ai/ui'\n\n// ---------------------------------------------------------------------------\n// ToggleRow — a single setting with label, description, and checkbox\n// ---------------------------------------------------------------------------\n\nexport function ToggleRow({ label, description, checked, onChange, disabled }: {\n label: string\n description?: string\n checked: boolean\n onChange: (checked: boolean) => void\n disabled?: boolean\n}) {\n return (\n <label className={cn(\n 'flex items-center justify-between gap-4 py-3 cursor-pointer',\n disabled && 'opacity-50 cursor-not-allowed',\n )}>\n <div className=\"min-w-0\">\n <p className=\"text-sm font-medium\">{label}</p>\n {description && <p className=\"text-xs text-muted-foreground mt-0.5\">{description}</p>}\n </div>\n <button\n type=\"button\"\n role=\"switch\"\n aria-checked={checked}\n disabled={disabled}\n onClick={() => !disabled && onChange(!checked)}\n className={cn(\n 'relative inline-flex h-5 w-9 shrink-0 rounded-full transition-colors duration-200',\n checked ? 'bg-primary' : 'bg-muted',\n disabled && 'cursor-not-allowed',\n )}\n >\n <span className={cn(\n 'inline-block h-4 w-4 rounded-full bg-white shadow-sm transition-transform duration-200 mt-0.5',\n checked ? 'translate-x-4 ml-0.5' : 'translate-x-0.5',\n )} />\n </button>\n </label>\n )\n}\n\n// ---------------------------------------------------------------------------\n// SelectRow — a single setting with label, description, and select dropdown\n// ---------------------------------------------------------------------------\n\nexport function SelectRow({ label, description, value, options, onChange, disabled }: {\n label: string\n description?: string\n value: string\n options: { value: string; label: string }[]\n onChange: (value: string) => void\n disabled?: boolean\n}) {\n return (\n <label className={cn(\n 'flex items-center justify-between gap-4 py-3',\n disabled && 'opacity-50 cursor-not-allowed',\n )}>\n <div className=\"min-w-0\">\n <p className=\"text-sm font-medium\">{label}</p>\n {description && <p className=\"text-xs text-muted-foreground mt-0.5\">{description}</p>}\n </div>\n <select\n value={value}\n onChange={(e) => onChange(e.target.value)}\n disabled={disabled}\n className=\"h-8 rounded-input border border-input bg-card shadow-[inset_0_1px_0_rgb(0_0_0_/0.06)] px-2 text-sm\"\n >\n {options.map((opt) => (\n <option key={opt.value} value={opt.value}>{opt.label}</option>\n ))}\n </select>\n </label>\n )\n}\n\n// ---------------------------------------------------------------------------\n// SettingsGroup — a bordered section with title and children\n// ---------------------------------------------------------------------------\n\nexport function SettingsGroup({ title, description, children }: {\n title: string\n description?: string\n children: React.ReactNode\n}) {\n return (\n <div>\n <div className=\"px-1 pb-1 pt-4 first:pt-0\">\n <h3 className=\"text-sm font-semibold\">{title}</h3>\n {description && <p className=\"text-[10px] text-muted-foreground mt-0.5\">{description}</p>}\n </div>\n <div className=\"rounded-lg border bg-card shadow-sm px-5 divide-y\">\n {children}\n </div>\n </div>\n )\n}\n","import React, { useState, useRef, useEffect } from 'react'\nimport { Plus, X } from 'lucide-react'\nimport { cn } from '@fayz-ai/ui'\nimport { Button } from '@fayz-ai/ui'\nimport { ICON_MAP } from '@fayz-ai/ui'\nimport { useModuleLayout } from '@fayz-ai/ui'\nimport type { PluginQuickAction } from '@fayz-ai/core'\n\n/**\n * Quick actions button for plugin modules.\n * Shows a \"+\" button that opens a popover with contextual insert actions.\n * Reusable by any plugin.\n */\nexport function QuickActionsButton({ actions, className }: {\n actions: PluginQuickAction[]\n className?: string\n}) {\n const [open, setOpen] = useState(false)\n const ref = useRef<HTMLDivElement>(null)\n // Solid primary in sidebar/tabs products (GHL-style), outline in topbar products.\n const variant = useModuleLayout() === 'tabs' ? 'default' : 'outline'\n\n useEffect(() => {\n function handler(e: MouseEvent) {\n if (ref.current && !ref.current.contains(e.target as Node)) setOpen(false)\n }\n document.addEventListener('mousedown', handler)\n return () => document.removeEventListener('mousedown', handler)\n }, [])\n\n if (actions.length === 0) return null\n\n return (\n <div ref={ref} className={cn('relative', className)}>\n <Button\n variant={variant}\n size=\"sm\"\n onClick={() => setOpen(!open)}\n className={cn(open && variant === 'outline' && 'bg-muted')}\n >\n <Plus className={cn('h-3.5 w-3.5 transition-transform duration-200', open && 'rotate-45')} />\n <span>New</span>\n </Button>\n\n {open && (\n <div className=\"fayz-glass-surface absolute top-full right-0 z-50 mt-2 w-64 rounded-xl border bg-popover shadow-lg overflow-hidden animate-in fade-in-0 zoom-in-95 origin-top-right\">\n <div className=\"p-1.5\">\n {actions.map((action) => {\n const Icon = action.icon ? (ICON_MAP[action.icon] ?? Plus) : Plus\n return (\n <button\n key={action.id}\n onClick={() => { action.action(); setOpen(false) }}\n className=\"w-full flex items-center gap-3 rounded-lg px-3 py-2.5 text-left hover:bg-muted/50 transition-colors group\"\n >\n <div className=\"flex h-8 w-8 items-center justify-center rounded-lg bg-muted group-hover:bg-primary/10 transition-colors shrink-0\">\n <Icon className=\"h-4 w-4 text-muted-foreground group-hover:text-primary transition-colors\" />\n </div>\n <div className=\"min-w-0\">\n <p className=\"text-sm font-medium\">{action.label}</p>\n {action.description && (\n <p className=\"text-[10px] text-muted-foreground leading-tight\">{action.description}</p>\n )}\n </div>\n </button>\n )\n })}\n </div>\n </div>\n )}\n </div>\n )\n}\n","import React from 'react'\nimport { Settings } from 'lucide-react'\nimport { Button } from '@fayz-ai/ui'\nimport type { PluginQuickAction } from '@fayz-ai/core'\nimport { QuickActionsButton } from './QuickActionsButton'\n\n/**\n * ModuleActionBar — the single, standard top-right action area for every plugin\n * module page. Pass it straight to `ModulePage`'s `headerAction` prop.\n *\n * Owns the two things every module's header repeated by hand:\n * - a primary \"New\" action (rendered via QuickActionsButton, which adapts its\n * variant to the layout: solid in `tabs` products, outline in `rail`),\n * - a settings gear that deep-links into the central Settings area.\n *\n * Plugins stop hand-rolling `<div className=\"flex gap-2\">…gear…</div>` blocks:\n * headerAction={<ModuleActionBar quickActions={quickActions} settingsPath=\"/settings/crm\" />}\n */\nexport function ModuleActionBar({\n quickActions,\n settingsPath,\n settingsLabel,\n leading,\n trailing,\n}: {\n /** Primary insert actions. Omit (or empty) to hide the New button. */\n quickActions?: PluginQuickAction[]\n /** Hash route to the central settings tab, e.g. '/settings/crm'. Omit to hide the gear. */\n settingsPath?: string\n /** Accessible title for the gear button. */\n settingsLabel?: string\n /** Optional extra controls rendered before the New button (e.g. a filter). */\n leading?: React.ReactNode\n /** Optional extra controls rendered after the gear. */\n trailing?: React.ReactNode\n}) {\n const hasQuickActions = !!quickActions && quickActions.length > 0\n if (!hasQuickActions && !settingsPath && !leading && !trailing) return null\n\n return (\n <div className=\"flex items-center gap-2\">\n {leading}\n {hasQuickActions && <QuickActionsButton actions={quickActions} />}\n {settingsPath && (\n <Button\n variant=\"outline\"\n size=\"icon\"\n onClick={() => { window.location.hash = settingsPath }}\n title={settingsLabel ?? 'Settings'}\n >\n <Settings className=\"h-4 w-4\" />\n </Button>\n )}\n {trailing}\n </div>\n )\n}\n","import React from 'react'\nimport { useStore as useZustandStore, type StoreApi } from 'zustand'\n\n/**\n * createPluginContext — the standard config/provider/store React context trio that\n * every plugin re-implemented by hand (~100 lines each). One call returns the\n * provider component plus the three typed hooks:\n *\n * const ctx = createPluginContext<ResolvedCrmConfig, CrmDataProvider, CrmUIState>('CrmPage')\n * export const CrmContextProvider = ctx.ContextProvider\n * export const useCrmConfig = ctx.useConfig\n * export const useCrmProvider = ctx.useProvider\n * export const useCrmStore = ctx.useStore\n *\n * `displayName` is only used in the \"must be used within …\" error messages.\n */\nexport interface PluginContextApi<TConfig, TProvider, TUIState> {\n ContextProvider: React.FC<{\n config: TConfig\n provider: TProvider\n store: StoreApi<TUIState>\n children?: React.ReactNode\n }>\n useConfig: () => TConfig\n useProvider: () => TProvider\n useStore: <T>(selector: (state: TUIState) => T) => T\n}\n\nexport function createPluginContext<TConfig, TProvider, TUIState>(\n displayName: string,\n): PluginContextApi<TConfig, TProvider, TUIState> {\n const ConfigContext = React.createContext<TConfig | null>(null)\n const ProviderContext = React.createContext<TProvider | null>(null)\n const StoreContext = React.createContext<StoreApi<TUIState> | null>(null)\n\n const ContextProvider: PluginContextApi<TConfig, TProvider, TUIState>['ContextProvider'] = ({\n config, provider, store, children,\n }) => (\n <ConfigContext.Provider value={config}>\n <ProviderContext.Provider value={provider}>\n <StoreContext.Provider value={store}>\n {children}\n </StoreContext.Provider>\n </ProviderContext.Provider>\n </ConfigContext.Provider>\n )\n ContextProvider.displayName = `${displayName}ContextProvider`\n\n function useConfig(): TConfig {\n const ctx = React.useContext(ConfigContext)\n if (!ctx) throw new Error(`useConfig must be used within ${displayName}`)\n return ctx\n }\n\n function useProvider(): TProvider {\n const ctx = React.useContext(ProviderContext)\n if (!ctx) throw new Error(`useProvider must be used within ${displayName}`)\n return ctx\n }\n\n function useStore<T>(selector: (state: TUIState) => T): T {\n const store = React.useContext(StoreContext)\n if (!store) throw new Error(`useStore must be used within ${displayName}`)\n return useZustandStore(store, selector)\n }\n\n return { ContextProvider, useConfig, useProvider, useStore }\n}\n","import React from 'react'\n\n/**\n * parseViewId — the ONE canonical way to split a module view string into its base\n * and optional `:id` param. Replaces the per-plugin mix of `.slice('x-detail:'.length)`,\n * `.split(':')[1]`, and regex. `'leads-detail:42'` → `{ base: 'leads-detail', id: '42' }`,\n * `'channels'` → `{ base: 'channels' }`.\n */\nexport function parseViewId(view: string): { base: string; id?: string } {\n const i = view.indexOf(':')\n return i === -1 ? { base: view } : { base: view.slice(0, i), id: view.slice(i + 1) }\n}\n\nexport interface ViewRoute {\n /** view base id, e.g. 'channels' (exact) or 'channel-detail' (matches 'channel-detail:<id>') */\n id: string\n /** render the view; `id` is the parsed `:id` param for detail/edit routes */\n render: (params: { id?: string }) => React.ReactNode\n}\n\n/**\n * createViewRouter — declarative replacement for the hand-written `renderView()`\n * switch every plugin repeated. Maps a view's base id to a renderer and falls back\n * to `fallbackId` for unknown views. Define routes inside the component so their\n * `render` closures can capture `navigate`/handlers:\n *\n * const renderView = createViewRouter([\n * { id: 'channels', render: () => <ChannelsView onOpen={(id) => navigate(`channel-detail:${id}`)} /> },\n * { id: 'channel-detail', render: ({ id }) => <ChannelDetailView channelId={id!} onBack={() => navigate('channels')} /> },\n * { id: 'overview', render: () => <OverviewView /> },\n * ], 'overview')\n * ...\n * {renderView(view)}\n *\n * Not a fit for plugins that collapse detail/edit into a parent view + mode\n * (e.g. financial's `parseIntent`) — those should still use `parseViewId` directly.\n */\nexport function createViewRouter(routes: ViewRoute[], fallbackId: string): (view: string) => React.ReactNode {\n const map = new Map(routes.map((r) => [r.id, r]))\n return (view: string) => {\n const { base, id } = parseViewId(view)\n const route = map.get(base) ?? map.get(fallbackId)\n return route ? route.render({ id }) : null\n }\n}\n","/**\n * Shared currency config + formatter. Every vertical plugin (crm, financial,\n * inventory, orders, menu, marketing) copied this same Intl.NumberFormat wrapper;\n * they now import it from here. Plugins may still re-export it under a local alias\n * (e.g. `export { formatCurrency } from '@fayz-ai/admin'`) to keep call sites short.\n *\n * `currency` is optional so this name means ONE thing on both doors: called with\n * a config it formats exactly that, called without it delegates to the core\n * formatter, which reads the active locale + the currency the app declared.\n * (They used to be two different functions sharing a name — code that moved from\n * `@fayz-ai/core` to the `@fayz-ai/admin` front door silently changed behaviour.)\n */\nimport { formatCurrency as formatCurrencyFromContext } from '@fayz-ai/core'\n\nexport interface CurrencyConfig {\n code: string\n locale: string\n symbol: string\n}\n\nexport function formatCurrency(value: number, currency?: CurrencyConfig): string {\n if (!currency) return formatCurrencyFromContext(value)\n return new Intl.NumberFormat(currency.locale, {\n style: 'currency',\n currency: currency.code,\n minimumFractionDigits: 2,\n }).format(value)\n}\n","import React, { useState, useMemo } from 'react'\nimport type { PluginRegistryDef } from '@fayz-ai/core'\nimport type { EntityDef } from '@fayz-ai/core'\nimport { createCrudStore } from '../stores/createCrudStore'\nimport { createMockProvider } from '@fayz-ai/core'\nimport { CrudPage } from '../crud/CrudPage'\nimport { cn } from '@fayz-ai/ui'\nimport { ICON_MAP } from '@fayz-ai/ui'\n\n/**\n * Internal CRUD view for a single registry.\n * Manages its own store and uses a hash-based basePath for proper CRUD routing.\n */\nfunction RegistryCrudView({ registry, basePath }: { registry: PluginRegistryDef; basePath: string }) {\n const useStore = useMemo(() => {\n const data = (registry.mockData ?? registry.seedData ?? []) as any[]\n const provider = createMockProvider(registry.entity as EntityDef<any>, data)\n return createCrudStore(provider)\n }, [registry.id])\n\n return (\n <CrudPage\n entityDef={registry.entity as EntityDef<any>}\n useStore={useStore as any}\n basePath={basePath}\n display={registry.display === 'cards' ? 'cards' : 'table'}\n readOnly={registry.readOnly}\n />\n )\n}\n\n/**\n * Reusable tabbed CRUD manager for plugin registries.\n * @param routeBase — hash route prefix for CRUD sub-routing (e.g. '/financial/settings')\n */\nexport function PluginRegistryManager({ registries, routeBase, className }: {\n registries: PluginRegistryDef[]\n /** Base route for CRUD navigation (e.g. '/financial/settings'). Each registry gets routeBase/registryId */\n routeBase?: string\n className?: string\n}) {\n // Derive active tab from hash if routeBase provided, otherwise use state\n const getTabFromHash = () => {\n if (!routeBase) return registries[0]?.id ?? ''\n const hash = window.location.hash.slice(1) || '/'\n if (hash.startsWith(routeBase + '/')) {\n const rest = hash.slice(routeBase.length + 1)\n const tabId = rest.split('/')[0]\n if (registries.find((r) => r.id === tabId)) return tabId\n }\n return registries[0]?.id ?? ''\n }\n\n const [activeTab, setActiveTab] = useState(getTabFromHash)\n\n // Sync tab from hash changes\n React.useEffect(() => {\n if (!routeBase) return\n const handler = () => setActiveTab(getTabFromHash())\n window.addEventListener('hashchange', handler)\n return () => window.removeEventListener('hashchange', handler)\n }, [routeBase])\n\n function switchTab(tabId: string) {\n setActiveTab(tabId)\n if (routeBase) {\n window.location.hash = `${routeBase}/${tabId}`\n }\n }\n\n if (registries.length === 0) return null\n\n const activeRegistry = registries.find((r) => r.id === activeTab) ?? registries[0]\n const crudBasePath = routeBase ? `${routeBase}/${activeRegistry.id}` : `/__registry/${activeRegistry.id}`\n\n return (\n <div className={cn('space-y-4', className)}>\n {/* Tabs */}\n <div className=\"flex gap-1 overflow-x-auto pb-1\">\n {registries.map((reg) => {\n const Icon = reg.icon ? (ICON_MAP[reg.icon] ?? null) : null\n const active = reg.id === activeTab\n return (\n <button\n key={reg.id}\n onClick={() => switchTab(reg.id)}\n className={cn(\n 'flex items-center gap-1.5 whitespace-nowrap rounded-lg px-3 py-2 text-sm font-medium transition-colors shrink-0',\n active\n ? 'bg-primary text-primary-foreground'\n : 'text-muted-foreground hover:text-foreground hover:bg-muted/50'\n )}\n >\n {Icon && <Icon className=\"h-3.5 w-3.5\" />}\n {reg.entity.name}\n </button>\n )\n })}\n </div>\n\n {/* Description */}\n {activeRegistry?.description && (\n <p className=\"text-xs text-muted-foreground\">{activeRegistry.description}</p>\n )}\n\n {/* CRUD content — keyed so it remounts when switching tabs */}\n {activeRegistry && <RegistryCrudView key={activeRegistry.id} registry={activeRegistry} basePath={crudBasePath} />}\n </div>\n )\n}\n","import { useState, useRef, useCallback, useEffect } from 'react'\n\n/**\n * Navigation direction for transition animations.\n * 'forward' = deeper into content (list → detail → edit, or main → settings)\n * 'back' = returning to parent (edit → detail → list, or settings → main)\n */\nexport type NavDirection = 'forward' | 'back'\n\n/**\n * View depth mapping — used to determine animation direction.\n * Higher depth = deeper in the navigation hierarchy.\n */\nexport type DepthMap = Record<string, number>\n\nconst DEFAULT_DEPTHS: DepthMap = {\n summary: 0,\n list: 0,\n new: 1,\n edit: 2,\n detail: 1,\n settings: 1,\n}\n\n/**\n * Reusable module navigation hook for plugins.\n * Manages view state, hash synchronization, and animation direction.\n *\n * @param hashBase — the base hash path for this module (e.g. '/financial')\n * @param depthMap — optional custom depth mapping for views\n */\nexport function useModuleNavigation(hashBase: string, depthMap?: DepthMap, homeView = 'summary') {\n const depths = { ...DEFAULT_DEPTHS, ...depthMap }\n\n function getInitialView(): string {\n const rawHash = window.location.hash.slice(1) || '/'\n // Strip query string from hash before parsing segments\n const hash = rawHash.split('?')[0]\n if (hash === hashBase || hash === hashBase + '/') return homeView\n if (hash.startsWith(hashBase + '/settings')) return 'settings'\n if (hash.startsWith(hashBase + '/')) {\n const rest = hash.slice(hashBase.length + 1)\n const segments = rest.split('/')\n // '/inventory/dashboard' → treat as home view\n if (segments.length === 1 && segments[0] === homeView) return homeView\n // Detect action + ID patterns: '/products/edit/uuid' or '/stock/detail/uuid'\n const ACTION_KEYWORDS = ['edit', 'detail', 'view', 'post']\n if (segments.length >= 3) {\n const maybeAction = segments[segments.length - 2]\n if (ACTION_KEYWORDS.includes(maybeAction)) {\n return segments.slice(0, -2).join('-') + '-' + maybeAction + ':' + segments[segments.length - 1]\n }\n }\n // Generic fallback: a trailing UUID is always an ID for the view formed\n // by the preceding segments ('/content/post/<uuid>' → 'content-post:<uuid>')\n const UUID_RE = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i\n if (segments.length >= 2 && UUID_RE.test(segments[segments.length - 1])) {\n return segments.slice(0, -1).join('-') + ':' + segments[segments.length - 1]\n }\n return segments.join('-')\n }\n return homeView\n }\n\n const [view, setView] = useState(getInitialView)\n const [direction, setDirection] = useState<NavDirection>('forward')\n const prevDepthRef = useRef(getDepth(getInitialView()))\n\n // Track recent in-module views so detail/subpages can render a context-aware\n // back link (\"Back to {where you came from}\") and return to the actual\n // previous page rather than a hard-coded parent route. Records every distinct\n // view (regardless of how it was reached: navigate(), topbar, browser back).\n const historyRef = useRef<string[]>([getInitialView()])\n const [previousView, setPreviousView] = useState<string | null>(null)\n useEffect(() => {\n const stack = historyRef.current\n if (stack[stack.length - 1] !== view) {\n stack.push(view)\n if (stack.length > 30) stack.shift()\n }\n setPreviousView(stack.length >= 2 ? stack[stack.length - 2] : null)\n }, [view])\n\n // Sync view from external hash changes (e.g., topbar nav clicking the module link)\n useEffect(() => {\n function handler() {\n const hash = (window.location.hash.slice(1) || '/').split('?')[0]\n // Only react if the hash is within our module's base\n if (hash === hashBase || hash === hashBase + '/' || hash.startsWith(hashBase + '/')) {\n const newView = getInitialView()\n if (newView !== view) {\n const nextDepth = getDepth(newView)\n setDirection(nextDepth > prevDepthRef.current ? 'forward' : 'back')\n prevDepthRef.current = nextDepth\n setView(newView)\n }\n }\n }\n window.addEventListener('hashchange', handler)\n return () => window.removeEventListener('hashchange', handler)\n }, [view, hashBase])\n\n function getDepth(v: string): number {\n // Check exact match first\n if (depths[v] !== undefined) return depths[v]\n // Check base view name (e.g. 'payables-list' → check 'list', 'payables-new' → check 'new')\n const parts = v.split('-')\n const suffix = parts[parts.length - 1]\n if (depths[suffix] !== undefined) return depths[suffix]\n // Edit with ID (e.g. 'payables-edit:123')\n if (v.includes('edit')) return depths.edit ?? 2\n return 0\n }\n\n const navigate = useCallback((nextView: string, hash?: string) => {\n const nextDepth = getDepth(nextView)\n setDirection(nextDepth > prevDepthRef.current ? 'forward' : 'back')\n prevDepthRef.current = nextDepth\n setView(nextView)\n\n // Sync hash — explicit hash takes priority, otherwise derive from view name\n if (hash) {\n window.location.hash = hash\n } else if (nextView === homeView || nextView === 'summary' || nextView === '') {\n window.location.hash = hashBase\n } else {\n // Convert view name to URL-friendly path: 'payables-list' → '/financial/payables/list'\n // 'payables-edit:uuid-with-dashes' → '/financial/payables/edit/uuid-with-dashes'\n const colonIdx = nextView.indexOf(':')\n if (colonIdx !== -1) {\n // Has an ID after colon — only convert dashes in the prefix, keep ID intact\n const prefix = nextView.slice(0, colonIdx).replace(/-/g, '/')\n const id = nextView.slice(colonIdx + 1)\n window.location.hash = `${hashBase}/${prefix}/${id}`\n } else {\n const path = nextView.replace(/-/g, '/')\n window.location.hash = `${hashBase}/${path}`\n }\n }\n }, [hashBase])\n\n // Return to the actual previous page. Uses the browser history when there's\n // in-app history to pop (preserving the prior page); otherwise navigates to a\n // sensible fallback (deep links / direct loads have nowhere to go back to).\n const back = useCallback((fallbackView?: string) => {\n if (historyRef.current.length >= 2) {\n window.history.back()\n } else {\n navigate(fallbackView ?? homeView)\n }\n }, [navigate, homeView])\n\n const animationClass = direction === 'forward' ? 'saas-nav-forward' : 'saas-nav-back'\n\n return { view, direction, animationClass, navigate, previousView, back }\n}\n","import React, { useState, useCallback, useRef } from 'react'\nimport { Mail, MessageCircle, ExternalLink, Cake, Calendar } from 'lucide-react'\nimport { Popover, PopoverTrigger, PopoverContent, PhoneLink, normalizePhone } from '@fayz-ai/ui'\nimport { createArchetypeLookup } from '../../crud/archetype-lookup'\nimport type { EntityLookupResult } from '../../crud/archetype-lookup'\nimport { cn } from '@fayz-ai/ui'\nimport { resolveEntityAnchor } from '../../lib/entity-routes'\n\n// Singleton person lookup — shared across all PersonLink instances\nconst personLookup = createArchetypeLookup({ archetype: 'person' })\n\ninterface PersonLinkProps {\n /** Person UUID — required for fetching details */\n personId?: string | null\n /**\n * Where to load the details from. Defaults to the `person` archetype lookup\n * (the `people` table). Modules whose \"person\" lives elsewhere pass their own\n * loader — a shop customer, for instance, is a plg_shop_customers row and the\n * default lookup would never find it. Without this the popover silently shows\n * an empty card, which reads as a bug rather than as a wrong data source.\n */\n lookup?: { getById: (id: string) => Promise<EntityLookupResult | null> }\n /** Display name (shown as the clickable text) */\n name: string\n /** Optional href to navigate to the person's profile */\n profileHref?: string\n /** Optional tab to open on the detail page (e.g. \"schedule\") */\n tab?: string\n /** Size variant */\n size?: 'sm' | 'default'\n /** Additional className for the trigger */\n className?: string\n}\n\nfunction formatAge(dob: string): string | null {\n try {\n const birth = new Date(dob)\n const now = new Date()\n let age = now.getFullYear() - birth.getFullYear()\n if (now.getMonth() < birth.getMonth() || (now.getMonth() === birth.getMonth() && now.getDate() < birth.getDate())) age--\n return `${age}y`\n } catch { return null }\n}\n\nexport function PersonLink({ personId, name, lookup, profileHref, tab, size = 'default', className }: PersonLinkProps) {\n const [person, setPerson] = useState<EntityLookupResult | null>(null)\n const [loading, setLoading] = useState(false)\n const [fetched, setFetched] = useState(false)\n const [open, setOpen] = useState(false)\n const hoverTimer = useRef<ReturnType<typeof setTimeout> | null>(null)\n\n const fetchPerson = useCallback(() => {\n if (!fetched && personId) {\n setLoading(true)\n ;(lookup ?? personLookup).getById(personId).then((result) => {\n setPerson(result)\n setFetched(true)\n setLoading(false)\n }).catch(() => {\n setFetched(true)\n setLoading(false)\n })\n }\n }, [personId, fetched, lookup])\n\n const handleOpenChange = useCallback((v: boolean) => {\n setOpen(v)\n if (v) fetchPerson()\n }, [fetchPerson])\n\n function handleMouseEnter() {\n hoverTimer.current = setTimeout(() => { setOpen(true); fetchPerson() }, 800)\n }\n\n function handleMouseLeave() {\n if (hoverTimer.current) { clearTimeout(hoverTimer.current); hoverTimer.current = null }\n }\n\n // If no personId, just render the name as plain text\n if (!personId) {\n return <span className={cn(size === 'sm' ? 'text-xs' : 'text-sm', className)}>{name}</span>\n }\n\n const data = person?.data as Record<string, unknown> | undefined\n const email = data?.email as string | undefined\n const phone = data?.phone as string | undefined\n const kind = data?.kind as string | undefined ?? person?.group\n const isActive = data?.is_active as boolean | undefined\n const dob = data?.date_of_birth as string | undefined\n const createdAt = data?.created_at as string | undefined\n const age = dob ? formatAge(dob) : null\n const initial = name.charAt(0).toUpperCase()\n\n // Auto-derive profile href from person kind if not explicitly provided\n const resolvedHref = profileHref ?? (personId ? resolveEntityAnchor(personId, 'person', kind ?? undefined, tab) : undefined)\n\n return (\n <Popover open={open} onOpenChange={handleOpenChange}>\n <PopoverTrigger asChild>\n <button\n type=\"button\"\n onClick={(e) => e.stopPropagation()}\n onMouseEnter={handleMouseEnter}\n onMouseLeave={handleMouseLeave}\n className={cn(\n 'font-medium text-foreground underline decoration-dashed decoration-muted-foreground/40 underline-offset-2 hover:decoration-primary hover:text-primary transition-colors truncate text-left',\n size === 'sm' ? 'text-xs' : 'text-sm',\n className\n )}\n >\n {name}\n </button>\n </PopoverTrigger>\n <PopoverContent side=\"bottom\" align=\"start\" sideOffset={6}>\n {loading ? (\n <div className=\"p-4 space-y-3\">\n <div className=\"flex items-center gap-3\">\n <div className=\"h-10 w-10 rounded-full bg-muted/40 animate-pulse\" />\n <div className=\"space-y-1.5 flex-1\">\n <div className=\"h-3.5 w-24 rounded bg-muted/40 animate-pulse\" />\n <div className=\"h-2.5 w-16 rounded bg-muted/30 animate-pulse\" />\n </div>\n </div>\n <div className=\"space-y-2 pt-1\">\n <div className=\"h-3 w-36 rounded bg-muted/30 animate-pulse\" />\n <div className=\"h-3 w-28 rounded bg-muted/30 animate-pulse\" />\n </div>\n </div>\n ) : (\n <div>\n {/* Header with profile link */}\n <div className=\"flex items-start gap-3 p-4 pb-3\">\n <div className=\"flex h-10 w-10 shrink-0 items-center justify-center rounded-full bg-primary/10 text-primary text-sm font-bold\">\n {initial}\n </div>\n <div className=\"min-w-0 flex-1\">\n <p className=\"text-sm font-semibold truncate\">{name}</p>\n <div className=\"flex items-center gap-1.5 mt-0.5\">\n {kind && (\n <span className=\"inline-flex items-center rounded-full bg-muted px-2 py-0.5 text-[10px] font-medium text-muted-foreground capitalize\">\n {kind}\n </span>\n )}\n {isActive !== undefined && (\n <span className={`inline-flex items-center gap-1 text-[10px] ${isActive ? 'text-success' : 'text-muted-foreground/50'}`}>\n <span className={`h-1.5 w-1.5 rounded-full ${isActive ? 'bg-success' : 'bg-muted-foreground/30'}`} />\n {isActive ? 'Active' : 'Inactive'}\n </span>\n )}\n </div>\n </div>\n {resolvedHref && (\n <a\n href={resolvedHref}\n onClick={(e) => { e.preventDefault(); window.location.hash = resolvedHref.replace(/^#/, '') }}\n className=\"flex h-7 w-7 items-center justify-center rounded-md text-muted-foreground hover:bg-muted hover:text-foreground transition-colors shrink-0\"\n title=\"View profile\"\n >\n <ExternalLink className=\"h-3.5 w-3.5\" />\n </a>\n )}\n </div>\n\n {/* Contact details */}\n {(email || phone || age) && (\n <div className=\"px-4 pb-3 space-y-1.5\">\n {email && (\n <a href={`mailto:${email}`} className=\"flex items-center gap-2 text-xs text-muted-foreground hover:text-primary transition-colors\">\n <Mail className=\"h-3 w-3 shrink-0\" />\n <span className=\"truncate\">{email}</span>\n </a>\n )}\n {phone && (\n <PhoneLink\n phone={phone}\n className=\"flex items-center gap-2 text-xs text-muted-foreground hover:text-primary transition-colors hover:no-underline\"\n >\n <MessageCircle className=\"h-3 w-3 shrink-0\" />\n <span>{normalizePhone(phone).display}</span>\n </PhoneLink>\n )}\n {dob && (\n <div className=\"flex items-center gap-2 text-xs text-muted-foreground\">\n <Cake className=\"h-3 w-3 shrink-0\" />\n <span>{new Date(dob).toLocaleDateString()}{age ? ` (${age})` : ''}</span>\n </div>\n )}\n </div>\n )}\n\n {/* No details found */}\n {!person && fetched && (\n <div className=\"px-4 pb-3\">\n <p className=\"text-xs text-muted-foreground\">No additional details available</p>\n </div>\n )}\n\n {/* Footer — created at */}\n {createdAt && (\n <div className=\"border-t px-4 py-2 flex items-center gap-1.5 text-[10px] text-muted-foreground/50\">\n <Calendar className=\"h-2.5 w-2.5\" />\n <span>Added {new Date(createdAt).toLocaleDateString()}</span>\n </div>\n )}\n </div>\n )}\n </PopoverContent>\n </Popover>\n )\n}\n","import { getSupabaseClientOptional } from '@fayz-ai/core'\nimport { useOrganizationStore } from '../../org/store'\n\n// ---------------------------------------------------------------------------\n// createPerson — the ONE way a plugin turns \"a name someone typed\" into a real\n// person record. Extracted from the agenda's inline quick-create so every\n// surface that needs \"find the contact, or create it\" writes the SAME rows:\n// `public.people` (the archetype base) plus, when the pool ships it, a\n// per-vertical extension table (`clients`, `leads`, …).\n//\n// Pool tolerance is the whole reason this is shared: beauty-style pools have\n// `public.clients`, school/agency pools live off `public.people` alone. A\n// MISSING extension table is not an error (PostgREST reports PGRST205 /\n// \"Could not find the table\"); any other failure rolls the person back so a\n// half-written contact never survives.\n// ---------------------------------------------------------------------------\n\nexport interface CreatePersonInput {\n name: string\n phone?: string\n email?: string\n /** `people.kind` discriminator for this vertical (e.g. 'client', 'lead'). */\n kind: string\n /**\n * Optional per-vertical extension table linked by `person_id`. Absent in the\n * pool → silently skipped (see above).\n */\n extensionTable?: string\n}\n\nexport interface CreatedPerson {\n id: string\n name: string\n phone?: string\n email?: string\n}\n\nexport async function createPerson(input: CreatePersonInput): Promise<CreatedPerson> {\n const supabase = getSupabaseClientOptional() as any\n const tenantId = useOrganizationStore.getState().currentOrg?.id\n if (!supabase) throw new Error('[createPerson] Supabase client not registered.')\n if (!tenantId) throw new Error('[createPerson] Active tenant not resolved — try again in a moment.')\n\n const name = input.name.trim()\n const phone = input.phone?.trim() || null\n const email = input.email?.trim() || null\n\n const { data: personRow, error: personError } = await supabase\n .from('people')\n .insert({ tenant_id: tenantId, kind: input.kind, name, phone, email })\n .select('id, name, phone, email')\n .single()\n if (personError) throw personError\n\n if (input.extensionTable) {\n const { error: extError } = await supabase\n .from(input.extensionTable)\n .insert({ person_id: personRow.id, tenant_id: tenantId })\n const missingExtensionTable =\n extError?.code === 'PGRST205' || extError?.message?.includes('Could not find the table')\n if (extError && !missingExtensionTable) {\n // Roll the person back so the failure leaves nothing behind.\n await supabase.from('people').delete().eq('id', personRow.id)\n throw extError\n }\n }\n\n return {\n id: String(personRow.id),\n name: String(personRow.name ?? name),\n phone: personRow.phone ?? undefined,\n email: personRow.email ?? undefined,\n }\n}\n","import React, { useState, useEffect, useMemo, useRef } from 'react'\nimport { X } from 'lucide-react'\nimport { SearchCombobox, cn, toast, type ComboboxOption } from '@fayz-ai/ui'\nimport { useTranslation } from '@fayz-ai/core'\nimport { createArchetypeLookup, type EntityLookup } from '../../crud/archetype-lookup'\nimport { createPerson } from './create-person'\nimport { PersonLink } from './PersonLink'\n\n// ---------------------------------------------------------------------------\n// ContactPicker — \"find the person, or create them\" as ONE component.\n//\n// The agenda invented this flow inline (search a client → no match → quick-add\n// with name/phone/email → keep going without leaving the modal). It's the same\n// need anywhere a plugin starts something FOR someone: a booking, a\n// conversation, an invoice. This is that flow, extracted, so the behaviour and\n// the rows written stay identical across surfaces (see `createPerson`).\n//\n// Three states, one component:\n// • empty → SearchCombobox over the person lookup, with \"+ Create <text>\"\n// • selected → a compact chip (PersonLink + phone) with an optional clear\n// • creating → inline name / phone / email form → `createPerson` → selected\n//\n// ONE behaviour, two skins (`variant`). What used to differ between hosts was\n// the FLOW — the agenda hid its search behind a collapsed \"+ Add client\" and\n// rendered its own quick-create, conversations rendered its own phone field —\n// and that is what made the same feature read as two. Those are gone: search,\n// chip, inline create, label and handle capture all live here now, and the host\n// passes configuration, not layout. `variant` only picks how much chrome the\n// input wears, so it can sit in a form-shaped modal or in a dense icon row\n// without the surrounding layout looking broken. Always open in both: the\n// contact is the primary input everywhere this is mounted.\n//\n// Uncontrolled-friendly: pass `value`/`onChange` and the parent owns the id.\n// ---------------------------------------------------------------------------\n\nexport interface ContactPickerValue {\n /** Person id — undefined while the user has only typed a name. */\n id?: string\n name: string\n phone?: string\n email?: string\n}\n\nexport interface ContactPickerProps {\n value: ContactPickerValue | null\n onChange: (value: ContactPickerValue | null) => void\n /**\n * `people.kind` for records created here (e.g. 'client', 'lead', 'contact').\n * Also narrows the default lookup, so a vertical only searches its own people.\n */\n kind?: string\n /** Per-vertical extension table linked by `person_id` — skipped when absent from the pool. */\n extensionTable?: string\n /** Search source. Defaults to the `person` archetype lookup narrowed by `kind`. */\n lookup?: EntityLookup\n /**\n * Allow committing a typed name with NO person record (`{ name }` and no id).\n * Off by default: the point of the picker is to end up with a real contact.\n * Conversations turns it on so an ad-hoc handle can still start a thread.\n */\n allowFreeText?: boolean\n /** Hide the clear button (agenda locks the client on a paid booking). */\n clearable?: boolean\n disabled?: boolean\n autoFocus?: boolean\n placeholder?: string\n /**\n * How much chrome the field carries. The BEHAVIOUR — search, chip, inline\n * create, handle capture — is identical either way; only the input's skin\n * changes, so it can sit in whichever layout grammar the host already uses.\n *\n * • 'field' (default) — label above + bordered input. For form-shaped modals\n * (the conversations composer), where every control is a labelled field.\n * • 'inline' — no label, borderless input that underlines on focus. For the\n * appointment modal's icon rows, where a bordered box next to \"Scheduled\"\n * and \"Add notes\" is the thing that looks out of place.\n */\n variant?: 'field' | 'inline'\n /** Field label, rendered BY the component so every host gets the same one. Ignored when `variant='inline'`. */\n label?: string\n /**\n * Right-hand detail on the selected chip. Defaults to the person's phone; a\n * host that cares about a different datum (the conversations composer shows\n * the handle for the ACTIVE channel) passes its own.\n */\n secondaryText?: string\n /**\n * Optional second datum captured alongside the contact — the address to reach\n * them at in this context (a channel handle, a delivery phone…). Lives HERE,\n * not in the host, because it is contact data and hosts were rendering their\n * own field around the picker, which is exactly what made the same flow look\n * like two different features.\n *\n * `derived` is what we already know from the picked person: when set it rides\n * on the chip and no field is offered. Otherwise the picker shows a discreet\n * \"+ Add {label}\" that expands into the input.\n */\n handleField?: {\n /** Human name of the datum, interpolated into \"+ Add {label}\". */\n label: string\n /** Known from the contact — suppresses the field entirely. */\n derived?: string\n value: string\n onChange: (value: string) => void\n /** Label above the input once open. Defaults to `label`. */\n fieldLabel?: string\n placeholder?: string\n }\n /**\n * Copy for the \"+ Create …\" row. Defaults to the shared \"New contact\"; a\n * plugin whose vertical calls them something else (the agenda says \"client\")\n * passes its own label so the wording doesn't regress into generic SDK copy.\n */\n createLabel?: string\n /**\n * Fires when the inline create form opens/closes. The create form owns phone\n * and email while it is open, so a host that ALSO renders a phone/handle field\n * (the conversations composer does) hides its own to avoid asking twice.\n */\n onCreatingChange?: (creating: boolean) => void\n className?: string\n /** Extra hint under the input while a name is typed but nothing is selected. */\n hint?: React.ReactNode\n}\n\nexport function ContactPicker({\n value,\n onChange,\n kind,\n extensionTable,\n lookup,\n allowFreeText = false,\n clearable = true,\n disabled,\n autoFocus,\n placeholder,\n variant = 'field',\n label,\n secondaryText,\n handleField,\n createLabel,\n onCreatingChange,\n className,\n hint,\n}: ContactPickerProps) {\n const t = useTranslation()\n const resolvedLookup = useMemo(\n () => lookup ?? createArchetypeLookup({ archetype: 'person', kind }),\n [lookup, kind],\n )\n\n const [search, setSearch] = useState(value?.id ? value.name : (value?.name ?? ''))\n const [options, setOptions] = useState<ComboboxOption[]>([])\n const [searching, setSearching] = useState(false)\n\n const [creating, setCreatingState] = useState(false)\n const creatingChanged = useRef(onCreatingChange)\n creatingChanged.current = onCreatingChange\n const setCreating = (next: boolean) => {\n setCreatingState(next)\n creatingChanged.current?.(next)\n }\n const [handleOpen, setHandleOpen] = useState(false)\n const [newName, setNewName] = useState('')\n const [newPhone, setNewPhone] = useState('')\n const [newEmail, setNewEmail] = useState('')\n const [saving, setSaving] = useState(false)\n\n // Keep the visible text in sync with the parent — but ONLY on an id\n // transition. Parents build `value` as a fresh object literal every render, so\n // reacting to the object itself would re-run each keystroke and wipe the text\n // the user is typing (there is no id yet while they type).\n const selectedId = value?.id\n const selectedName = value?.id ? value.name : undefined\n const lastSelectedId = useRef(selectedId)\n useEffect(() => {\n if (selectedId === lastSelectedId.current) return\n lastSelectedId.current = selectedId\n if (selectedId) {\n setSearch(selectedName ?? '')\n setCreating(false)\n } else {\n // Parent dropped the selection (form reset, \"change contact\", …).\n setSearch('')\n }\n }, [selectedId, selectedName])\n\n // Debounced search — skipped once a person is selected.\n useEffect(() => {\n if (value?.id || creating || search.trim().length < 1) {\n setOptions([])\n setSearching(false)\n return\n }\n setSearching(true)\n const timer = setTimeout(async () => {\n try {\n const results = await resolvedLookup.search(search)\n setOptions(results.map((r) => ({ id: r.id, label: r.label, subtitle: r.subtitle, data: r.data })))\n } catch {\n setOptions([])\n }\n setSearching(false)\n }, 250)\n return () => clearTimeout(timer)\n }, [search, value?.id, creating, resolvedLookup])\n\n // Free-text mode: a typed name with no match is still a usable value, so the\n // parent sees every keystroke. Without it the text would be lost on submit.\n function handleSearchChange(next: string) {\n setSearch(next)\n if (value?.id) onChange(null)\n if (allowFreeText) onChange(next.trim() ? { name: next } : null)\n }\n\n function handleSelect(opt: ComboboxOption) {\n const data = (opt.data ?? {}) as Record<string, unknown>\n setSearch(opt.label)\n setOptions([])\n onChange({\n id: opt.id,\n name: opt.label,\n phone: (data.phone as string) || undefined,\n email: (data.email as string) || undefined,\n })\n }\n\n function startCreate(prefillName: string) {\n setCreating(true)\n setNewName(prefillName)\n setNewPhone('')\n setNewEmail('')\n }\n\n async function handleCreate() {\n if (!newName.trim() || saving) return\n setSaving(true)\n try {\n const person = await createPerson({\n name: newName,\n phone: newPhone,\n email: newEmail,\n kind: kind ?? 'contact',\n extensionTable,\n })\n setSearch(person.name)\n setCreating(false)\n onChange(person)\n } catch (err) {\n const message = err instanceof Error ? err.message : String(err)\n toast.error(t('contactPicker.createFailed'), { description: message })\n }\n setSaving(false)\n }\n\n function handleClear() {\n setSearch('')\n setOptions([])\n onChange(null)\n }\n\n const inputClass =\n 'w-full rounded-input border border-input bg-card shadow-[inset_0_1px_0_rgb(0_0_0_/0.06)] px-2.5 py-1.5 text-sm focus:outline-none focus:ring-2 focus:ring-ring'\n\n // Each state renders only its BODY; `frame` below wraps every one of them in\n // the same label + handle chrome, so the picker looks identical wherever it is\n // mounted no matter which state it is in.\n const frame = (body: React.ReactNode) => (\n <div className={cn('flex flex-col', className)}>\n {label && variant === 'field' && (\n <label className=\"mb-1.5 block text-xs font-medium text-muted-foreground\">{label}</label>\n )}\n {body}\n {handleField && !creating && !handleField.derived && (\n handleOpen || handleField.value ? (\n <div className=\"mt-3\">\n <label htmlFor=\"contact-handle\" className=\"mb-1.5 block text-xs font-medium text-muted-foreground\">\n {handleField.fieldLabel ?? handleField.label}\n </label>\n <input\n id=\"contact-handle\"\n type=\"text\"\n value={handleField.value}\n onChange={(e) => handleField.onChange(e.target.value)}\n placeholder={handleField.placeholder}\n className={inputClass}\n autoFocus={handleOpen}\n />\n </div>\n ) : (\n <button\n type=\"button\"\n onClick={() => setHandleOpen(true)}\n className=\"mt-2 self-start text-xs font-medium text-primary hover:underline\"\n >\n + {t('contactPicker.addField').replace('{label}', handleField.label)}\n </button>\n )\n )}\n </div>\n )\n\n // ---- Selected -----------------------------------------------------------\n if (value?.id && !creating) {\n return frame(\n <div className=\"flex items-center gap-2 rounded-md bg-muted/30 px-2.5 py-1.5 text-sm\">\n <PersonLink personId={value.id} name={value.name} size=\"default\" className=\"flex-1 min-w-0\" />\n {(secondaryText ?? value.phone) && (\n <span className=\"text-[10px] text-muted-foreground shrink-0\">{secondaryText ?? value.phone}</span>\n )}\n {clearable && !disabled && (\n <button\n type=\"button\"\n onClick={handleClear}\n aria-label={t('contactPicker.clear')}\n className=\"p-0.5 text-muted-foreground hover:text-destructive shrink-0\"\n >\n <X className=\"h-3 w-3\" />\n </button>\n )}\n </div>,\n )\n }\n\n // ---- Creating -----------------------------------------------------------\n if (creating) {\n return frame(\n <div className=\"rounded-input border border-input bg-card shadow-[inset_0_1px_0_rgb(0_0_0_/0.06)] p-2.5 space-y-2\">\n <div className=\"flex items-center gap-2\">\n <input\n type=\"text\"\n value={newName}\n onChange={(e) => setNewName(e.target.value)}\n placeholder={t('contactPicker.name')}\n className={cn(inputClass, 'flex-1 font-medium')}\n autoFocus\n />\n <button\n type=\"button\"\n onClick={() => setCreating(false)}\n aria-label={t('contactPicker.cancel')}\n className=\"p-1 text-muted-foreground hover:text-foreground shrink-0\"\n >\n <X className=\"h-3.5 w-3.5\" />\n </button>\n </div>\n <div className=\"grid grid-cols-2 gap-2\">\n <input\n type=\"tel\"\n value={newPhone}\n onChange={(e) => setNewPhone(e.target.value)}\n placeholder={t('contactPicker.phone')}\n className={inputClass}\n />\n <input\n type=\"email\"\n value={newEmail}\n onChange={(e) => setNewEmail(e.target.value)}\n placeholder={t('contactPicker.emailOptional')}\n className={inputClass}\n />\n </div>\n <button\n type=\"button\"\n disabled={saving || !newName.trim()}\n onClick={handleCreate}\n className=\"w-full rounded-md bg-primary border border-primary px-3 py-1.5 text-xs font-medium text-primary-foreground hover:bg-primary/90 shadow-button-primary active:shadow-button-inset disabled:opacity-40 transition-colors\"\n >\n {saving ? t('contactPicker.creating') : t('contactPicker.create')}\n </button>\n </div>,\n )\n }\n\n // ---- Empty / searching --------------------------------------------------\n return frame(\n <div>\n <SearchCombobox\n value={search}\n onChange={handleSearchChange}\n onSelect={handleSelect}\n options={options}\n loading={searching}\n placeholder={placeholder ?? t('contactPicker.search')}\n allowCreate\n createLabel={createLabel ?? t('contactPicker.newContact')}\n onCreateNew={startCreate}\n autoFocus={autoFocus}\n minimal={variant === 'inline'}\n />\n {hint && search.trim() && !searching && <div className=\"mt-1\">{hint}</div>}\n </div>,\n )\n}\n","import { useState, useCallback, useMemo } from 'react'\n\n// ---------------------------------------------------------------------------\n// Plugin Preferences — localStorage-backed per-plugin user preferences\n//\n// Usage:\n// const prefs = usePluginPrefs('agenda', { calendarView: 'timeGridWeek', slotDuration: 30 })\n// prefs.get('calendarView') // 'timeGridWeek'\n// prefs.set('calendarView', 'dayGridMonth')\n// prefs.getAll() // { calendarView: 'dayGridMonth', slotDuration: 30 }\n// prefs.reset() // back to defaults\n//\n// Keys are namespaced: `saas:prefs:{pluginId}` in localStorage.\n// Each plugin gets its own isolated namespace.\n// ---------------------------------------------------------------------------\n\nconst STORAGE_PREFIX = 'saas:prefs:'\n\nfunction readStore<T extends Record<string, unknown>>(pluginId: string, defaults: T): T {\n try {\n const raw = localStorage.getItem(STORAGE_PREFIX + pluginId)\n if (!raw) return { ...defaults }\n return { ...defaults, ...JSON.parse(raw) }\n } catch {\n return { ...defaults }\n }\n}\n\nfunction writeStore<T extends Record<string, unknown>>(pluginId: string, data: T): void {\n try {\n localStorage.setItem(STORAGE_PREFIX + pluginId, JSON.stringify(data))\n } catch { /* quota exceeded or private browsing — silently ignore */ }\n}\n\nexport interface PluginPrefs<T extends Record<string, unknown>> {\n /** Get a single preference value */\n get<K extends keyof T>(key: K): T[K]\n /** Set a single preference value (persists immediately) */\n set<K extends keyof T>(key: K, value: T[K]): void\n /** Update multiple preferences at once */\n update(partial: Partial<T>): void\n /** Get all preferences as an object */\n getAll(): T\n /** Reset all preferences to defaults */\n reset(): void\n}\n\n/**\n * Hook for localStorage-backed plugin preferences.\n *\n * @param pluginId Unique plugin identifier (e.g. 'agenda', 'financial')\n * @param defaults Default values — also defines the shape of the prefs object\n * @returns PluginPrefs accessor with get/set/update/reset\n */\nexport function usePluginPrefs<T extends Record<string, unknown>>(\n pluginId: string,\n defaults: T,\n): PluginPrefs<T> {\n const [state, setState] = useState<T>(() => readStore(pluginId, defaults))\n\n const get = useCallback(<K extends keyof T>(key: K): T[K] => {\n return state[key]\n }, [state])\n\n const set = useCallback(<K extends keyof T>(key: K, value: T[K]): void => {\n setState((prev) => {\n const next = { ...prev, [key]: value }\n writeStore(pluginId, next)\n return next\n })\n }, [pluginId])\n\n const update = useCallback((partial: Partial<T>): void => {\n setState((prev) => {\n const next = { ...prev, ...partial }\n writeStore(pluginId, next)\n return next\n })\n }, [pluginId])\n\n const getAll = useCallback((): T => state, [state])\n\n const reset = useCallback((): void => {\n setState({ ...defaults })\n writeStore(pluginId, defaults)\n }, [pluginId, defaults])\n\n return useMemo(() => ({ get, set, update, getAll, reset }), [get, set, update, getAll, reset])\n}\n\n// ---------------------------------------------------------------------------\n// Non-hook utility for use outside React components (e.g. in store factories)\n// ---------------------------------------------------------------------------\n\nexport function getPluginPref<T>(pluginId: string, key: string, defaultValue: T): T {\n try {\n const raw = localStorage.getItem(STORAGE_PREFIX + pluginId)\n if (!raw) return defaultValue\n const parsed = JSON.parse(raw)\n return parsed[key] ?? defaultValue\n } catch {\n return defaultValue\n }\n}\n\nexport function setPluginPref(pluginId: string, key: string, value: unknown): void {\n try {\n const raw = localStorage.getItem(STORAGE_PREFIX + pluginId)\n const existing = raw ? JSON.parse(raw) : {}\n existing[key] = value\n localStorage.setItem(STORAGE_PREFIX + pluginId, JSON.stringify(existing))\n } catch { /* ignore */ }\n}\n","import { useCallback, useMemo, useRef } from 'react'\nimport { useOrganizationStore, useOrgAdapterOptional } from '../org'\nimport { usePluginPrefs } from './usePluginPrefs'\n\n// ---------------------------------------------------------------------------\n// useTenantPluginSettings — PER-TENANT plugin settings, persisted server-side\n//\n// Unlike usePluginPrefs (per-browser localStorage), this hook stores each\n// plugin's settings under the current organization so they follow the tenant\n// across devices/sessions:\n//\n// tenants.settings = { ..., plugins: { [pluginId]: { key: value, ... } } }\n//\n// Reads come from the native org store (`currentOrg.settings.plugins[pluginId]`)\n// merged over `defaults`. Writes optimistically patch the store and then\n// persist via `adapter.updateOrg(orgId, { settings })` (lightly debounced so a\n// burst of toggles collapses into one network round-trip).\n//\n// When no org adapter is mounted (standalone / mock-less demo), it transparently\n// falls back to `usePluginPrefs` (localStorage) with the SAME api, so the caller\n// never has to branch.\n//\n// NOTE (follow-up): persisting + re-hydrating these values is the contract here.\n// Actually *consuming* them to change plugin behaviour is a separate follow-up —\n// today most of these keys are inert flags that only round-trip through storage.\n// ---------------------------------------------------------------------------\n\nexport interface TenantPluginSettings<T extends Record<string, unknown>> {\n /** Get a single setting value (falls back to the provided default). */\n get<K extends keyof T>(key: K): T[K]\n /** Set a single setting value — optimistic + debounced persistence. */\n set<K extends keyof T>(key: K, value: T[K]): void\n /** Get all settings merged over defaults. */\n getAll(): T\n /** Whether values are persisted per-tenant (true) or per-browser fallback (false). */\n isTenantScoped: boolean\n}\n\n/** Extract this plugin's settings blob from an org's settings, merged over defaults. */\nfunction readForPlugin<T extends Record<string, unknown>>(\n settings: unknown,\n pluginId: string,\n defaults: T,\n): T {\n const root = settings && typeof settings === 'object' ? (settings as Record<string, unknown>) : {}\n const plugins = root.plugins && typeof root.plugins === 'object' ? (root.plugins as Record<string, unknown>) : {}\n const forPlugin = plugins[pluginId]\n const merged = forPlugin && typeof forPlugin === 'object' ? (forPlugin as Partial<T>) : {}\n return { ...defaults, ...merged }\n}\n\nconst DEBOUNCE_MS = 400\n\nexport function useTenantPluginSettings<T extends Record<string, unknown>>(\n pluginId: string,\n defaults: T,\n): TenantPluginSettings<T> {\n const currentOrg = useOrganizationStore((s) => s.currentOrg)\n const setCurrentOrg = useOrganizationStore((s) => s.setCurrentOrg)\n const adapter = useOrgAdapterOptional()\n\n // Always mounted (hooks can't be conditional). Used as the fallback store when\n // there's no org adapter to persist against.\n const localPrefs = usePluginPrefs<T>(pluginId, defaults)\n\n const isTenantScoped = !!(adapter && currentOrg)\n\n const stored = useMemo(\n () => readForPlugin(currentOrg?.settings, pluginId, defaults),\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [currentOrg?.settings, pluginId],\n )\n\n const timerRef = useRef<ReturnType<typeof setTimeout> | null>(null)\n\n const scheduleWrite = useCallback(\n (orgId: string, settings: Record<string, unknown>) => {\n if (!adapter) return\n if (timerRef.current) clearTimeout(timerRef.current)\n timerRef.current = setTimeout(() => {\n adapter\n .updateOrg(orgId, { settings })\n .then((updated) => setCurrentOrg(updated))\n .catch(() => {\n /* keep the optimistic value; a later save or refresh reconciles */\n })\n }, DEBOUNCE_MS)\n },\n [adapter, setCurrentOrg],\n )\n\n const set = useCallback(\n <K extends keyof T>(key: K, value: T[K]): void => {\n const org = useOrganizationStore.getState().currentOrg\n if (!adapter || !org) {\n localPrefs.set(key, value)\n return\n }\n // Read the freshest org from the store so rapid successive sets accumulate\n // instead of clobbering each other via a stale closure.\n const settings = (org.settings ?? {}) as Record<string, unknown>\n const plugins = (settings.plugins ?? {}) as Record<string, unknown>\n const nextForPlugin = { ...readForPlugin(settings, pluginId, defaults), [key]: value }\n const nextSettings = { ...settings, plugins: { ...plugins, [pluginId]: nextForPlugin } }\n // Optimistic: reflect immediately so the toggle updates without a round-trip.\n setCurrentOrg({ ...org, settings: nextSettings })\n scheduleWrite(org.id, nextSettings)\n },\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [adapter, pluginId, setCurrentOrg, scheduleWrite, localPrefs],\n )\n\n const get = useCallback(\n <K extends keyof T>(key: K): T[K] => (isTenantScoped ? stored[key] : localPrefs.get(key)),\n [isTenantScoped, stored, localPrefs],\n )\n\n const getAll = useCallback(\n (): T => (isTenantScoped ? stored : localPrefs.getAll()),\n [isTenantScoped, stored, localPrefs],\n )\n\n return useMemo(\n () => ({ get, set, getAll, isTenantScoped }),\n [get, set, getAll, isTenantScoped],\n )\n}\n","import * as React from 'react'\nimport {\n registerSurface,\n unregisterSurface,\n type AgentSurfaceContribution,\n} from '../lib/agent-surface'\nimport { registerAIToolHandler, unregisterAIToolHandler } from '../lib/ai-tool-handlers'\n\n/**\n * Publish the current screen to the assistant. Call it from an interactive\n * surface (a form builder, a calendar) with a description of what's on screen,\n * plus the tools that act on it. The contribution is live while the component\n * is mounted and gone when it unmounts.\n *\n * Freshness without churn: register once (by `id`), but read the contribution\n * through a ref so `describe()` and every `execute()` always see the latest\n * state and closures — even though the effect runs a single time. Pass a\n * `contribution` with a STABLE identity (memoize it) whose functions read\n * current state via refs; do not rebuild it every render.\n */\nexport function useAgentSurface(contribution: AgentSurfaceContribution): void {\n const ref = React.useRef(contribution)\n ref.current = contribution\n\n const id = contribution.id\n\n React.useEffect(() => {\n registerSurface({ id, get: () => ref.current })\n\n // Executors ride the normal client-plane handler map so `executeAITool`\n // finds and serializes them with zero special-casing. Each looks its own\n // executor up by name at call time, through the ref, so it never goes stale.\n const names = (ref.current.tools ?? []).map((t) => t.tool.name)\n for (const name of names) {\n registerAIToolHandler(name, (args) => {\n const entry = ref.current.tools?.find((t) => t.tool.name === name)\n if (!entry) return { error: 'tool_unmounted', message: 'That surface is no longer open.' }\n return entry.execute(args)\n })\n }\n\n return () => {\n unregisterSurface(id)\n for (const name of names) unregisterAIToolHandler(name)\n }\n }, [id])\n}\n","import React from 'react'\nimport { ExternalLink } from 'lucide-react'\nimport { Skeleton } from '@fayz-ai/ui'\nimport { useTranslation } from '../../hooks/useTranslation'\nimport { ConnectorRow } from '../connect/ConnectorRow'\nimport { ConnectorDetail } from '../connect/ConnectorDetail'\nimport { openConnectorsPanel, useConnectorsPanelAvailable } from '../connect/ConnectorsPanel'\nimport { useConnectors } from '../connect/useConnectors'\nimport type { UnifiedConnector } from '../connect/model'\nimport { navigateTo } from '../../app/routing'\n\n// ---------------------------------------------------------------------------\n// Connectors hub — a plugin's Integrações tab.\n//\n// This is not a second connector experience; it is Settings → Conectores seen\n// from inside one module. Same rows, same ids, same journey — only the scope\n// differs, so \"Google Calendar\" here and \"Google Calendar\" in the hub cannot\n// disagree about whether it is connected or how it gets resolved.\n//\n// Opening a row raises the assistant with its connectors drawer, because that\n// is where the agentic surface lives. Apps without an assistant get the same\n// journey in a sheet.\n//\n// An addon plugin contributing a ConnectorDefinition is all it takes to appear\n// in both places; adding a connector needs no change here.\n// ---------------------------------------------------------------------------\n\nexport function ConnectorsHub({ hostPluginId }: { hostPluginId: string }) {\n const { t } = useTranslation()\n const { connectors, reload } = useConnectors({ hostPluginId, includeGrants: false })\n const assistantAvailable = useConnectorsPanelAvailable()\n const [selected, setSelected] = React.useState<UnifiedConnector | null>(null)\n\n // Only what this module actually hosts — the catalogue at large belongs to\n // the hub, where \"adicionar\" is the point of the screen.\n const scoped = React.useMemo(\n () => (connectors ?? []).filter((c) => c.hostPluginId === hostPluginId),\n [connectors, hostPluginId],\n )\n\n React.useEffect(() => {\n if (!selected || !connectors) return\n const fresh = connectors.find((c) => c.id === selected.id)\n if (fresh && fresh !== selected) setSelected(fresh)\n }, [connectors])\n\n // Each connector resolves its own status over the network, so the tab starts\n // empty for a beat. The row's shape is known before its contents are — showing\n // that shape beats a blank panel that looks like \"nenhuma integração\".\n if (connectors === null) return <HubSkeleton />\n\n if (scoped.length === 0) {\n return <p className=\"py-8 text-center text-sm text-muted-foreground\">{t('connectors.empty')}</p>\n }\n\n return (\n <div className=\"max-w-3xl space-y-3\">\n <ul className=\"divide-y divide-border overflow-hidden rounded-xl border border-border\">\n {scoped.map((c) => (\n <ConnectorRow\n key={c.id}\n connector={c}\n showHost={false}\n onOpen={(connector) =>\n assistantAvailable ? openConnectorsPanel(connector) : setSelected(connector)\n }\n />\n ))}\n </ul>\n\n <button\n onClick={() => navigateTo('/settings/connectors')}\n className=\"inline-flex items-center gap-1 text-xs text-muted-foreground hover:text-foreground\"\n >\n <ExternalLink className=\"h-3 w-3\" /> {t('connectors.viewAll')}\n </button>\n\n <ConnectorDetail\n connector={selected}\n open={!!selected}\n onOpenChange={(open) => !open && setSelected(null)}\n onChanged={reload}\n />\n </div>\n )\n}\n\nfunction HubSkeleton() {\n return (\n <div className=\"max-w-3xl\" aria-hidden>\n <ul className=\"divide-y divide-border overflow-hidden rounded-xl border border-border\">\n {[0, 1].map((i) => (\n <li key={i} className=\"flex items-start gap-4 p-4\">\n <Skeleton className=\"h-10 w-10 shrink-0 rounded-lg\" />\n <div className=\"min-w-0 flex-1 space-y-2 py-0.5\">\n <Skeleton className=\"h-4 w-44\" />\n <Skeleton className=\"h-3 w-64\" />\n </div>\n <Skeleton className=\"h-4 w-24 shrink-0\" />\n </li>\n ))}\n </ul>\n </div>\n )\n}\n","import React, { useState, useMemo } from 'react'\nimport { ChevronLeft, Settings, Plug, TableProperties } from 'lucide-react'\nimport { cn } from '../../lib/cn'\nimport { useTranslation } from '../../hooks/useTranslation'\nimport { ICON_MAP } from '@fayz-ai/ui'\nimport type { PluginRegistryDef } from '../../types/plugins'\nimport type { EntityDef } from '../../types/crud'\nimport { createCrudStore } from '../../stores/createCrudStore'\nimport { resolveDataProvider, useConnectorsForPlugin } from '@fayz-ai/core'\nimport { CrudPage } from '../../crud/CrudPage'\nimport { ConnectorsHub } from './ConnectorsHub'\n\n// ---------------------------------------------------------------------------\n// Settings tab definition — General, custom tabs, and registry tabs all unified\n// ---------------------------------------------------------------------------\n\nexport interface SettingsPanelTab {\n id: string\n label: string\n icon?: string\n content: React.ReactNode\n}\n\n// ---------------------------------------------------------------------------\n// Internal: CRUD view for a registry\n// ---------------------------------------------------------------------------\n\nfunction RegistryCrudView({ registry, basePath }: { registry: PluginRegistryDef; basePath: string }) {\n const useStore = useMemo(() => {\n const mockData = (registry.mockData ?? registry.seedData ?? []) as any[]\n const provider = resolveDataProvider(registry.entity as EntityDef<any>, mockData)\n return createCrudStore(provider)\n }, [registry.id])\n\n return (\n <CrudPage\n entityDef={registry.entity as EntityDef<any>}\n useStore={useStore as any}\n basePath={basePath}\n display={registry.display === 'cards' ? 'cards' : 'table'}\n readOnly={registry.readOnly}\n />\n )\n}\n\n// ---------------------------------------------------------------------------\n// Properties tab — the plugin's CRUD registries as an inner (pill) tab strip.\n// Sub-routes at `${routeBase}/_properties/<registryId>`; also accepts the legacy\n// flat `${routeBase}/<registryId>` deep links.\n// ---------------------------------------------------------------------------\n\nfunction PropertiesTab({ registries, routeBase, regLabel }: {\n registries: PluginRegistryDef[]\n routeBase: string\n regLabel: (id: string, fallback: string) => string\n}) {\n function getActive(): string {\n const hash = window.location.hash.slice(1)\n const nested = `${routeBase}/_properties/`\n if (hash.startsWith(nested)) {\n const id = hash.slice(nested.length).split('/')[0]\n if (registries.find((r) => r.id === id)) return id\n }\n const flat = `${routeBase}/`\n if (hash.startsWith(flat)) {\n const id = hash.slice(flat.length).split('/')[0]\n if (registries.find((r) => r.id === id)) return id // legacy deep link\n }\n return registries[0]?.id ?? ''\n }\n\n const [active, setActive] = useState(getActive)\n React.useEffect(() => {\n const handler = () => setActive(getActive())\n window.addEventListener('hashchange', handler)\n return () => window.removeEventListener('hashchange', handler)\n }, [routeBase, registries])\n\n function select(id: string) {\n setActive(id)\n window.location.hash = `${routeBase}/_properties/${id}`\n }\n\n const activeReg = registries.find((r) => r.id === active) ?? registries[0]\n\n return (\n <div className=\"space-y-3\">\n <div className=\"flex gap-1.5 flex-wrap\">\n {registries.map((r) => {\n const Icon = r.icon ? (ICON_MAP[r.icon] ?? null) : null\n const on = r.id === activeReg?.id\n return (\n <button\n key={r.id}\n onClick={() => select(r.id)}\n className={cn(\n 'inline-flex items-center gap-1.5 rounded-full px-3 py-1.5 text-xs font-medium transition-colors',\n on ? 'bg-primary text-primary-foreground' : 'bg-muted text-muted-foreground hover:bg-muted/70',\n )}\n >\n {Icon && <Icon className=\"h-3.5 w-3.5\" />}\n {regLabel(r.id, r.entity.namePlural ?? r.entity.name)}\n </button>\n )\n })}\n </div>\n {activeReg?.description && (\n <p className=\"text-xs text-muted-foreground\">{regLabel(activeReg.id + '.description', activeReg.description)}</p>\n )}\n {activeReg && (\n <RegistryCrudView key={activeReg.id} registry={activeReg} basePath={`${routeBase}/_properties/${activeReg.id}`} />\n )}\n </div>\n )\n}\n\n// ---------------------------------------------------------------------------\n// Plugin settings panel\n// ---------------------------------------------------------------------------\n\nexport function PluginSettingsPanel({ title, subtitle, hideTitle, generalSettings, registries, customTabs, routeBase, hostPluginId, onClose }: {\n title: string\n subtitle?: string\n /** Hide the panel's own title heading — use when the settings shell already\n * renders the section label as the page H1 (avoids a duplicated title). */\n hideTitle?: boolean\n /** General preferences component */\n generalSettings?: React.ReactNode\n /** CRUD registries — grouped under a \"Properties\" tab */\n registries?: PluginRegistryDef[]\n /** Additional custom tabs (e.g., Pipeline config for CRM) */\n customTabs?: SettingsPanelTab[]\n /** Hash route base for CRUD sub-routing */\n routeBase: string\n /** This plugin's id — used to surface connectors addons registered for it in an Integrations tab. */\n hostPluginId?: string\n /** Called when back button is clicked. If not provided, back button is hidden. */\n onClose?: () => void\n}) {\n const { t } = useTranslation()\n\n // Connectors that addon plugins registered against this host plugin.\n const connectors = useConnectorsForPlugin(hostPluginId ?? '')\n\n // Translate registry entity name: try t('registry.{id}'), fallback to raw name\n const regLabel = (id: string, fallback: string) => {\n const key = `registry.${id}`\n const translated = t(key)\n return translated === key ? fallback : translated\n }\n\n // Standard tab list: General → custom tabs → Integrations → Properties.\n // Standard tabs carry their lucide component directly (IconComp) so they render\n // regardless of ICON_MAP; custom tabs still resolve their string icon via ICON_MAP.\n type Tab = {\n id: string; label: string; type: 'general' | 'custom' | 'integrations' | 'properties'\n icon?: string; IconComp?: React.ComponentType<{ className?: string }>\n }\n const tabs = useMemo<Tab[]>(() => {\n const list: Tab[] = []\n\n if (generalSettings) {\n list.push({ id: '_general', label: t('settings.general'), IconComp: Settings, type: 'general' })\n }\n if (customTabs) {\n for (const tab of customTabs) {\n list.push({ id: tab.id, label: tab.label, icon: tab.icon, type: 'custom' })\n }\n }\n if (connectors.length > 0) {\n list.push({ id: '_integrations', label: t('connectors.title'), IconComp: Plug, type: 'integrations' })\n }\n if (registries && registries.length > 0) {\n list.push({ id: '_properties', label: t('settings.properties'), IconComp: TableProperties, type: 'properties' })\n }\n\n return list\n }, [generalSettings, customTabs, connectors.length, registries, t])\n\n // Always use hash routing — the app router now prefix-matches /settings/*\n const useHashRouting = true\n\n function getActiveFromHash(): string {\n if (!useHashRouting) return tabs[0]?.id ?? ''\n const hash = window.location.hash.slice(1) || '/'\n if (hash.startsWith(routeBase + '/')) {\n const rest = hash.slice(routeBase.length + 1).split('/')[0]\n const match = tabs.find((t) => t.id === rest)\n if (match) return match.id\n const legacyCustom = rest.startsWith('_custom_') ? rest.slice('_custom_'.length) : null\n if (legacyCustom && tabs.find((t) => t.id === legacyCustom && t.type === 'custom')) return legacyCustom\n // Legacy/nested: a registry id (flat or under _properties) → Properties tab.\n if (registries?.some((r) => r.id === rest) && tabs.some((t) => t.id === '_properties')) return '_properties'\n }\n return tabs[0]?.id ?? ''\n }\n\n const [activeTab, setActiveTab] = useState(getActiveFromHash)\n\n React.useEffect(() => {\n if (!useHashRouting) return\n const handler = () => setActiveTab(getActiveFromHash())\n window.addEventListener('hashchange', handler)\n return () => window.removeEventListener('hashchange', handler)\n }, [routeBase, tabs, useHashRouting])\n\n function switchTab(tabId: string) {\n setActiveTab(tabId)\n if (useHashRouting) {\n window.location.hash = `${routeBase}/${tabId}`\n }\n }\n\n const activeTabDef = tabs.find((t) => t.id === activeTab) ?? tabs[0]\n const customTabContent = customTabs?.find((t) => t.id === activeTab)\n\n return (\n <div className=\"space-y-4\">\n {/* Header — the title can be hidden when the settings shell already shows\n the section label as the page H1 (prevents a duplicated heading). */}\n {(onClose || !hideTitle || subtitle) && (\n <div className=\"flex items-center gap-3\">\n {onClose && (\n <button onClick={onClose} className=\"flex h-8 w-8 items-center justify-center rounded-lg border hover:bg-muted bg-card shadow-button active:shadow-button-inset transition-colors\">\n <ChevronLeft className=\"h-4 w-4\" />\n </button>\n )}\n <div>\n {!hideTitle && <h2 className=\"text-lg font-bold\">{title}</h2>}\n {subtitle && <p className=\"text-xs text-muted-foreground\">{subtitle}</p>}\n </div>\n </div>\n )}\n\n {/* Unified tabs — underline style */}\n <div className=\"flex gap-0.5 overflow-x-auto border-b scrollbar-none\" style={{ scrollbarWidth: 'none' }}>\n {tabs.map((tab) => {\n const Icon = tab.IconComp ?? (tab.icon ? (ICON_MAP[tab.icon] ?? null) : null)\n const active = tab.id === activeTab\n return (\n <button\n key={tab.id}\n onClick={() => switchTab(tab.id)}\n className={cn(\n 'flex items-center gap-1.5 whitespace-nowrap px-3 py-2 text-sm font-medium transition-colors shrink-0 border-b-2 -mb-px',\n active\n ? 'border-primary text-foreground'\n : 'border-transparent text-muted-foreground hover:text-foreground hover:border-muted',\n )}\n >\n {Icon && <Icon className=\"h-3.5 w-3.5\" />}\n {tab.label}\n </button>\n )\n })}\n </div>\n\n {/* Content */}\n {activeTabDef?.type === 'general' && generalSettings && (\n <div>{generalSettings}</div>\n )}\n\n {activeTabDef?.type === 'custom' && customTabContent && (\n <div>{customTabContent.content}</div>\n )}\n\n {activeTabDef?.type === 'integrations' && hostPluginId && (\n <ConnectorsHub hostPluginId={hostPluginId} />\n )}\n\n {activeTabDef?.type === 'properties' && registries && registries.length > 0 && (\n <PropertiesTab registries={registries} routeBase={routeBase} regLabel={regLabel} />\n )}\n </div>\n )\n}\n","// ---------------------------------------------------------------------------\n// App factory (main entry point)\n// ---------------------------------------------------------------------------\nexport { createFayzApp, AdminProviders } from './app/admin-app'\nexport type { FayzAppConfig, AuthConfig, OrgConfig, ChatConfig, FayzBillingConfig, CustomPage, PageSection, AppSiteConfig } from './app/config'\n\n// Native admin scaffold — manifest-first entry. The 'admin' scaffold registers\n// lazily via the renderApp wrapper below (or an explicit registerAdminScaffold\n// call), so importing this barrel has no side effects.\nexport { defineSaas, AdminScaffold, registerAdminScaffold } from './app/scaffold'\nexport { deriveAgentContract } from './app/derive-contract'\nexport type { DerivedAgentSections } from './app/derive-contract'\nexport { AdminShell } from './app/AdminShell'\nexport { useNavContribution, useNavContributionsStore } from './app/nav-contributions.store'\nexport type { FayzProject, FayzProjectKind, CreateFayzProjectInput, UpdateFayzProjectInput } from './projects/types'\nexport { listFayzProjects, getDefaultFayzProject, createFayzProject, updateFayzProject, deleteFayzProject } from './projects/provider'\nexport { useFayzProjectsStore, defaultProjectOf } from './projects/store'\nexport { SeuSiteWidget } from './projects/SeuSiteWidget'\nexport { ProjectsSettings } from './projects/ProjectsSettings'\nexport { LoginPage } from './app/LoginPage'\nexport { navigateTo as adminNavigateTo, useAdminPath } from './app/routing'\n\n// Auth hook re-exported through the saas front-door so app screens (e.g. a\n// Profile page) can read the current user + signOut without depending on\n// @fayz-ai/auth directly.\nexport { useAuth } from '@fayz-ai/auth'\n\n// ---------------------------------------------------------------------------\n// CRUD engine — NATIVE code is now in ./crud (de-bridged from saas-core: the\n// full list/form/detail engine, archetype layouts, providers and store).\n// The native engine + the saas shell share runtime providers (Permissions,\n// Org), so the DEFAULT createCrudPage stays bridged until the admin shell\n// de-bridges and mounts the native providers — they co-migrate atomically.\n// The native pieces are exported here, ready for the native shell.\nexport {\n CrudPage,\n CrudListView,\n CrudFormPage,\n CrudDetailPage,\n CrudCardGrid,\n DeleteConfirmDialog,\n ImportWizard,\n exportToCSV,\n createCrudPage as createNativeCrudPage,\n CrudDetailSkeleton,\n CrudFormSkeleton,\n} from './crud'\nexport type {\n ImportRowError, CrudListViewProps, CrudFacet, CrudNavTab,\n CrudSkeletonProps, CrudFormSkeletonProps,\n} from './crud'\nexport { PermissionGate } from './permissions/PermissionGate'\nexport { WidgetSlot } from './plugins/WidgetSlot'\nexport { useFieldRules } from './hooks/useFieldRules'\n\nexport { createCrudPage } from './crud/createCrudPage'\nexport { EntityLink, registerEntityPath, getPersonPath } from './crud/archetypes/EntityLink'\n// Client-orders archetype (used by beauty-saas client detail tab)\nexport { ClientOrdersTab } from './crud/archetypes/ClientOrdersTab'\n// Shared order-detail archetype (used by plugin-shop + plugin-courses)\nexport {\n OrderDetailView, OrderDetailSkeleton, OrderDetailBlock, OrderDetailRow,\n} from './crud/archetypes/OrderDetailView'\nexport type {\n OrderDetailData, OrderDetailItem, OrderDetailTotalRow, OrderDetailBadge,\n OrderDetailReceivable, OrderDetailInstallment, OrderDetailTone,\n} from './crud/archetypes/OrderDetailView'\n// Shared order-FORM archetype — o par do detalhe, usado pelo orçamento (CRM) e\n// pela fatura (Financeiro) para que criar e ler o documento tenham a mesma cara.\nexport {\n OrderFormView, OrderFormSkeleton, OrderFormBlock, OrderFormItemsCard,\n OrderFormItemRow, OrderFormAddItemStep,\n} from './crud/archetypes/OrderFormView'\nexport type {\n OrderFormViewProps, OrderFormItemsCardProps, OrderFormItemRowProps,\n OrderFormItemValue, OrderFormItemType, OrderFormItemLabels,\n} from './crud/archetypes/OrderFormView'\n// Shared order-list archetype (used by plugin-shop + plugin-courses)\nexport { OrderListView } from './crud/archetypes/OrderListView'\nexport type { OrderListColumn, OrderListStat, OrderListViewProps } from './crud/archetypes/OrderListView'\nexport type { ClientOrdersProvider, ClientOrdersQuery, ClientOrdersNavigator, ClientDocument, ClientDocumentStage, ClientOrdersStageFilter } from './types/client-orders'\nexport { createClientOrdersProvider } from './lib/create-client-orders-provider'\n\n// ---------------------------------------------------------------------------\n// Archetype lookup\n// ---------------------------------------------------------------------------\nexport { createArchetypeLookup } from './crud/archetype-lookup'\nexport type { EntityLookup, EntityLookupResult, EntityLookupMap, ArchetypeType } from './crud/archetype-lookup'\n\n// ---------------------------------------------------------------------------\n// Supabase client\n// ---------------------------------------------------------------------------\nexport {\n createFayzSupabaseClient,\n getFayzSupabaseClient,\n getFayzSupabaseClientOptional,\n} from './data/client'\n\n// ---------------------------------------------------------------------------\n// Org / multi-tenancy\n// ---------------------------------------------------------------------------\nexport {\n // Adapters\n createSupabaseOrgAdapter,\n createMockOrgAdapter,\n // Store\n useOrganizationStore,\n getPersistedOrgId,\n // Bootstrap cache\n ORG_CACHE_TTL_MS,\n readOrgSnapshot,\n clearOrgSnapshot,\n // Context & hooks\n OrgProvider,\n useTenant,\n useTenantOptional,\n useOrgAdapter,\n useOrgAdapterOptional,\n} from './org/index'\nexport type {\n SupabaseOrgAdapterConfig,\n OrgStore,\n OrgSnapshot,\n OrgProviderProps,\n TenantContext,\n} from './org/index'\n\n// ---------------------------------------------------------------------------\n// Permissions\n// ---------------------------------------------------------------------------\nexport {\n usePermissionsStore,\n PermissionsProvider,\n usePermission,\n usePermissionOptional,\n useHasPermission,\n usePermissions,\n} from './permissions/index'\nexport type { PermissionsStore, PermissionsProviderProps } from './permissions/index'\n\n// ---------------------------------------------------------------------------\n// Access engine — role × plan decision, quantity limits, upgrade modal store\n// ---------------------------------------------------------------------------\nexport {\n AccessProvider,\n useAccess,\n useAccessOptional,\n useLimit,\n useLimitGuard,\n useModuleNavAccess,\n resolveAccess,\n isEntitledByPlan,\n invalidateLimit,\n useUpgradeModalStore,\n getAccessSnapshot,\n checkAccess,\n guardLimit,\n agentDenial,\n UPGRADE_URL,\n} from './access/index'\nexport type {\n AccessProviderProps,\n AccessApi,\n AccessDecision,\n AccessSession,\n DenyReason,\n LimitState,\n UpgradeModalPayload,\n UpgradeModalStore,\n AgentDenial,\n AgentDenialLimit,\n AgentGuardResult,\n} from './access/index'\n\n// ---------------------------------------------------------------------------\n// Billing\n// ---------------------------------------------------------------------------\nexport { useBillingStore } from './billing/index'\nexport { EntitlementGate, LimitGate } from './components/billing/gates'\n\n// Connect — the consent screen an external agent sends the user to, and the\n// settings tab where those approvals can be withdrawn.\nexport { ConnectConsentPage, ConnectorsTab } from './components/connect'\nexport type { ConnectConsentPageProps } from './components/connect'\nexport { UpgradePrompt } from './components/billing/UpgradePrompt'\nexport type { UpgradePromptProps } from './components/billing/UpgradePrompt'\nexport type { BillingStore, BillingState, Subscription, Invoice } from './billing/index'\n\n// ---------------------------------------------------------------------------\n// Re-export commonly needed @fayz-ai/core types so consumers can import\n// everything from a single package when building on top of @fayz-ai/admin\n// ---------------------------------------------------------------------------\nexport type {\n // Org\n Organization,\n OrgMember,\n OrgMembership,\n OrgAdapter,\n Location,\n Invite,\n CreateOrgOptions,\n // Auth\n AuthAdapter,\n AuthUser,\n AuthSession,\n // Permissions\n PermissionsConfig,\n FeatureDeclaration,\n PermissionAction,\n PermissionProfile,\n // Plugins\n PluginManifest,\n PluginScope,\n PluginRuntime,\n // Theme\n ThemeMode,\n ThemeBrand,\n ThemeRadius,\n // i18n\n LocaleConfig,\n // Billing\n BillingConfig,\n Plan,\n // Entities / connectors\n EntityDef,\n ConnectorDefinition,\n // Entity field contracts — apps declaring their own entities need these to\n // type the field/group/tab literals. Without them on the front door apps\n // re-declare the shapes locally (beauty's old src/types/sdk-contract.ts).\n FieldDef,\n FieldType,\n FieldGroup,\n FieldRelation,\n DetailTab,\n FormLayout,\n EntityImageConfig,\n ComputedFieldValue,\n} from '@fayz-ai/core'\n\n// Commonly needed @fayz-ai/core *runtime* helpers, re-exported so apps built on\n// top of @fayz-ai/admin can import them from the single front-door package.\n// renderApp is wrapped (not re-exported) so the 'admin' scaffold registers on\n// first render instead of at import time — keeps the barrel side-effect-free.\nimport { renderApp as coreRenderApp } from '@fayz-ai/core'\nimport { registerAdminScaffold } from './app/scaffold'\n\nexport const renderApp: typeof coreRenderApp = (...args) => {\n registerAdminScaffold()\n return coreRenderApp(...args)\n}\n\nexport {\n getSupabaseClientOptional,\n getActiveTenantId,\n useActiveTenantId,\n setCurrentLocale,\n preloadLocale,\n getCurrentLocale,\n getActiveLocale,\n tl,\n resolveBackendEnv,\n createSafeDataProvider,\n formatDate,\n formatDateTime,\n} from '@fayz-ai/core'\n\n// Base SDK client + table-query contracts, surfaced through the saas front door.\nexport { fayz } from '@fayz-ai/sdk'\nexport type { FayzTableFilter } from '@fayz-ai/sdk'\n\n// ---------------------------------------------------------------------------\n// Page helpers\n// ---------------------------------------------------------------------------\nexport { createPlaceholder } from './crud/placeholder'\n\n// Plugin framework UI (used by plugins + the shell)\nexport { SettingsGroup, ToggleRow, SelectRow } from './plugins/SettingsGroup'\nexport { QuickActionsButton } from './plugins/QuickActionsButton'\nexport { ModuleActionBar } from './plugins/ModuleActionBar'\nexport { createPluginContext, type PluginContextApi } from './plugins/createPluginContext'\nexport { createViewRouter, parseViewId, type ViewRoute } from './plugins/createViewRouter'\nexport { formatCurrency, type CurrencyConfig } from './lib/currency'\nexport { PluginRegistryManager } from './plugins/PluginRegistryManager'\nexport { useModuleNavigation } from './hooks/useModuleNavigation'\nexport { PersonLink } from './components/shared/PersonLink'\nexport { ContactPicker } from './components/shared/ContactPicker'\nexport type { ContactPickerProps, ContactPickerValue } from './components/shared/ContactPicker'\nexport { createPerson } from './components/shared/create-person'\nexport type { CreatePersonInput, CreatedPerson } from './components/shared/create-person'\nexport { resolveEntityHref, resolveEntityAnchor, openEntity } from './lib/entity-routes'\nexport { usePluginPrefs } from './hooks/usePluginPrefs'\nexport { useTenantPluginSettings } from './hooks/useTenantPluginSettings'\nexport type { TenantPluginSettings } from './hooks/useTenantPluginSettings'\nexport { setScheduleBlockConfig, getScheduleBlockConfig, subscribeScheduleBlockConfig } from './lib/schedule-config'\n\n// Assistant chat store — lets apps drive the shell's chat panel imperatively\n// (e.g. an \"Ask the assistant\" CTA calling useChatStore().setOpen(true)). The\n// store is a shared zustand singleton, so app + shell read the same instance.\nexport { useChatStore } from './stores/chat.store'\nexport type { ChatMessage } from './stores/chat.store'\n\n// Agent Surface Contract — a mounted screen publishes what's on it (a form\n// draft, the open record) plus tools that act on that live state, so the\n// assistant can help IN CONTEXT. Plugins call useAgentSurface from their\n// interactive views. See lib/agent-surface.ts.\nexport { useAgentSurface } from './hooks/useAgentSurface'\nexport type {\n AgentSurfaceContribution,\n AgentSurfaceTool,\n AgentSurfaceSnapshot,\n} from './lib/agent-surface'\n\n// The project's connection to the Fayz platform — the same one the assistant\n// uses. Exported because the assistant is not the only thing that needs the\n// platform: a plugin that has to transcribe audio or generate a document needs\n// a model WITHOUT holding a provider key, and the answer to that is the same\n// broker, reached the same way. Resolving it here instead of letting each\n// plugin re-read `import.meta.env` is what keeps a `chat.agent` override\n// working for every caller at once.\nexport { resolveFayzAgentConnection, getFayzAgentClient } from './lib/fayz-agent'\nexport type {\n FayzAgentConnectionConfig,\n ResolvedFayzAgentConnection,\n} from './lib/fayz-agent'\n\n// The conversation with no box around it — for an app building its own\n// assistant surface (a page, a modal, a second rail) on the shell's engine.\nexport { ChatConversation } from './components/chat'\nexport type { ChatConversationProps } from './components/chat'\n\n// Right rail — the shell's shared companion column. A plugin registers a panel\n// (`useRightRailPanel`) and drives it (`useRightRailStore().togglePanel`);\n// `mounted` says whether a shell able to render it is actually present.\nexport { useRightRailPanel, useRightRailStore, useHasRightRail } from './components/right-rail'\nexport type { RightRailPanelDef } from './components/right-rail'\nexport { registerNotesTasksAdapter, useNotesTasksBridge, NOTE_LABEL_PREFIX } from './lib/notes-tasks-bridge'\nexport { useDelegateToAssistant } from './lib/assistant-delegation'\nexport type { NotesTasksAdapter, NoteTodo } from './lib/notes-tasks-bridge'\n\n// Shell plugin-settings panel + dedup util (used by vertical plugins)\nexport { PluginSettingsPanel } from './components/plugins/PluginSettingsPanel'\nexport { ConnectorsHub } from './components/plugins/ConnectorsHub'\nexport { dedup } from './lib/dedup'\n\n// Full admin theme type (the shell's theme system, richer than @fayz-ai/core's).\nexport type { SaasTheme } from './theme/tokens'\nexport type { CreateThemeOptions } from './theme/utils'\nexport { createFayzTheme, fayzThemePresets } from '@fayz-ai/ui'\nexport type { FayzThemePresetId } from '@fayz-ai/ui'\n"]}
|