@fayz-ai/admin 0.47.0 → 0.48.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.
Files changed (355) hide show
  1. package/dist/ImportWizard-SYP3OXZU.js +3 -0
  2. package/dist/{ImportWizard-7UFB2PPF.js.map → ImportWizard-SYP3OXZU.js.map} +1 -1
  3. package/dist/PersonTimeline-X7JTPUWJ.js +3 -0
  4. package/dist/PersonTimeline-X7JTPUWJ.js.map +1 -0
  5. package/dist/ScheduleEditor-BXWJ7CMI.js +6 -0
  6. package/dist/{ScheduleEditor-MNHZCQIG.js.map → ScheduleEditor-BXWJ7CMI.js.map} +1 -1
  7. package/dist/SubscriptionPage-VBDDRSVW.js +8 -0
  8. package/dist/{SubscriptionPage-JWWS44SE.js.map → SubscriptionPage-VBDDRSVW.js.map} +1 -1
  9. package/dist/access/ModuleUnavailable.d.ts +14 -0
  10. package/dist/access/ModuleUnavailable.d.ts.map +1 -0
  11. package/dist/access/context.d.ts.map +1 -1
  12. package/dist/access/useModuleAccess.d.ts +11 -0
  13. package/dist/access/useModuleAccess.d.ts.map +1 -0
  14. package/dist/app/AdminShell.d.ts +1 -1
  15. package/dist/app/AdminShell.d.ts.map +1 -1
  16. package/dist/app/OfflineBoot.d.ts.map +1 -1
  17. package/dist/app/admin-app.d.ts +1 -1
  18. package/dist/app/admin-app.d.ts.map +1 -1
  19. package/dist/app/config.d.ts +3 -3
  20. package/dist/app/config.d.ts.map +1 -1
  21. package/dist/app/rail-preset.d.ts.map +1 -1
  22. package/dist/billing/TrialWidget.d.ts.map +1 -1
  23. package/dist/billing/ai-usage.d.ts +67 -0
  24. package/dist/billing/ai-usage.d.ts.map +1 -0
  25. package/dist/billing/index.d.ts +2 -0
  26. package/dist/billing/index.d.ts.map +1 -1
  27. package/dist/billing/index.js +3 -2
  28. package/dist/billing/module-families.d.ts +25 -0
  29. package/dist/billing/module-families.d.ts.map +1 -0
  30. package/dist/billing/module-pricing.d.ts +199 -0
  31. package/dist/billing/module-pricing.d.ts.map +1 -0
  32. package/dist/{chunk-IUCDHAAB.js → chunk-2Q6QHTZV.js} +13 -78
  33. package/dist/chunk-2Q6QHTZV.js.map +1 -0
  34. package/dist/{chunk-46UABOOC.js → chunk-5GCC7YCE.js} +40 -39
  35. package/dist/chunk-5GCC7YCE.js.map +1 -0
  36. package/dist/{chunk-WXNTUCX3.js → chunk-E4MESMNR.js} +10 -4
  37. package/dist/chunk-E4MESMNR.js.map +1 -0
  38. package/dist/chunk-F346TYKO.js +1448 -0
  39. package/dist/chunk-F346TYKO.js.map +1 -0
  40. package/dist/chunk-GZWX4ZIK.js +111 -0
  41. package/dist/chunk-GZWX4ZIK.js.map +1 -0
  42. package/dist/{chunk-OINP2UYL.js → chunk-KVIINVY6.js} +133 -169
  43. package/dist/chunk-KVIINVY6.js.map +1 -0
  44. package/dist/chunk-OEY3V6J3.js +581 -0
  45. package/dist/chunk-OEY3V6J3.js.map +1 -0
  46. package/dist/{chunk-V2IBAF4O.js → chunk-ZMP52ZHM.js} +23 -83
  47. package/dist/chunk-ZMP52ZHM.js.map +1 -0
  48. package/dist/components/RightRail.d.ts.map +1 -1
  49. package/dist/components/auth/CenteredLogin.d.ts +1 -1
  50. package/dist/components/auth/CenteredLogin.d.ts.map +1 -1
  51. package/dist/components/auth/LoginForm.d.ts +1 -1
  52. package/dist/components/auth/LoginForm.d.ts.map +1 -1
  53. package/dist/components/auth/LoginPage.d.ts +1 -1
  54. package/dist/components/auth/LoginPage.d.ts.map +1 -1
  55. package/dist/components/auth/OAuthButtons.d.ts +1 -1
  56. package/dist/components/auth/OAuthButtons.d.ts.map +1 -1
  57. package/dist/components/auth/ProtectedRoute.d.ts +1 -1
  58. package/dist/components/auth/ProtectedRoute.d.ts.map +1 -1
  59. package/dist/components/auth/RecoveryForm.d.ts.map +1 -1
  60. package/dist/components/auth/SignupForm.d.ts.map +1 -1
  61. package/dist/components/auth/SplitLogin.d.ts +1 -1
  62. package/dist/components/auth/SplitLogin.d.ts.map +1 -1
  63. package/dist/components/billing/AiUsageSection.d.ts +16 -0
  64. package/dist/components/billing/AiUsageSection.d.ts.map +1 -0
  65. package/dist/components/billing/InvoiceList.d.ts +1 -1
  66. package/dist/components/billing/InvoiceList.d.ts.map +1 -1
  67. package/dist/components/billing/PlanCheckoutSheet.d.ts +24 -0
  68. package/dist/components/billing/PlanCheckoutSheet.d.ts.map +1 -0
  69. package/dist/components/billing/PlanSelector.d.ts +1 -1
  70. package/dist/components/billing/PlanSelector.d.ts.map +1 -1
  71. package/dist/components/billing/PricingOverview.d.ts +20 -0
  72. package/dist/components/billing/PricingOverview.d.ts.map +1 -0
  73. package/dist/components/billing/SoftLimitWidget.d.ts.map +1 -1
  74. package/dist/components/billing/SubscriptionCard.d.ts +1 -1
  75. package/dist/components/billing/SubscriptionCard.d.ts.map +1 -1
  76. package/dist/components/billing/SubscriptionPage.d.ts.map +1 -1
  77. package/dist/components/billing/UpgradePrompt.d.ts.map +1 -1
  78. package/dist/components/billing/access-contract.d.ts +5 -3
  79. package/dist/components/billing/access-contract.d.ts.map +1 -1
  80. package/dist/components/billing/plan-feature.d.ts.map +1 -1
  81. package/dist/components/chat/AssistantActivityBar.d.ts.map +1 -1
  82. package/dist/components/chat/AssistantInvite.d.ts.map +1 -1
  83. package/dist/components/chat/AssistantRecordingView.d.ts.map +1 -1
  84. package/dist/components/chat/ChatAttachments.d.ts.map +1 -1
  85. package/dist/components/chat/ChatComposer.d.ts.map +1 -1
  86. package/dist/components/chat/ChatConversation.d.ts.map +1 -1
  87. package/dist/components/chat/ChatFab.d.ts.map +1 -1
  88. package/dist/components/chat/ChatHistory.d.ts.map +1 -1
  89. package/dist/components/chat/ChatMessages.d.ts.map +1 -1
  90. package/dist/components/chat/ChatSuggestions.d.ts.map +1 -1
  91. package/dist/components/chat/ChoiceCard.d.ts.map +1 -1
  92. package/dist/components/chat/ConfirmActionCard.d.ts.map +1 -1
  93. package/dist/components/chat/ConnectorSuggestionCard.d.ts.map +1 -1
  94. package/dist/components/chat/RecordChip.d.ts.map +1 -1
  95. package/dist/components/chat/TourCoachCard.d.ts.map +1 -1
  96. package/dist/components/connect/AddConnectorPanel.d.ts.map +1 -1
  97. package/dist/components/connect/ConnectConsentPage.d.ts.map +1 -1
  98. package/dist/components/connect/ConnectorDetail.d.ts.map +1 -1
  99. package/dist/components/connect/ConnectorRow.d.ts.map +1 -1
  100. package/dist/components/connect/ConnectorSyncActions.d.ts.map +1 -1
  101. package/dist/components/connect/ConnectorsPanel.d.ts.map +1 -1
  102. package/dist/components/layout/BottomNav.d.ts.map +1 -1
  103. package/dist/components/notifications/NotificationInbox.d.ts +1 -1
  104. package/dist/components/notifications/NotificationInbox.d.ts.map +1 -1
  105. package/dist/components/notifications/UpdateReady.d.ts.map +1 -1
  106. package/dist/components/organization/PermissionMatrixEditor.d.ts.map +1 -1
  107. package/dist/components/organization/PermissionProfilesTab.d.ts.map +1 -1
  108. package/dist/components/organization/TeamTab.d.ts.map +1 -1
  109. package/dist/components/plugins/ConnectorsHub.d.ts.map +1 -1
  110. package/dist/components/plugins/PluginSettingsPanel.d.ts.map +1 -1
  111. package/dist/components/settings/AddModulesPanel.d.ts.map +1 -1
  112. package/dist/components/settings/BrandingSettings.d.ts.map +1 -1
  113. package/dist/components/settings/CompanySettings.d.ts +1 -1
  114. package/dist/components/settings/CompanySettings.d.ts.map +1 -1
  115. package/dist/components/settings/ConnectedCompanySettings.d.ts.map +1 -1
  116. package/dist/components/settings/ConnectedFieldRulesSettings.d.ts.map +1 -1
  117. package/dist/components/settings/ConnectedModulesSettings.d.ts.map +1 -1
  118. package/dist/components/settings/ConnectedSecuritySettings.d.ts.map +1 -1
  119. package/dist/components/settings/FieldRulesEditor.d.ts +12 -0
  120. package/dist/components/settings/FieldRulesEditor.d.ts.map +1 -0
  121. package/dist/components/settings/FieldRulesSettings.d.ts.map +1 -1
  122. package/dist/components/settings/HolidaysSettings.d.ts.map +1 -1
  123. package/dist/components/settings/ModuleCard.d.ts +18 -3
  124. package/dist/components/settings/ModuleCard.d.ts.map +1 -1
  125. package/dist/components/settings/ModuleFamilyBits.d.ts +4 -0
  126. package/dist/components/settings/ModuleFamilyBits.d.ts.map +1 -0
  127. package/dist/components/settings/ModulesSettings.d.ts +3 -1
  128. package/dist/components/settings/ModulesSettings.d.ts.map +1 -1
  129. package/dist/components/settings/SecuritySettings.d.ts +1 -1
  130. package/dist/components/settings/SecuritySettings.d.ts.map +1 -1
  131. package/dist/components/settings/SettingsPage.d.ts +19 -0
  132. package/dist/components/settings/SettingsPage.d.ts.map +1 -1
  133. package/dist/components/settings/UserProfile.d.ts +1 -1
  134. package/dist/components/settings/UserProfile.d.ts.map +1 -1
  135. package/dist/components/settings/module-links.d.ts +10 -0
  136. package/dist/components/settings/module-links.d.ts.map +1 -0
  137. package/dist/components/settings/module-scope.d.ts +28 -0
  138. package/dist/components/settings/module-scope.d.ts.map +1 -0
  139. package/dist/components/settings/settings-focus.d.ts +17 -0
  140. package/dist/components/settings/settings-focus.d.ts.map +1 -0
  141. package/dist/components/settings/settings-parents.d.ts +11 -0
  142. package/dist/components/settings/settings-parents.d.ts.map +1 -0
  143. package/dist/components/settings/settings-sections.d.ts +56 -0
  144. package/dist/components/settings/settings-sections.d.ts.map +1 -0
  145. package/dist/components/settings/settings-shortcuts.d.ts +7 -0
  146. package/dist/components/settings/settings-shortcuts.d.ts.map +1 -0
  147. package/dist/components/settings/settings-subtabs.d.ts +14 -0
  148. package/dist/components/settings/settings-subtabs.d.ts.map +1 -0
  149. package/dist/components/shared/ContactPicker.d.ts.map +1 -1
  150. package/dist/components/shared/PersonLink.d.ts.map +1 -1
  151. package/dist/components/shared/RecordPickerModal.d.ts.map +1 -1
  152. package/dist/components/survey/PublicSurveyPage.d.ts.map +1 -1
  153. package/dist/crud/CrudDetailPage.d.ts.map +1 -1
  154. package/dist/crud/CrudFormPage.d.ts.map +1 -1
  155. package/dist/crud/CrudListView.d.ts.map +1 -1
  156. package/dist/crud/CrudPage.d.ts.map +1 -1
  157. package/dist/crud/EntityOverview.d.ts.map +1 -1
  158. package/dist/crud/ImportWizard.d.ts.map +1 -1
  159. package/dist/crud/InlineField.d.ts +36 -0
  160. package/dist/crud/InlineField.d.ts.map +1 -0
  161. package/dist/crud/LookupCreateInline.d.ts.map +1 -1
  162. package/dist/crud/RelatedSection.d.ts.map +1 -1
  163. package/dist/crud/TagsField.d.ts.map +1 -1
  164. package/dist/crud/archetypes/AccessTab.d.ts.map +1 -1
  165. package/dist/crud/archetypes/ActiveToggle.d.ts.map +1 -1
  166. package/dist/crud/archetypes/AddressFormModal.d.ts +34 -0
  167. package/dist/crud/archetypes/AddressFormModal.d.ts.map +1 -0
  168. package/dist/crud/archetypes/AddressesTab.d.ts +2 -20
  169. package/dist/crud/archetypes/AddressesTab.d.ts.map +1 -1
  170. package/dist/crud/archetypes/ArchetypeStatusBar.d.ts.map +1 -1
  171. package/dist/crud/archetypes/BlockSettingsPopover.d.ts +1 -1
  172. package/dist/crud/archetypes/BlockSettingsPopover.d.ts.map +1 -1
  173. package/dist/crud/archetypes/ClientOrdersTab.d.ts.map +1 -1
  174. package/dist/crud/archetypes/KanbanBoard.d.ts.map +1 -1
  175. package/dist/crud/archetypes/LocationFormLayout.d.ts.map +1 -1
  176. package/dist/crud/archetypes/OrderBoardView.d.ts.map +1 -1
  177. package/dist/crud/archetypes/OrderCreateScreen.d.ts +3 -1
  178. package/dist/crud/archetypes/OrderCreateScreen.d.ts.map +1 -1
  179. package/dist/crud/archetypes/OrderDetailPage.d.ts.map +1 -1
  180. package/dist/crud/archetypes/OrderDetailRail.d.ts.map +1 -1
  181. package/dist/crud/archetypes/OrderFormView.d.ts.map +1 -1
  182. package/dist/crud/archetypes/PayeeAccountsSection.d.ts.map +1 -1
  183. package/dist/crud/archetypes/PaymentStatusBadge.d.ts.map +1 -1
  184. package/dist/crud/archetypes/PersonPicker.d.ts.map +1 -1
  185. package/dist/crud/archetypes/ScheduleDateExceptions.d.ts.map +1 -1
  186. package/dist/crud/archetypes/ScheduleGridPanel.d.ts.map +1 -1
  187. package/dist/crud/fieldToColumn.d.ts.map +1 -1
  188. package/dist/db.cjs +831 -5
  189. package/dist/db.d.ts +2 -1
  190. package/dist/db.d.ts.map +1 -1
  191. package/dist/db.js +1 -1
  192. package/dist/directory/AppSwitcher.d.ts.map +1 -1
  193. package/dist/handbook/NotebookPanel.d.ts.map +1 -1
  194. package/dist/hooks/useAITools.d.ts.map +1 -1
  195. package/dist/hooks/useAuth.d.ts +3 -3
  196. package/dist/hooks/useAuth.d.ts.map +1 -1
  197. package/dist/hooks/useChat.d.ts.map +1 -1
  198. package/dist/hooks/useFieldRules.d.ts +4 -2
  199. package/dist/hooks/useFieldRules.d.ts.map +1 -1
  200. package/dist/hooks/useFormatters.d.ts.map +1 -1
  201. package/dist/hooks/useGlobalSearch.d.ts.map +1 -1
  202. package/dist/hooks/useLayout.d.ts.map +1 -1
  203. package/dist/hooks/useNotifications.d.ts +1 -1
  204. package/dist/hooks/useNotifications.d.ts.map +1 -1
  205. package/dist/hooks/useTenant.d.ts +2 -2
  206. package/dist/hooks/useTenant.d.ts.map +1 -1
  207. package/dist/hooks/useTenantPlugins.d.ts +1 -1
  208. package/dist/impersonation/ImpersonationBanner.d.ts.map +1 -1
  209. package/dist/index.d.ts +48 -8
  210. package/dist/index.d.ts.map +1 -1
  211. package/dist/index.js +4945 -4555
  212. package/dist/index.js.map +1 -1
  213. package/dist/lib/currency.d.ts +6 -0
  214. package/dist/lib/currency.d.ts.map +1 -1
  215. package/dist/lib/field-rules-db.d.ts +36 -0
  216. package/dist/lib/field-rules-db.d.ts.map +1 -0
  217. package/dist/onboarding/ActivationProvider.d.ts.map +1 -1
  218. package/dist/onboarding/activation.store.d.ts +1 -1
  219. package/dist/onboarding/activation.store.d.ts.map +1 -1
  220. package/dist/onboarding/checklist.d.ts +1 -1
  221. package/dist/onboarding/checklist.d.ts.map +1 -1
  222. package/dist/onboarding/tasks.d.ts +1 -1
  223. package/dist/onboarding/tasks.d.ts.map +1 -1
  224. package/dist/org/WorkspaceChooser.d.ts.map +1 -1
  225. package/dist/org/WorkspaceUnitSheet.d.ts.map +1 -1
  226. package/dist/org/adapters/supabase.d.ts +1 -0
  227. package/dist/org/adapters/supabase.d.ts.map +1 -1
  228. package/dist/org/index.js +2 -2
  229. package/dist/permissions/v1-catalog.d.ts +16 -0
  230. package/dist/permissions/v1-catalog.d.ts.map +1 -0
  231. package/dist/plugins/PluginRegistryManager.d.ts.map +1 -1
  232. package/dist/plugins/QuickActionsButton.d.ts.map +1 -1
  233. package/dist/plugins/SettingsGroup.d.ts +12 -4
  234. package/dist/plugins/SettingsGroup.d.ts.map +1 -1
  235. package/dist/plugins/WidgetSlot.d.ts.map +1 -1
  236. package/dist/projects/ProjectsSettings.d.ts.map +1 -1
  237. package/dist/projects/SeuSiteWidget.d.ts.map +1 -1
  238. package/dist/settings/MessageTemplateRow.d.ts +16 -0
  239. package/dist/settings/MessageTemplateRow.d.ts.map +1 -0
  240. package/dist/settings/SettingsForm.d.ts +60 -0
  241. package/dist/settings/SettingsForm.d.ts.map +1 -0
  242. package/dist/settings/UnitScopePicker.d.ts +22 -0
  243. package/dist/settings/UnitScopePicker.d.ts.map +1 -0
  244. package/dist/settings/core-v1-tabs.d.ts +8 -0
  245. package/dist/settings/core-v1-tabs.d.ts.map +1 -0
  246. package/dist/settings/defineSettingsTab.d.ts +17 -0
  247. package/dist/settings/defineSettingsTab.d.ts.map +1 -0
  248. package/dist/settings/registry-parent.d.ts +8 -0
  249. package/dist/settings/registry-parent.d.ts.map +1 -0
  250. package/dist/settings/useSettingKeys.d.ts +28 -0
  251. package/dist/settings/useSettingKeys.d.ts.map +1 -0
  252. package/dist/stores/auth.store.d.ts +1 -1
  253. package/dist/stores/auth.store.d.ts.map +1 -1
  254. package/dist/stores/notifications.store.d.ts +1 -1
  255. package/dist/stores/notifications.store.d.ts.map +1 -1
  256. package/dist/stores/tenant.store.d.ts +1 -1
  257. package/dist/stores/tenant.store.d.ts.map +1 -1
  258. package/dist/tasks/TasksPanel.d.ts +4 -0
  259. package/dist/tasks/TasksPanel.d.ts.map +1 -0
  260. package/dist/tasks/TasksRailPanel.d.ts.map +1 -1
  261. package/dist/tasks/index.d.ts +15 -14
  262. package/dist/tasks/index.d.ts.map +1 -1
  263. package/dist/timeline/PersonTimeline.d.ts +1 -0
  264. package/dist/timeline/PersonTimeline.d.ts.map +1 -1
  265. package/dist/types/billing.d.ts +2 -0
  266. package/dist/types/billing.d.ts.map +1 -1
  267. package/dist/types/plugins.d.ts +2 -0
  268. package/dist/types/plugins.d.ts.map +1 -1
  269. package/dist/ui.d.ts +2 -1
  270. package/dist/ui.d.ts.map +1 -1
  271. package/dist/ui.js +1 -1
  272. package/dist/units/MemberUnitsCell.d.ts.map +1 -1
  273. package/dist/units/UnitMembersTab.d.ts.map +1 -1
  274. package/dist/units/UnitSwitcher.d.ts.map +1 -1
  275. package/package.json +7 -7
  276. package/dist/ImportWizard-7UFB2PPF.js +0 -3
  277. package/dist/ScheduleEditor-MNHZCQIG.js +0 -6
  278. package/dist/SubscriptionPage-JWWS44SE.js +0 -9
  279. package/dist/access/index.d.ts +0 -12
  280. package/dist/access/index.d.ts.map +0 -1
  281. package/dist/access/resolver.d.ts +0 -2
  282. package/dist/access/resolver.d.ts.map +0 -1
  283. package/dist/app/LoginPage.d.ts +0 -3
  284. package/dist/app/LoginPage.d.ts.map +0 -1
  285. package/dist/chunk-46UABOOC.js.map +0 -1
  286. package/dist/chunk-IUCDHAAB.js.map +0 -1
  287. package/dist/chunk-OINP2UYL.js.map +0 -1
  288. package/dist/chunk-QOS6UAQ4.js +0 -54
  289. package/dist/chunk-QOS6UAQ4.js.map +0 -1
  290. package/dist/chunk-V2IBAF4O.js.map +0 -1
  291. package/dist/chunk-VH4LLIMH.js +0 -531
  292. package/dist/chunk-VH4LLIMH.js.map +0 -1
  293. package/dist/chunk-WXNTUCX3.js.map +0 -1
  294. package/dist/components/auth/index.d.ts +0 -7
  295. package/dist/components/auth/index.d.ts.map +0 -1
  296. package/dist/components/layout/index.d.ts +0 -6
  297. package/dist/components/layout/index.d.ts.map +0 -1
  298. package/dist/components/notifications/index.d.ts +0 -5
  299. package/dist/components/notifications/index.d.ts.map +0 -1
  300. package/dist/components/organization/index.d.ts +0 -5
  301. package/dist/components/organization/index.d.ts.map +0 -1
  302. package/dist/components/settings/index.d.ts +0 -11
  303. package/dist/components/settings/index.d.ts.map +0 -1
  304. package/dist/crud/index.d.ts +0 -18
  305. package/dist/crud/index.d.ts.map +0 -1
  306. package/dist/hooks/index.d.ts +0 -20
  307. package/dist/hooks/index.d.ts.map +0 -1
  308. package/dist/lib/format.d.ts +0 -7
  309. package/dist/lib/format.d.ts.map +0 -1
  310. package/dist/lib/plugins.d.ts +0 -2
  311. package/dist/lib/plugins.d.ts.map +0 -1
  312. package/dist/stores/billing.store.d.ts +0 -2
  313. package/dist/stores/billing.store.d.ts.map +0 -1
  314. package/dist/stores/index.d.ts +0 -13
  315. package/dist/stores/index.d.ts.map +0 -1
  316. package/dist/stores/layout.store.d.ts +0 -2
  317. package/dist/stores/layout.store.d.ts.map +0 -1
  318. package/dist/stores/permissions.store.d.ts +0 -2
  319. package/dist/stores/permissions.store.d.ts.map +0 -1
  320. package/dist/tasks/components/TaskCard.d.ts +0 -11
  321. package/dist/tasks/components/TaskCard.d.ts.map +0 -1
  322. package/dist/tasks/components/TaskDetail.d.ts +0 -5
  323. package/dist/tasks/components/TaskDetail.d.ts.map +0 -1
  324. package/dist/tasks/components/TaskLabelBadge.d.ts +0 -9
  325. package/dist/tasks/components/TaskLabelBadge.d.ts.map +0 -1
  326. package/dist/tasks/components/TaskPriorityBadge.d.ts +0 -7
  327. package/dist/tasks/components/TaskPriorityBadge.d.ts.map +0 -1
  328. package/dist/tasks/components/TaskQuickAdd.d.ts +0 -5
  329. package/dist/tasks/components/TaskQuickAdd.d.ts.map +0 -1
  330. package/dist/tasks/components/TaskSourceBadge.d.ts +0 -5
  331. package/dist/tasks/components/TaskSourceBadge.d.ts.map +0 -1
  332. package/dist/tasks/components/TaskStatusGroup.d.ts +0 -17
  333. package/dist/tasks/components/TaskStatusGroup.d.ts.map +0 -1
  334. package/dist/tasks/components/TasksFilterBar.d.ts +0 -3
  335. package/dist/tasks/components/TasksFilterBar.d.ts.map +0 -1
  336. package/dist/tasks/components/TasksPanel.d.ts +0 -14
  337. package/dist/tasks/components/TasksPanel.d.ts.map +0 -1
  338. package/dist/tasks/data/mock.d.ts +0 -3
  339. package/dist/tasks/data/mock.d.ts.map +0 -1
  340. package/dist/tasks/data/supabase.d.ts +0 -3
  341. package/dist/tasks/data/supabase.d.ts.map +0 -1
  342. package/dist/tasks/entity.d.ts +0 -11
  343. package/dist/tasks/entity.d.ts.map +0 -1
  344. package/dist/tasks/store.d.ts +0 -34
  345. package/dist/tasks/store.d.ts.map +0 -1
  346. package/dist/tasks/types.d.ts +0 -89
  347. package/dist/tasks/types.d.ts.map +0 -1
  348. package/dist/theme/index.d.ts +0 -8
  349. package/dist/theme/index.d.ts.map +0 -1
  350. package/dist/timeline/index.d.ts +0 -7
  351. package/dist/timeline/index.d.ts.map +0 -1
  352. package/dist/timeline-LECYQ4IA.js +0 -3
  353. package/dist/timeline-LECYQ4IA.js.map +0 -1
  354. package/dist/types/index.d.ts +0 -16
  355. package/dist/types/index.d.ts.map +0 -1
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/billing/store.ts","../src/billing/trial.ts","../src/billing/module-pricing.ts","../src/billing/ai-usage.ts"],"names":["paidPlanIds","named","units","React2"],"mappings":"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","file":"chunk-OEY3V6J3.js","sourcesContent":["import { create } from 'zustand'\nimport type { Plan, BillingCheckoutFn } from '@fayz-ai/core'\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\nexport interface Subscription {\n id: string\n orgId: string\n planId: string\n status: 'active' | 'trialing' | 'past_due' | 'canceled' | 'incomplete'\n currentPeriodStart: string\n currentPeriodEnd: string\n cancelAtPeriodEnd?: boolean\n stripeSubscriptionId?: string\n}\n\nexport interface Invoice {\n id: string\n orgId: string\n amount: number\n currency: string\n status: 'paid' | 'open' | 'void' | 'uncollectible'\n pdfUrl?: string\n createdAt: string\n}\n\nexport interface BillingState {\n subscription: Subscription | null\n invoices: Invoice[]\n plans: Plan[]\n loading: boolean\n /** Payment-gateway seam seeded from `config.billing.onCheckout` (see core\n * BillingConfig). When set, the Subscription page routes plan changes through\n * it instead of writing `plan` straight onto the org. */\n checkout: BillingCheckoutFn | null\n}\n\n// ---------------------------------------------------------------------------\n// Store\n// ---------------------------------------------------------------------------\n\nexport interface BillingStore extends BillingState {\n setSubscription: (subscription: Subscription | null) => void\n setInvoices: (invoices: Invoice[]) => void\n setPlans: (plans: Plan[]) => void\n setLoading: (loading: boolean) => void\n setCheckout: (checkout: BillingCheckoutFn | null) => void\n reset: () => void\n}\n\nconst initialState: BillingState = {\n subscription: null,\n invoices: [],\n plans: [],\n loading: false,\n checkout: null,\n}\n\nexport const useBillingStore = create<BillingStore>((set) => ({\n ...initialState,\n setSubscription: (subscription) => set({ subscription }),\n setInvoices: (invoices) => set({ invoices }),\n setPlans: (plans) => set({ plans }),\n setLoading: (loading) => set({ loading }),\n setCheckout: (checkout) => set({ checkout }),\n reset: () => set(initialState),\n}))\n","import * as React from 'react'\nimport type { Organization, Plan } from '@fayz-ai/core'\nimport { useOrganizationStore } from '../org/store'\nimport { useBillingStore } from './store'\n\n/**\n * The free trial, as one derived fact.\n *\n * A trial is not a fourth plan or a state machine — it is a WINDOW during which\n * a tenant on the free plan is entitled to a paid one. Modelling it that way is\n * what keeps it out of every gate in the product: the access provider resolves\n * the effective plan once, and the nav crowns, the entitlement gates, the limit\n * caps and the assistant's lock all follow without knowing a trial exists.\n *\n * `trialEndsAt` is written by the database when the tenant is created (see\n * migration 147) and is never written by the client — a trial the browser could\n * extend is not a trial. A tenant with no `trialEndsAt` predates the column and\n * is left alone: status `none`, plan exactly as stored.\n */\n\nexport type TrialStatus = 'none' | 'active' | 'expired'\n\nexport interface TrialState {\n status: TrialStatus\n /** ISO date the window closes. */\n endsAt?: string\n /** Whole days remaining, floored at 0. `0` on the last day, not a negative. */\n daysLeft: number\n /** The last 48 hours, when the banner stops being informational. */\n endingSoon: boolean\n}\n\nexport const NO_TRIAL: TrialState = { status: 'none', daysLeft: 0, endingSoon: false }\n\nconst DAY_MS = 86_400_000\n\n/** Pure — the part worth testing, and it needs neither React nor a clock. */\nexport function resolveTrial(\n org: Pick<Organization, 'plan' | 'trialEndsAt'> | null | undefined,\n paidPlanIds: ReadonlySet<string>,\n now: number = Date.now(),\n): TrialState {\n if (!org?.trialEndsAt) return NO_TRIAL\n // Somebody who is paying is not on a trial, whatever the column still says.\n if (org.plan && paidPlanIds.has(org.plan)) return NO_TRIAL\n\n const ends = Date.parse(org.trialEndsAt)\n if (Number.isNaN(ends)) return NO_TRIAL\n\n const remaining = ends - now\n if (remaining <= 0) return { status: 'expired', endsAt: org.trialEndsAt, daysLeft: 0, endingSoon: false }\n\n const daysLeft = Math.ceil(remaining / DAY_MS)\n return {\n status: 'active',\n endsAt: org.trialEndsAt,\n daysLeft,\n endingSoon: remaining <= 2 * DAY_MS,\n }\n}\n\n/**\n * The plan whose entitlements apply RIGHT NOW.\n *\n * During the trial that is the trial plan — by default the most expensive one\n * configured, because the point of a trial is to be worth losing. After it, the\n * tenant's own plan, which for a free tenant is the free one: that fall is the\n * paywall, and it needs no separate enforcement path.\n *\n * ── Por que um plano desconhecido cai no piso, e não em `null` ──────────────\n * A frase acima (\"essa queda é o paywall\") só era verdade quando o id gravado\n * em `tenants.plan` existia no catálogo do app. Quando não existia — o\n * ChefControl vendia `starter/professional/enterprise` enquanto o pool grava\n * `free/pro/business` — isto devolvia `null`, e `null` não é \"sem plano\": é SEM\n * TETO. `resolveLimit` lê teto ausente como ilimitado e `isEntitledByPlan` só\n * nega com um `false` explícito. O resultado é que vencer o trial LIBERAVA em\n * vez de travar, que é o oposto do paywall.\n *\n * Então um id que o catálogo não conhece cai no plano mais barato — o piso é a\n * resposta segura para \"não sei em que plano esta conta está\". `null` fica\n * reservado para o único caso em que ilimitado é a leitura certa: o app que não\n * vende plano nenhum e portanto não tem o que travar.\n */\nexport function effectivePlan(\n org: Pick<Organization, 'plan'> | null | undefined,\n plans: Plan[],\n trial: TrialState,\n trialPlanId?: string,\n): Plan | null {\n if (trial.status === 'active') {\n const named = trialPlanId ? plans.find((p) => p.id === trialPlanId) : undefined\n if (named) return named\n const paid = plans.filter((p) => p.price > 0)\n if (paid.length) return paid.reduce((best, p) => (p.price > best.price ? p : best))\n }\n if (plans.length === 0) return null\n\n const named = org?.plan ? plans.find((p) => p.id === org.plan) : undefined\n if (named) return named\n\n const floor = plans.reduce((cheapest, p) => (p.price < cheapest.price ? p : cheapest))\n if (org?.plan) {\n // Avisa alto: é um defeito de dados (catálogo e pool discordando), e quem\n // vê primeiro é quem estiver com o console aberto.\n console.warn(\n `[billing] tenant plan \"${org.plan}\" não existe neste catálogo (${plans.map((p) => p.id).join(', ')}) — aplicando o piso \"${floor.id}\"`,\n )\n }\n return floor\n}\n\n/** Ids of the plans somebody actually pays for. */\nexport function paidPlanIds(plans: Plan[]): Set<string> {\n return new Set(plans.filter((p) => p.price > 0).map((p) => p.id))\n}\n\n/**\n * Live trial state for the current workspace.\n *\n * Ticks once an hour rather than on a timer per second: nothing on screen\n * counts down in real time, and a banner that says \"2 days left\" only has to be\n * right the next time somebody looks at it.\n */\nexport function useTrial(): TrialState {\n const org = useOrganizationStore((s) => s.currentOrg)\n const plans = useBillingStore((s) => s.plans)\n const [now, setNow] = React.useState(() => Date.now())\n\n React.useEffect(() => {\n const id = window.setInterval(() => setNow(Date.now()), 3_600_000)\n return () => window.clearInterval(id)\n }, [])\n\n return React.useMemo(\n () => resolveTrial(org, paidPlanIds(plans), now),\n [org?.plan, org?.trialEndsAt, plans, now],\n )\n}\n","import { tl } from '@fayz-ai/core'\n\n/**\n * Module pricing — the account pays for what it turns on, scaled by how big\n * the operation is. Rationale and the worked examples live in\n * docs/saas/MODULE-PRICING.md; this file is the one place the numbers live.\n */\n\nexport type PriceBasis = 'unit' | 'account'\n\nexport interface PriceEntry {\n /** Monthly list price (BRL) for the first unit, or once for an account-wide item. */\n price: number\n /** `unit`: each unit uses it on its own (a till, a kitchen, a time clock).\n * `account`: one copy serves the whole group (the client base, the DRE). */\n per: PriceBasis\n /** [English, Portuguese] — resolved when quoted, not at import. */\n label: readonly [string, string]\n /** A proposed price for a module not built yet: listed, never billed. */\n comingSoon?: boolean\n}\n\n/** Keyed `plugin` for the module, `plugin.facet` for a paid part of it. Modules\n * not listed cost nothing on their own — they are the floor every account has. */\nexport const PRICE_BOOK: Record<string, PriceEntry> = {\n // Selling and the floor\n orders: { price: 99, per: 'unit', label: ['Orders & POS', 'Pedidos e PDV'] },\n 'orders.scale': { price: 29, per: 'unit', label: ['Scale & sale by weight', 'Balança e venda por peso'] },\n // The orders facet that takes delivery-app orders (iFood, 99Food…).\n 'orders.delivery': { price: 39, per: 'unit', label: ['Delivery & iFood', 'Delivery e iFood'] },\n tables: { price: 79, per: 'unit', label: ['Tables & tabs', 'Salão e mesas'] },\n 'tables.tablets': { price: 39, per: 'unit', label: ['Table tablets', 'Tablets de mesa'] },\n 'tables.waitlist': { price: 29, per: 'unit', label: ['Waitlist', 'Fila de espera'] },\n reservations: { price: 29, per: 'unit', label: ['Reservations', 'Reservas'] },\n menu: { price: 39, per: 'unit', label: ['Menu', 'Cardápio'] },\n 'menu.qr_menu': { price: 29, per: 'unit', label: ['QR menu', 'Cardápio digital (QR)'] },\n production: { price: 49, per: 'unit', label: ['Kitchen (KDS)', 'Cozinha (KDS)'] },\n // The resto preset mounts the kitchen as `kitchen`; same price, never both on.\n kitchen: { price: 49, per: 'unit', label: ['Kitchen (KDS)', 'Cozinha (KDS)'] },\n shop: { price: 79, per: 'account', label: ['Online store', 'Loja online'] },\n // Services\n agenda: { price: 79, per: 'unit', label: ['Schedule', 'Agenda'] },\n 'agenda.public_booking': { price: 29, per: 'unit', label: ['Online booking', 'Agendamento online'] },\n 'agenda.smart_fit': { price: 29, per: 'unit', label: ['Smart fit', 'Encaixe inteligente'] },\n 'agenda.kiosk': { price: 39, per: 'unit', label: ['Kiosks', 'Totens'] },\n clinical: { price: 79, per: 'unit', label: ['Clinical records', 'Prontuário'] },\n // Back office\n inventory: { price: 69, per: 'unit', label: ['Inventory', 'Estoque'] },\n 'inventory.costing': { price: 29, per: 'unit', label: ['Recipe costing & margin', 'Ficha técnica e CMV'] },\n 'inventory.purchasing': { price: 39, per: 'unit', label: ['Purchasing', 'Compras e reposição'] },\n financial: { price: 79, per: 'unit', label: ['Financial', 'Financeiro'] },\n 'financial.reconciliation': { price: 39, per: 'unit', label: ['Bank reconciliation', 'Conciliação bancária'] },\n 'financial.dre': { price: 19, per: 'account', label: ['P&L and cash flow', 'DRE e fluxo de caixa'] },\n 'fiscal-br': { price: 59, per: 'unit', label: ['Invoicing (NFC-e/NF-e)', 'Fiscal (NFC-e/NF-e)'] },\n openbanking: { price: 29, per: 'account', label: ['Open banking', 'Open banking'] },\n workforce: { price: 49, per: 'unit', label: ['Team & shifts', 'Equipe e escala'] },\n 'workforce.time_clock': { price: 39, per: 'unit', label: ['Time clock', 'Ponto eletrônico'] },\n // Clients and growth — one client base for the whole group\n crm: { price: 39, per: 'account', label: ['Clients (CRM)', 'Clientes (CRM)'] },\n 'crm.pipeline': { price: 19, per: 'account', label: ['Sales pipeline', 'Funil de vendas'] },\n 'crm.automation': { price: 29, per: 'account', label: ['Pipeline automations', 'Automações de funil'] },\n 'crm.loyalty': { price: 39, per: 'account', label: ['Club & cashback', 'Clube e Cashback'] },\n conversations: { price: 49, per: 'account', label: ['Conversations (WhatsApp)', 'Conversas (WhatsApp)'] },\n // The upsell every trade gets: an AI attendant answering each unit's WhatsApp.\n // Below a generic AI agent (R$ 500+) and a fraction of a receptionist.\n 'conversations.atendeai': { price: 149, per: 'unit', label: ['AI attendant', 'AtendeAI'] },\n marketing: { price: 49, per: 'account', label: ['Marketing', 'Marketing'] },\n automations: { price: 39, per: 'account', label: ['Automations', 'Automações'] },\n forms: { price: 29, per: 'account', label: ['Forms & contracts', 'Formulários e contratos'] },\n // The forms plugin's runtime id.\n custom_forms: { price: 29, per: 'account', label: ['Forms & contracts', 'Formulários e contratos'] },\n scribe: { price: 49, per: 'account', label: ['AI scribe', 'Escriba (IA)'] },\n reports: { price: 29, per: 'account', label: ['Reports', 'Relatórios'] },\n reputation: { price: 29, per: 'account', label: ['Reviews', 'Avaliações'] },\n sites: { price: 29, per: 'account', label: ['Website', 'Site'] },\n courses: { price: 49, per: 'account', label: ['Courses', 'Cursos'] },\n // Coming soon — proposed prices (docs/saas/PRICING-COMPETITORS.md), never billed.\n tiss: { price: 99, per: 'unit', label: ['Health-plan billing (TISS)', 'Faturamento de Convênio (TISS)'], comingSoon: true },\n 'pet.grooming': { price: 79, per: 'unit', label: ['Bath & grooming', 'Banho e tosa'], comingSoon: true },\n 'pet.vet': { price: 99, per: 'unit', label: ['Vet records', 'Prontuário veterinário'], comingSoon: true },\n 'pet.lodging': { price: 49, per: 'unit', label: ['Pet hotel & daycare', 'Hotel e creche'], comingSoon: true },\n 'pet.packages': { price: 29, per: 'account', label: ['Pet packages', 'Pacotes pet'], comingSoon: true },\n marketplaces: { price: 79, per: 'account', label: ['Marketplaces (Mercado Livre…)', 'Marketplaces (Mercado Livre…)'], comingSoon: true },\n}\n\n/** Modules on the price list that do not exist yet. */\nexport const COMING_SOON_MODULES: readonly string[] = Object.keys(PRICE_BOOK).filter((k) => PRICE_BOOK[k]!.comingSoon)\n\n/** Each extra unit costs less than the one before it: the first pays full, the\n * network's fiftieth pays the price of what it actually adds. */\nexport const UNIT_TIERS: ReadonlyArray<{ from: number; factor: number }> = [\n { from: 1, factor: 1 },\n { from: 2, factor: 0.85 },\n { from: 6, factor: 0.65 },\n { from: 21, factor: 0.45 },\n]\n\nexport const EXTRA_SEAT_PRICE = 19\n\n// ── The base package ───────────────────────────────────────────────────────\n// What a trade's product sells as one line, per unit: ChefControl is the\n// counter, the dining room and the back office; what a house adds on top\n// (delivery, scale, kitchen screen, invoicing, time clock, AI…) is an extra.\n// The lists are data, one place, edited per product — not a flag on a module:\n// Pedidos comes in ChefControl and StoreControl and is an extra for a salon\n// that also sells at a counter.\n\nexport interface BasePackage {\n id: string\n /** The product name the line carries (\"ChefControl · 3 unidades\"). */\n name: string\n /** Per unit, a month; units after the first take the multi-unit discount. */\n unitPrice: number\n /** Modules (and facets, when listed) that come in the package. */\n includes: readonly string[]\n}\n\nconst BACK_OFFICE = ['financial', 'inventory', 'crm', 'forms', 'custom_forms', 'marketing', 'automations', 'reports'] as const\n\nexport const BASE_PACKAGES: Readonly<Record<string, BasePackage>> = {\n // Calibrated so the 3-unit restaurant archetype lands at R$ 1.950 on Scale,\n // the price of the first proposal sent.\n chefcontrol: { id: 'chefcontrol', name: 'ChefControl', unitPrice: 328, includes: [...BACK_OFFICE, 'orders', 'tables', 'menu', 'reservations'] },\n beautycontrol: { id: 'beautycontrol', name: 'BeautyControl', unitPrice: 199, includes: [...BACK_OFFICE, 'agenda'] },\n storecontrol: { id: 'storecontrol', name: 'StoreControl', unitPrice: 189, includes: [...BACK_OFFICE, 'shop', 'orders'] },\n gocontrol: { id: 'gocontrol', name: 'GoControl', unitPrice: 149, includes: [...BACK_OFFICE] },\n}\n\n/** Which package each trade buys. Trades without a product of their own buy GoControl. */\nexport const PACKAGE_BY_TRADE: Readonly<Record<string, string>> = {\n food: 'chefcontrol', beauty: 'beautycontrol', commerce: 'storecontrol',\n}\n\n/** The package for an operation: the one named, else the trade's, else read\n * from what it runs (a counter → ChefControl, a schedule → BeautyControl). */\nexport function packageFor(opts: { package?: string; trades?: readonly string[]; modules?: readonly string[] } = {}): BasePackage {\n if (opts.package && BASE_PACKAGES[opts.package]) return BASE_PACKAGES[opts.package]!\n for (const t of opts.trades ?? []) {\n const id = PACKAGE_BY_TRADE[t]\n if (id) return BASE_PACKAGES[id]!\n }\n const on = new Set(opts.modules ?? [])\n if (['tables', 'menu', 'kitchen', 'production', 'reservations'].some((k) => on.has(k))) return BASE_PACKAGES.chefcontrol!\n if (['agenda', 'clinical'].some((k) => on.has(k))) return BASE_PACKAGES.beautycontrol!\n if (on.has('shop')) return BASE_PACKAGES.storecontrol!\n return BASE_PACKAGES.gocontrol!\n}\n\n/** A module or facet the package covers. A facet is covered only when listed:\n * Pedidos is in ChefControl, Balança (orders.scale) is still an extra. */\nexport function includedIn(pkg: BasePackage | null | undefined, key: string, extra?: readonly string[]): boolean {\n return !!pkg && (pkg.includes.includes(key) || !!extra?.includes(key))\n}\n\nexport interface PricingPlan {\n id: string\n name: readonly [string, string]\n /** Platform fee: login, registries, dashboard, support. Paid once. */\n platformFee: number\n /** Logins included per unit; `null` is unlimited. */\n seatsPerUnit: number | null\n /** Off the modules subtotal (after unit tiers). */\n discount: number\n /** AI assistant credits included a month. */\n aiCredits?: number\n}\n\n/** Credits a free plan includes when the app does not say. */\nexport const FREE_AI_CREDITS = 30\n\n/** Proposal (docs/saas/MODULE-PRICING.md): extra assistant credits, monthly packs. */\n/** The add-on the screen offers when it is off. */\nexport const UPSELL_KEY = 'conversations.atendeai'\n\nexport const EXTRA_AI_CREDITS: ReadonlyArray<{ credits: number; price: number }> = [\n { credits: 100, price: 19 },\n { credits: 1000, price: 149 },\n]\n\n/** `a-la-carte` is the price without a plan; the other ids are the ones\n * `app.plan_grants` uses. */\nexport const PRICING_PLANS: readonly PricingPlan[] = [\n { id: 'a-la-carte', name: ['À la carte', 'Avulso'], platformFee: 99, seatsPerUnit: 3, discount: 0, aiCredits: 50 },\n { id: 'essential', name: ['Essential', 'Essencial'], platformFee: 79, seatsPerUnit: 5, discount: 0, aiCredits: 100 },\n // Pro is the natural middle: a lower fee and a real discount make it the\n // cheapest choice once a salon or restaurant outgrows five logins.\n { id: 'pro', name: ['Pro', 'Pro'], platformFee: 119, seatsPerUnit: 7, discount: 0.08, aiCredits: 300 },\n { id: 'scale', name: ['Scale', 'Scale'], platformFee: 449, seatsPerUnit: null, discount: 0.1, aiCredits: 1000 },\n]\n\n/** One unit and the per-unit modules it actually runs: a dark kitchen has no\n * dining room, so it does not pay for one. */\nexport interface UnitFootprint {\n id: string\n name: string\n modules: readonly string[]\n}\n\nexport interface OperationSize {\n /** Units (stores, branches). At least 1 is charged. */\n units: number\n /** What each unit runs. Absent, every unit runs every per-unit module on. */\n unitModules?: readonly UnitFootprint[]\n /** People with a login. */\n users: number\n /** Active modules and paid facets: `plugin` or `plugin.facet`. */\n modules: readonly string[]\n /** The base package (`BASE_PACKAGES` id). Absent, read from the trade or the modules. */\n package?: string\n /** The trades this operation runs, when known. */\n trades?: readonly string[]\n /** Extras negotiated into the package for this account. */\n alsoIncluded?: readonly string[]\n}\n\nexport type QuoteLineKind = 'platform' | 'package' | 'module' | 'unit' | 'tier' | 'seats' | 'discount' | 'credits'\n\nexport interface QuoteLine {\n kind: QuoteLineKind\n key: string\n label: string\n /** Human formula: \"R$ 79 × 3 unidades\". */\n detail: string\n amount: number\n}\n\nexport interface Quote {\n planId: string\n planName: string\n lines: QuoteLine[]\n total: number\n}\n\nconst round = (n: number) => Math.round(n * 100) / 100\nconst brl = (n: number) => `R$ ${n.toLocaleString('pt-BR', { minimumFractionDigits: 0, maximumFractionDigits: 2 })}`\n\n/** \"Pedidos e PDV, Salão e mesas, … e Análises\" — the package's priced contents. */\nexport function packageSummary(pkg: BasePackage): string {\n const seen = new Set<string>()\n const names = pkg.includes\n .filter((k) => PRICE_BOOK[k])\n .map((k) => tl(...PRICE_BOOK[k]!.label))\n .filter((n) => (seen.has(n) ? false : (seen.add(n), true)))\n return names.length > 1 ? `${names.slice(0, -1).join(', ')} ${tl('and', 'e')} ${names[names.length - 1]}` : names.join('')\n}\n\n/** The share the n-th unit (1-based) pays of its per-unit modules. */\nexport function tierFactorAt(n: number): number {\n let factor = UNIT_TIERS[0]!.factor\n for (const tier of UNIT_TIERS) if (n >= tier.from) factor = tier.factor\n return factor\n}\n\n/** Sum of the tier factors for `units` units: 3 units → 1 + 0.85 + 0.85. */\nexport function unitFactor(units: number): number {\n const n = Math.max(1, Math.floor(units))\n let sum = 0\n for (let i = 1; i <= n; i++) {\n let factor = UNIT_TIERS[0]!.factor\n for (const tier of UNIT_TIERS) if (i >= tier.from) factor = tier.factor\n sum += factor\n }\n return sum\n}\n\n/** Only priced keys, once each, in price-book order. */\nexport function billableModules(modules: readonly string[], pkg?: BasePackage | null, alsoIncluded?: readonly string[]): string[] {\n const on = new Set(modules)\n return Object.keys(PRICE_BOOK).filter((key) => {\n if (!on.has(key) || PRICE_BOOK[key]!.comingSoon || includedIn(pkg, key, alsoIncluded)) return false\n // A facet without its module is not running, so it is not billed.\n const dot = key.indexOf('.')\n return dot < 0 || on.has(key.slice(0, dot))\n })\n}\n\nexport function quote(size: OperationSize, plan: PricingPlan): Quote {\n const units = Math.max(1, Math.floor(size.unitModules?.length || size.units))\n const lines: QuoteLine[] = [{\n kind: 'platform', key: 'platform', label: tl('Platform', 'Plataforma'),\n detail: tl('Login, registries, dashboard and support', 'Acesso, cadastros, painel e suporte'),\n amount: plan.platformFee,\n }]\n\n const footprints = size.unitModules?.length ? size.unitModules : null\n const all = [...size.modules, ...(footprints ?? []).flatMap((u) => u.modules)]\n const pkg = packageFor({ package: size.package, trades: size.trades, modules: all })\n const negotiated = size.alsoIncluded\n\n // The package is ONE line: every unit pays it, the next ones less.\n const base = pkg.unitPrice * unitFactor(units)\n let modules = base\n let tierOff = 0\n lines.push({\n kind: 'package', key: `package:${pkg.id}`,\n label: `${pkg.name} · ${units} ${units === 1 ? tl('unit', 'unidade') : tl('units', 'unidades')}`,\n detail: `${tl('Includes', 'Inclui')} ${packageSummary(pkg)} · ${brl(pkg.unitPrice)} ${tl('the first unit, less for the next', 'a primeira unidade, menos nas seguintes')}`,\n amount: round(base),\n })\n // A unit's add-on switches on its account-wide module too (AtendeAI → Conversas), billed once.\n const on = billableModules(all, pkg, negotiated)\n\n if (footprints) {\n // Each unit is a line with what it runs; the unit that spends most pays in\n // full and the others take the multi-unit discount by their position.\n const perUnit = footprints.map((u) => {\n const keys = billableModules(u.modules, pkg, negotiated).filter((k) => PRICE_BOOK[k]!.per === 'unit')\n return { u, keys, list: keys.reduce((sum, k) => sum + PRICE_BOOK[k]!.price, 0) }\n }).sort((a, b) => b.list - a.list)\n perUnit.forEach(({ u, keys, list }, i) => {\n modules += list\n tierOff += list * (1 - tierFactorAt(i + 1))\n // A unit that runs only the package adds nothing to say.\n if (!keys.length) return\n lines.push({\n kind: 'unit', key: `unit:${u.id}`, label: u.name,\n detail: keys.map((k) => tl(...PRICE_BOOK[k]!.label)).join(' · ') || tl('No per-unit module', 'Nenhum módulo por unidade'),\n amount: list,\n })\n })\n }\n\n let perUnitList = 0\n for (const key of on) {\n const entry = PRICE_BOOK[key]!\n if (footprints && entry.per === 'unit') continue\n const amount = entry.per === 'unit' ? entry.price * units : entry.price\n if (entry.per === 'unit') perUnitList += entry.price\n modules += amount\n lines.push({\n kind: 'module', key, label: tl(...entry.label),\n detail: entry.per === 'unit' && units > 1\n ? `${brl(entry.price)} × ${units} ${tl('units', 'unidades')}`\n : entry.per === 'unit' ? tl('per unit', 'por unidade') : tl('whole group', 'grupo todo'),\n amount,\n })\n }\n\n // Volume: units beyond the first pay a smaller share of the per-unit modules.\n if (!footprints) tierOff = perUnitList * (units - unitFactor(units))\n tierOff = round(tierOff)\n if (tierOff > 0) {\n lines.push({\n kind: 'tier', key: 'unit-tiers', label: tl('Multi-unit discount', 'Desconto por unidade adicional'),\n detail: tl('Units 2–5 pay 85%, 6–20 pay 65%, 21+ pay 45%', 'Unidades 2–5 pagam 85%, 6–20 pagam 65%, 21+ pagam 45%'),\n amount: -tierOff,\n })\n }\n\n if (plan.discount > 0 && modules > 0) {\n const off = round((modules - tierOff) * plan.discount)\n lines.push({\n kind: 'discount', key: 'plan-discount', label: `${tl('Plan discount', 'Desconto do plano')} ${tl(...plan.name)}`,\n detail: `${Math.round(plan.discount * 100)}% ${tl('off the modules', 'sobre os módulos')}`,\n amount: -off,\n })\n }\n\n if (plan.seatsPerUnit === null) {\n lines.push({ kind: 'seats', key: 'seats', label: tl('Users', 'Usuários'), detail: tl('Unlimited', 'Ilimitados'), amount: 0 })\n } else {\n const included = plan.seatsPerUnit * units\n const extra = Math.max(0, Math.floor(size.users) - included)\n lines.push({\n kind: 'seats', key: 'seats', label: tl('Users', 'Usuários'),\n detail: extra > 0\n ? `${extra} ${tl('beyond the', 'além dos')} ${included} ${tl('included', 'incluídos')} × ${brl(EXTRA_SEAT_PRICE)}`\n : `${Math.floor(size.users)} ${tl('of', 'de')} ${included} ${tl('included', 'incluídos')}`,\n amount: extra * EXTRA_SEAT_PRICE,\n })\n }\n\n if (plan.aiCredits) {\n lines.push({\n kind: 'credits', key: 'ai-credits', label: tl('AI assistant', 'Assistente de IA'),\n detail: `${plan.aiCredits.toLocaleString('pt-BR')} ${tl('credits/mo included', 'créditos/mês incluídos')}`,\n amount: 0,\n })\n }\n\n const total = round(lines.reduce((sum, line) => sum + line.amount, 0))\n return { planId: plan.id, planName: tl(...plan.name), lines, total }\n}\n\n/** Every plan for one operation, cheapest first marked by the caller. */\nexport function quoteAll(size: OperationSize, plans: readonly PricingPlan[] = PRICING_PLANS): Quote[] {\n return plans.map((plan) => quote(size, plan))\n}\n\n/** The plugin runtime's view of what is on, as price-book keys. */\n/** The plugin runtime's view of what is on, as price-book keys. A plugin\n * running only because another needs it (orders under a salon's agenda) is not\n * something the account chose, so it is not billed; with `trades`/`offered`,\n * only what the account's trade offers counts. */\nexport function activeModuleKeys(\n plugins: ReadonlyArray<{ id: string; isActive?: boolean; activationReason?: string; config?: { facets?: unknown } | null }>,\n opts: { trades?: readonly Trade[]; offered?: readonly string[] } = {},\n): string[] {\n const out: string[] = []\n for (const plugin of plugins) {\n if (!plugin.isActive || plugin.activationReason === 'dependency') continue\n if (opts.offered?.length && !opts.offered.includes(plugin.id)) continue\n const keys = [plugin.id]\n const facets = (plugin.config?.facets ?? {}) as Record<string, boolean>\n for (const [facet, on] of Object.entries(facets)) if (on) keys.push(`${plugin.id}.${facet}`)\n out.push(...(opts.trades?.length ? keys.filter((k) => moduleFitsTrades(k, opts.trades!)) : keys))\n }\n return out\n}\n\n// ── Which trade a module belongs to ────────────────────────────────────────\n// One place for the rule \"o ofício oferece\": the pricing sheet and the Módulos\n// page both read it. A salon never sees Pedidos e PDV; a restaurant books\n// through Reservas, never Agenda.\n\n/** The same vocabulary as `tenants.vertical_id` (097). */\n// `pet` has no app yet; it tags the coming-soon pet modules.\nexport type Trade = 'food' | 'beauty' | 'commerce' | 'education' | 'events' | 'accounting' | 'generic' | 'pet'\n\nconst FOOD_COMMERCE: readonly Trade[] = ['food', 'commerce']\nconst SERVICES: readonly Trade[] = ['beauty', 'education']\n\n/** Keys missing here (financial, crm, inventory…) serve every trade. */\nexport const MODULE_TRADES: Readonly<Record<string, readonly Trade[]>> = {\n orders: FOOD_COMMERCE,\n 'orders.scale': FOOD_COMMERCE,\n 'orders.delivery': FOOD_COMMERCE,\n shop: ['commerce', 'food'],\n tables: ['food'],\n 'tables.tablets': ['food'],\n 'tables.waitlist': ['food'],\n reservations: ['food'],\n menu: ['food'],\n 'menu.qr_menu': ['food'],\n production: ['food'],\n kitchen: ['food'],\n 'inventory.costing': ['food'],\n agenda: SERVICES,\n 'agenda.public_booking': SERVICES,\n 'agenda.smart_fit': SERVICES,\n 'agenda.kiosk': SERVICES,\n clinical: ['beauty'],\n scribe: ['beauty'],\n courses: ['education'],\n tiss: ['beauty'],\n 'pet.grooming': ['pet'],\n 'pet.vet': ['pet'],\n 'pet.lodging': ['pet'],\n 'pet.packages': ['pet'],\n marketplaces: ['commerce'],\n}\n\n/** The trade each app (`app.apps.id`) sells to — 097's table. */\nexport const TRADE_BY_APP: Readonly<Record<string, Trade>> = {\n resto: 'food', beauty: 'beauty', shop: 'commerce', school: 'education',\n ticket: 'events', fiscal: 'accounting', full: 'generic',\n}\n\n/** A module (or facet) that serves at least one of `trades`. */\nexport function moduleFitsTrades(key: string, trades: readonly Trade[]): boolean {\n const own = MODULE_TRADES[key] ?? MODULE_TRADES[key.split('.')[0]!]\n return !own || own.some((t) => trades.includes(t))\n}\n\n/** Every priced key this trade can turn on, in price-book order. */\nexport function modulesForTrade(trade: Trade): string[] {\n return Object.keys(PRICE_BOOK).filter((k) => moduleFitsTrades(k, [trade]))\n}\n\n/** The per-unit priced modules among `modules`, for a unit's footprint. */\nexport function perUnitModules(modules: readonly string[], pkg?: BasePackage | null): string[] {\n return billableModules(modules, pkg).filter((k) => PRICE_BOOK[k]!.per === 'unit')\n}\n\n/** Generic operations the Assinatura screen prices next to the account's own.\n * Shipped to every tenant: archetypes only, never a customer's name or size. */\nexport type ScenarioVertical = 'food' | 'beauty' | 'commerce' | 'generic'\n\nexport interface PricingScenario {\n id: string\n name: readonly [string, string]\n vertical: ScenarioVertical\n assumptions?: readonly string[]\n size: OperationSize\n}\n\nexport const SCENARIO_VERTICAL_LABELS: Record<ScenarioVertical, readonly [string, string]> = {\n food: ['Food service', 'Alimentação'],\n beauty: ['Beauty & clinics', 'Beleza e clínicas'],\n commerce: ['Retail & e-commerce', 'Varejo e loja online'],\n generic: ['Other', 'Outros'],\n}\n\nconst BEAUTY_UNIT = ['agenda', 'inventory', 'financial', 'fiscal-br', 'workforce'] as const\nconst BEAUTY_ACCOUNT = ['crm', 'marketing', 'automations', 'custom_forms', 'reports'] as const\nconst RESTAURANT_UNIT = ['orders', 'orders.delivery', 'tables', 'reservations', 'menu', 'menu.qr_menu', 'kitchen', 'inventory', 'inventory.costing', 'financial', 'fiscal-br', 'workforce'] as const\nconst units = (n: number, prefix: string, modules: readonly string[]): UnitFootprint[] =>\n Array.from({ length: n }, (_, i) => ({ id: `${prefix}-${i + 1}`, name: `${prefix === 'u' ? 'Unidade' : prefix} ${i + 1}`, modules }))\n\nexport const PRICING_SCENARIOS: ReadonlyArray<PricingScenario> = [\n {\n // Calibration point: a three-format restaurant group lands near R$ 1.950 on the top plan.\n id: 'restaurante-3-unidades',\n name: ['Restaurant group, 3 units (store, dining room, dark kitchen)', 'Restaurante com 3 unidades (empório, salão, dark kitchen)'],\n vertical: 'food',\n assumptions: ['Usuários ilimitados no plano de cima; 40 pessoas com login.'],\n size: {\n units: 3,\n users: 40,\n modules: ['crm', 'financial', 'financial.dre', 'reports'],\n unitModules: [\n { id: 'emporio', name: 'Empório', modules: ['orders', 'orders.scale', 'orders.delivery', 'inventory', 'inventory.purchasing', 'financial', 'financial.reconciliation', 'fiscal-br', 'workforce', 'workforce.time_clock'] },\n { id: 'salao', name: 'Restaurante com salão', modules: ['tables', 'reservations', 'menu', 'menu.qr_menu', 'orders', 'orders.delivery', 'production', 'inventory', 'inventory.costing', 'financial', 'fiscal-br', 'workforce', 'workforce.time_clock'] },\n { id: 'dark', name: 'Dark kitchen', modules: ['orders', 'orders.delivery', 'production', 'inventory', 'inventory.costing', 'financial', 'fiscal-br', 'workforce', 'workforce.time_clock'] },\n ],\n },\n },\n {\n id: 'cafe',\n name: ['Café, 1 unit', 'Café de 1 unidade'],\n vertical: 'food',\n size: { units: 1, users: 4, modules: ['orders', 'financial', 'inventory', 'fiscal-br'] },\n },\n {\n id: 'rede-10',\n name: ['Restaurant network, 10 units', 'Rede de restaurantes, 10 unidades'],\n vertical: 'food',\n size: {\n units: 10,\n users: 120,\n modules: ['orders', 'orders.delivery', 'menu', 'menu.qr_menu', 'production', 'inventory', 'inventory.costing', 'financial', 'financial.dre', 'fiscal-br', 'workforce', 'workforce.time_clock', 'crm', 'crm.loyalty', 'reports'],\n },\n },\n {\n id: 'restaurante-e-servicos',\n name: ['Restaurant + back office, 2 units', 'Restaurante + escritório, 2 unidades'],\n vertical: 'food',\n assumptions: ['Uma unidade com toda a operação; a outra só com financeiro, equipe e ponto.'],\n size: {\n units: 2,\n users: 25,\n modules: ['crm', 'financial', 'financial.dre', 'reports'],\n unitModules: [\n { id: 'restaurante', name: 'Restaurante', modules: [...RESTAURANT_UNIT] },\n { id: 'escritorio', name: 'Escritório', modules: ['financial', 'workforce', 'workforce.time_clock'] },\n ],\n },\n },\n {\n id: 'rede-estetica-60',\n name: ['Beauty network, 60 units', 'Rede de estética, 60 unidades'],\n vertical: 'beauty',\n assumptions: ['Todas as unidades com agenda, prontuário, estoque, financeiro, fiscal e equipe; 6 logins por unidade.'],\n size: { units: 60, users: 360, modules: [...BEAUTY_ACCOUNT, 'financial', 'financial.dre'], unitModules: units(60, 'u', [...BEAUTY_UNIT, 'clinical']) },\n },\n {\n id: 'saloes-3',\n name: ['Salon chain, 3 units', 'Rede de salões, 3 unidades'],\n vertical: 'beauty',\n size: { units: 3, users: 24, modules: [...BEAUTY_ACCOUNT, 'financial', 'financial.dre'], unitModules: units(3, 'u', [...BEAUTY_UNIT]) },\n },\n {\n id: 'salao-1',\n name: ['Salon, 1 unit', 'Salão de 1 unidade'],\n vertical: 'beauty',\n size: { units: 1, users: 6, modules: [...BEAUTY_UNIT, ...BEAUTY_ACCOUNT] },\n },\n {\n id: 'clinica-1',\n name: ['Aesthetic clinic, 1 unit', 'Clínica de estética, 1 unidade'],\n vertical: 'beauty',\n size: { units: 1, users: 5, modules: ['agenda', 'clinical', 'financial', 'fiscal-br', 'crm', 'custom_forms'] },\n },\n {\n id: 'cozinha-loja-online',\n name: ['Central kitchen + online store', 'Cozinha central + loja online'],\n vertical: 'food',\n size: { units: 1, users: 9, modules: ['shop', 'orders', 'kitchen', 'inventory', 'inventory.costing', 'inventory.purchasing', 'financial', 'fiscal-br', 'crm'] },\n },\n {\n id: 'loja-online-fisica',\n name: ['Online store + physical store', 'Loja online + loja física'],\n vertical: 'commerce',\n size: {\n units: 2,\n users: 4,\n modules: ['shop', 'financial', 'crm'],\n unitModules: [\n { id: 'online', name: 'Loja online', modules: ['orders', 'inventory', 'financial'] },\n { id: 'fisica', name: 'Loja física', modules: ['orders', 'inventory', 'financial', 'fiscal-br'] },\n ],\n },\n },\n]\n\n/** The slice of an app plan the price model reads. */\nexport interface PricedPlanSource {\n id: string\n name: string\n price: number\n pricing?: { platformFee: number; seatsPerUnit: number | null; discount: number; aiCredits?: number }\n entitlements?: { limits?: Record<string, number> }\n}\n\n/**\n * Price-model parameters for each app plan, in the same order. A plan's own\n * `pricing` wins; otherwise paid plans take the model's tiers from the top\n * (the richest plan is Scale) and a free plan stays free (`null`).\n */\nexport function pricingForPlans(plans: readonly PricedPlanSource[]): Array<PricingPlan | null> {\n const tiers = PRICING_PLANS.filter((p) => p.id !== 'a-la-carte')\n const paid = plans.filter((p) => p.price > 0 && !p.pricing).sort((a, b) => a.price - b.price)\n return plans.map((plan) => {\n const declared = plan.entitlements?.limits?.ai_credits_month\n const credits = declared !== undefined && declared >= 0 ? { aiCredits: declared } : {}\n if (plan.pricing) return { id: plan.id, name: [plan.name, plan.name], ...plan.pricing, ...credits }\n if (plan.price <= 0) return null\n const rank = paid.indexOf(plan) - paid.length + tiers.length\n const tier = tiers[Math.max(0, rank)]!\n return { ...tier, id: plan.id, name: [plan.name, plan.name], ...credits }\n })\n}\n\nexport type PlanFit = { fits: true } | { fits: false; limit: 'locations' | 'users'; max: number; have: number }\n\n/** AI credits a plan includes a month: what the app declares, else the mapped\n * tier, else the free allowance. */\nexport function aiCreditsFor(plan: PricedPlanSource, pricing: PricingPlan | null): number {\n const declared = plan.entitlements?.limits?.ai_credits_month\n if (declared !== undefined && declared >= 0) return declared\n return pricing?.aiCredits ?? FREE_AI_CREDITS\n}\n\n/** Whether the operation fits the plan's caps (units, logins); -1 is unlimited. */\nexport function planFit(plan: PricedPlanSource, size: Pick<OperationSize, 'units' | 'users' | 'unitModules'>): PlanFit {\n const limits = plan.entitlements?.limits ?? {}\n const units = size.unitModules?.length || size.units\n const checks: Array<['locations' | 'users', number]> = [['locations', units], ['users', size.users]]\n for (const [limit, have] of checks) {\n const max = limits[limit]\n if (max !== undefined && max >= 0 && have > max) return { fits: false, limit, max, have }\n }\n return { fits: true }\n}\n","import * as React from 'react'\nimport { getSupabaseClientOptional } from '../lib/supabase'\nimport { useOrganizationStore } from '../org/store'\n\n/** What the usage source reports for one period. */\nexport interface AiUsageRaw {\n /** Credits spent per member (this tenant only — the source is tenant-scoped). */\n byUser: Array<{ userId: string; credits: number }>\n /** Credits per feature key: `assistant`, `atendeai`, `scribe`… */\n byFeature: Array<{ feature: string; credits: number }>\n}\n\nexport interface AiUsageSummary {\n used: number\n included: number\n remaining: number\n /** 0–1+, used ÷ included. */\n ratio: number\n over: boolean\n /** Credits beyond the allowance. */\n overBy: number\n periodStart: Date\n periodEnd: Date\n daysLeft: number\n /** Credits at the end of the period at the current daily pace. */\n projected: number\n projectedOver: boolean\n byUser: Array<{ userId: string; name: string; credits: number }>\n byFeature: Array<{ feature: string; credits: number }>\n}\n\nconst DAY = 86_400_000\n\n/** The billing period: the calendar month `now` falls in. */\nexport function currentPeriod(now: Date = new Date()): { start: Date; end: Date } {\n return {\n start: new Date(now.getFullYear(), now.getMonth(), 1),\n end: new Date(now.getFullYear(), now.getMonth() + 1, 1),\n }\n}\n\n/** Pure: the period's numbers from what the source reported. */\nexport function summarizeAiUsage(\n raw: AiUsageRaw,\n included: number,\n now: Date = new Date(),\n names: Record<string, string> = {},\n): AiUsageSummary {\n const { start, end } = currentPeriod(now)\n const used = raw.byUser.reduce((sum, u) => sum + u.credits, 0)\n const elapsedDays = Math.max(1, (now.getTime() - start.getTime()) / DAY)\n const totalDays = Math.round((Date.UTC(end.getFullYear(), end.getMonth(), 1) - Date.UTC(start.getFullYear(), start.getMonth(), 1)) / DAY)\n const projected = Math.round((used / elapsedDays) * totalDays)\n return {\n used,\n included,\n remaining: Math.max(0, included - used),\n ratio: included > 0 ? used / included : used > 0 ? Infinity : 0,\n over: used > included,\n overBy: Math.max(0, used - included),\n periodStart: start,\n periodEnd: end,\n // Calendar days, so a daylight-saving hour never adds one.\n daysLeft: Math.max(0, Math.round((Date.UTC(end.getFullYear(), end.getMonth(), end.getDate()) - Date.UTC(now.getFullYear(), now.getMonth(), now.getDate())) / DAY)),\n projected,\n projectedOver: projected > included,\n byUser: [...raw.byUser]\n .sort((a, b) => b.credits - a.credits)\n // Someone who spent credits and has since left the team.\n .map((u) => ({ ...u, name: names[u.userId] ?? 'Ex-integrante da equipe' })),\n byFeature: [...raw.byFeature].sort((a, b) => b.credits - a.credits),\n }\n}\n\nexport type AiUsageState =\n | { status: 'loading' }\n /** No meter is recording credits yet: the screen says so, it shows no number. */\n | { status: 'not-metered' }\n /** Metered, nothing spent this period. */\n | { status: 'empty'; summary: AiUsageSummary }\n | { status: 'ok'; summary: AiUsageSummary }\n\n/**\n * This tenant's AI credit usage in the current period, read from the\n * `ai_usage_summary(p_from, p_to)` RPC — the seam the assistant broker writes\n * behind. Until that RPC exists the state is `not-metered`, never a guess.\n */\nexport function useAiUsage(included: number): AiUsageState {\n const tenantId = useOrganizationStore((s) => s.currentOrg?.id ?? null)\n const members = useOrganizationStore((s) => s.members)\n const [raw, setRaw] = React.useState<AiUsageRaw | null | 'missing'>(null)\n\n React.useEffect(() => {\n const supabase = getSupabaseClientOptional() as any\n if (!supabase || !tenantId) { setRaw('missing'); return }\n let alive = true\n const { start, end } = currentPeriod()\n void supabase.rpc('ai_usage_summary', { p_from: start.toISOString(), p_to: end.toISOString() })\n .then((res: { data: any; error: any }) => {\n if (!alive) return\n if (res.error || !res.data) { setRaw('missing'); return }\n setRaw({\n byUser: (res.data.by_user ?? []).map((u: any) => ({ userId: String(u.user_id), credits: Number(u.credits) || 0 })),\n byFeature: (res.data.by_feature ?? []).map((f: any) => ({ feature: String(f.feature), credits: Number(f.credits) || 0 })),\n })\n })\n return () => { alive = false }\n }, [tenantId])\n\n const names = React.useMemo(() => {\n const out: Record<string, string> = {}\n for (const m of members) out[m.userId] = m.user?.fullName || m.user?.email || '—'\n return out\n }, [members])\n\n if (raw === null) return { status: 'loading' }\n if (raw === 'missing') return { status: 'not-metered' }\n const summary = summarizeAiUsage(raw, included, new Date(), names)\n return summary.used > 0 ? { status: 'ok', summary } : { status: 'empty', summary }\n}\n"]}
@@ -1,71 +1,14 @@
1
1
  import { usePermissionsStore } from './chunk-UQ2NTFQC.js';
