@fayz-ai/saas 0.8.1 → 0.8.2

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 (233) hide show
  1. package/dist/access/context.d.ts +47 -0
  2. package/dist/access/context.d.ts.map +1 -0
  3. package/dist/access/headless.d.ts +21 -0
  4. package/dist/access/headless.d.ts.map +1 -0
  5. package/dist/access/index.d.ts +12 -0
  6. package/dist/access/index.d.ts.map +1 -0
  7. package/dist/access/limits-registry.d.ts +33 -0
  8. package/dist/access/limits-registry.d.ts.map +1 -0
  9. package/dist/access/module-nav.d.ts +15 -0
  10. package/dist/access/module-nav.d.ts.map +1 -0
  11. package/dist/access/resolver.d.ts +2 -0
  12. package/dist/access/resolver.d.ts.map +1 -0
  13. package/dist/access/types.d.ts +43 -0
  14. package/dist/access/types.d.ts.map +1 -0
  15. package/dist/access/upgrade-modal-store.d.ts +23 -0
  16. package/dist/access/upgrade-modal-store.d.ts.map +1 -0
  17. package/dist/app/AdminShell.d.ts +3 -0
  18. package/dist/app/AdminShell.d.ts.map +1 -1
  19. package/dist/app/admin-app.d.ts +3 -1
  20. package/dist/app/admin-app.d.ts.map +1 -1
  21. package/dist/app/config.d.ts +47 -2
  22. package/dist/app/config.d.ts.map +1 -1
  23. package/dist/app/core-entities.d.ts +25 -0
  24. package/dist/app/core-entities.d.ts.map +1 -0
  25. package/dist/app/derive-contract.d.ts +8 -0
  26. package/dist/app/derive-contract.d.ts.map +1 -0
  27. package/dist/app/scaffold.d.ts.map +1 -1
  28. package/dist/archetype-lookup.d.ts.map +1 -1
  29. package/dist/billing/index.cjs +6 -2
  30. package/dist/billing/index.d.ts +2 -0
  31. package/dist/billing/index.d.ts.map +1 -1
  32. package/dist/billing/index.js +1 -1
  33. package/dist/billing/plan-badge.d.ts +17 -0
  34. package/dist/billing/plan-badge.d.ts.map +1 -0
  35. package/dist/billing/store.d.ts +6 -1
  36. package/dist/billing/store.d.ts.map +1 -1
  37. package/dist/{chunk-3M25GRRU.js → chunk-I3DY47N5.js} +3 -4
  38. package/dist/chunk-I3DY47N5.js.map +1 -0
  39. package/dist/chunk-NNFGMUF2.cjs +39 -0
  40. package/dist/chunk-NNFGMUF2.cjs.map +1 -0
  41. package/dist/{chunk-4XTQ4V5L.cjs → chunk-SAZLW54Y.cjs} +16 -12
  42. package/dist/chunk-SAZLW54Y.cjs.map +1 -0
  43. package/dist/{chunk-IPWCHJPE.cjs → chunk-VKYZACG5.cjs} +5 -6
  44. package/dist/chunk-VKYZACG5.cjs.map +1 -0
  45. package/dist/chunk-VN5NTK26.js +36 -0
  46. package/dist/chunk-VN5NTK26.js.map +1 -0
  47. package/dist/{chunk-XNWCGJYH.js → chunk-VTEP2AQX.js} +15 -11
  48. package/dist/chunk-VTEP2AQX.js.map +1 -0
  49. package/dist/components/shared/ContactPicker.d.ts +92 -0
  50. package/dist/components/shared/ContactPicker.d.ts.map +1 -0
  51. package/dist/components/shared/PersonLink.d.ts +12 -1
  52. package/dist/components/shared/PersonLink.d.ts.map +1 -1
  53. package/dist/components/shared/create-person.d.ts +20 -0
  54. package/dist/components/shared/create-person.d.ts.map +1 -0
  55. package/dist/crud/CrudDetailPage.d.ts.map +1 -1
  56. package/dist/crud/CrudFormPage.d.ts.map +1 -1
  57. package/dist/crud/CrudListView.d.ts.map +1 -1
  58. package/dist/crud/CrudPage.d.ts.map +1 -1
  59. package/dist/crud/archetypes/AddressesTab.d.ts +21 -0
  60. package/dist/crud/archetypes/AddressesTab.d.ts.map +1 -0
  61. package/dist/crud/archetypes/PersonDetailTabs.d.ts +2 -1
  62. package/dist/crud/archetypes/PersonDetailTabs.d.ts.map +1 -1
  63. package/dist/crud/createCrudPage.d.ts.map +1 -1
  64. package/dist/crud/index.d.ts +1 -0
  65. package/dist/crud/index.d.ts.map +1 -1
  66. package/dist/index.cjs +4281 -716
  67. package/dist/index.cjs.map +1 -1
  68. package/dist/index.d.ts +17 -2
  69. package/dist/index.d.ts.map +1 -1
  70. package/dist/index.js +4067 -542
  71. package/dist/index.js.map +1 -1
  72. package/dist/org/index.cjs +11 -11
  73. package/dist/org/index.js +2 -2
  74. package/dist/org/store.d.ts.map +1 -1
  75. package/dist/permissions/context.d.ts +2 -0
  76. package/dist/permissions/context.d.ts.map +1 -1
  77. package/dist/permissions/index.cjs +7 -7
  78. package/dist/permissions/index.js +1 -1
  79. package/dist/shell/components/auth/ProtectedRoute.d.ts.map +1 -1
  80. package/dist/shell/components/billing/SoftLimitBanner.d.ts +5 -0
  81. package/dist/shell/components/billing/SoftLimitBanner.d.ts.map +1 -0
  82. package/dist/shell/components/billing/SubscriptionPage.d.ts +5 -0
  83. package/dist/shell/components/billing/SubscriptionPage.d.ts.map +1 -0
  84. package/dist/shell/components/billing/UpgradeModal.d.ts +3 -0
  85. package/dist/shell/components/billing/UpgradeModal.d.ts.map +1 -0
  86. package/dist/shell/components/billing/UpgradePrompt.d.ts +10 -0
  87. package/dist/shell/components/billing/UpgradePrompt.d.ts.map +1 -0
  88. package/dist/shell/components/billing/access-contract.d.ts +18 -0
  89. package/dist/shell/components/billing/access-contract.d.ts.map +1 -0
  90. package/dist/shell/components/billing/gates.d.ts +14 -0
  91. package/dist/shell/components/billing/gates.d.ts.map +1 -0
  92. package/dist/shell/components/billing/index.d.ts +9 -2
  93. package/dist/shell/components/billing/index.d.ts.map +1 -1
  94. package/dist/shell/components/chat/ChatFab.d.ts +3 -1
  95. package/dist/shell/components/chat/ChatFab.d.ts.map +1 -1
  96. package/dist/shell/components/chat/ChatPanel.d.ts +3 -1
  97. package/dist/shell/components/chat/ChatPanel.d.ts.map +1 -1
  98. package/dist/shell/components/chat/ConfirmActionCard.d.ts +13 -0
  99. package/dist/shell/components/chat/ConfirmActionCard.d.ts.map +1 -0
  100. package/dist/shell/components/chat/markdown.d.ts +5 -0
  101. package/dist/shell/components/chat/markdown.d.ts.map +1 -0
  102. package/dist/shell/components/organization/TeamTab.d.ts.map +1 -1
  103. package/dist/shell/components/organization/TenantOnboarding.d.ts.map +1 -1
  104. package/dist/shell/components/organization/index.d.ts +0 -1
  105. package/dist/shell/components/organization/index.d.ts.map +1 -1
  106. package/dist/shell/components/settings/ConnectedCompanySettings.d.ts.map +1 -1
  107. package/dist/shell/components/settings/ConnectedFieldRulesSettings.d.ts.map +1 -1
  108. package/dist/shell/components/settings/ConnectedSecuritySettings.d.ts.map +1 -1
  109. package/dist/shell/components/settings/LocationsCrudPage.d.ts +1 -1
  110. package/dist/shell/components/settings/LocationsCrudPage.d.ts.map +1 -1
  111. package/dist/shell/components/settings/SettingsPage.d.ts +23 -2
  112. package/dist/shell/components/settings/SettingsPage.d.ts.map +1 -1
  113. package/dist/shell/hooks/index.d.ts +3 -2
  114. package/dist/shell/hooks/index.d.ts.map +1 -1
  115. package/dist/shell/hooks/useAITools.d.ts +2 -0
  116. package/dist/shell/hooks/useAITools.d.ts.map +1 -1
  117. package/dist/shell/hooks/useChat.d.ts +22 -0
  118. package/dist/shell/hooks/useChat.d.ts.map +1 -1
  119. package/dist/shell/hooks/useSystemPermission.d.ts +3 -0
  120. package/dist/shell/hooks/useSystemPermission.d.ts.map +1 -0
  121. package/dist/shell/hooks/useTenantPluginSettings.d.ts +12 -0
  122. package/dist/shell/hooks/useTenantPluginSettings.d.ts.map +1 -0
  123. package/dist/shell/lib/ai-tool-handlers.d.ts +119 -0
  124. package/dist/shell/lib/ai-tool-handlers.d.ts.map +1 -0
  125. package/dist/shell/lib/core-ai-tools.d.ts +14 -0
  126. package/dist/shell/lib/core-ai-tools.d.ts.map +1 -1
  127. package/dist/shell/lib/create-client-orders-provider.d.ts.map +1 -1
  128. package/dist/shell/lib/fayz-agent.d.ts +23 -0
  129. package/dist/shell/lib/fayz-agent.d.ts.map +1 -0
  130. package/dist/shell/lib/i18n.d.ts.map +1 -1
  131. package/dist/shell/stores/chat.store.d.ts +69 -0
  132. package/dist/shell/stores/chat.store.d.ts.map +1 -1
  133. package/dist/shell/types/billing.d.ts +7 -0
  134. package/dist/shell/types/billing.d.ts.map +1 -1
  135. package/dist/shell/types/plugins.d.ts +2 -45
  136. package/dist/shell/types/plugins.d.ts.map +1 -1
  137. package/dist/stores/createCrudStore.d.ts.map +1 -1
  138. package/package.json +14 -11
  139. package/src/access/context.tsx +228 -0
  140. package/src/access/headless.ts +71 -0
  141. package/src/access/index.ts +27 -0
  142. package/src/access/limits-registry.ts +86 -0
  143. package/src/access/module-nav.test.ts +78 -0
  144. package/src/access/module-nav.ts +82 -0
  145. package/src/access/resolver.test.ts +143 -0
  146. package/src/access/resolver.ts +5 -0
  147. package/src/access/types.ts +47 -0
  148. package/src/access/upgrade-modal-store.ts +30 -0
  149. package/src/app/AdminShell.tsx +451 -68
  150. package/src/app/admin-app.tsx +46 -9
  151. package/src/app/config.ts +54 -1
  152. package/src/app/core-entities.ts +110 -0
  153. package/src/app/derive-contract.test.ts +155 -0
  154. package/src/app/derive-contract.ts +214 -0
  155. package/src/app/scaffold.tsx +4 -0
  156. package/src/archetype-lookup.ts +8 -2
  157. package/src/billing/index.ts +2 -0
  158. package/src/billing/plan-badge.ts +32 -0
  159. package/src/billing/store.ts +8 -1
  160. package/src/components/shared/ContactPicker.tsx +394 -0
  161. package/src/components/shared/PersonLink.tsx +11 -3
  162. package/src/components/shared/create-person.ts +74 -0
  163. package/src/crud/CrudDetailPage.tsx +5 -1
  164. package/src/crud/CrudFormPage.tsx +113 -6
  165. package/src/crud/CrudListView.tsx +16 -1
  166. package/src/crud/CrudPage.tsx +27 -5
  167. package/src/crud/DeleteConfirmDialog.tsx +1 -1
  168. package/src/crud/archetypes/AddressesTab.tsx +387 -0
  169. package/src/crud/archetypes/PersonDetailTabs.tsx +5 -0
  170. package/src/crud/createCrudPage.tsx +2 -0
  171. package/src/crud/index.ts +6 -0
  172. package/src/env.d.ts +7 -0
  173. package/src/index.ts +49 -1
  174. package/src/org/store.ts +9 -1
  175. package/src/permissions/context.tsx +29 -15
  176. package/src/shell/components/auth/ProtectedRoute.tsx +12 -2
  177. package/src/shell/components/billing/SoftLimitBanner.tsx +81 -0
  178. package/src/shell/components/billing/SubscriptionPage.tsx +372 -0
  179. package/src/shell/components/billing/UpgradeModal.tsx +102 -0
  180. package/src/shell/components/billing/UpgradePrompt.tsx +229 -0
  181. package/src/shell/components/billing/access-contract.ts +64 -0
  182. package/src/shell/components/billing/gates.tsx +62 -0
  183. package/src/shell/components/billing/index.ts +18 -2
  184. package/src/shell/components/chat/ChatFab.tsx +4 -2
  185. package/src/shell/components/chat/ChatPanel.tsx +174 -23
  186. package/src/shell/components/chat/ConfirmActionCard.tsx +57 -0
  187. package/src/shell/components/chat/markdown.tsx +102 -0
  188. package/src/shell/components/organization/TeamTab.tsx +21 -4
  189. package/src/shell/components/organization/TenantOnboarding.tsx +3 -1
  190. package/src/shell/components/organization/index.ts +0 -1
  191. package/src/shell/components/settings/ConnectedCompanySettings.tsx +4 -1
  192. package/src/shell/components/settings/ConnectedFieldRulesSettings.tsx +3 -1
  193. package/src/shell/components/settings/ConnectedSecuritySettings.tsx +3 -1
  194. package/src/shell/components/settings/LocationsCrudPage.ts +6 -1
  195. package/src/shell/components/settings/SettingsPage.tsx +63 -21
  196. package/src/shell/hooks/index.ts +3 -2
  197. package/src/shell/hooks/useAITools.ts +27 -23
  198. package/src/shell/hooks/useChat.ts +381 -16
  199. package/src/shell/hooks/useSystemPermission.ts +23 -0
  200. package/src/shell/hooks/useTenantPluginSettings.ts +127 -0
  201. package/src/shell/lib/ai-tool-handlers.ts +910 -0
  202. package/src/shell/lib/core-ai-tools.ts +234 -2
  203. package/src/shell/lib/create-client-orders-provider.ts +24 -2
  204. package/src/shell/lib/fayz-agent.ts +56 -0
  205. package/src/shell/lib/i18n.ts +71 -0
  206. package/src/shell/stores/chat.store.ts +118 -1
  207. package/src/shell/styles.css +30 -0
  208. package/src/shell/types/billing.ts +8 -0
  209. package/src/shell/types/plugins.ts +13 -50
  210. package/src/stores/createCrudStore.ts +9 -0
  211. package/dist/chunk-3M25GRRU.js.map +0 -1
  212. package/dist/chunk-4XTQ4V5L.cjs.map +0 -1
  213. package/dist/chunk-5GYQK5IW.js +0 -21
  214. package/dist/chunk-5GYQK5IW.js.map +0 -1
  215. package/dist/chunk-IPWCHJPE.cjs.map +0 -1
  216. package/dist/chunk-KYID2MR6.cjs +0 -23
  217. package/dist/chunk-KYID2MR6.cjs.map +0 -1
  218. package/dist/chunk-XNWCGJYH.js.map +0 -1
  219. package/dist/shell/components/billing/BillingPage.d.ts +0 -7
  220. package/dist/shell/components/billing/BillingPage.d.ts.map +0 -1
  221. package/dist/shell/components/billing/PaywallGate.d.ts +0 -11
  222. package/dist/shell/components/billing/PaywallGate.d.ts.map +0 -1
  223. package/dist/shell/components/organization/PermissionGate.d.ts +0 -11
  224. package/dist/shell/components/organization/PermissionGate.d.ts.map +0 -1
  225. package/dist/shell/hooks/useBilling.d.ts +0 -14
  226. package/dist/shell/hooks/useBilling.d.ts.map +0 -1
  227. package/dist/shell/hooks/usePermission.d.ts +0 -16
  228. package/dist/shell/hooks/usePermission.d.ts.map +0 -1
  229. package/src/shell/components/billing/BillingPage.tsx +0 -56
  230. package/src/shell/components/billing/PaywallGate.tsx +0 -80
  231. package/src/shell/components/organization/PermissionGate.tsx +0 -16
  232. package/src/shell/hooks/useBilling.ts +0 -151
  233. package/src/shell/hooks/usePermission.ts +0 -101
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/supabase/client.ts","../src/org/adapters/supabase.ts","../src/org/adapters/mock.ts","../src/org/store.ts","../src/org/context.tsx"],"names":["slugify","STORAGE_KEY"],"mappings":"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","file":"chunk-I3DY47N5.js","sourcesContent":["import { createClient, type SupabaseClient } from '@supabase/supabase-js'\nimport { setGlobalSupabaseClient } from '@fayz-ai/core'\n\nlet _client: SupabaseClient | null = null\n\n/**\n * Create (and cache) the Supabase client for the Fayz app.\n * Also registers it as the global client in @fayz-ai/core so data providers\n * can resolve it without prop-drilling.\n *\n * Idempotent — subsequent calls with the same URL return the cached client.\n */\nexport function createFayzSupabaseClient(url: string, anonKey: string): SupabaseClient {\n if (_client) return _client\n\n if (!url || !anonKey) {\n throw new Error(\n '[@fayz-ai/saas] Supabase URL and anon key are required. ' +\n 'Pass supabaseUrl and supabaseAnonKey to createFayzApp.',\n )\n }\n\n _client = createClient(url, anonKey, {\n auth: { autoRefreshToken: true, persistSession: true },\n })\n\n // Register globally so @fayz-ai/core data providers can use it\n setGlobalSupabaseClient(_client)\n\n return _client\n}\n\n/** Get the cached client — throws if not initialised */\nexport function getFayzSupabaseClient(): SupabaseClient {\n if (!_client) {\n throw new Error(\n '[@fayz-ai/saas] Supabase client not initialised. Call createFayzApp with supabaseUrl and supabaseAnonKey first.',\n )\n }\n return _client\n}\n\n/** Safe getter — returns null if not initialised (mock/offline mode) */\nexport function getFayzSupabaseClientOptional(): SupabaseClient | null {\n return _client\n}\n","import type {\n OrgAdapter,\n Organization,\n OrgMember,\n OrgMembership,\n CreateOrgOptions,\n Location,\n Invite,\n} from '@fayz-ai/core'\nimport type { PermissionProfile, SystemPermission, AuthAdapter } from '@fayz-ai/core'\nimport { getFayzSupabaseClient } from '../../supabase/client'\n\n// ---------------------------------------------------------------------------\n// Request dedup — prevents duplicate in-flight requests (React StrictMode etc.)\n// ---------------------------------------------------------------------------\n\nconst inflightRequests = new Map<string, Promise<unknown>>()\n\nfunction dedup<T>(key: string, fn: () => Promise<T>): Promise<T> {\n const existing = inflightRequests.get(key)\n if (existing) return existing as Promise<T>\n\n const promise = fn().finally(() => {\n inflightRequests.delete(key)\n })\n inflightRequests.set(key, promise)\n return promise\n}\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\nfunction slugify(name: string): string {\n return name.toLowerCase().replace(/[^a-z0-9]+/g, '-').replace(/^-|-$/g, '')\n}\n\nfunction capitalize(s: string): string {\n return s.charAt(0).toUpperCase() + s.slice(1)\n}\n\nfunction mapTenantToOrg(row: Record<string, unknown>): Organization {\n return {\n id: row['id'] as string,\n name: row['name'] as string,\n slug: row['slug'] as string,\n logoUrl: (row['logo_url'] as string | null) ?? undefined,\n verticalId: (row['vertical_id'] as string | null) ?? undefined,\n plan: (row['plan'] as string | null) ?? undefined,\n settings: (row['settings'] as Record<string, unknown> | null) ?? undefined,\n createdAt: row['created_at'] as string,\n updatedAt: row['updated_at'] as string,\n }\n}\n\nfunction mapMemberRow(row: Record<string, unknown>): OrgMember {\n const profile = (row['profile'] as Record<string, unknown>) ?? {}\n return {\n id: row['id'] as string,\n userId: row['user_id'] as string,\n orgId: row['tenant_id'] as string,\n profileId: row['role'] as string,\n profileName: capitalize(row['role'] as string),\n user: {\n id: row['user_id'] as string,\n email: (profile['email'] as string) ?? '',\n fullName: (profile['full_name'] as string) ?? '',\n avatarUrl: (profile['avatar_url'] as string | null) ?? undefined,\n },\n // tenant_members has no `joined_at` column — it's `created_at`.\n joinedAt: (row['joined_at'] ?? row['created_at']) as string,\n }\n}\n\nfunction mapLocationRow(row: Record<string, unknown>): Location {\n return {\n id: row['id'] as string,\n tenantId: row['tenant_id'] as string,\n name: row['name'] as string,\n address: (row['address'] as string | null) ?? undefined,\n city: (row['city'] as string | null) ?? undefined,\n state: (row['state'] as string | null) ?? undefined,\n country: (row['country'] as string | null) ?? undefined,\n phone: (row['phone'] as string | null) ?? undefined,\n isHeadquarters: (row['is_headquarters'] as boolean) ?? false,\n isActive: (row['is_active'] as boolean) ?? true,\n createdAt: row['created_at'] as string,\n updatedAt: row['updated_at'] as string,\n }\n}\n\nfunction mapInviteRow(row: Record<string, unknown>): Invite {\n return {\n id: row['id'] as string,\n orgId: row['tenant_id'] as string,\n email: row['email'] as string,\n profileId: row['role'] as string,\n profileName: capitalize(row['role'] as string),\n invitedBy: row['invited_by'] as string,\n token: row['token'] as string,\n status: (row['status'] as Invite['status']) ?? 'pending',\n createdAt: row['created_at'] as string,\n expiresAt: row['expires_at'] as string,\n }\n}\n\n/** Minimal role identity the adapter needs to build profiles. Grants come from\n * the DB catalog; id/name/order/description come from what the app declares. */\nexport interface RoleIdentity {\n id: string\n name: string\n description?: string\n /** System roles are app-defined and static (not user-editable). Custom roles\n * (duplicated by users, stored in tenant_roles) are false. Defaults true. */\n isSystem?: boolean\n}\n\n// Matrix emits read/create/edit/delete; map back to DB action verbs.\nconst DB_ACTION: Record<string, string> = {\n read: 'read', create: 'create', edit: 'update', write: 'create', manage: 'manage', delete: 'delete',\n}\n\nfunction slugifyRole(name: string): string {\n return name.toLowerCase().normalize('NFD').replace(/[\\u0300-\\u036f]/g, '')\n .replace(/[^a-z0-9]+/g, '-').replace(/^-|-$/g, '') || 'role'\n}\n\n// Fallback role set when the host app declares none. The SDK is domain-agnostic:\n// each app defines its OWN business roles (a salon's roles ≠ an agency's) via\n// config.permissions.defaultProfiles. These five are only a back-compat default.\nconst DEFAULT_ROLES: RoleIdentity[] = [\n { id: 'owner', name: 'Owner' },\n { id: 'admin', name: 'Admin' },\n { id: 'manager', name: 'Manager' },\n { id: 'staff', name: 'Staff' },\n { id: 'viewer', name: 'Viewer' },\n]\n\n// DB permission ids that confer an org-management system permission.\nconst SYSTEM_PERMISSION_MAP: Record<string, SystemPermission> = {\n 'team.read': 'manage_team',\n 'team.invite': 'manage_team',\n 'team.manage': 'manage_team',\n 'team.manage_roles': 'manage_permissions',\n 'billing.read': 'manage_billing',\n 'billing.manage': 'manage_billing',\n 'settings.read': 'manage_settings',\n 'settings.update': 'manage_settings',\n}\nconst ALL_SYSTEM_PERMISSIONS: SystemPermission[] = ['manage_team', 'manage_billing', 'manage_settings', 'manage_permissions']\n\n// Map DB permission ids to feature action grants\nfunction buildPermissionProfiles(\n roles: RoleIdentity[],\n permissions: Array<{ id: string; category: string }>,\n rolePerms: Array<{ role: string; permission_id: string }>,\n overrides: Array<{ role: string; permission_id: string; granted: boolean }>,\n): PermissionProfile[] {\n const overrideMap = new Map<string, boolean>()\n for (const o of overrides) {\n overrideMap.set(`${o.role}:${o.permission_id}`, o.granted)\n }\n\n // The role SET comes from what the app declares — the SDK no longer bakes it in.\n const rolePermMap = new Map<string, Set<string>>()\n for (const r of roles) {\n rolePermMap.set(r.id, new Set())\n }\n // Convention: an 'owner' role (if declared) gets every permission implicitly.\n if (rolePermMap.has('owner')) {\n for (const p of permissions) rolePermMap.get('owner')!.add(p.id)\n }\n for (const rp of rolePerms) {\n rolePermMap.get(rp.role)?.add(rp.permission_id)\n }\n\n // Apply overrides\n for (const [key, granted] of overrideMap) {\n const colonIdx = key.indexOf(':')\n const role = key.slice(0, colonIdx)\n const permId = key.slice(colonIdx + 1)\n const perms = rolePermMap.get(role)\n if (!perms) continue\n if (granted) {\n perms.add(permId)\n } else {\n perms.delete(permId)\n }\n }\n\n // Align DB actions with the matrix's action vocabulary (read/create/edit/delete).\n const actionMap: Record<string, string> = {\n read: 'read',\n create: 'create',\n update: 'edit',\n manage: 'edit',\n delete: 'delete',\n configure: 'edit',\n invite: 'create',\n }\n\n return roles.map(({ id: role, name, description, isSystem }) => {\n const permIds = rolePermMap.get(role)!\n const features: Record<string, string[]> = {}\n\n for (const permId of permIds) {\n const dotIdx = permId.indexOf('.')\n if (dotIdx === -1) continue\n const category = permId.slice(0, dotIdx)\n const action = permId.slice(dotIdx + 1)\n const mappedAction = actionMap[action]\n if (!mappedAction) continue\n\n if (!features[category]) features[category] = []\n if (!features[category].includes(mappedAction)) {\n features[category].push(mappedAction)\n }\n }\n\n // Org-management system permissions, derived from team/billing/settings\n // grants (owner gets all four). These gate the Equipe/Permissões tabs.\n const systemPermissions: SystemPermission[] = []\n const source = role === 'owner' ? ALL_SYSTEM_PERMISSIONS : [...permIds].map((id) => SYSTEM_PERMISSION_MAP[id])\n for (const sp of source) {\n if (sp && !systemPermissions.includes(sp)) systemPermissions.push(sp)\n }\n\n return {\n id: role,\n name: name || capitalize(role),\n description,\n isSystem: isSystem ?? true,\n systemPermissions,\n grants: features,\n }\n })\n}\n\n// ---------------------------------------------------------------------------\n// Adapter factory\n// ---------------------------------------------------------------------------\n\nexport interface SupabaseOrgAdapterConfig {\n /** Deprecated — core tables now live in the public schema; this field is ignored. */\n coreSchema?: string\n /** Business roles the host app declares (config.permissions.defaultProfiles).\n * Falls back to the generic five when omitted. */\n roles?: RoleIdentity[]\n /** Auth adapter used to actually DELIVER invites (send the e-mail + create the\n * auth user) — the org adapter only records the audit row. Injected by the app;\n * when omitted, invites are recorded but not delivered. */\n authAdapter?: AuthAdapter\n /** Canonical, deployment-fixed origin baked into invite/magic-link redirects\n * (e.g. https://beauty-saas.live.fayz.ai). The container injects it as\n * VITE_APP_URL; the app wiring passes it here. Falls back to\n * window.location.origin, which is wrong when an admin invites from a preview\n * or localhost origin. Note: whatever origin ends up here must ALSO be in the\n * Supabase project's Redirect URLs allow-list, or Supabase silently swaps it\n * for its Site URL (default http://localhost:3000). */\n siteUrl?: string\n}\n\nexport function createSupabaseOrgAdapter(config?: SupabaseOrgAdapterConfig): OrgAdapter {\n const roles: RoleIdentity[] = config?.roles && config.roles.length > 0 ? config.roles : DEFAULT_ROLES\n const authAdapter = config?.authAdapter\n const originBase =\n config?.siteUrl?.replace(/\\/+$/, '') ??\n (typeof window !== 'undefined' ? window.location.origin : undefined)\n const inviteRedirectTo = originBase ? `${originBase}/` : undefined\n\n function supabase() {\n return getFayzSupabaseClient()\n }\n\n function core() {\n return supabase()\n }\n\n return {\n async listUserOrgs(userId: string): Promise<OrgMembership[]> {\n return dedup(`listUserOrgs:${userId}`, async () => {\n const { data, error } = await core()\n .from('tenant_members')\n .select('tenant_id, role, tenant:tenants(id, name, slug, logo_url)')\n .eq('user_id', userId)\n\n if (error) throw error\n\n return ((data ?? []) as Array<Record<string, unknown>>).map((row) => ({\n orgId: row['tenant_id'] as string,\n orgName: ((row['tenant'] as Record<string, unknown>)?.['name'] as string) ?? '',\n orgSlug: ((row['tenant'] as Record<string, unknown>)?.['slug'] as string) ?? '',\n orgLogoUrl: ((row['tenant'] as Record<string, unknown>)?.['logo_url'] as string | null) ?? undefined,\n profileId: row['role'] as string,\n profileName: capitalize(row['role'] as string),\n }))\n })\n },\n\n async getOrg(orgId: string): Promise<Organization> {\n const { data, error } = await core()\n .from('tenants')\n .select('*')\n .eq('id', orgId)\n .single()\n\n if (error) throw error\n return mapTenantToOrg(data as Record<string, unknown>)\n },\n\n async createOrg(name: string, userId: string, options?: CreateOrgOptions): Promise<Organization> {\n const { data: tenant, error } = await supabase()\n .rpc('create_tenant_with_owner', {\n p_name: name,\n p_slug: slugify(name),\n p_user_id: userId,\n p_vertical_id: options?.verticalId ?? null,\n p_plan: 'free',\n p_settings: {\n timezone: options?.timezone ?? 'America/Sao_Paulo',\n currency: options?.currency ?? 'BRL',\n locale: options?.locale ?? 'pt-BR',\n teamSize: options?.teamSize ?? undefined,\n branding: {},\n },\n })\n\n if (error) throw error\n return mapTenantToOrg(tenant as Record<string, unknown>)\n },\n\n async updateOrg(orgId: string, updates: Partial<Organization>): Promise<Organization> {\n const row: Record<string, unknown> = {}\n if (updates.name !== undefined) row['name'] = updates.name\n if (updates.slug !== undefined) row['slug'] = updates.slug\n if (updates.logoUrl !== undefined) row['logo_url'] = updates.logoUrl\n if (updates.verticalId !== undefined) row['vertical_id'] = updates.verticalId\n if (updates.plan !== undefined) row['plan'] = updates.plan\n if (updates.settings !== undefined) row['settings'] = updates.settings\n\n const { data, error } = await core()\n .from('tenants')\n .update(row)\n .eq('id', orgId)\n .select()\n .single()\n\n if (error) throw error\n return mapTenantToOrg(data as Record<string, unknown>)\n },\n\n async listMembers(orgId: string): Promise<OrgMember[]> {\n const { data, error } = await core()\n .from('tenant_members')\n .select('*')\n .eq('tenant_id', orgId)\n\n if (error) throw error\n\n const userIds = ((data ?? []) as Array<Record<string, unknown>>).map((m) => m['user_id'] as string)\n const { data: profiles } = userIds.length > 0\n ? await core().from('profiles').select('id, full_name, avatar_url, email').in('id', userIds)\n : { data: [] }\n\n const profileMap = new Map(\n ((profiles ?? []) as Array<Record<string, unknown>>).map((p) => [p['id'], p]),\n )\n\n return ((data ?? []) as Array<Record<string, unknown>>).map((row) => {\n const profile = profileMap.get(row['user_id'] as string) ?? {}\n return mapMemberRow({ ...row, profile })\n })\n },\n\n async updateMemberProfile(orgId: string, memberId: string, profileId: string): Promise<void> {\n const { error } = await core()\n .from('tenant_members')\n .update({ role: profileId })\n .eq('id', memberId)\n .eq('tenant_id', orgId)\n\n if (error) throw error\n },\n\n async removeMember(orgId: string, memberId: string): Promise<void> {\n const { error } = await core()\n .from('tenant_members')\n .delete()\n .eq('id', memberId)\n .eq('tenant_id', orgId)\n\n if (error) throw error\n },\n\n async listProfiles(orgId: string): Promise<PermissionProfile[]> {\n const [permsResult, rolePermsResult, overridesResult, customResult] = await Promise.all([\n core().from('permissions').select('id, category'),\n core().from('role_permissions').select('role, permission_id'),\n core().from('tenant_role_overrides').select('role, permission_id, granted').eq('tenant_id', orgId),\n // Custom roles the tenant created by duplicating a system role. Tolerate a\n // missing table (pre-seed) — just show the system roles in that case.\n core().from('tenant_roles').select('key, name, description').eq('tenant_id', orgId),\n ])\n\n if (permsResult.error) throw permsResult.error\n if (rolePermsResult.error) throw rolePermsResult.error\n if (overridesResult.error) throw overridesResult.error\n\n const systemRoles: RoleIdentity[] = roles.map((r) => ({ ...r, isSystem: true }))\n const customRoles: RoleIdentity[] = customResult.error\n ? []\n : ((customResult.data ?? []) as Array<{ key: string; name: string; description: string | null }>).map((r) => ({\n id: r.key,\n name: r.name,\n description: r.description ?? undefined,\n isSystem: false,\n }))\n\n return buildPermissionProfiles(\n [...systemRoles, ...customRoles],\n (permsResult.data ?? []) as Array<{ id: string; category: string }>,\n (rolePermsResult.data ?? []) as Array<{ role: string; permission_id: string }>,\n (overridesResult.data ?? []) as Array<{ role: string; permission_id: string; granted: boolean }>,\n )\n },\n\n async createProfile(\n orgId: string,\n profile: Omit<PermissionProfile, 'id' | 'isSystem'>,\n ): Promise<PermissionProfile> {\n // Custom roles live in tenant_roles (identity/name) + tenant_role_overrides\n // (their grants). System roles stay app-defined and untouched.\n const existing = new Set(\n ((await core().from('tenant_roles').select('key').eq('tenant_id', orgId)).data ?? [])\n .map((r: { key: string }) => r.key),\n )\n let key = slugifyRole(profile.name)\n if (existing.has(key) || roles.some((r) => r.id === key)) {\n let n = 2\n while (existing.has(`${key}-${n}`) || roles.some((r) => r.id === `${key}-${n}`)) n++\n key = `${key}-${n}`\n }\n\n const insertRole = await core()\n .from('tenant_roles')\n .insert({ tenant_id: orgId, key, name: profile.name, description: profile.description ?? null })\n if (insertRole.error) throw insertRole.error\n\n const overrides = Object.entries(profile.grants ?? {}).flatMap(([category, actions]) =>\n actions.map((action) => ({\n tenant_id: orgId,\n role: key,\n permission_id: `${category}.${DB_ACTION[action] ?? action}`,\n granted: true,\n })),\n )\n if (overrides.length > 0) {\n const { error } = await core().from('tenant_role_overrides').insert(overrides)\n if (error) throw error\n }\n\n const profiles = await this.listProfiles(orgId)\n return profiles.find((p) => p.id === key) ?? {\n id: key, name: profile.name, description: profile.description, isSystem: false,\n systemPermissions: profile.systemPermissions ?? [], grants: profile.grants ?? {},\n }\n },\n\n async updateProfile(\n orgId: string,\n profileId: string,\n data: Partial<PermissionProfile>,\n ): Promise<PermissionProfile> {\n if (data.grants) {\n await core()\n .from('tenant_role_overrides')\n .delete()\n .eq('tenant_id', orgId)\n .eq('role', profileId)\n\n const overrides: Array<{\n tenant_id: string\n role: string\n permission_id: string\n granted: boolean\n }> = []\n\n for (const [category, actions] of Object.entries(data.grants)) {\n for (const action of actions) {\n // Matrix emits read/create/edit/delete; map back to DB action verbs.\n const dbActionMap: Record<string, string> = {\n read: 'read',\n create: 'create',\n edit: 'update',\n write: 'create',\n manage: 'manage',\n delete: 'delete',\n }\n const dbAction = dbActionMap[action] ?? action\n overrides.push({\n tenant_id: orgId,\n role: profileId,\n permission_id: `${category}.${dbAction}`,\n granted: true,\n })\n }\n }\n\n if (overrides.length > 0) {\n const { error } = await core().from('tenant_role_overrides').insert(overrides)\n if (error) throw error\n }\n }\n\n const profiles = await this.listProfiles(orgId)\n const updated = profiles.find((p) => p.id === profileId)\n if (!updated) throw new Error(`Profile not found: ${profileId}`)\n return updated\n },\n\n async deleteProfile(orgId: string, profileId: string): Promise<void> {\n // Only custom roles (present in tenant_roles) can be deleted; system roles\n // are app-defined and static.\n const found = await core()\n .from('tenant_roles')\n .select('key')\n .eq('tenant_id', orgId)\n .eq('key', profileId)\n .maybeSingle()\n if (found.error) throw found.error\n if (!found.data) throw new Error('System roles cannot be deleted.')\n\n await core().from('tenant_role_overrides').delete().eq('tenant_id', orgId).eq('role', profileId)\n const { error } = await core().from('tenant_roles').delete().eq('tenant_id', orgId).eq('key', profileId)\n if (error) throw error\n },\n\n async listInvites(orgId: string): Promise<Invite[]> {\n const { data, error } = await core()\n .from('invitations')\n .select('*')\n .eq('tenant_id', orgId)\n .order('created_at', { ascending: false })\n\n if (error) throw error\n return ((data ?? []) as Array<Record<string, unknown>>).map(mapInviteRow)\n },\n\n async createInvite(orgId: string, email: string, profileId: string, invitedBy: string): Promise<Invite> {\n const { data, error } = await core()\n .from('invitations')\n .insert({\n tenant_id: orgId,\n email,\n role: profileId,\n invited_by: invitedBy,\n })\n .select()\n .single()\n\n if (error) throw error\n // Deliver via the auth abstraction (sends the e-mail + creates the auth user,\n // stamping tenant_id/role on its metadata for the accept-time membership trigger).\n await authAdapter?.inviteUser?.(email, {\n redirectTo: inviteRedirectTo,\n data: { tenant_id: orgId, role: profileId, invited_by: invitedBy },\n })\n return mapInviteRow(data as Record<string, unknown>)\n },\n\n async bulkInvite(orgId: string, emails: string[], profileId: string, invitedBy: string): Promise<Invite[]> {\n const rows = emails.map((email) => ({\n tenant_id: orgId,\n email,\n role: profileId,\n invited_by: invitedBy,\n }))\n\n const { data, error } = await core().from('invitations').insert(rows).select()\n if (error) throw error\n await Promise.all(\n emails.map((email) =>\n authAdapter?.inviteUser?.(email, {\n redirectTo: inviteRedirectTo,\n data: { tenant_id: orgId, role: profileId, invited_by: invitedBy },\n }),\n ),\n )\n return ((data ?? []) as Array<Record<string, unknown>>).map(mapInviteRow)\n },\n\n async revokeInvite(orgId: string, inviteId: string): Promise<void> {\n const { error } = await core()\n .from('invitations')\n .update({ status: 'revoked' })\n .eq('id', inviteId)\n .eq('tenant_id', orgId)\n\n if (error) throw error\n },\n\n async resendInvite(orgId: string, inviteId: string): Promise<Invite> {\n const { data, error } = await core()\n .from('invitations')\n .update({\n status: 'pending',\n expires_at: new Date(Date.now() + 7 * 24 * 60 * 60 * 1000).toISOString(),\n })\n .eq('id', inviteId)\n .eq('tenant_id', orgId)\n .select()\n .single()\n\n if (error) throw error\n const row = data as Record<string, unknown>\n // Re-send the invite e-mail through the auth abstraction.\n await authAdapter?.inviteUser?.(row.email as string, {\n redirectTo: inviteRedirectTo,\n data: { tenant_id: orgId, role: row.role as string, invited_by: row.invited_by as string },\n })\n return mapInviteRow(row)\n },\n\n async listLocations(orgId: string): Promise<Location[]> {\n const { data, error } = await core()\n .from('locations')\n .select('*')\n .eq('tenant_id', orgId)\n .order('is_headquarters', { ascending: false })\n .order('name')\n\n if (error) throw error\n return ((data ?? []) as Array<Record<string, unknown>>).map(mapLocationRow)\n },\n\n async createLocation(\n orgId: string,\n input: {\n name: string\n address?: string\n city?: string\n state?: string\n country?: string\n phone?: string\n isHeadquarters?: boolean\n },\n ): Promise<Location> {\n const { data, error } = await core()\n .from('locations')\n .insert({\n tenant_id: orgId,\n name: input.name,\n address: input.address ?? null,\n city: input.city ?? null,\n state: input.state ?? null,\n country: input.country ?? 'BR',\n phone: input.phone ?? null,\n is_headquarters: input.isHeadquarters ?? false,\n })\n .select()\n .single()\n\n if (error) throw error\n return mapLocationRow(data as Record<string, unknown>)\n },\n }\n}\n","import type {\n OrgAdapter,\n Organization,\n OrgMember,\n OrgMembership,\n CreateOrgOptions,\n Location,\n Invite,\n} from '@fayz-ai/core'\nimport type { PermissionProfile } from '@fayz-ai/core'\n\nconst STORAGE_KEY = 'fayz:mock-orgs'\n\ninterface MockOrgData {\n orgs: Organization[]\n members: OrgMember[]\n profiles: Record<string, PermissionProfile[]>\n invites: Record<string, Invite[]>\n userOrgMap: Record<string, string[]>\n}\n\nfunction getStored(): MockOrgData {\n try {\n if (typeof localStorage === 'undefined') return empty()\n const raw = localStorage.getItem(STORAGE_KEY)\n if (raw) return JSON.parse(raw) as MockOrgData\n } catch {\n // ignore\n }\n return empty()\n}\n\nfunction empty(): MockOrgData {\n return { orgs: [], members: [], profiles: {}, invites: {}, userOrgMap: {} }\n}\n\nfunction setStored(data: MockOrgData): void {\n try {\n if (typeof localStorage === 'undefined') return\n localStorage.setItem(STORAGE_KEY, JSON.stringify(data))\n } catch {\n // ignore\n }\n}\n\nfunction slugify(name: string): string {\n return name.toLowerCase().replace(/[^a-z0-9]+/g, '-').replace(/^-|-$/g, '')\n}\n\nexport function createMockOrgAdapter(defaultProfiles?: PermissionProfile[]): OrgAdapter {\n function seedOrgForUser(userId: string, userName?: string): MockOrgData {\n const data = getStored()\n if (data.userOrgMap[userId]?.length) return data\n\n const orgId = crypto.randomUUID()\n const memberId = crypto.randomUUID()\n const firstProfile = defaultProfiles?.[0]\n\n const org: Organization = {\n id: orgId,\n name: 'My Organization',\n slug: 'my-organization',\n createdAt: new Date().toISOString(),\n updatedAt: new Date().toISOString(),\n }\n\n const member: OrgMember = {\n id: memberId,\n userId,\n orgId,\n profileId: firstProfile?.id ?? 'owner',\n profileName: firstProfile?.name ?? 'Owner',\n user: {\n id: userId,\n email: userName\n ? `${userName.toLowerCase().replace(/\\s+/g, '.')}@example.com`\n : 'user@example.com',\n fullName: userName ?? 'Current User',\n },\n joinedAt: new Date().toISOString(),\n }\n\n data.orgs.push(org)\n data.members.push(member)\n data.userOrgMap[userId] = [orgId]\n if (defaultProfiles) {\n data.profiles[orgId] = [...defaultProfiles]\n }\n data.invites[orgId] = []\n\n setStored(data)\n return data\n }\n\n return {\n async listUserOrgs(userId: string): Promise<OrgMembership[]> {\n const data = seedOrgForUser(userId)\n const orgIds = data.userOrgMap[userId] ?? []\n return orgIds.map((orgId) => {\n const org = data.orgs.find((o) => o.id === orgId)!\n const member = data.members.find((m) => m.orgId === orgId && m.userId === userId)\n return {\n orgId,\n orgName: org.name,\n orgSlug: org.slug,\n orgLogoUrl: org.logoUrl,\n profileId: member?.profileId ?? 'owner',\n profileName: member?.profileName ?? 'Owner',\n }\n })\n },\n\n async getOrg(orgId: string): Promise<Organization> {\n const data = getStored()\n const org = data.orgs.find((o) => o.id === orgId)\n if (!org) throw new Error(`Org not found: ${orgId}`)\n return org\n },\n\n async createOrg(name: string, userId: string, options?: CreateOrgOptions): Promise<Organization> {\n const data = getStored()\n const orgId = crypto.randomUUID()\n const firstProfile = defaultProfiles?.[0]\n\n const org: Organization = {\n id: orgId,\n name,\n slug: slugify(name),\n verticalId: options?.verticalId,\n plan: 'free',\n settings: {\n timezone: options?.timezone ?? 'America/Sao_Paulo',\n currency: options?.currency ?? 'BRL',\n locale: options?.locale ?? 'pt-BR',\n },\n createdAt: new Date().toISOString(),\n updatedAt: new Date().toISOString(),\n }\n\n const member: OrgMember = {\n id: crypto.randomUUID(),\n userId,\n orgId,\n profileId: firstProfile?.id ?? 'owner',\n profileName: firstProfile?.name ?? 'Owner',\n user: {\n id: userId,\n email: 'user@example.com',\n fullName: 'Current User',\n },\n joinedAt: new Date().toISOString(),\n }\n\n data.orgs.push(org)\n data.members.push(member)\n if (!data.userOrgMap[userId]) data.userOrgMap[userId] = []\n data.userOrgMap[userId].push(orgId)\n if (defaultProfiles) {\n data.profiles[orgId] = [...defaultProfiles]\n }\n data.invites[orgId] = []\n\n setStored(data)\n return org\n },\n\n async updateOrg(orgId: string, updates: Partial<Organization>): Promise<Organization> {\n const data = getStored()\n const idx = data.orgs.findIndex((o) => o.id === orgId)\n if (idx === -1) throw new Error(`Org not found: ${orgId}`)\n data.orgs[idx] = { ...data.orgs[idx], ...updates, updatedAt: new Date().toISOString() }\n setStored(data)\n return data.orgs[idx]\n },\n\n async listMembers(orgId: string): Promise<OrgMember[]> {\n const data = getStored()\n return data.members.filter((m) => m.orgId === orgId)\n },\n\n async updateMemberProfile(orgId: string, memberId: string, profileId: string): Promise<void> {\n const data = getStored()\n const member = data.members.find((m) => m.id === memberId && m.orgId === orgId)\n if (!member) throw new Error(`Member not found: ${memberId}`)\n const profiles = data.profiles[orgId] ?? []\n const profile = profiles.find((p) => p.id === profileId)\n member.profileId = profileId\n member.profileName = profile?.name ?? profileId\n setStored(data)\n },\n\n async removeMember(orgId: string, memberId: string): Promise<void> {\n const data = getStored()\n const memberIdx = data.members.findIndex((m) => m.id === memberId && m.orgId === orgId)\n if (memberIdx === -1) return\n const member = data.members[memberIdx]\n data.members.splice(memberIdx, 1)\n const userOrgs = data.userOrgMap[member.userId]\n if (userOrgs) {\n const orgIdx = userOrgs.indexOf(orgId)\n if (orgIdx !== -1) userOrgs.splice(orgIdx, 1)\n }\n setStored(data)\n },\n\n async listProfiles(orgId: string): Promise<PermissionProfile[]> {\n const data = getStored()\n return data.profiles[orgId] ?? defaultProfiles ?? []\n },\n\n async createProfile(\n orgId: string,\n profile: Omit<PermissionProfile, 'id' | 'isSystem'>,\n ): Promise<PermissionProfile> {\n const data = getStored()\n const newProfile: PermissionProfile = {\n ...profile,\n id: crypto.randomUUID(),\n isSystem: false,\n }\n if (!data.profiles[orgId]) {\n data.profiles[orgId] = defaultProfiles ? [...defaultProfiles] : []\n }\n data.profiles[orgId].push(newProfile)\n setStored(data)\n return newProfile\n },\n\n async updateProfile(\n orgId: string,\n profileId: string,\n updates: Partial<PermissionProfile>,\n ): Promise<PermissionProfile> {\n const data = getStored()\n const profiles = data.profiles[orgId] ?? []\n const idx = profiles.findIndex((p) => p.id === profileId)\n if (idx === -1) throw new Error(`Profile not found: ${profileId}`)\n profiles[idx] = { ...profiles[idx], ...updates }\n data.profiles[orgId] = profiles\n setStored(data)\n return profiles[idx]\n },\n\n async deleteProfile(orgId: string, profileId: string): Promise<void> {\n const data = getStored()\n const profiles = data.profiles[orgId] ?? []\n const profile = profiles.find((p) => p.id === profileId)\n if (profile?.isSystem) throw new Error('Cannot delete system profile')\n data.profiles[orgId] = profiles.filter((p) => p.id !== profileId)\n setStored(data)\n },\n\n async listInvites(orgId: string): Promise<Invite[]> {\n const data = getStored()\n return data.invites[orgId] ?? []\n },\n\n async createInvite(\n orgId: string,\n email: string,\n profileId: string,\n invitedBy: string,\n ): Promise<Invite> {\n const data = getStored()\n const profiles = data.profiles[orgId] ?? defaultProfiles ?? []\n const profile = profiles.find((p) => p.id === profileId)\n\n const invite: Invite = {\n id: crypto.randomUUID(),\n orgId,\n email,\n profileId,\n profileName: profile?.name ?? profileId,\n invitedBy,\n token: crypto.randomUUID(),\n status: 'pending',\n createdAt: new Date().toISOString(),\n expiresAt: new Date(Date.now() + 7 * 24 * 60 * 60 * 1000).toISOString(),\n }\n\n if (!data.invites[orgId]) data.invites[orgId] = []\n data.invites[orgId].push(invite)\n setStored(data)\n return invite\n },\n\n async bulkInvite(\n orgId: string,\n emails: string[],\n profileId: string,\n invitedBy: string,\n ): Promise<Invite[]> {\n const results: Invite[] = []\n for (const email of emails) {\n results.push(await this.createInvite(orgId, email, profileId, invitedBy))\n }\n return results\n },\n\n async revokeInvite(orgId: string, inviteId: string): Promise<void> {\n const data = getStored()\n const invites = data.invites[orgId] ?? []\n const invite = invites.find((i) => i.id === inviteId)\n if (invite) {\n invite.status = 'expired'\n setStored(data)\n }\n },\n\n async resendInvite(orgId: string, inviteId: string): Promise<Invite> {\n const data = getStored()\n const invites = data.invites[orgId] ?? []\n const invite = invites.find((i) => i.id === inviteId)\n if (!invite) throw new Error(`Invite not found: ${inviteId}`)\n invite.expiresAt = new Date(Date.now() + 7 * 24 * 60 * 60 * 1000).toISOString()\n invite.status = 'pending'\n setStored(data)\n return invite\n },\n\n async listLocations(_orgId: string): Promise<Location[]> {\n return []\n },\n\n async createLocation(\n orgId: string,\n input: {\n name: string\n address?: string\n city?: string\n state?: string\n country?: string\n phone?: string\n isHeadquarters?: boolean\n },\n ): Promise<Location> {\n return {\n id: crypto.randomUUID(),\n tenantId: orgId,\n name: input.name,\n address: input.address,\n city: input.city,\n state: input.state,\n country: input.country ?? 'BR',\n phone: input.phone,\n isHeadquarters: input.isHeadquarters ?? false,\n isActive: true,\n createdAt: new Date().toISOString(),\n updatedAt: new Date().toISOString(),\n }\n },\n }\n}\n","import { create } from 'zustand'\nimport { setActiveTenantId, type Organization, type OrgMember, type OrgMembership } from '@fayz-ai/core'\n\nconst STORAGE_KEY = 'fayz:current-org'\n\n// ---------------------------------------------------------------------------\n// Persistence helpers\n// ---------------------------------------------------------------------------\n\nfunction getPersistedOrgId(): string | null {\n try {\n if (typeof localStorage === 'undefined') return null\n return localStorage.getItem(STORAGE_KEY)\n } catch {\n return null\n }\n}\n\nfunction persistOrgId(orgId: string | null): void {\n try {\n if (typeof localStorage === 'undefined') return\n if (orgId) {\n localStorage.setItem(STORAGE_KEY, orgId)\n } else {\n localStorage.removeItem(STORAGE_KEY)\n }\n } catch {\n // ignore\n }\n}\n\n// ---------------------------------------------------------------------------\n// Store interface\n// ---------------------------------------------------------------------------\n\nexport interface OrgStore {\n currentOrg: Organization | null\n userOrgs: OrgMembership[]\n members: OrgMember[]\n loading: boolean\n\n setCurrentOrg: (org: Organization | null) => void\n setUserOrgs: (orgs: OrgMembership[]) => void\n setMembers: (members: OrgMember[]) => void\n setLoading: (loading: boolean) => void\n reset: () => void\n}\n\nexport const useOrganizationStore = create<OrgStore>((set) => ({\n currentOrg: null,\n userOrgs: [],\n members: [],\n loading: false,\n\n setCurrentOrg: (org) => {\n setActiveTenantId(org?.id)\n persistOrgId(org?.id ?? null)\n set({ currentOrg: org })\n },\n setUserOrgs: (orgs) => set({ userOrgs: orgs }),\n setMembers: (members) => set({ members }),\n setLoading: (loading) => set({ loading }),\n reset: () => {\n setActiveTenantId(undefined)\n // NOTE: do NOT clear the persisted org id here. The org providers call\n // reset() whenever the auth store transiently reports `user === null` —\n // which happens on every fresh load while the Supabase session hydrates\n // asynchronously. Wiping 'fayz:current-org' at that moment drops a\n // multi-org user's workspace selection BEFORE loadOrgs can read it back,\n // so the app always falls to memberships[0] on reload (single-org users\n // never noticed). The pin is a last-selected hint that's re-validated\n // against the fresh membership list on load, so it's safe to keep across\n // sign-out too (a mismatching pin just falls back to memberships[0]).\n set({ currentOrg: null, userOrgs: [], members: [], loading: false })\n },\n}))\n\nexport { getPersistedOrgId }\n","import * as React from 'react'\nimport type { OrgAdapter, Organization, OrgMembership } from '@fayz-ai/core'\nimport { useAuthStore } from '@fayz-ai/auth'\nimport { useOrganizationStore, getPersistedOrgId } from './store'\nimport { usePermissionsStore } from '../permissions'\n\n// ---------------------------------------------------------------------------\n// Adapter context\n// ---------------------------------------------------------------------------\n\nconst OrgAdapterContext = React.createContext<OrgAdapter | null>(null)\n\nexport function useOrgAdapter(): OrgAdapter {\n const adapter = React.useContext(OrgAdapterContext)\n if (!adapter) {\n throw new Error('useOrgAdapter must be used within an <OrgProvider>')\n }\n return adapter\n}\n\nexport function useOrgAdapterOptional(): OrgAdapter | null {\n return React.useContext(OrgAdapterContext)\n}\n\n// ---------------------------------------------------------------------------\n// Tenant / org hook\n// ---------------------------------------------------------------------------\n\nexport interface TenantContext {\n /** The currently active organization */\n org: Organization | null\n /** All orgs the current user belongs to */\n userOrgs: OrgMembership[]\n loading: boolean\n /** Switch the active org */\n switchOrg: (orgId: string) => Promise<void>\n /** Refresh the current org from the adapter */\n refreshOrg: () => Promise<void>\n}\n\nconst TenantContext = React.createContext<TenantContext | null>(null)\n\n/**\n * Access the current tenant / organization.\n * Must be used inside <OrgProvider>.\n */\nexport function useTenant(): TenantContext {\n const ctx = React.useContext(TenantContext)\n if (!ctx) {\n throw new Error('useTenant must be used inside <OrgProvider>')\n }\n return ctx\n}\n\nexport function useTenantOptional(): TenantContext | null {\n return React.useContext(TenantContext)\n}\n\n// ---------------------------------------------------------------------------\n// Provider\n// ---------------------------------------------------------------------------\n\nexport interface OrgProviderProps {\n adapter: OrgAdapter\n /** When true, automatically creates an org if the user has none */\n autoCreate?: boolean\n children: React.ReactNode\n}\n\nexport function OrgProvider({ adapter, autoCreate = false, children }: OrgProviderProps) {\n const { user } = useAuthStore()\n const { currentOrg, userOrgs, loading, setCurrentOrg, setUserOrgs, setMembers, setLoading, reset } =\n useOrganizationStore()\n const setProfiles = usePermissionsStore((s) => s.setProfiles)\n const setCurrentProfile = usePermissionsStore((s) => s.setCurrentProfile)\n\n const adapterRef = React.useRef(adapter)\n adapterRef.current = adapter\n\n // Load the org's members + permission profiles into the shared stores whenever\n // an org resolves. This is what makes the role list, the invite dialog's role\n // dropdown, and permission checks work — previously nothing loaded them here,\n // so those surfaces came up empty. Also resolves the signed-in user's own role.\n const hydrateOrg = React.useCallback(\n async (orgId: string, uid: string | undefined) => {\n try {\n const [members, profiles] = await Promise.all([\n adapterRef.current.listMembers(orgId),\n adapterRef.current.listProfiles(orgId),\n ])\n setMembers(members)\n setProfiles(profiles)\n const myMembership = uid ? members.find((m) => m.userId === uid) : undefined\n setCurrentProfile(profiles.find((p) => p.id === myMembership?.profileId) ?? null)\n } catch {\n // Non-fatal — leave stores as-is if the load fails.\n }\n },\n [setMembers, setProfiles, setCurrentProfile],\n )\n\n // Load orgs when user is authenticated\n React.useEffect(() => {\n if (!user) {\n reset()\n return\n }\n\n let cancelled = false\n\n async function loadOrgs() {\n setLoading(true)\n try {\n const memberships = await adapterRef.current.listUserOrgs(user!.id)\n\n if (cancelled) return\n\n setUserOrgs(memberships)\n\n // Auto-create org if user has none\n if (memberships.length === 0 && autoCreate) {\n const newOrg = await adapterRef.current.createOrg(\n user!.fullName ? `${user!.fullName}'s Organization` : 'My Organization',\n user!.id,\n )\n if (!cancelled) {\n setUserOrgs([\n {\n orgId: newOrg.id,\n orgName: newOrg.name,\n orgSlug: newOrg.slug,\n profileId: 'owner',\n profileName: 'Owner',\n },\n ])\n setCurrentOrg(newOrg)\n await hydrateOrg(newOrg.id, user!.id)\n }\n return\n }\n\n // Restore previously selected org or default to first\n const persistedId = getPersistedOrgId()\n const target =\n memberships.find((m) => m.orgId === persistedId) ?? memberships[0]\n\n if (target && !cancelled) {\n const org = await adapterRef.current.getOrg(target.orgId)\n if (!cancelled) {\n setCurrentOrg(org)\n await hydrateOrg(org.id, user!.id)\n }\n }\n } finally {\n if (!cancelled) setLoading(false)\n }\n }\n\n void loadOrgs()\n\n return () => {\n cancelled = true\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [user?.id])\n\n async function switchOrg(orgId: string): Promise<void> {\n setLoading(true)\n try {\n const org = await adapterRef.current.getOrg(orgId)\n setCurrentOrg(org)\n await hydrateOrg(org.id, user?.id)\n } finally {\n setLoading(false)\n }\n }\n\n async function refreshOrg(): Promise<void> {\n if (!currentOrg) return\n setLoading(true)\n try {\n const org = await adapterRef.current.getOrg(currentOrg.id)\n setCurrentOrg(org)\n await hydrateOrg(org.id, user?.id)\n } finally {\n setLoading(false)\n }\n }\n\n const tenantValue: TenantContext = {\n org: currentOrg,\n userOrgs,\n loading,\n switchOrg,\n refreshOrg,\n }\n\n return (\n <OrgAdapterContext.Provider value={adapter}>\n <TenantContext.Provider value={tenantValue}>\n {children}\n </TenantContext.Provider>\n </OrgAdapterContext.Provider>\n )\n}\n"]}
@@ -0,0 +1,39 @@
1
+ 'use strict';
2
+
3
+ var zustand = require('zustand');
4
+
5
+ // src/billing/store.ts
6
+ var initialState = {
7
+ subscription: null,
8
+ invoices: [],
9
+ plans: [],
10
+ loading: false,
11
+ checkout: null
12
+ };
13
+ var useBillingStore = zustand.create((set) => ({
14
+ ...initialState,
15
+ setSubscription: (subscription) => set({ subscription }),
16
+ setInvoices: (invoices) => set({ invoices }),
17
+ setPlans: (plans) => set({ plans }),
18
+ setLoading: (loading) => set({ loading }),
19
+ setCheckout: (checkout) => set({ checkout }),
20
+ reset: () => set(initialState)
21
+ }));
22
+
23
+ // src/billing/plan-badge.ts
24
+ function capitalize(s) {
25
+ return s ? s.charAt(0).toUpperCase() + s.slice(1) : s;
26
+ }
27
+ function resolvePlanBadge(planId, plans) {
28
+ const id = planId || "free";
29
+ const match = plans.find((p) => p.id === id);
30
+ if (match) {
31
+ return { label: match.name, planId: match.id, paid: match.price > 0 };
32
+ }
33
+ return { label: capitalize(id), planId: id, paid: false };
34
+ }
35
+
36
+ exports.resolvePlanBadge = resolvePlanBadge;
37
+ exports.useBillingStore = useBillingStore;
38
+ //# sourceMappingURL=chunk-NNFGMUF2.cjs.map
39
+ //# sourceMappingURL=chunk-NNFGMUF2.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/billing/store.ts","../src/billing/plan-badge.ts"],"names":["create"],"mappings":";;;;;AAoDA,IAAM,YAAA,GAA6B;AAAA,EACjC,YAAA,EAAc,IAAA;AAAA,EACd,UAAU,EAAC;AAAA,EACX,OAAO,EAAC;AAAA,EACR,OAAA,EAAS,KAAA;AAAA,EACT,QAAA,EAAU;AACZ,CAAA;AAEO,IAAM,eAAA,GAAkBA,cAAA,CAAqB,CAAC,GAAA,MAAS;AAAA,EAC5D,GAAG,YAAA;AAAA,EACH,iBAAiB,CAAC,YAAA,KAAiB,GAAA,CAAI,EAAE,cAAc,CAAA;AAAA,EACvD,aAAa,CAAC,QAAA,KAAa,GAAA,CAAI,EAAE,UAAU,CAAA;AAAA,EAC3C,UAAU,CAAC,KAAA,KAAU,GAAA,CAAI,EAAE,OAAO,CAAA;AAAA,EAClC,YAAY,CAAC,OAAA,KAAY,GAAA,CAAI,EAAE,SAAS,CAAA;AAAA,EACxC,aAAa,CAAC,QAAA,KAAa,GAAA,CAAI,EAAE,UAAU,CAAA;AAAA,EAC3C,KAAA,EAAO,MAAM,GAAA,CAAI,YAAY;AAC/B,CAAA,CAAE;;;ACzDF,SAAS,WAAW,CAAA,EAAmB;AACrC,EAAA,OAAO,CAAA,GAAI,CAAA,CAAE,MAAA,CAAO,CAAC,CAAA,CAAE,aAAY,GAAI,CAAA,CAAE,KAAA,CAAM,CAAC,CAAA,GAAI,CAAA;AACtD;AAQO,SAAS,gBAAA,CACd,QACA,KAAA,EACe;AACf,EAAA,MAAM,KAAK,MAAA,IAAU,MAAA;AACrB,EAAA,MAAM,QAAQ,KAAA,CAAM,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,OAAO,EAAE,CAAA;AAC3C,EAAA,IAAI,KAAA,EAAO;AACT,IAAA,OAAO,EAAE,KAAA,EAAO,KAAA,CAAM,IAAA,EAAM,MAAA,EAAQ,MAAM,EAAA,EAAI,IAAA,EAAM,KAAA,CAAM,KAAA,GAAQ,CAAA,EAAE;AAAA,EACtE;AACA,EAAA,OAAO,EAAE,OAAO,UAAA,CAAW,EAAE,GAAG,MAAA,EAAQ,EAAA,EAAI,MAAM,KAAA,EAAM;AAC1D","file":"chunk-NNFGMUF2.cjs","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 type { Plan } from '@fayz-ai/core'\n\nexport interface PlanBadgeInfo {\n /** Display label, e.g. 'Free' or 'Pro'. */\n label: string\n /** Resolved plan id (falls back to the raw org.plan string). */\n planId: string\n /** Paid plan (price > 0) — drives the Crown icon + gold styling in the menus. */\n paid: boolean\n}\n\nfunction capitalize(s: string): string {\n return s ? s.charAt(0).toUpperCase() + s.slice(1) : s\n}\n\n/**\n * Resolve an org's `plan` string against the configured billing plans into the\n * badge shown next to the user in both menus. Falls back to a capitalized\n * version of the raw string when the id isn't in config (defensive — e.g. a\n * legacy 'free' tenant before billing was wired).\n */\nexport function resolvePlanBadge(\n planId: string | undefined | null,\n plans: Plan[],\n): PlanBadgeInfo {\n const id = planId || 'free'\n const match = plans.find((p) => p.id === id)\n if (match) {\n return { label: match.name, planId: match.id, paid: match.price > 0 }\n }\n return { label: capitalize(id), planId: id, paid: false }\n}\n"]}
@@ -2,6 +2,8 @@
2
2
 
3
3
  var zustand = require('zustand');
4
4
  var React = require('react');
5
+ var core = require('@fayz-ai/core');
6
+ var access = require('@fayz-ai/core/access');
5
7
  var jsxRuntime = require('react/jsx-runtime');
6
8
 
7
9
  function _interopNamespace(e) {
@@ -62,23 +64,25 @@ var usePermissionsStore = zustand.create((set, get) => ({
62
64
  isImpersonating: false
63
65
  })
64
66
  }));