2
- import { persistOrgId, cn, useOrganizationStore, getPersistedOrgId } from './chunk-QOS6UAQ4.js';
3
- import { createClient } from '@supabase/supabase-js';
4
- import { EMPTY_APP_CONFIG, resetActiveUnit, setUnitMode, setActiveUnitId, setScopedResources, getSupabaseClientOptional, isKnownMissing, rememberIfMissing, getActiveUnitId, getActiveTenantId, setGlobalSupabaseClient, useTranslation, isImpersonating, errorMessage, emitDomainEvent, setHouseCurrency } from '@fayz-ai/core';
5
- import { createDedupedFetch } from '@fayz-ai/sdk';
2
+ import { persistOrgId, cn, useOrganizationStore, getPersistedOrgId, getFayzSupabaseClient, getSupabaseClientOptional as getSupabaseClientOptional$1 } from './chunk-GZWX4ZIK.js';
6
3
  import * as React3 from 'react';
7
4
  import { useState, useEffect } from 'react';
8
5
  import { Building2, Check, ShieldCheck } from 'lucide-react';
9
6
  import { create } from 'zustand';
7
+ import { EMPTY_APP_CONFIG, resetActiveUnit, setUnitMode, setActiveUnitId, setScopedResources, getSupabaseClientOptional, isKnownMissing, rememberIfMissing, getActiveTenantId, useTranslation, isImpersonating, errorMessage, emitDomainEvent, setHouseCurrency } from '@fayz-ai/core';
10
8
  import { jsxs, jsx, Fragment } from 'react/jsx-runtime';
11
- import { cn as cn$1, Checkbox, Button } from '@fayz-ai/ui';
9
+ import { Input, Button, cn as cn$1, Checkbox } from '@fayz-ai/ui';
12
10
  import { useAuthStore, readAppHandoff } from '@fayz-ai/auth';
13
11
 
14
- var _client = null;
15
- function requestUrl(input) {
16
- if (typeof input === "string") return input;
17
- if (input instanceof URL) return input.toString();
18
- return input?.url ?? "";
19
- }
20
- function isEdgeFunctionCall(input) {
21
- return requestUrl(input).includes("/functions/v1/");
22
- }
23
- function createFayzSupabaseClient(url, anonKey) {
24
- if (_client) return _client;
25
- if (!url || !anonKey) {
26
- throw new Error(
27
- "[@fayz-ai/admin] Supabase URL and anon key are required. Pass supabaseUrl and supabaseAnonKey to createFayzApp."
28
- );
29
- }
30
- const deduped = createDedupedFetch();
31
- _client = createClient(url, anonKey, {
32
- auth: { autoRefreshToken: true, persistSession: true },
33
- global: {
34
- // The active unit rides on every request so the DATABASE can stamp a
35
- // write with it (041's trigger reads this header). Reads are narrowed by
36
- // an explicit filter, not by this — a header cannot be trusted to narrow,
37
- // and it must never be able to widen: the policies resolve unit access
38
- // through `public.user_unit_ids()`, never through what was sent here.
39
- //
40
- // `x-fayz-unit` is in the dedupe vary list. Without that, two identical
41
- // URLs under different units collapse into one response.
42
- fetch: (input, init = {}) => {
43
- if (isEdgeFunctionCall(input)) return deduped(input, init);
44
- const unit = getActiveUnitId();
45
- const tenant = getActiveTenantId();
46
- if (!unit && !tenant) return deduped(input, init);
47
- const headers = new Headers(init.headers);
48
- if (unit) headers.set("x-fayz-unit", unit);
49
- if (tenant) headers.set("x-fayz-tenant", tenant);
50
- return deduped(input, { ...init, headers });
51
- }
52
- }
53
- });
54
- setGlobalSupabaseClient(_client);
55
- return _client;
56
- }
57
- function getFayzSupabaseClient() {
58
- if (!_client) {
59
- throw new Error(
60
- "[@fayz-ai/admin] Supabase client not initialised. Call createFayzApp with supabaseUrl and supabaseAnonKey first."
61
- );
62
- }
63
- return _client;
64
- }
65
- function getFayzSupabaseClientOptional() {
66
- return _client;
67
- }
68
-
69
12
  // src/org/team-rows.ts