65
- function profileHasPermission(profile, feature, action) {
66
- if (!profile) return true;
67
- const actions = profile.grants[feature];
68
- if (!actions) return false;
69
- if (!action) return actions.length > 0;
70
- return actions.includes(action) || actions.includes("manage");
67
+ function mergeFeatures(pluginFeatures, appFeatures) {
68
+ const byId = /* @__PURE__ */ new Map();
69
+ for (const f of pluginFeatures ?? []) byId.set(f.id, f);
70
+ for (const f of appFeatures ?? []) byId.set(f.id, f);
71
+ return Array.from(byId.values());
71
72
  }
72
73
  var PermissionsContext = React__namespace.createContext(null);
73
74
  function PermissionsProvider({ config, children }) {
74
75
  const { setFeatures, startImpersonation, stopImpersonation, currentProfile, isImpersonating } = usePermissionsStore();
76
+ const runtime = core.usePluginRuntimeOptional();
77
+ const pluginFeatures = runtime?.pluginFeatures;
75
78
  React__namespace.useEffect(() => {
76
- if (config?.features) {
77
- setFeatures(config.features);
79
+ const merged = mergeFeatures(pluginFeatures, config?.features);
80
+ if (merged.length > 0) {
81
+ setFeatures(merged);
78
82
  }
79
- }, [config, setFeatures]);
83
+ }, [config, pluginFeatures, setFeatures]);
80
84
  function hasPermission(feature, action) {
81
- return profileHasPermission(currentProfile, feature, action);
85
+ return access.profileHasPermission(currentProfile, feature, action);
82
86
  }
83
87
  const value = {
84
88
  hasPermission,
@@ -120,5 +124,5 @@ exports.usePermission = usePermission;
120
124
  exports.usePermissionOptional = usePermissionOptional;
121
125
  exports.usePermissions = usePermissions;
122
126
  exports.usePermissionsStore = usePermissionsStore;
123
- //# sourceMappingURL=chunk-4XTQ4V5L.cjs.map
124
- //# sourceMappingURL=chunk-4XTQ4V5L.cjs.map
127
+ //# sourceMappingURL=chunk-SAZLW54Y.cjs.map
128
+ //# sourceMappingURL=chunk-SAZLW54Y.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/permissions/store.ts","../src/permissions/context.tsx"],"names":["create","React","usePluginRuntimeOptional","profileHasPermission","jsx"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA2BO,IAAM,mBAAA,GAAsBA,cAAA,CAAyB,CAAC,GAAA,EAAK,GAAA,MAAS;AAAA,EACzE,UAAU,EAAC;AAAA,EACX,UAAU,EAAC;AAAA,EACX,cAAA,EAAgB,IAAA;AAAA,EAChB,WAAA,EAAa,IAAA;AAAA,EACb,mBAAA,EAAqB,IAAA;AAAA,EACrB,eAAA,EAAiB,KAAA;AAAA,EAEjB,aAAa,CAAC,QAAA,KAAa,GAAA,CAAI,EAAE,UAAU,CAAA;AAAA,EAC3C,aAAa,CAAC,QAAA,KAAa,GAAA,CAAI,EAAE,UAAU,CAAA;AAAA,EAC3C,iBAAA,EAAmB,CAAC,OAAA,KAClB,GAAA,CAAI;AAAA,IACF,cAAA,EAAgB,OAAA;AAAA,IAChB,WAAA,EAAa,OAAA;AAAA,IACb,mBAAA,EAAqB,IAAA;AAAA,IACrB,eAAA,EAAiB;AAAA,GAClB,CAAA;AAAA,EACH,kBAAA,EAAoB,CAAC,OAAA,KACnB,GAAA,CAAI;AAAA,IACF,cAAA,EAAgB,OAAA;AAAA,IAChB,mBAAA,EAAqB,OAAA;AAAA,IACrB,eAAA,EAAiB;AAAA,GAClB,CAAA;AAAA,EACH,mBAAmB,MAAM;AACvB,IAAA,MAAM,EAAE,WAAA,EAAY,GAAI,GAAA,EAAI;AAC5B,IAAA,GAAA,CAAI;AAAA,MACF,cAAA,EAAgB,WAAA;AAAA,MAChB,mBAAA,EAAqB,IAAA;AAAA,MACrB,eAAA,EAAiB;AAAA,KAClB,CAAA;AAAA,EACH,CAAA;AAAA,EACA,KAAA,EAAO,MACL,GAAA,CAAI;AAAA,IACF,UAAU,EAAC;AAAA,IACX,UAAU,EAAC;AAAA,IACX,cAAA,EAAgB,IAAA;AAAA,IAChB,WAAA,EAAa,IAAA;AAAA,IACb,mBAAA,EAAqB,IAAA;AAAA,IACrB,eAAA,EAAiB;AAAA,GAClB;AACL,CAAA,CAAE;ACjDF,SAAS,aAAA,CACP,gBACA,WAAA,EACsB;AACtB,EAAA,MAAM,IAAA,uBAAW,GAAA,EAAgC;AACjD,EAAA,KAAA,MAAW,CAAA,IAAK,kBAAkB,EAAC,OAAQ,GAAA,CAAI,CAAA,CAAE,IAAI,CAAC,CAAA;AACtD,EAAA,KAAA,MAAW,CAAA,IAAK,eAAe,EAAC,OAAQ,GAAA,CAAI,CAAA,CAAE,IAAI,CAAC,CAAA;AACnD,EAAA,OAAO,KAAA,CAAM,IAAA,CAAK,IAAA,CAAK,MAAA,EAAQ,CAAA;AACjC;AAaA,IAAM,kBAAA,GAA2BC,+BAA8C,IAAI,CAAA;AAW5E,SAAS,mBAAA,CAAoB,EAAE,MAAA,EAAQ,QAAA,EAAS,EAA6B;AAClF,EAAA,MAAM,EAAE,WAAA,EAAa,kBAAA,EAAoB,mBAAmB,cAAA,EAAgB,eAAA,KAC1E,mBAAA,EAAoB;AAOtB,EAAA,MAAM,UAAUC,6BAAA,EAAyB;AACzC,EAAA,MAAM,iBAAiB,OAAA,EAAS,cAAA;AAEhC,EAAMD,2BAAU,MAAM;AACpB,IAAA,MAAM,MAAA,GAAS,aAAA,CAAc,cAAA,EAAgB,MAAA,EAAQ,QAAQ,CAAA;AAC7D,IAAA,IAAI,MAAA,CAAO,SAAS,CAAA,EAAG;AACrB,MAAA,WAAA,CAAY,MAAM,CAAA;AAAA,IACpB;AAAA,EACF,CAAA,EAAG,CAAC,MAAA,EAAQ,cAAA,EAAgB,WAAW,CAAC,CAAA;AAExC,EAAA,SAAS,aAAA,CAAc,SAAiB,MAAA,EAA0B;AAChE,IAAA,OAAOE,2BAAA,CAAqB,cAAA,EAAgB,OAAA,EAAS,MAAM,CAAA;AAAA,EAC7D;AAEA,EAAA,MAAM,KAAA,GAAiC;AAAA,IACrC,aAAA;AAAA,IACA,gBAAgB,CAAC,eAAA;AAAA,IACjB,kBAAA;AAAA,IACA;AAAA,GACF;AAEA,EAAA,uBACEC,cAAA,CAAC,kBAAA,CAAmB,QAAA,EAAnB,EAA4B,OAC1B,QAAA,EACH,CAAA;AAEJ;AAUO,SAAS,aAAA,GAA+D;AAC7E,EAAA,MAAM,GAAA,GAAYH,4BAAW,kBAAkB,CAAA;AAC/C,EAAA,IAAI,CAAC,GAAA,EAAK;AACR,IAAA,MAAM,IAAI,MAAM,yDAAyD,CAAA;AAAA,EAC3E;AACA,EAAA,OAAO,GAAA,CAAI,aAAA;AACb;AAQO,SAAS,qBAAA,GAAuE;AACrF,EAAA,MAAM,GAAA,GAAYA,4BAAW,kBAAkB,CAAA;AAC/C,EAAA,OAAO,GAAA,EAAK,kBAAkB,MAAM,IAAA,CAAA;AACtC;AAMO,SAAS,gBAAA,CAAiB,SAAiB,MAAA,EAA0B;AAC1E,EAAA,MAAM,GAAA,GAAYA,4BAAW,kBAAkB,CAAA;AAC/C,EAAA,IAAI,CAAC,GAAA,EAAK;AACR,IAAA,MAAM,IAAI,MAAM,4DAA4D,CAAA;AAAA,EAC9E;AACA,EAAA,OAAO,GAAA,CAAI,aAAA,CAAc,OAAA,EAAS,MAAM,CAAA;AAC1C;AAMO,SAAS,cAAA,GAA0C;AACxD,EAAA,MAAM,GAAA,GAAYA,4BAAW,kBAAkB,CAAA;AAC/C,EAAA,IAAI,CAAC,GAAA,EAAK;AACR,IAAA,MAAM,IAAI,MAAM,0DAA0D,CAAA;AAAA,EAC5E;AACA,EAAA,OAAO,GAAA;AACT","file":"chunk-SAZLW54Y.cjs","sourcesContent":["import { create } from 'zustand'\nimport type { FeatureDeclaration, PermissionProfile } from '@fayz-ai/core'\n\n// ---------------------------------------------------------------------------\n// Store interface\n// ---------------------------------------------------------------------------\n\nexport interface PermissionsStore {\n features: FeatureDeclaration[]\n profiles: PermissionProfile[]\n /** The effective profile used for permission checks (may be impersonated) */\n currentProfile: PermissionProfile | null\n /** The user's actual profile (preserved during impersonation) */\n realProfile: PermissionProfile | null\n /** The profile being previewed, if any */\n impersonatedProfile: PermissionProfile | null\n /** Whether impersonation is active */\n isImpersonating: boolean\n\n setFeatures: (features: FeatureDeclaration[]) => void\n setProfiles: (profiles: PermissionProfile[]) => void\n setCurrentProfile: (profile: PermissionProfile | null) => void\n startImpersonation: (profile: PermissionProfile) => void\n stopImpersonation: () => void\n reset: () => void\n}\n\nexport const usePermissionsStore = create<PermissionsStore>((set, get) => ({\n features: [],\n profiles: [],\n currentProfile: null,\n realProfile: null,\n impersonatedProfile: null,\n isImpersonating: false,\n\n setFeatures: (features) => set({ features }),\n setProfiles: (profiles) => set({ profiles }),\n setCurrentProfile: (profile) =>\n set({\n currentProfile: profile,\n realProfile: profile,\n impersonatedProfile: null,\n isImpersonating: false,\n }),\n startImpersonation: (profile) =>\n set({\n currentProfile: profile,\n impersonatedProfile: profile,\n isImpersonating: true,\n }),\n stopImpersonation: () => {\n const { realProfile } = get()\n set({\n currentProfile: realProfile,\n impersonatedProfile: null,\n isImpersonating: false,\n })\n },\n reset: () =>\n set({\n features: [],\n profiles: [],\n currentProfile: null,\n realProfile: null,\n impersonatedProfile: null,\n isImpersonating: false,\n }),\n}))\n","import * as React from 'react'\nimport type { FeatureDeclaration, PermissionsConfig, PermissionProfile } from '@fayz-ai/core'\nimport { usePluginRuntimeOptional } from '@fayz-ai/core'\nimport { usePermissionsStore } from './store'\n\n// ---------------------------------------------------------------------------\n// Permission check helpers\n// ---------------------------------------------------------------------------\n\n// The role-side check moved to @fayz-ai/core/access (single implementation for\n// browser, headless and the Fayz broker). Re-exported to keep call-sites stable.\nimport { profileHasPermission } from '@fayz-ai/core/access'\nexport { profileHasPermission }\n\n/**\n * Merge plugin-declared features with the app's own, deduped by id. The app's\n * declaration wins on collision (it can override a plugin's label/actions).\n */\nfunction mergeFeatures(\n pluginFeatures: FeatureDeclaration[] | undefined,\n appFeatures: FeatureDeclaration[] | undefined,\n): FeatureDeclaration[] {\n const byId = new Map<string, FeatureDeclaration>()\n for (const f of pluginFeatures ?? []) byId.set(f.id, f)\n for (const f of appFeatures ?? []) byId.set(f.id, f) // app override wins\n return Array.from(byId.values())\n}\n\n// ---------------------------------------------------------------------------\n// Context\n// ---------------------------------------------------------------------------\n\ninterface PermissionsContextValue {\n hasPermission: (feature: string, action?: string) => boolean\n canImpersonate: boolean\n startImpersonation: (profile: PermissionProfile) => void\n stopImpersonation: () => void\n}\n\nconst PermissionsContext = React.createContext<PermissionsContextValue | null>(null)\n\n// ---------------------------------------------------------------------------\n// Provider\n// ---------------------------------------------------------------------------\n\nexport interface PermissionsProviderProps {\n config?: PermissionsConfig\n children: React.ReactNode\n}\n\nexport function PermissionsProvider({ config, children }: PermissionsProviderProps) {\n const { setFeatures, startImpersonation, stopImpersonation, currentProfile, isImpersonating } =\n usePermissionsStore()\n\n // Plugins declare their own permission features via `declaredFeatures`, which the\n // plugin runtime aggregates into `pluginFeatures`. Merging them here is what makes\n // a plugin \"born compatible\" — its features show up in the RBAC matrix and gate\n // checks without the app re-declaring them. The app's own `config.features` wins\n // on id collisions (app override), so an app can refine a plugin's declaration.\n const runtime = usePluginRuntimeOptional()\n const pluginFeatures = runtime?.pluginFeatures\n\n React.useEffect(() => {\n const merged = mergeFeatures(pluginFeatures, config?.features)\n if (merged.length > 0) {\n setFeatures(merged)\n }\n }, [config, pluginFeatures, setFeatures])\n\n function hasPermission(feature: string, action?: string): boolean {\n return profileHasPermission(currentProfile, feature, action)\n }\n\n const value: PermissionsContextValue = {\n hasPermission,\n canImpersonate: !isImpersonating,\n startImpersonation,\n stopImpersonation,\n }\n\n return (\n <PermissionsContext.Provider value={value}>\n {children}\n </PermissionsContext.Provider>\n )\n}\n\n// ---------------------------------------------------------------------------\n// Hooks\n// ---------------------------------------------------------------------------\n\n/**\n * Returns a function that checks whether the current user has a given\n * permission. Throws if used outside <PermissionsProvider>.\n */\nexport function usePermission(): (feature: string, action?: string) => boolean {\n const ctx = React.useContext(PermissionsContext)\n if (!ctx) {\n throw new Error('usePermission must be used inside <PermissionsProvider>')\n }\n return ctx.hasPermission\n}\n\n/**\n * Like usePermission, but degrades to allow-all when no <PermissionsProvider>\n * is mounted — so SDK components (e.g. the CRUD engine's PermissionGate) work\n * under any host shell instead of throwing. Gating is an enhancement, not a\n * hard requirement at the component level.\n */\nexport function usePermissionOptional(): (feature: string, action?: string) => boolean {\n const ctx = React.useContext(PermissionsContext)\n return ctx?.hasPermission ?? (() => true)\n}\n\n/**\n * Convenience hook — returns true/false for a specific feature + action.\n * Example: `const canEdit = useHasPermission('clients', 'write')`\n */\nexport function useHasPermission(feature: string, action?: string): boolean {\n const ctx = React.useContext(PermissionsContext)\n if (!ctx) {\n throw new Error('useHasPermission must be used inside <PermissionsProvider>')\n }\n return ctx.hasPermission(feature, action)\n}\n\n/**\n * Convenience hook that surfaces the full permissions context, including\n * impersonation controls.\n */\nexport function usePermissions(): PermissionsContextValue {\n const ctx = React.useContext(PermissionsContext)\n if (!ctx) {\n throw new Error('usePermissions must be used inside <PermissionsProvider>')\n }\n return ctx\n}\n\n// Re-export feature declarations for use in feature flag checks\nexport type { FeatureDeclaration }\n"]}
@@ -1,6 +1,6 @@
1
1
  'use strict';
2
2
 
3
- var chunk4XTQ4V5L_cjs = require('./chunk-4XTQ4V5L.cjs');
3
+ var chunkSAZLW54Y_cjs = require('./chunk-SAZLW54Y.cjs');
4
4
  var supabaseJs = require('@supabase/supabase-js');
5
5
  var core = require('@fayz-ai/core');
6
6
  var zustand = require('zustand');
@@ -791,7 +791,6 @@ var useOrganizationStore = zustand.create((set) => ({
791
791
  setLoading: (loading) => set({ loading }),
792
792
  reset: () => {
793
793
  core.setActiveTenantId(void 0);
794
- persistOrgId(null);
795
794
  set({ currentOrg: null, userOrgs: [], members: [], loading: false });
796
795
  }
797
796
  }));
@@ -820,8 +819,8 @@ function useTenantOptional() {
820
819
  function OrgProvider({ adapter, autoCreate = false, children }) {
821
820
  const { user } = auth.useAuthStore();
822
821
  const { currentOrg, userOrgs, loading, setCurrentOrg, setUserOrgs, setMembers, setLoading, reset } = useOrganizationStore();
823
- const setProfiles = chunk4XTQ4V5L_cjs.usePermissionsStore((s) => s.setProfiles);
824
- const setCurrentProfile = chunk4XTQ4V5L_cjs.usePermissionsStore((s) => s.setCurrentProfile);
822
+ const setProfiles = chunkSAZLW54Y_cjs.usePermissionsStore((s) => s.setProfiles);
823
+ const setCurrentProfile = chunkSAZLW54Y_cjs.usePermissionsStore((s) => s.setCurrentProfile);
825
824
  const adapterRef = React__namespace.useRef(adapter);
826
825
  adapterRef.current = adapter;
827
826
  const hydrateOrg = React__namespace.useCallback(
@@ -933,5 +932,5 @@ exports.useOrgAdapterOptional = useOrgAdapterOptional;
933
932
  exports.useOrganizationStore = useOrganizationStore;
934
933
  exports.useTenant = useTenant;
935
934
  exports.useTenantOptional = useTenantOptional;
936
- //# sourceMappingURL=chunk-IPWCHJPE.cjs.map
937
- //# sourceMappingURL=chunk-IPWCHJPE.cjs.map
935
+ //# sourceMappingURL=chunk-VKYZACG5.cjs.map
936
+ //# sourceMappingURL=chunk-VKYZACG5.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/supabase/client.ts","../src/org/adapters/supabase.ts","../src/org/adapters/mock.ts","../src/org/store.ts","../src/org/context.tsx"],"names":["createClient","setGlobalSupabaseClient","slugify","STORAGE_KEY","create","setActiveTenantId","React","useAuthStore","usePermissionsStore","jsx"],"mappings":"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","file":"chunk-VKYZACG5.cjs","sourcesContent":["import { createClient, type SupabaseClient } from '@supabase/supabase-js'\nimport { setGlobalSupabaseClient } from '@fayz-ai/core'\n\nlet _client: SupabaseClient | null = null\n\n/**\n * Create (and cache) the Supabase client for the Fayz app.\n * Also registers it as the global client in @fayz-ai/core so data providers\n * can resolve it without prop-drilling.\n *\n * Idempotent — subsequent calls with the same URL return the cached client.\n */\nexport function createFayzSupabaseClient(url: string, anonKey: string): SupabaseClient {\n if (_client) return _client\n\n if (!url || !anonKey) {\n throw new Error(\n '[@fayz-ai/saas] Supabase URL and anon key are required. ' +\n 'Pass supabaseUrl and supabaseAnonKey to createFayzApp.',\n )\n }\n\n _client = createClient(url, anonKey, {\n auth: { autoRefreshToken: true, persistSession: true },\n })\n\n // Register globally so @fayz-ai/core data providers can use it\n setGlobalSupabaseClient(_client)\n\n return _client\n}\n\n/** Get the cached client — throws if not initialised */\nexport function getFayzSupabaseClient(): SupabaseClient {\n if (!_client) {\n throw new Error(\n '[@fayz-ai/saas] Supabase client not initialised. Call createFayzApp with supabaseUrl and supabaseAnonKey first.',\n )\n }\n return _client\n}\n\n/** Safe getter — returns null if not initialised (mock/offline mode) */\nexport function getFayzSupabaseClientOptional(): SupabaseClient | null {\n return _client\n}\n","import type {\n OrgAdapter,\n Organization,\n OrgMember,\n OrgMembership,\n CreateOrgOptions,\n Location,\n Invite,\n} from '@fayz-ai/core'\nimport type { PermissionProfile, SystemPermission, AuthAdapter } from '@fayz-ai/core'\nimport { getFayzSupabaseClient } from '../../supabase/client'\n\n// ---------------------------------------------------------------------------\n// Request dedup — prevents duplicate in-flight requests (React StrictMode etc.)\n// ---------------------------------------------------------------------------\n\nconst inflightRequests = new Map<string, Promise<unknown>>()\n\nfunction dedup<T>(key: string, fn: () => Promise<T>): Promise<T> {\n const existing = inflightRequests.get(key)\n if (existing) return existing as Promise<T>\n\n const promise = fn().finally(() => {\n inflightRequests.delete(key)\n })\n inflightRequests.set(key, promise)\n return promise\n}\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\nfunction slugify(name: string): string {\n return name.toLowerCase().replace(/[^a-z0-9]+/g, '-').replace(/^-|-$/g, '')\n}\n\nfunction capitalize(s: string): string {\n return s.charAt(0).toUpperCase() + s.slice(1)\n}\n\nfunction mapTenantToOrg(row: Record<string, unknown>): Organization {\n return {\n id: row['id'] as string,\n name: row['name'] as string,\n slug: row['slug'] as string,\n logoUrl: (row['logo_url'] as string | null) ?? undefined,\n verticalId: (row['vertical_id'] as string | null) ?? undefined,\n plan: (row['plan'] as string | null) ?? undefined,\n settings: (row['settings'] as Record<string, unknown> | null) ?? undefined,\n createdAt: row['created_at'] as string,\n updatedAt: row['updated_at'] as string,\n }\n}\n\nfunction mapMemberRow(row: Record<string, unknown>): OrgMember {\n const profile = (row['profile'] as Record<string, unknown>) ?? {}\n return {\n id: row['id'] as string,\n userId: row['user_id'] as string,\n orgId: row['tenant_id'] as string,\n profileId: row['role'] as string,\n profileName: capitalize(row['role'] as string),\n user: {\n id: row['user_id'] as string,\n email: (profile['email'] as string) ?? '',\n fullName: (profile['full_name'] as string) ?? '',\n avatarUrl: (profile['avatar_url'] as string | null) ?? undefined,\n },\n // tenant_members has no `joined_at` column — it's `created_at`.\n joinedAt: (row['joined_at'] ?? row['created_at']) as string,\n }\n}\n\nfunction mapLocationRow(row: Record<string, unknown>): Location {\n return {\n id: row['id'] as string,\n tenantId: row['tenant_id'] as string,\n name: row['name'] as string,\n address: (row['address'] as string | null) ?? undefined,\n city: (row['city'] as string | null) ?? undefined,\n state: (row['state'] as string | null) ?? undefined,\n country: (row['country'] as string | null) ?? undefined,\n phone: (row['phone'] as string | null) ?? undefined,\n isHeadquarters: (row['is_headquarters'] as boolean) ?? false,\n isActive: (row['is_active'] as boolean) ?? true,\n createdAt: row['created_at'] as string,\n updatedAt: row['updated_at'] as string,\n }\n}\n\nfunction mapInviteRow(row: Record<string, unknown>): Invite {\n return {\n id: row['id'] as string,\n orgId: row['tenant_id'] as string,\n email: row['email'] as string,\n profileId: row['role'] as string,\n profileName: capitalize(row['role'] as string),\n invitedBy: row['invited_by'] as string,\n token: row['token'] as string,\n status: (row['status'] as Invite['status']) ?? 'pending',\n createdAt: row['created_at'] as string,\n expiresAt: row['expires_at'] as string,\n }\n}\n\n/** Minimal role identity the adapter needs to build profiles. Grants come from\n * the DB catalog; id/name/order/description come from what the app declares. */\nexport interface RoleIdentity {\n id: string\n name: string\n description?: string\n /** System roles are app-defined and static (not user-editable). Custom roles\n * (duplicated by users, stored in tenant_roles) are false. Defaults true. */\n isSystem?: boolean\n}\n\n// Matrix emits read/create/edit/delete; map back to DB action verbs.\nconst DB_ACTION: Record<string, string> = {\n read: 'read', create: 'create', edit: 'update', write: 'create', manage: 'manage', delete: 'delete',\n}\n\nfunction slugifyRole(name: string): string {\n return name.toLowerCase().normalize('NFD').replace(/[\\u0300-\\u036f]/g, '')\n .replace(/[^a-z0-9]+/g, '-').replace(/^-|-$/g, '') || 'role'\n}\n\n// Fallback role set when the host app declares none. The SDK is domain-agnostic:\n// each app defines its OWN business roles (a salon's roles ≠ an agency's) via\n// config.permissions.defaultProfiles. These five are only a back-compat default.\nconst DEFAULT_ROLES: RoleIdentity[] = [\n { id: 'owner', name: 'Owner' },\n { id: 'admin', name: 'Admin' },\n { id: 'manager', name: 'Manager' },\n { id: 'staff', name: 'Staff' },\n { id: 'viewer', name: 'Viewer' },\n]\n\n// DB permission ids that confer an org-management system permission.\nconst SYSTEM_PERMISSION_MAP: Record<string, SystemPermission> = {\n 'team.read': 'manage_team',\n 'team.invite': 'manage_team',\n 'team.manage': 'manage_team',\n 'team.manage_roles': 'manage_permissions',\n 'billing.read': 'manage_billing',\n 'billing.manage': 'manage_billing',\n 'settings.read': 'manage_settings',\n 'settings.update': 'manage_settings',\n}\nconst ALL_SYSTEM_PERMISSIONS: SystemPermission[] = ['manage_team', 'manage_billing', 'manage_settings', 'manage_permissions']\n\n// Map DB permission ids to feature action grants\nfunction buildPermissionProfiles(\n roles: RoleIdentity[],\n permissions: Array<{ id: string; category: string }>,\n rolePerms: Array<{ role: string; permission_id: string }>,\n overrides: Array<{ role: string; permission_id: string; granted: boolean }>,\n): PermissionProfile[] {\n const overrideMap = new Map<string, boolean>()\n for (const o of overrides) {\n overrideMap.set(`${o.role}:${o.permission_id}`, o.granted)\n }\n\n // The role SET comes from what the app declares — the SDK no longer bakes it in.\n const rolePermMap = new Map<string, Set<string>>()\n for (const r of roles) {\n rolePermMap.set(r.id, new Set())\n }\n // Convention: an 'owner' role (if declared) gets every permission implicitly.\n if (rolePermMap.has('owner')) {\n for (const p of permissions) rolePermMap.get('owner')!.add(p.id)\n }\n for (const rp of rolePerms) {\n rolePermMap.get(rp.role)?.add(rp.permission_id)\n }\n\n // Apply overrides\n for (const [key, granted] of overrideMap) {\n const colonIdx = key.indexOf(':')\n const role = key.slice(0, colonIdx)\n const permId = key.slice(colonIdx + 1)\n const perms = rolePermMap.get(role)\n if (!perms) continue\n if (granted) {\n perms.add(permId)\n } else {\n perms.delete(permId)\n }\n }\n\n // Align DB actions with the matrix's action vocabulary (read/create/edit/delete).\n const actionMap: Record<string, string> = {\n read: 'read',\n create: 'create',\n update: 'edit',\n manage: 'edit',\n delete: 'delete',\n configure: 'edit',\n invite: 'create',\n }\n\n return roles.map(({ id: role, name, description, isSystem }) => {\n const permIds = rolePermMap.get(role)!\n const features: Record<string, string[]> = {}\n\n for (const permId of permIds) {\n const dotIdx = permId.indexOf('.')\n if (dotIdx === -1) continue\n const category = permId.slice(0, dotIdx)\n const action = permId.slice(dotIdx + 1)\n const mappedAction = actionMap[action]\n if (!mappedAction) continue\n\n if (!features[category]) features[category] = []\n if (!features[category].includes(mappedAction)) {\n features[category].push(mappedAction)\n }\n }\n\n // Org-management system permissions, derived from team/billing/settings\n // grants (owner gets all four). These gate the Equipe/Permissões tabs.\n const systemPermissions: SystemPermission[] = []\n const source = role === 'owner' ? ALL_SYSTEM_PERMISSIONS : [...permIds].map((id) => SYSTEM_PERMISSION_MAP[id])\n for (const sp of source) {\n if (sp && !systemPermissions.includes(sp)) systemPermissions.push(sp)\n }\n\n return {\n id: role,\n name: name || capitalize(role),\n description,\n isSystem: isSystem ?? true,\n systemPermissions,\n grants: features,\n }\n })\n}\n\n// ---------------------------------------------------------------------------\n// Adapter factory\n// ---------------------------------------------------------------------------\n\nexport interface SupabaseOrgAdapterConfig {\n /** Deprecated — core tables now live in the public schema; this field is ignored. */\n coreSchema?: string\n /** Business roles the host app declares (config.permissions.defaultProfiles).\n * Falls back to the generic five when omitted. */\n roles?: RoleIdentity[]\n /** Auth adapter used to actually DELIVER invites (send the e-mail + create the\n * auth user) — the org adapter only records the audit row. Injected by the app;\n * when omitted, invites are recorded but not delivered. */\n authAdapter?: AuthAdapter\n /** Canonical, deployment-fixed origin baked into invite/magic-link redirects\n * (e.g. https://beauty-saas.live.fayz.ai). The container injects it as\n * VITE_APP_URL; the app wiring passes it here. Falls back to\n * window.location.origin, which is wrong when an admin invites from a preview\n * or localhost origin. Note: whatever origin ends up here must ALSO be in the\n * Supabase project's Redirect URLs allow-list, or Supabase silently swaps it\n * for its Site URL (default http://localhost:3000). */\n siteUrl?: string\n}\n\nexport function createSupabaseOrgAdapter(config?: SupabaseOrgAdapterConfig): OrgAdapter {\n const roles: RoleIdentity[] = config?.roles && config.roles.length > 0 ? config.roles : DEFAULT_ROLES\n const authAdapter = config?.authAdapter\n const originBase =\n config?.siteUrl?.replace(/\\/+$/, '') ??\n (typeof window !== 'undefined' ? window.location.origin : undefined)\n const inviteRedirectTo = originBase ? `${originBase}/` : undefined\n\n function supabase() {\n return getFayzSupabaseClient()\n }\n\n function core() {\n return supabase()\n }\n\n return {\n async listUserOrgs(userId: string): Promise<OrgMembership[]> {\n return dedup(`listUserOrgs:${userId}`, async () => {\n const { data, error } = await core()\n .from('tenant_members')\n .select('tenant_id, role, tenant:tenants(id, name, slug, logo_url)')\n .eq('user_id', userId)\n\n if (error) throw error\n\n return ((data ?? []) as Array<Record<string, unknown>>).map((row) => ({\n orgId: row['tenant_id'] as string,\n orgName: ((row['tenant'] as Record<string, unknown>)?.['name'] as string) ?? '',\n orgSlug: ((row['tenant'] as Record<string, unknown>)?.['slug'] as string) ?? '',\n orgLogoUrl: ((row['tenant'] as Record<string, unknown>)?.['logo_url'] as string | null) ?? undefined,\n profileId: row['role'] as string,\n profileName: capitalize(row['role'] as string),\n }))\n })\n },\n\n async getOrg(orgId: string): Promise<Organization> {\n const { data, error } = await core()\n .from('tenants')\n .select('*')\n .eq('id', orgId)\n .single()\n\n if (error) throw error\n return mapTenantToOrg(data as Record<string, unknown>)\n },\n\n async createOrg(name: string, userId: string, options?: CreateOrgOptions): Promise<Organization> {\n const { data: tenant, error } = await supabase()\n .rpc('create_tenant_with_owner', {\n p_name: name,\n p_slug: slugify(name),\n p_user_id: userId,\n p_vertical_id: options?.verticalId ?? null,\n p_plan: 'free',\n p_settings: {\n timezone: options?.timezone ?? 'America/Sao_Paulo',\n currency: options?.currency ?? 'BRL',\n locale: options?.locale ?? 'pt-BR',\n teamSize: options?.teamSize ?? undefined,\n branding: {},\n },\n })\n\n if (error) throw error\n return mapTenantToOrg(tenant as Record<string, unknown>)\n },\n\n async updateOrg(orgId: string, updates: Partial<Organization>): Promise<Organization> {\n const row: Record<string, unknown> = {}\n if (updates.name !== undefined) row['name'] = updates.name\n if (updates.slug !== undefined) row['slug'] = updates.slug\n if (updates.logoUrl !== undefined) row['logo_url'] = updates.logoUrl\n if (updates.verticalId !== undefined) row['vertical_id'] = updates.verticalId\n if (updates.plan !== undefined) row['plan'] = updates.plan\n if (updates.settings !== undefined) row['settings'] = updates.settings\n\n const { data, error } = await core()\n .from('tenants')\n .update(row)\n .eq('id', orgId)\n .select()\n .single()\n\n if (error) throw error\n return mapTenantToOrg(data as Record<string, unknown>)\n },\n\n async listMembers(orgId: string): Promise<OrgMember[]> {\n const { data, error } = await core()\n .from('tenant_members')\n .select('*')\n .eq('tenant_id', orgId)\n\n if (error) throw error\n\n const userIds = ((data ?? []) as Array<Record<string, unknown>>).map((m) => m['user_id'] as string)\n const { data: profiles } = userIds.length > 0\n ? await core().from('profiles').select('id, full_name, avatar_url, email').in('id', userIds)\n : { data: [] }\n\n const profileMap = new Map(\n ((profiles ?? []) as Array<Record<string, unknown>>).map((p) => [p['id'], p]),\n )\n\n return ((data ?? []) as Array<Record<string, unknown>>).map((row) => {\n const profile = profileMap.get(row['user_id'] as string) ?? {}\n return mapMemberRow({ ...row, profile })\n })\n },\n\n async updateMemberProfile(orgId: string, memberId: string, profileId: string): Promise<void> {\n const { error } = await core()\n .from('tenant_members')\n .update({ role: profileId })\n .eq('id', memberId)\n .eq('tenant_id', orgId)\n\n if (error) throw error\n },\n\n async removeMember(orgId: string, memberId: string): Promise<void> {\n const { error } = await core()\n .from('tenant_members')\n .delete()\n .eq('id', memberId)\n .eq('tenant_id', orgId)\n\n if (error) throw error\n },\n\n async listProfiles(orgId: string): Promise<PermissionProfile[]> {\n const [permsResult, rolePermsResult, overridesResult, customResult] = await Promise.all([\n core().from('permissions').select('id, category'),\n core().from('role_permissions').select('role, permission_id'),\n core().from('tenant_role_overrides').select('role, permission_id, granted').eq('tenant_id', orgId),\n // Custom roles the tenant created by duplicating a system role. Tolerate a\n // missing table (pre-seed) — just show the system roles in that case.\n core().from('tenant_roles').select('key, name, description').eq('tenant_id', orgId),\n ])\n\n if (permsResult.error) throw permsResult.error\n if (rolePermsResult.error) throw rolePermsResult.error\n if (overridesResult.error) throw overridesResult.error\n\n const systemRoles: RoleIdentity[] = roles.map((r) => ({ ...r, isSystem: true }))\n const customRoles: RoleIdentity[] = customResult.error\n ? []\n : ((customResult.data ?? []) as Array<{ key: string; name: string; description: string | null }>).map((r) => ({\n id: r.key,\n name: r.name,\n description: r.description ?? undefined,\n isSystem: false,\n }))\n\n return buildPermissionProfiles(\n [...systemRoles, ...customRoles],\n (permsResult.data ?? []) as Array<{ id: string; category: string }>,\n (rolePermsResult.data ?? []) as Array<{ role: string; permission_id: string }>,\n (overridesResult.data ?? []) as Array<{ role: string; permission_id: string; granted: boolean }>,\n )\n },\n\n async createProfile(\n orgId: string,\n profile: Omit<PermissionProfile, 'id' | 'isSystem'>,\n ): Promise<PermissionProfile> {\n // Custom roles live in tenant_roles (identity/name) + tenant_role_overrides\n // (their grants). System roles stay app-defined and untouched.\n const existing = new Set(\n ((await core().from('tenant_roles').select('key').eq('tenant_id', orgId)).data ?? [])\n .map((r: { key: string }) => r.key),\n )\n let key = slugifyRole(profile.name)\n if (existing.has(key) || roles.some((r) => r.id === key)) {\n let n = 2\n while (existing.has(`${key}-${n}`) || roles.some((r) => r.id === `${key}-${n}`)) n++\n key = `${key}-${n}`\n }\n\n const insertRole = await core()\n .from('tenant_roles')\n .insert({ tenant_id: orgId, key, name: profile.name, description: profile.description ?? null })\n if (insertRole.error) throw insertRole.error\n\n const overrides = Object.entries(profile.grants ?? {}).flatMap(([category, actions]) =>\n actions.map((action) => ({\n tenant_id: orgId,\n role: key,\n permission_id: `${category}.${DB_ACTION[action] ?? action}`,\n granted: true,\n })),\n )\n if (overrides.length > 0) {\n const { error } = await core().from('tenant_role_overrides').insert(overrides)\n if (error) throw error\n }\n\n const profiles = await this.listProfiles(orgId)\n return profiles.find((p) => p.id === key) ?? {\n id: key, name: profile.name, description: profile.description, isSystem: false,\n systemPermissions: profile.systemPermissions ?? [], grants: profile.grants ?? {},\n }\n },\n\n async updateProfile(\n orgId: string,\n profileId: string,\n data: Partial<PermissionProfile>,\n ): Promise<PermissionProfile> {\n if (data.grants) {\n await core()\n .from('tenant_role_overrides')\n .delete()\n .eq('tenant_id', orgId)\n .eq('role', profileId)\n\n const overrides: Array<{\n tenant_id: string\n role: string\n permission_id: string\n granted: boolean\n }> = []\n\n for (const [category, actions] of Object.entries(data.grants)) {\n for (const action of actions) {\n // Matrix emits read/create/edit/delete; map back to DB action verbs.\n const dbActionMap: Record<string, string> = {\n read: 'read',\n create: 'create',\n edit: 'update',\n write: 'create',\n manage: 'manage',\n delete: 'delete',\n }\n const dbAction = dbActionMap[action] ?? action\n overrides.push({\n tenant_id: orgId,\n role: profileId,\n permission_id: `${category}.${dbAction}`,\n granted: true,\n })\n }\n }\n\n if (overrides.length > 0) {\n const { error } = await core().from('tenant_role_overrides').insert(overrides)\n if (error) throw error\n }\n }\n\n const profiles = await this.listProfiles(orgId)\n const updated = profiles.find((p) => p.id === profileId)\n if (!updated) throw new Error(`Profile not found: ${profileId}`)\n return updated\n },\n\n async deleteProfile(orgId: string, profileId: string): Promise<void> {\n // Only custom roles (present in tenant_roles) can be deleted; system roles\n // are app-defined and static.\n const found = await core()\n .from('tenant_roles')\n .select('key')\n .eq('tenant_id', orgId)\n .eq('key', profileId)\n .maybeSingle()\n if (found.error) throw found.error\n if (!found.data) throw new Error('System roles cannot be deleted.')\n\n await core().from('tenant_role_overrides').delete().eq('tenant_id', orgId).eq('role', profileId)\n const { error } = await core().from('tenant_roles').delete().eq('tenant_id', orgId).eq('key', profileId)\n if (error) throw error\n },\n\n async listInvites(orgId: string): Promise<Invite[]> {\n const { data, error } = await core()\n .from('invitations')\n .select('*')\n .eq('tenant_id', orgId)\n .order('created_at', { ascending: false })\n\n if (error) throw error\n return ((data ?? []) as Array<Record<string, unknown>>).map(mapInviteRow)\n },\n\n async createInvite(orgId: string, email: string, profileId: string, invitedBy: string): Promise<Invite> {\n const { data, error } = await core()\n .from('invitations')\n .insert({\n tenant_id: orgId,\n email,\n role: profileId,\n invited_by: invitedBy,\n })\n .select()\n .single()\n\n if (error) throw error\n // Deliver via the auth abstraction (sends the e-mail + creates the auth user,\n // stamping tenant_id/role on its metadata for the accept-time membership trigger).\n await authAdapter?.inviteUser?.(email, {\n redirectTo: inviteRedirectTo,\n data: { tenant_id: orgId, role: profileId, invited_by: invitedBy },\n })\n return mapInviteRow(data as Record<string, unknown>)\n },\n\n async bulkInvite(orgId: string, emails: string[], profileId: string, invitedBy: string): Promise<Invite[]> {\n const rows = emails.map((email) => ({\n tenant_id: orgId,\n email,\n role: profileId,\n invited_by: invitedBy,\n }))\n\n const { data, error } = await core().from('invitations').insert(rows).select()\n if (error) throw error\n await Promise.all(\n emails.map((email) =>\n authAdapter?.inviteUser?.(email, {\n redirectTo: inviteRedirectTo,\n data: { tenant_id: orgId, role: profileId, invited_by: invitedBy },\n }),\n ),\n )\n return ((data ?? []) as Array<Record<string, unknown>>).map(mapInviteRow)\n },\n\n async revokeInvite(orgId: string, inviteId: string): Promise<void> {\n const { error } = await core()\n .from('invitations')\n .update({ status: 'revoked' })\n .eq('id', inviteId)\n .eq('tenant_id', orgId)\n\n if (error) throw error\n },\n\n async resendInvite(orgId: string, inviteId: string): Promise<Invite> {\n const { data, error } = await core()\n .from('invitations')\n .update({\n status: 'pending',\n expires_at: new Date(Date.now() + 7 * 24 * 60 * 60 * 1000).toISOString(),\n })\n .eq('id', inviteId)\n .eq('tenant_id', orgId)\n .select()\n .single()\n\n if (error) throw error\n const row = data as Record<string, unknown>\n // Re-send the invite e-mail through the auth abstraction.\n await authAdapter?.inviteUser?.(row.email as string, {\n redirectTo: inviteRedirectTo,\n data: { tenant_id: orgId, role: row.role as string, invited_by: row.invited_by as string },\n })\n return mapInviteRow(row)\n },\n\n async listLocations(orgId: string): Promise<Location[]> {\n const { data, error } = await core()\n .from('locations')\n .select('*')\n .eq('tenant_id', orgId)\n .order('is_headquarters', { ascending: false })\n .order('name')\n\n if (error) throw error\n return ((data ?? []) as Array<Record<string, unknown>>).map(mapLocationRow)\n },\n\n async createLocation(\n orgId: string,\n input: {\n name: string\n address?: string\n city?: string\n state?: string\n country?: string\n phone?: string\n isHeadquarters?: boolean\n },\n ): Promise<Location> {\n const { data, error } = await core()\n .from('locations')\n .insert({\n tenant_id: orgId,\n name: input.name,\n address: input.address ?? null,\n city: input.city ?? null,\n state: input.state ?? null,\n country: input.country ?? 'BR',\n phone: input.phone ?? null,\n is_headquarters: input.isHeadquarters ?? false,\n })\n .select()\n .single()\n\n if (error) throw error\n return mapLocationRow(data as Record<string, unknown>)\n },\n }\n}\n","import type {\n OrgAdapter,\n Organization,\n OrgMember,\n OrgMembership,\n CreateOrgOptions,\n Location,\n Invite,\n} from '@fayz-ai/core'\nimport type { PermissionProfile } from '@fayz-ai/core'\n\nconst STORAGE_KEY = 'fayz:mock-orgs'\n\ninterface MockOrgData {\n orgs: Organization[]\n members: OrgMember[]\n profiles: Record<string, PermissionProfile[]>\n invites: Record<string, Invite[]>\n userOrgMap: Record<string, string[]>\n}\n\nfunction getStored(): MockOrgData {\n try {\n if (typeof localStorage === 'undefined') return empty()\n const raw = localStorage.getItem(STORAGE_KEY)\n if (raw) return JSON.parse(raw) as MockOrgData\n } catch {\n // ignore\n }\n return empty()\n}\n\nfunction empty(): MockOrgData {\n return { orgs: [], members: [], profiles: {}, invites: {}, userOrgMap: {} }\n}\n\nfunction setStored(data: MockOrgData): void {\n try {\n if (typeof localStorage === 'undefined') return\n localStorage.setItem(STORAGE_KEY, JSON.stringify(data))\n } catch {\n // ignore\n }\n}\n\nfunction slugify(name: string): string {\n return name.toLowerCase().replace(/[^a-z0-9]+/g, '-').replace(/^-|-$/g, '')\n}\n\nexport function createMockOrgAdapter(defaultProfiles?: PermissionProfile[]): OrgAdapter {\n function seedOrgForUser(userId: string, userName?: string): MockOrgData {\n const data = getStored()\n if (data.userOrgMap[userId]?.length) return data\n\n const orgId = crypto.randomUUID()\n const memberId = crypto.randomUUID()\n const firstProfile = defaultProfiles?.[0]\n\n const org: Organization = {\n id: orgId,\n name: 'My Organization',\n slug: 'my-organization',\n createdAt: new Date().toISOString(),\n updatedAt: new Date().toISOString(),\n }\n\n const member: OrgMember = {\n id: memberId,\n userId,\n orgId,\n profileId: firstProfile?.id ?? 'owner',\n profileName: firstProfile?.name ?? 'Owner',\n user: {\n id: userId,\n email: userName\n ? `${userName.toLowerCase().replace(/\\s+/g, '.')}@example.com`\n : 'user@example.com',\n fullName: userName ?? 'Current User',\n },\n joinedAt: new Date().toISOString(),\n }\n\n data.orgs.push(org)\n data.members.push(member)\n data.userOrgMap[userId] = [orgId]\n if (defaultProfiles) {\n data.profiles[orgId] = [...defaultProfiles]\n }\n data.invites[orgId] = []\n\n setStored(data)\n return data\n }\n\n return {\n async listUserOrgs(userId: string): Promise<OrgMembership[]> {\n const data = seedOrgForUser(userId)\n const orgIds = data.userOrgMap[userId] ?? []\n return orgIds.map((orgId) => {\n const org = data.orgs.find((o) => o.id === orgId)!\n const member = data.members.find((m) => m.orgId === orgId && m.userId === userId)\n return {\n orgId,\n orgName: org.name,\n orgSlug: org.slug,\n orgLogoUrl: org.logoUrl,\n profileId: member?.profileId ?? 'owner',\n profileName: member?.profileName ?? 'Owner',\n }\n })\n },\n\n async getOrg(orgId: string): Promise<Organization> {\n const data = getStored()\n const org = data.orgs.find((o) => o.id === orgId)\n if (!org) throw new Error(`Org not found: ${orgId}`)\n return org\n },\n\n async createOrg(name: string, userId: string, options?: CreateOrgOptions): Promise<Organization> {\n const data = getStored()\n const orgId = crypto.randomUUID()\n const firstProfile = defaultProfiles?.[0]\n\n const org: Organization = {\n id: orgId,\n name,\n slug: slugify(name),\n verticalId: options?.verticalId,\n plan: 'free',\n settings: {\n timezone: options?.timezone ?? 'America/Sao_Paulo',\n currency: options?.currency ?? 'BRL',\n locale: options?.locale ?? 'pt-BR',\n },\n createdAt: new Date().toISOString(),\n updatedAt: new Date().toISOString(),\n }\n\n const member: OrgMember = {\n id: crypto.randomUUID(),\n userId,\n orgId,\n profileId: firstProfile?.id ?? 'owner',\n profileName: firstProfile?.name ?? 'Owner',\n user: {\n id: userId,\n email: 'user@example.com',\n fullName: 'Current User',\n },\n joinedAt: new Date().toISOString(),\n }\n\n data.orgs.push(org)\n data.members.push(member)\n if (!data.userOrgMap[userId]) data.userOrgMap[userId] = []\n data.userOrgMap[userId].push(orgId)\n if (defaultProfiles) {\n data.profiles[orgId] = [...defaultProfiles]\n }\n data.invites[orgId] = []\n\n setStored(data)\n return org\n },\n\n async updateOrg(orgId: string, updates: Partial<Organization>): Promise<Organization> {\n const data = getStored()\n const idx = data.orgs.findIndex((o) => o.id === orgId)\n if (idx === -1) throw new Error(`Org not found: ${orgId}`)\n data.orgs[idx] = { ...data.orgs[idx], ...updates, updatedAt: new Date().toISOString() }\n setStored(data)\n return data.orgs[idx]\n },\n\n async listMembers(orgId: string): Promise<OrgMember[]> {\n const data = getStored()\n return data.members.filter((m) => m.orgId === orgId)\n },\n\n async updateMemberProfile(orgId: string, memberId: string, profileId: string): Promise<void> {\n const data = getStored()\n const member = data.members.find((m) => m.id === memberId && m.orgId === orgId)\n if (!member) throw new Error(`Member not found: ${memberId}`)\n const profiles = data.profiles[orgId] ?? []\n const profile = profiles.find((p) => p.id === profileId)\n member.profileId = profileId\n member.profileName = profile?.name ?? profileId\n setStored(data)\n },\n\n async removeMember(orgId: string, memberId: string): Promise<void> {\n const data = getStored()\n const memberIdx = data.members.findIndex((m) => m.id === memberId && m.orgId === orgId)\n if (memberIdx === -1) return\n const member = data.members[memberIdx]\n data.members.splice(memberIdx, 1)\n const userOrgs = data.userOrgMap[member.userId]\n if (userOrgs) {\n const orgIdx = userOrgs.indexOf(orgId)\n if (orgIdx !== -1) userOrgs.splice(orgIdx, 1)\n }\n setStored(data)\n },\n\n async listProfiles(orgId: string): Promise<PermissionProfile[]> {\n const data = getStored()\n return data.profiles[orgId] ?? defaultProfiles ?? []\n },\n\n async createProfile(\n orgId: string,\n profile: Omit<PermissionProfile, 'id' | 'isSystem'>,\n ): Promise<PermissionProfile> {\n const data = getStored()\n const newProfile: PermissionProfile = {\n ...profile,\n id: crypto.randomUUID(),\n isSystem: false,\n }\n if (!data.profiles[orgId]) {\n data.profiles[orgId] = defaultProfiles ? [...defaultProfiles] : []\n }\n data.profiles[orgId].push(newProfile)\n setStored(data)\n return newProfile\n },\n\n async updateProfile(\n orgId: string,\n profileId: string,\n updates: Partial<PermissionProfile>,\n ): Promise<PermissionProfile> {\n const data = getStored()\n const profiles = data.profiles[orgId] ?? []\n const idx = profiles.findIndex((p) => p.id === profileId)\n if (idx === -1) throw new Error(`Profile not found: ${profileId}`)\n profiles[idx] = { ...profiles[idx], ...updates }\n data.profiles[orgId] = profiles\n setStored(data)\n return profiles[idx]\n },\n\n async deleteProfile(orgId: string, profileId: string): Promise<void> {\n const data = getStored()\n const profiles = data.profiles[orgId] ?? []\n const profile = profiles.find((p) => p.id === profileId)\n if (profile?.isSystem) throw new Error('Cannot delete system profile')\n data.profiles[orgId] = profiles.filter((p) => p.id !== profileId)\n setStored(data)\n },\n\n async listInvites(orgId: string): Promise<Invite[]> {\n const data = getStored()\n return data.invites[orgId] ?? []\n },\n\n async createInvite(\n orgId: string,\n email: string,\n profileId: string,\n invitedBy: string,\n ): Promise<Invite> {\n const data = getStored()\n const profiles = data.profiles[orgId] ?? defaultProfiles ?? []\n const profile = profiles.find((p) => p.id === profileId)\n\n const invite: Invite = {\n id: crypto.randomUUID(),\n orgId,\n email,\n profileId,\n profileName: profile?.name ?? profileId,\n invitedBy,\n token: crypto.randomUUID(),\n status: 'pending',\n createdAt: new Date().toISOString(),\n expiresAt: new Date(Date.now() + 7 * 24 * 60 * 60 * 1000).toISOString(),\n }\n\n if (!data.invites[orgId]) data.invites[orgId] = []\n data.invites[orgId].push(invite)\n setStored(data)\n return invite\n },\n\n async bulkInvite(\n orgId: string,\n emails: string[],\n profileId: string,\n invitedBy: string,\n ): Promise<Invite[]> {\n const results: Invite[] = []\n for (const email of emails) {\n results.push(await this.createInvite(orgId, email, profileId, invitedBy))\n }\n return results\n },\n\n async revokeInvite(orgId: string, inviteId: string): Promise<void> {\n const data = getStored()\n const invites = data.invites[orgId] ?? []\n const invite = invites.find((i) => i.id === inviteId)\n if (invite) {\n invite.status = 'expired'\n setStored(data)\n }\n },\n\n async resendInvite(orgId: string, inviteId: string): Promise<Invite> {\n const data = getStored()\n const invites = data.invites[orgId] ?? []\n const invite = invites.find((i) => i.id === inviteId)\n if (!invite) throw new Error(`Invite not found: ${inviteId}`)\n invite.expiresAt = new Date(Date.now() + 7 * 24 * 60 * 60 * 1000).toISOString()\n invite.status = 'pending'\n setStored(data)\n return invite\n },\n\n async listLocations(_orgId: string): Promise<Location[]> {\n return []\n },\n\n async createLocation(\n orgId: string,\n input: {\n name: string\n address?: string\n city?: string\n state?: string\n country?: string\n phone?: string\n isHeadquarters?: boolean\n },\n ): Promise<Location> {\n return {\n id: crypto.randomUUID(),\n tenantId: orgId,\n name: input.name,\n address: input.address,\n city: input.city,\n state: input.state,\n country: input.country ?? 'BR',\n phone: input.phone,\n isHeadquarters: input.isHeadquarters ?? false,\n isActive: true,\n createdAt: new Date().toISOString(),\n updatedAt: new Date().toISOString(),\n }\n },\n }\n}\n","import { create } from 'zustand'\nimport { setActiveTenantId, type Organization, type OrgMember, type OrgMembership } from '@fayz-ai/core'\n\nconst STORAGE_KEY = 'fayz:current-org'\n\n// ---------------------------------------------------------------------------\n// Persistence helpers\n// ---------------------------------------------------------------------------\n\nfunction getPersistedOrgId(): string | null {\n try {\n if (typeof localStorage === 'undefined') return null\n return localStorage.getItem(STORAGE_KEY)\n } catch {\n return null\n }\n}\n\nfunction persistOrgId(orgId: string | null): void {\n try {\n if (typeof localStorage === 'undefined') return\n if (orgId) {\n localStorage.setItem(STORAGE_KEY, orgId)\n } else {\n localStorage.removeItem(STORAGE_KEY)\n }\n } catch {\n // ignore\n }\n}\n\n// ---------------------------------------------------------------------------\n// Store interface\n// ---------------------------------------------------------------------------\n\nexport interface OrgStore {\n currentOrg: Organization | null\n userOrgs: OrgMembership[]\n members: OrgMember[]\n loading: boolean\n\n setCurrentOrg: (org: Organization | null) => void\n setUserOrgs: (orgs: OrgMembership[]) => void\n setMembers: (members: OrgMember[]) => void\n setLoading: (loading: boolean) => void\n reset: () => void\n}\n\nexport const useOrganizationStore = create<OrgStore>((set) => ({\n currentOrg: null,\n userOrgs: [],\n members: [],\n loading: false,\n\n setCurrentOrg: (org) => {\n setActiveTenantId(org?.id)\n persistOrgId(org?.id ?? null)\n set({ currentOrg: org })\n },\n setUserOrgs: (orgs) => set({ userOrgs: orgs }),\n setMembers: (members) => set({ members }),\n setLoading: (loading) => set({ loading }),\n reset: () => {\n setActiveTenantId(undefined)\n // NOTE: do NOT clear the persisted org id here. The org providers call\n // reset() whenever the auth store transiently reports `user === null` —\n // which happens on every fresh load while the Supabase session hydrates\n // asynchronously. Wiping 'fayz:current-org' at that moment drops a\n // multi-org user's workspace selection BEFORE loadOrgs can read it back,\n // so the app always falls to memberships[0] on reload (single-org users\n // never noticed). The pin is a last-selected hint that's re-validated\n // against the fresh membership list on load, so it's safe to keep across\n // sign-out too (a mismatching pin just falls back to memberships[0]).\n set({ currentOrg: null, userOrgs: [], members: [], loading: false })\n },\n}))\n\nexport { getPersistedOrgId }\n","import * as React from 'react'\nimport type { OrgAdapter, Organization, OrgMembership } from '@fayz-ai/core'\nimport { useAuthStore } from '@fayz-ai/auth'\nimport { useOrganizationStore, getPersistedOrgId } from './store'\nimport { usePermissionsStore } from '../permissions'\n\n// ---------------------------------------------------------------------------\n// Adapter context\n// ---------------------------------------------------------------------------\n\nconst OrgAdapterContext = React.createContext<OrgAdapter | null>(null)\n\nexport function useOrgAdapter(): OrgAdapter {\n const adapter = React.useContext(OrgAdapterContext)\n if (!adapter) {\n throw new Error('useOrgAdapter must be used within an <OrgProvider>')\n }\n return adapter\n}\n\nexport function useOrgAdapterOptional(): OrgAdapter | null {\n return React.useContext(OrgAdapterContext)\n}\n\n// ---------------------------------------------------------------------------\n// Tenant / org hook\n// ---------------------------------------------------------------------------\n\nexport interface TenantContext {\n /** The currently active organization */\n org: Organization | null\n /** All orgs the current user belongs to */\n userOrgs: OrgMembership[]\n loading: boolean\n /** Switch the active org */\n switchOrg: (orgId: string) => Promise<void>\n /** Refresh the current org from the adapter */\n refreshOrg: () => Promise<void>\n}\n\nconst TenantContext = React.createContext<TenantContext | null>(null)\n\n/**\n * Access the current tenant / organization.\n * Must be used inside <OrgProvider>.\n */\nexport function useTenant(): TenantContext {\n const ctx = React.useContext(TenantContext)\n if (!ctx) {\n throw new Error('useTenant must be used inside <OrgProvider>')\n }\n return ctx\n}\n\nexport function useTenantOptional(): TenantContext | null {\n return React.useContext(TenantContext)\n}\n\n// ---------------------------------------------------------------------------\n// Provider\n// ---------------------------------------------------------------------------\n\nexport interface OrgProviderProps {\n adapter: OrgAdapter\n /** When true, automatically creates an org if the user has none */\n autoCreate?: boolean\n children: React.ReactNode\n}\n\nexport function OrgProvider({ adapter, autoCreate = false, children }: OrgProviderProps) {\n const { user } = useAuthStore()\n const { currentOrg, userOrgs, loading, setCurrentOrg, setUserOrgs, setMembers, setLoading, reset } =\n useOrganizationStore()\n const setProfiles = usePermissionsStore((s) => s.setProfiles)\n const setCurrentProfile = usePermissionsStore((s) => s.setCurrentProfile)\n\n const adapterRef = React.useRef(adapter)\n adapterRef.current = adapter\n\n // Load the org's members + permission profiles into the shared stores whenever\n // an org resolves. This is what makes the role list, the invite dialog's role\n // dropdown, and permission checks work — previously nothing loaded them here,\n // so those surfaces came up empty. Also resolves the signed-in user's own role.\n const hydrateOrg = React.useCallback(\n async (orgId: string, uid: string | undefined) => {\n try {\n const [members, profiles] = await Promise.all([\n adapterRef.current.listMembers(orgId),\n adapterRef.current.listProfiles(orgId),\n ])\n setMembers(members)\n setProfiles(profiles)\n const myMembership = uid ? members.find((m) => m.userId === uid) : undefined\n setCurrentProfile(profiles.find((p) => p.id === myMembership?.profileId) ?? null)\n } catch {\n // Non-fatal — leave stores as-is if the load fails.\n }\n },\n [setMembers, setProfiles, setCurrentProfile],\n )\n\n // Load orgs when user is authenticated\n React.useEffect(() => {\n if (!user) {\n reset()\n return\n }\n\n let cancelled = false\n\n async function loadOrgs() {\n setLoading(true)\n try {\n const memberships = await adapterRef.current.listUserOrgs(user!.id)\n\n if (cancelled) return\n\n setUserOrgs(memberships)\n\n // Auto-create org if user has none\n if (memberships.length === 0 && autoCreate) {\n const newOrg = await adapterRef.current.createOrg(\n user!.fullName ? `${user!.fullName}'s Organization` : 'My Organization',\n user!.id,\n )\n if (!cancelled) {\n setUserOrgs([\n {\n orgId: newOrg.id,\n orgName: newOrg.name,\n orgSlug: newOrg.slug,\n profileId: 'owner',\n profileName: 'Owner',\n },\n ])\n setCurrentOrg(newOrg)\n await hydrateOrg(newOrg.id, user!.id)\n }\n return\n }\n\n // Restore previously selected org or default to first\n const persistedId = getPersistedOrgId()\n const target =\n memberships.find((m) => m.orgId === persistedId) ?? memberships[0]\n\n if (target && !cancelled) {\n const org = await adapterRef.current.getOrg(target.orgId)\n if (!cancelled) {\n setCurrentOrg(org)\n await hydrateOrg(org.id, user!.id)\n }\n }\n } finally {\n if (!cancelled) setLoading(false)\n }\n }\n\n void loadOrgs()\n\n return () => {\n cancelled = true\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [user?.id])\n\n async function switchOrg(orgId: string): Promise<void> {\n setLoading(true)\n try {\n const org = await adapterRef.current.getOrg(orgId)\n setCurrentOrg(org)\n await hydrateOrg(org.id, user?.id)\n } finally {\n setLoading(false)\n }\n }\n\n async function refreshOrg(): Promise<void> {\n if (!currentOrg) return\n setLoading(true)\n try {\n const org = await adapterRef.current.getOrg(currentOrg.id)\n setCurrentOrg(org)\n await hydrateOrg(org.id, user?.id)\n } finally {\n setLoading(false)\n }\n }\n\n const tenantValue: TenantContext = {\n org: currentOrg,\n userOrgs,\n loading,\n switchOrg,\n refreshOrg,\n }\n\n return (\n <OrgAdapterContext.Provider value={adapter}>\n <TenantContext.Provider value={tenantValue}>\n {children}\n </TenantContext.Provider>\n </OrgAdapterContext.Provider>\n )\n}\n"]}
@@ -0,0 +1,36 @@
1
+ import { create } from 'zustand';
2
+
3
+ // src/billing/store.ts
4
+ var initialState = {
5
+ subscription: null,
6
+ invoices: [],
7
+ plans: [],
8
+ loading: false,
9
+ checkout: null
10
+ };
11
+ var useBillingStore = create((set) => ({
12
+ ...initialState,
13
+ setSubscription: (subscription) => set({ subscription }),
14
+ setInvoices: (invoices) => set({ invoices }),
15
+ setPlans: (plans) => set({ plans }),
16
+ setLoading: (loading) => set({ loading }),
17
+ setCheckout: (checkout) => set({ checkout }),
18
+ reset: () => set(initialState)
19
+ }));
20
+
21
+ // src/billing/plan-badge.ts
22
+ function capitalize(s) {
23
+ return s ? s.charAt(0).toUpperCase() + s.slice(1) : s;
24
+ }
25
+ function resolvePlanBadge(planId, plans) {
26
+ const id = planId || "free";
27
+ const match = plans.find((p) => p.id === id);
28
+ if (match) {
29
+ return { label: match.name, planId: match.id, paid: match.price > 0 };
30
+ }
31
+ return { label: capitalize(id), planId: id, paid: false };
32
+ }
33
+
34
+ export { resolvePlanBadge, useBillingStore };
35
+ //# sourceMappingURL=chunk-VN5NTK26.js.map
36
+ //# sourceMappingURL=chunk-VN5NTK26.js.map