70
13
  var capitalize = (s) => s ? s.charAt(0).toUpperCase() + s.slice(1) : s;
71
14
  function loginName(profile, session) {
@@ -276,18 +219,14 @@ var DEFAULT_ROLES = [
276
219
  { id: "viewer", name: "Viewer" }
277
220
  ];
278
221
  var SYSTEM_PERMISSION_MAP = {
279
- "team.read": "manage_team",
280
- "team.invite": "manage_team",
281
- "team.manage": "manage_team",
282
- "team.manage_roles": "manage_permissions",
283
- "billing.read": "manage_billing",
222
+ "members.manage": "manage_team",
223
+ "roles.manage": "manage_permissions",
284
224
  "billing.manage": "manage_billing",
285
- "settings.read": "manage_settings",
286
- "settings.update": "manage_settings"
225
+ "settings.manage": "manage_settings"
287
226
  };
288
227
  var ALL_SYSTEM_PERMISSIONS = ["manage_team", "manage_billing", "manage_settings", "manage_permissions"];
289
228
  var FEATURE_ALIASES = {
290
- people: ["registry.customers"],
229
+ people: ["registry.customers", "registry.suppliers"],
291
230
  catalog: ["services"]
292
231
  };
293
232
  function buildPermissionProfiles(roles, permissions, rolePerms, overrides) {
@@ -334,8 +273,7 @@ function buildPermissionProfiles(roles, permissions, rolePerms, overrides) {
334
273
  if (dotIdx <= 0) continue;
335
274
  const category = permId.slice(0, dotIdx);
336
275
  const action = permId.slice(dotIdx + 1);
337
- const mappedAction = actionMap[action];
338
- if (!mappedAction) continue;
276
+ const mappedAction = actionMap[action] ?? action;
339
277
  for (const feature of [category, ...FEATURE_ALIASES[category] ?? []]) {
340
278
  if (!features[feature]) features[feature] = [];
341
279
  if (!features[feature].includes(mappedAction)) {
@@ -580,7 +518,8 @@ function createSupabaseOrgAdapter(config) {
580
518
  });
581
519
  if (created.error) throw created.error;
582
520
  const roleId = created.data;
583
- const keys = grantsToDbKeys(profile.grants ?? {}, await catalogKeys());
521
+ const catalog = await catalogKeys();
522
+ const keys = [.../* @__PURE__ */ new Set([...grantsToDbKeys(profile.grants ?? {}, catalog), ...SESSION_BASELINE.filter((k) => catalog.has(k))])];
584
523
  const set = await core().rpc("role_set_permissions", { p_role_id: roleId, p_keys: keys });
585
524
  if (set.error) throw set.error;
586
525
  const profiles = await this.listProfiles(orgId);
@@ -610,7 +549,8 @@ function createSupabaseOrgAdapter(config) {
610
549
  if (error) throw error;
611
550
  }
612
551
  if (data.grants) {
613
- const keys = grantsToDbKeys(data.grants, await catalogKeys());
552
+ const catalog = await catalogKeys();
553
+ const keys = [.../* @__PURE__ */ new Set([...grantsToDbKeys(data.grants, catalog), ...SESSION_BASELINE.filter((k) => catalog.has(k))])];
614
554
  const { error } = await core().rpc("role_set_permissions", { p_role_id: role.id, p_keys: keys });
615
555
  if (error) throw error;
616
556
  }
@@ -2064,13 +2004,14 @@ function WorkspaceChooser({ memberships, suggestedId, onCancel }) {
2064
2004
  ) })
2065
2005
  ] }),
2066
2006
  search.searchable && /* @__PURE__ */ jsx(
2067
- "input",
2007
+ Input,
2068
2008
  {
2069
2009
  value: query,
2070
2010
  onChange: (e) => setQuery(e.target.value),
2071
2011
  placeholder: tr("organization.searchWorkspace", "Buscar conta\u2026"),
2072
2012
  autoFocus: true,
2073
- className: "mb-3 w-full rounded-lg border border-border bg-card px-3 py-2 text-sm text-foreground outline-none placeholder:text-muted-foreground focus:border-primary"
2013
+ wrapperClassName: "mb-3",
2014
+ className: "rounded-lg border-border shadow-none focus:border-primary focus-visible:ring-0 focus-visible:ring-offset-0"
2074
2015
  }
2075
2016
  ),
2076
2017
  /* @__PURE__ */ jsxs(
@@ -2085,8 +2026,10 @@ function WorkspaceChooser({ memberships, suggestedId, onCancel }) {
2085
2026
  const isSelected = m.orgId === selected;
2086
2027
  const isSuggested = m.orgId === suggestedId;
2087
2028
  return /* @__PURE__ */ jsxs(
2088
- "button",
2029
+ Button,
2089
2030
  {
2031
+ variant: "bare",
2032
+ size: "bare",
2090
2033
  type: "button",
2091
2034
  role: "radio",
2092
2035
  "aria-checked": isSelected,
@@ -2094,7 +2037,7 @@ function WorkspaceChooser({ memberships, suggestedId, onCancel }) {
2094
2037
  onClick: () => setSelected(m.orgId),
2095
2038
  onDoubleClick: () => void enter(m.orgId),
2096
2039
  className: cn$1(
2097
- "flex w-full items-center gap-3 rounded-lg border p-3 text-left transition-colors",
2040
+ "flex w-full items-center gap-3 rounded-lg border p-3 text-left transition-colors justify-start whitespace-normal text-[length:inherit] font-normal",
2098
2041
  "disabled:opacity-60",
2099
2042
  isSelected ? "border-primary bg-primary/5" : "border-border hover:border-primary/50 hover:bg-muted/50"
2100
2043
  ),
@@ -2147,9 +2090,6 @@ function WorkspaceChooser({ memberships, suggestedId, onCancel }) {
2147
2090
  ) })
2148
2091
  ] }) });
2149
2092
  }
2150
- var getSupabaseClientOptional3 = () => getSupabaseClientOptional();
2151
-
2152
- // src/app/useDomainTenant.ts
2153
2093
  var LOCAL = /^(localhost|127\.0\.0\.1|\[::1\])$/;
2154
2094
  function resolveHostname() {
2155
2095
  if (typeof window === "undefined") return null;
@@ -2163,7 +2103,7 @@ function useDomainTenant() {
2163
2103
  const [resolving, setResolving] = useState(true);
2164
2104
  useEffect(() => {
2165
2105
  const host = resolveHostname();
2166
- const supabase = getSupabaseClientOptional3();
2106
+ const supabase = getSupabaseClientOptional$1();
2167
2107
  if (!host || !supabase) {
2168
2108
  setResolving(false);
2169
2109
  return;
@@ -2330,6 +2270,6 @@ function WorkspaceSwitchingHost() {
2330
2270
  );
2331
2271
  }
2332
2272
 
2333
- export { ORG_CACHE_TTL_MS, OrgMark, OrgProvider, UNIT_ACCESS_CHANGED, WorkspaceChooser, WorkspaceChooserGate, WorkspaceSwitching, WorkspaceSwitchingHost, activePluginIds, bindAllMembersTo, bindUserToUnit, clearOrgSnapshot, countUnboundMembers, createFayzSupabaseClient, createMockOrgAdapter, createSupabaseOrgAdapter, decideWorkspaceChoice, dedup2 as dedup, fetchMemberActivity, fetchMemberUnits, fetchUnitMembers, fetchUserIdForPerson, getAutoPick, getFayzSupabaseClient, getFayzSupabaseClientOptional, getSupabaseClientOptional3 as getSupabaseClientOptional, hasPlugin, markWorkspaceSwitch, orgInitials, readOrgSnapshot, resolveAppId, searchWorkspaces, setAutoPick, setUnitModeRemote, takeWorkspaceSwitch, unbindUserFromUnit, useAppConfigStore, useOrgAdapter, useOrgAdapterOptional, useTenant, useTenantOptional, useUnitStore, useWorkspaceSwitchingStore };
2334
- //# sourceMappingURL=chunk-V2IBAF4O.js.map
2335
- //# sourceMappingURL=chunk-V2IBAF4O.js.map
2273
+ export { ORG_CACHE_TTL_MS, OrgMark, OrgProvider, UNIT_ACCESS_CHANGED, WorkspaceChooser, WorkspaceChooserGate, WorkspaceSwitching, WorkspaceSwitchingHost, activePluginIds, bindAllMembersTo, bindUserToUnit, clearOrgSnapshot, countUnboundMembers, createMockOrgAdapter, createSupabaseOrgAdapter, decideWorkspaceChoice, dedup2 as dedup, fetchMemberActivity, fetchMemberUnits, fetchUnitMembers, fetchUserIdForPerson, getAutoPick, hasPlugin, markWorkspaceSwitch, orgInitials, readOrgSnapshot, resolveAppId, searchWorkspaces, setAutoPick, setUnitModeRemote, takeWorkspaceSwitch, unbindUserFromUnit, useAppConfigStore, useOrgAdapter, useOrgAdapterOptional, useTenant, useTenantOptional, useUnitStore, useWorkspaceSwitchingStore };
2274
+ //# sourceMappingURL=chunk-ZMP52ZHM.js.map
2275
+ //# sourceMappingURL=chunk-ZMP52ZHM.js.map