@fayz-ai/admin 0.30.3 → 0.33.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (131) hide show
  1. package/dist/ScheduleEditor-AWG3QNDS.js +7 -0
  2. package/dist/{ScheduleEditor-YE42HL7P.js.map → ScheduleEditor-AWG3QNDS.js.map} +1 -1
  3. package/dist/SubscriptionPage-WQBBD35Q.js +9 -0
  4. package/dist/{SubscriptionPage-TVAEOFNC.js.map → SubscriptionPage-WQBBD35Q.js.map} +1 -1
  5. package/dist/app/AdminShell.d.ts +14 -0
  6. package/dist/app/AdminShell.d.ts.map +1 -1
  7. package/dist/app/admin-app.d.ts.map +1 -1
  8. package/dist/app/rail-preset.d.ts.map +1 -1
  9. package/dist/app/scaffold.d.ts.map +1 -1
  10. package/dist/app/useAppPreset.d.ts +13 -0
  11. package/dist/app/useAppPreset.d.ts.map +1 -1
  12. package/dist/billing/index.js +2 -2
  13. package/dist/{chunk-ZUM3Y7VB.js → chunk-4YF6R7T3.js} +13 -7
  14. package/dist/chunk-4YF6R7T3.js.map +1 -0
  15. package/dist/{chunk-KSUIF56I.js → chunk-IDOTNT43.js} +5 -5
  16. package/dist/chunk-IDOTNT43.js.map +1 -0
  17. package/dist/{chunk-ZOUIXHKI.js → chunk-IUCDHAAB.js} +3 -3
  18. package/dist/{chunk-ZOUIXHKI.js.map → chunk-IUCDHAAB.js.map} +1 -1
  19. package/dist/{chunk-W5IBKM3K.js → chunk-QOS6UAQ4.js} +7 -2
  20. package/dist/chunk-QOS6UAQ4.js.map +1 -0
  21. package/dist/{chunk-XDYY5PLH.js → chunk-VUWBGUIH.js} +40 -6
  22. package/dist/chunk-VUWBGUIH.js.map +1 -0
  23. package/dist/{chunk-U6LV4GIH.js → chunk-WML2RLDF.js} +5 -5
  24. package/dist/{chunk-U6LV4GIH.js.map → chunk-WML2RLDF.js.map} +1 -1
  25. package/dist/chunk-WXNTUCX3.js +270 -0
  26. package/dist/chunk-WXNTUCX3.js.map +1 -0
  27. package/dist/components/RightRail.d.ts.map +1 -1
  28. package/dist/components/auth/LoginForm.d.ts.map +1 -1
  29. package/dist/components/chat/ChatConversation.d.ts.map +1 -1
  30. package/dist/components/chat/ConfirmActionCard.d.ts.map +1 -1
  31. package/dist/components/plugins/PluginSettingsPanel.d.ts +2 -2
  32. package/dist/components/plugins/PluginSettingsPanel.d.ts.map +1 -1
  33. package/dist/components/plugins/SettingsTabs.d.ts.map +1 -1
  34. package/dist/components/settings/BrandingSettings.d.ts.map +1 -1
  35. package/dist/components/settings/LocationsCrudPage.d.ts.map +1 -1
  36. package/dist/components/settings/SettingsPage.d.ts +3 -0
  37. package/dist/components/settings/SettingsPage.d.ts.map +1 -1
  38. package/dist/components/settings/module-catalog.d.ts +12 -0
  39. package/dist/components/settings/module-catalog.d.ts.map +1 -1
  40. package/dist/crud/AddressField.d.ts +7 -0
  41. package/dist/crud/AddressField.d.ts.map +1 -0
  42. package/dist/crud/AttachedFieldSection.d.ts +32 -0
  43. package/dist/crud/AttachedFieldSection.d.ts.map +1 -0
  44. package/dist/crud/BankField.d.ts +6 -0
  45. package/dist/crud/BankField.d.ts.map +1 -0
  46. package/dist/crud/CrudCardGrid.d.ts +3 -1
  47. package/dist/crud/CrudCardGrid.d.ts.map +1 -1
  48. package/dist/crud/CrudDetailPage.d.ts +30 -1
  49. package/dist/crud/CrudDetailPage.d.ts.map +1 -1
  50. package/dist/crud/CrudFormPage.d.ts +7 -0
  51. package/dist/crud/CrudFormPage.d.ts.map +1 -1
  52. package/dist/crud/CrudListView.d.ts +13 -1
  53. package/dist/crud/CrudListView.d.ts.map +1 -1
  54. package/dist/crud/CrudPage.d.ts +3 -1
  55. package/dist/crud/CrudPage.d.ts.map +1 -1
  56. package/dist/crud/DeleteConfirmDialog.d.ts +8 -1
  57. package/dist/crud/DeleteConfirmDialog.d.ts.map +1 -1
  58. package/dist/crud/EntityOverview.d.ts.map +1 -1
  59. package/dist/crud/RelatedListTab.d.ts.map +1 -1
  60. package/dist/crud/RelatedSection.d.ts +8 -0
  61. package/dist/crud/RelatedSection.d.ts.map +1 -0
  62. package/dist/crud/SubForm.d.ts +9 -0
  63. package/dist/crud/SubForm.d.ts.map +1 -0
  64. package/dist/crud/TagsField.d.ts +13 -0
  65. package/dist/crud/TagsField.d.ts.map +1 -0
  66. package/dist/crud/archetype-lookup.d.ts +22 -0
  67. package/dist/crud/archetype-lookup.d.ts.map +1 -1
  68. package/dist/crud/archetypes/AddressesTab.d.ts +22 -2
  69. package/dist/crud/archetypes/AddressesTab.d.ts.map +1 -1
  70. package/dist/crud/archetypes/LocationFormLayout.d.ts +4 -1
  71. package/dist/crud/archetypes/LocationFormLayout.d.ts.map +1 -1
  72. package/dist/crud/archetypes/OrderDetailView.d.ts +12 -0
  73. package/dist/crud/archetypes/OrderDetailView.d.ts.map +1 -1
  74. package/dist/crud/archetypes/OrderFormView.d.ts +12 -0
  75. package/dist/crud/archetypes/OrderFormView.d.ts.map +1 -1
  76. package/dist/crud/archetypes/PayeeAccountsSection.d.ts +5 -0
  77. package/dist/crud/archetypes/PayeeAccountsSection.d.ts.map +1 -0
  78. package/dist/crud/archetypes/PersonDetailTabs.d.ts +56 -5
  79. package/dist/crud/archetypes/PersonDetailTabs.d.ts.map +1 -1
  80. package/dist/crud/archetypes/PersonFormLayout.d.ts +4 -1
  81. package/dist/crud/archetypes/PersonFormLayout.d.ts.map +1 -1
  82. package/dist/crud/archetypes/useCatalogedItemTypes.d.ts +9 -0
  83. package/dist/crud/archetypes/useCatalogedItemTypes.d.ts.map +1 -0
  84. package/dist/crud/createCrudPage.d.ts +2 -0
  85. package/dist/crud/createCrudPage.d.ts.map +1 -1
  86. package/dist/crud/fieldToColumn.d.ts +12 -0
  87. package/dist/crud/fieldToColumn.d.ts.map +1 -1
  88. package/dist/crud/navTabRegistry.d.ts +23 -0
  89. package/dist/crud/navTabRegistry.d.ts.map +1 -0
  90. package/dist/crud/relation-field.d.ts.map +1 -1
  91. package/dist/crud/tab-counts.d.ts +23 -0
  92. package/dist/crud/tab-counts.d.ts.map +1 -0
  93. package/dist/hooks/useChat.d.ts +4 -0
  94. package/dist/hooks/useChat.d.ts.map +1 -1
  95. package/dist/hooks/useNotifications.d.ts.map +1 -1
  96. package/dist/index.d.ts +10 -6
  97. package/dist/index.d.ts.map +1 -1
  98. package/dist/index.js +3234 -2025
  99. package/dist/index.js.map +1 -1
  100. package/dist/lib/agent-staff.d.ts +20 -1
  101. package/dist/lib/agent-staff.d.ts.map +1 -1
  102. package/dist/lib/fayz-agent.d.ts +16 -0
  103. package/dist/lib/fayz-agent.d.ts.map +1 -1
  104. package/dist/org/adapters/supabase.d.ts +12 -1
  105. package/dist/org/adapters/supabase.d.ts.map +1 -1
  106. package/dist/org/context.d.ts.map +1 -1
  107. package/dist/org/index.js +3 -3
  108. package/dist/org/store.d.ts +16 -0
  109. package/dist/org/store.d.ts.map +1 -1
  110. package/dist/theme/light.d.ts.map +1 -1
  111. package/dist/theme/utils.d.ts.map +1 -1
  112. package/dist/timeline/PersonTimeline.d.ts.map +1 -1
  113. package/dist/timeline/TimelineList.d.ts +32 -0
  114. package/dist/timeline/TimelineList.d.ts.map +1 -0
  115. package/dist/timeline/index.d.ts +2 -1
  116. package/dist/timeline/index.d.ts.map +1 -1
  117. package/dist/timeline-LECYQ4IA.js +3 -0
  118. package/dist/timeline-LECYQ4IA.js.map +1 -0
  119. package/dist/types/crud.d.ts +13 -2
  120. package/dist/types/crud.d.ts.map +1 -1
  121. package/dist/units/index.d.ts +2 -0
  122. package/dist/units/index.d.ts.map +1 -1
  123. package/dist/units/useUnitFilter.d.ts +46 -0
  124. package/dist/units/useUnitFilter.d.ts.map +1 -0
  125. package/package.json +6 -6
  126. package/dist/ScheduleEditor-YE42HL7P.js +0 -7
  127. package/dist/SubscriptionPage-TVAEOFNC.js +0 -9
  128. package/dist/chunk-KSUIF56I.js.map +0 -1
  129. package/dist/chunk-W5IBKM3K.js.map +0 -1
  130. package/dist/chunk-XDYY5PLH.js.map +0 -1
  131. package/dist/chunk-ZUM3Y7VB.js.map +0 -1
@@ -0,0 +1,7 @@
1
+ export { ScheduleEditor } from './chunk-VUWBGUIH.js';
2
+ import './chunk-4YF6R7T3.js';
3
+ import './chunk-IDOTNT43.js';
4
+ import './chunk-UQ2NTFQC.js';
5
+ import './chunk-QOS6UAQ4.js';
6
+ //# sourceMappingURL=ScheduleEditor-AWG3QNDS.js.map
7
+ //# sourceMappingURL=ScheduleEditor-AWG3QNDS.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":[],"names":[],"mappings":"","file":"ScheduleEditor-YE42HL7P.js"}
1
+ {"version":3,"sources":[],"names":[],"mappings":"","file":"ScheduleEditor-AWG3QNDS.js"}
@@ -0,0 +1,9 @@
1
+ export { SubscriptionPage } from './chunk-WML2RLDF.js';
2
+ import './chunk-YUHCC7JY.js';
3
+ import './chunk-IUCDHAAB.js';
4
+ import './chunk-VX3WJLKK.js';
5
+ import './chunk-IDOTNT43.js';
6
+ import './chunk-UQ2NTFQC.js';
7
+ import './chunk-QOS6UAQ4.js';
8
+ //# sourceMappingURL=SubscriptionPage-WQBBD35Q.js.map
9
+ //# sourceMappingURL=SubscriptionPage-WQBBD35Q.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":[],"names":[],"mappings":"","file":"SubscriptionPage-TVAEOFNC.js"}
1
+ {"version":3,"sources":[],"names":[],"mappings":"","file":"SubscriptionPage-WQBBD35Q.js"}
@@ -100,6 +100,20 @@ export interface AdminShellProps {
100
100
  * switch in the user menu; omitted means "whatever the shell ships". */
101
101
  locales?: string[];
102
102
  }
103
+ /**
104
+ * Exportado porque o PDV monta a MESMA peça.
105
+ *
106
+ * O balcão abre por cima da retaguarda, e a cabeça da trilha tem de ser a
107
+ * mesma coisa no mesmo lugar: a conta em cima, a unidade dentro dela, e a
108
+ * chave Retaguarda ⇄ PDV logo abaixo. Recriar um seletor parecido do outro
109
+ * lado é como as duas telas passam a divergir um pixel por vez — e a chave
110
+ * deixa de parecer uma chave quando o que está à volta dela se move.
111
+ */
112
+ export declare function WorkspaceSwitcher({ variant, collapsed, canCreate, }: {
113
+ variant?: 'sidebar' | 'topbar';
114
+ collapsed?: boolean;
115
+ canCreate?: boolean;
116
+ }): React.JSX.Element | null;
103
117
  export declare function AdminShell(props: AdminShellProps): React.JSX.Element;
104
118
  export declare namespace AdminShell {
105
119
  var displayName: string;
@@ -1 +1 @@
1
- {"version":3,"file":"AdminShell.d.ts","sourceRoot":"","sources":["../../src/app/AdminShell.tsx"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"AdminShell.d.ts","sourceRoot":"","sources":["../../src/app/AdminShell.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAC9B,OAAO,EAIL,KAAK,aAAa,EAClB,KAAK,mBAAmB,EACxB,KAAK,WAAW,EAGhB,KAAK,gBAAgB,EAkBtB,MAAM,aAAa,CAAA;AAQpB,OAAO,EAAmD,KAAK,eAAe,EAAE,MAAM,sBAAsB,CAAA;AAc5G,OAAO,KAAK,EAAE,UAAU,EAAE,aAAa,EAAE,gBAAgB,EAAE,MAAM,UAAU,CAAA;AAE3E,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,eAAe,CAAA;AAajD,OAAO,EAA8C,KAAK,SAAS,EAAE,MAAM,eAAe,CAAA;AA8C1F,MAAM,WAAW,eAAe;IAC9B,OAAO,EAAE,MAAM,CAAA;IACf,8EAA8E;IAC9E,eAAe,CAAC,EAAE,OAAO,CAAA;IACzB,MAAM,CAAC,EAAE,SAAS,GAAG,QAAQ,GAAG,SAAS,CAAA;IACzC,IAAI,CAAC,EAAE,KAAK,CAAC,SAAS,CAAA;IACtB;;;;;;OAMG;IACH,QAAQ,CAAC,EAAE,KAAK,CAAC,SAAS,CAAA;IAC1B,KAAK,CAAC,EAAE,UAAU,EAAE,CAAA;IACpB,WAAW,CAAC,EAAE,OAAO,CAAA;IACrB,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,gBAAgB,CAAC,EAAE,MAAM,CAAA;IACzB,SAAS,CAAC,EAAE,KAAK,CAAC,SAAS,CAAA;IAC3B,WAAW,CAAC,EAAE,OAAO,GAAG,UAAU,CAAA;IAClC,gBAAgB,CAAC,EAAE,eAAe,EAAE,CAAA;IACpC,qBAAqB,CAAC,EAAE,MAAM,CAAA;IAC9B;+EAC2E;IAC3E,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,oDAAoD;IACpD,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,SAAS,CAAC,EAAE,OAAO,CAAA;IACnB,cAAc,CAAC,EAAE,OAAO,CAAC,YAAY,EAAE,OAAO,CAAC,EAAE,CAAA;IACjD,6EAA6E;IAC7E,eAAe,CAAC,EAAE,OAAO,CAAC,YAAY,EAAE,OAAO,CAAC,EAAE,CAAA;IAClD,YAAY,CAAC,EAAE,OAAO,CAAA;IACtB,eAAe,CAAC,EAAE,OAAO,CAAA;IACzB;;mEAE+D;IAC/D,eAAe,CAAC,EAAE,OAAO,CAAA;IACzB,kFAAkF;IAClF,KAAK,CAAC,EAAE,SAAS,CAAA;IACjB,oFAAoF;IACpF,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,aAAa,CAAC,EAAE,MAAM,CAAA;IACtB,aAAa,CAAC,EAAE,MAAM,CAAA;IACtB,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,6DAA6D;IAC7D,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,WAAW,CAAC,CAAA;IACxC;4EACwE;IACxE,YAAY,CAAC,EAAE,OAAO,CAAA;IACtB;;qFAEiF;IACjF,kBAAkB,CAAC,EAAE,MAAM,EAAE,CAAA;IAC7B;;;;;;;;;;;;OAYG;IACH,cAAc,CAAC,EAAE,gBAAgB,EAAE,CAAA;IACnC;+CAC2C;IAC3C,YAAY,CAAC,EAAE,OAAO,CAAA;IACtB;oDACgD;IAChD,SAAS,CAAC,EAAE,gBAAgB,CAAA;IAC5B,kEAAkE;IAClE,SAAS,CAAC,EAAE,aAAa,EAAE,CAAA;IAC3B,6EAA6E;IAC7E,iBAAiB,CAAC,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,IAAI,CAAA;IACxC,0EAA0E;IAC1E,YAAY,CAAC,EAAE,mBAAmB,CAAA;IAClC;kFAC8E;IAC9E,WAAW,CAAC,EAAE,KAAK,CAAC,aAAa,EAAE,CAAA;IACnC;0DACsD;IACtD,aAAa,CAAC,EAAE,KAAK,CAAC,SAAS,CAAA;IAC/B;sEACkE;IAClE,iBAAiB,CAAC,EAAE,OAAO,CAAA;IAC3B;2EACuE;IACvE,IAAI,CAAC,EAAE,aAAa,GAAG,KAAK,CAAA;IAC5B;6EACyE;IACzE,OAAO,CAAC,EAAE,MAAM,EAAE,CAAA;CACnB;AAkBD;;;;;;;;GAQG;AACH,wBAAgB,iBAAiB,CAAC,EAChC,OAAmB,EACnB,SAAiB,EACjB,SAAgB,GACjB,EAAE;IAAE,OAAO,CAAC,EAAE,SAAS,GAAG,QAAQ,CAAC;IAAC,SAAS,CAAC,EAAE,OAAO,CAAC;IAAC,SAAS,CAAC,EAAE,OAAO,CAAA;CAAE,4BA0L9E;AA+3DD,wBAAgB,UAAU,CAAC,KAAK,EAAE,eAAe,qBAuHhD;yBAvHe,UAAU"}
@@ -1 +1 @@
1
- {"version":3,"file":"admin-app.d.ts","sourceRoot":"","sources":["../../src/app/admin-app.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAa9B,OAAO,EAGL,KAAK,UAAU,EAGf,KAAK,eAAe,EACrB,MAAM,sBAAsB,CAAA;AA2C7B,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,UAAU,CAAA;AAiD7C,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,aAAa,CAAC,MAAM,CAAC,GAAG;IAC9D,WAAW,CAAC,EAAE,OAAO,CAAA;IACrB,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,gBAAgB,CAAC,EAAE,MAAM,CAAA;IACzB,SAAS,CAAC,EAAE,KAAK,CAAC,SAAS,CAAA;IAC3B,WAAW,CAAC,EAAE,UAAU,CAAA;IACxB,gBAAgB,CAAC,EAAE,eAAe,EAAE,CAAA;IACpC,qBAAqB,CAAC,EAAE,MAAM,CAAA;IAC9B,SAAS,CAAC,EAAE,OAAO,CAAA;IACnB,cAAc,CAAC,EAAE,OAAO,CAAC,OAAO,eAAe,EAAE,YAAY,EAAE,OAAO,CAAC,EAAE,CAAA;IACzE,eAAe,CAAC,EAAE,OAAO,CAAC,OAAO,eAAe,EAAE,YAAY,EAAE,OAAO,CAAC,EAAE,CAAA;CAC3E,CA4BA;AA+bD,wBAAgB,cAAc,CAAC,EAAE,MAAM,EAAE,QAAQ,EAAE,EAAE;IAAE,MAAM,EAAE,aAAa,CAAC;IAAC,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAA;CAAE,qBAkLxG;yBAlLe,cAAc;;;AA6M9B,wBAAgB,aAAa,CAAC,MAAM,EAAE,aAAa,GAAG,KAAK,CAAC,aAAa,CAWxE"}
1
+ {"version":3,"file":"admin-app.d.ts","sourceRoot":"","sources":["../../src/app/admin-app.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAa9B,OAAO,EAGL,KAAK,UAAU,EAGf,KAAK,eAAe,EACrB,MAAM,sBAAsB,CAAA;AA4C7B,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,UAAU,CAAA;AAiD7C,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,aAAa,CAAC,MAAM,CAAC,GAAG;IAC9D,WAAW,CAAC,EAAE,OAAO,CAAA;IACrB,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,gBAAgB,CAAC,EAAE,MAAM,CAAA;IACzB,SAAS,CAAC,EAAE,KAAK,CAAC,SAAS,CAAA;IAC3B,WAAW,CAAC,EAAE,UAAU,CAAA;IACxB,gBAAgB,CAAC,EAAE,eAAe,EAAE,CAAA;IACpC,qBAAqB,CAAC,EAAE,MAAM,CAAA;IAC9B,SAAS,CAAC,EAAE,OAAO,CAAA;IACnB,cAAc,CAAC,EAAE,OAAO,CAAC,OAAO,eAAe,EAAE,YAAY,EAAE,OAAO,CAAC,EAAE,CAAA;IACzE,eAAe,CAAC,EAAE,OAAO,CAAC,OAAO,eAAe,EAAE,YAAY,EAAE,OAAO,CAAC,EAAE,CAAA;CAC3E,CA4BA;AA0eD,wBAAgB,cAAc,CAAC,EAAE,MAAM,EAAE,QAAQ,EAAE,EAAE;IAAE,MAAM,EAAE,aAAa,CAAC;IAAC,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAA;CAAE,qBAgMxG;yBAhMe,cAAc;;;AA2N9B,wBAAgB,aAAa,CAAC,MAAM,EAAE,aAAa,GAAG,KAAK,CAAC,aAAa,CAWxE"}
@@ -1 +1 @@
1
- {"version":3,"file":"rail-preset.d.ts","sourceRoot":"","sources":["../../src/app/rail-preset.ts"],"names":[],"mappings":"AAAA,OAAO,EAAiB,KAAK,cAAc,EAAE,MAAM,aAAa,CAAA;AAmChE,MAAM,WAAW,SAAS;IACxB,KAAK,EAAE,MAAM,CAAA;IACb,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,+CAA+C;IAC/C,KAAK,EAAE,MAAM,EAAE,CAAA;CAChB;AAED;;;;;;;;;;;GAWG;AACH,MAAM,WAAW,UAAU;IACzB,IAAI,CAAC,EAAE,SAAS,EAAE,CAAA;IAClB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAA;IACf,sCAAsC;IACtC,KAAK,CAAC,EAAE,MAAM,EAAE,CAAA;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;CAChC;AAED,MAAM,MAAM,SAAS,GAAG,MAAM,GAAG,SAAS,CAAA;AAE1C,MAAM,WAAW,OAAQ,SAAQ,IAAI,CAAC,cAAc,EAAE,UAAU,CAAC;IAC/D,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,QAAQ,CAAC,EAAE,OAAO,EAAE,CAAA;CACrB;AAKD,+EAA+E;AAC/E,wBAAgB,aAAa,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAEpE;AAED;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,eAAe,CAC7B,IAAI,EAAE,OAAO,EAAE,EACf,IAAI,EAAE,SAAS,EAAE,GAAG,SAAS,EAC7B,IAAI,CAAC,EAAE,MAAM,EAAE,EACf,KAAK,CAAC,EAAE,MAAM,EAAE,GACf,OAAO,EAAE,CA2GX;AAED;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,wBAAgB,QAAQ,CAAC,CAAC,SAAS,MAAM,GAAG,SAAS,EACnD,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,SAAS,EAC1C,KAAK,EAAE,MAAM,EACb,QAAQ,EAAE,CAAC,GACV,MAAM,GAAG,CAAC,CAEZ"}
1
+ {"version":3,"file":"rail-preset.d.ts","sourceRoot":"","sources":["../../src/app/rail-preset.ts"],"names":[],"mappings":"AAAA,OAAO,EAAiB,KAAK,cAAc,EAAE,MAAM,aAAa,CAAA;AAmChE,MAAM,WAAW,SAAS;IACxB,KAAK,EAAE,MAAM,CAAA;IACb,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,+CAA+C;IAC/C,KAAK,EAAE,MAAM,EAAE,CAAA;CAChB;AAED;;;;;;;;;;;GAWG;AACH,MAAM,WAAW,UAAU;IACzB,IAAI,CAAC,EAAE,SAAS,EAAE,CAAA;IAClB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAA;IACf,sCAAsC;IACtC,KAAK,CAAC,EAAE,MAAM,EAAE,CAAA;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;CAChC;AAED,MAAM,MAAM,SAAS,GAAG,MAAM,GAAG,SAAS,CAAA;AAE1C,MAAM,WAAW,OAAQ,SAAQ,IAAI,CAAC,cAAc,EAAE,UAAU,CAAC;IAC/D,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,QAAQ,CAAC,EAAE,OAAO,EAAE,CAAA;CACrB;AAKD,+EAA+E;AAC/E,wBAAgB,aAAa,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAEpE;AAED;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,eAAe,CAC7B,IAAI,EAAE,OAAO,EAAE,EACf,IAAI,EAAE,SAAS,EAAE,GAAG,SAAS,EAC7B,IAAI,CAAC,EAAE,MAAM,EAAE,EACf,KAAK,CAAC,EAAE,MAAM,EAAE,GACf,OAAO,EAAE,CAoIX;AAED;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,wBAAgB,QAAQ,CAAC,CAAC,SAAS,MAAM,GAAG,SAAS,EACnD,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,SAAS,EAC1C,KAAK,EAAE,MAAM,EACb,QAAQ,EAAE,CAAC,GACV,MAAM,GAAG,CAAC,CAEZ"}
@@ -1 +1 @@
1
- {"version":3,"file":"scaffold.d.ts","sourceRoot":"","sources":["../../src/app/scaffold.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAQ9B,OAAO,KAAK,EACV,WAAW,EAKZ,MAAM,eAAe,CAAA;AAQtB,OAAO,KAAK,EAAE,aAAa,EAAc,MAAM,UAAU,CAAA;AA2BzD;;;iFAGiF;AACjF,wBAAgB,UAAU,CAAC,MAAM,EAAE,aAAa,GAAG,WAAW,CAmC7D;AA6DD,wBAAgB,aAAa,CAAC,EAAE,QAAQ,EAAE,OAAO,EAAE,EAAE;IAAE,QAAQ,EAAE,WAAW,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,qBAW9F;yBAXe,aAAa;;;AA2E7B,wBAAgB,qBAAqB,IAAI,IAAI,CAI5C"}
1
+ {"version":3,"file":"scaffold.d.ts","sourceRoot":"","sources":["../../src/app/scaffold.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAQ9B,OAAO,KAAK,EACV,WAAW,EAKZ,MAAM,eAAe,CAAA;AAQtB,OAAO,KAAK,EAAE,aAAa,EAAc,MAAM,UAAU,CAAA;AA2BzD;;;iFAGiF;AACjF,wBAAgB,UAAU,CAAC,MAAM,EAAE,aAAa,GAAG,WAAW,CAmC7D;AA6DD,wBAAgB,aAAa,CAAC,EAAE,QAAQ,EAAE,OAAO,EAAE,EAAE;IAAE,QAAQ,EAAE,WAAW,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,qBAW9F;yBAXe,aAAa;;;AAoF7B,wBAAgB,qBAAqB,IAAI,IAAI,CAI5C"}
@@ -105,4 +105,17 @@ export declare function useTenantLedIdentity(hasTenantBrand: boolean): boolean;
105
105
  * sempre foi.
106
106
  */
107
107
  export declare function usePresetLabel(route: string | undefined, fallback: string): string;
108
+ /**
109
+ * A COR do aplicativo que esta conta roda (138).
110
+ *
111
+ * Irmã de `useAppPreset`, e deliberadamente com a mesma escolha: o PRIMEIRO
112
+ * aplicativo da lista — `app_config()` já os ordena por ofício. O rail e a cara
113
+ * têm de vir do mesmo produto, senão a casa abre com o menu do ChefControl e a
114
+ * cor do FullControl, que é um sistema que ninguém desenhou.
115
+ *
116
+ * Nulo quando o aplicativo não reivindica tema (o `control-admin`, um pool que
117
+ * ainda não rodou a 138). Aí vale o tema compilado no bundle, que é como era
118
+ * antes desta migração — e é a leitura certa para uma ferramenta interna.
119
+ */
120
+ export declare function useAppTheme(): unknown | null;
108
121
  //# sourceMappingURL=useAppPreset.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"useAppPreset.d.ts","sourceRoot":"","sources":["../../src/app/useAppPreset.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,UAAU,CAAA;AAE7C;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,MAAM,WAAW,SAAS;IACxB,KAAK,CAAC,EAAE;QACN,MAAM,CAAC,EAAE,aAAa,CAAC,QAAQ,CAAC,CAAA;QAChC,SAAS,CAAC,EAAE,aAAa,CAAC,WAAW,CAAC,CAAA;QACtC,YAAY,CAAC,EAAE,OAAO,CAAA;QACtB,iBAAiB,CAAC,EAAE,OAAO,CAAA;KAC5B,CAAA;IACD;;;;;;OAMG;IACH,IAAI,CAAC,EAAE,KAAK,CAAC,MAAM,GAAG;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,EAAE,CAAA;KAAE,CAAC,CAAA;IACxE;;;OAGG;IACH,IAAI,CAAC,EAAE,MAAM,EAAE,CAAA;IACf;;;;OAIG;IACH,KAAK,CAAC,EAAE,MAAM,EAAE,CAAA;IAChB;;;;;;OAMG;IACH,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IAC/B,gEAAgE;IAChE,OAAO,CAAC,EAAE,MAAM,EAAE,CAAA;CACnB;AAED,wBAAgB,YAAY,IAAI,SAAS,CAMxC;AAED;;;;;;;;;GASG;AACH,wBAAgB,iBAAiB,IAAI,MAAM,EAAE,CAU5C;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,oBAAoB,CAAC,cAAc,EAAE,OAAO,GAAG,OAAO,CAErE;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,CAGlF"}
1
+ {"version":3,"file":"useAppPreset.d.ts","sourceRoot":"","sources":["../../src/app/useAppPreset.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,UAAU,CAAA;AAE7C;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,MAAM,WAAW,SAAS;IACxB,KAAK,CAAC,EAAE;QACN,MAAM,CAAC,EAAE,aAAa,CAAC,QAAQ,CAAC,CAAA;QAChC,SAAS,CAAC,EAAE,aAAa,CAAC,WAAW,CAAC,CAAA;QACtC,YAAY,CAAC,EAAE,OAAO,CAAA;QACtB,iBAAiB,CAAC,EAAE,OAAO,CAAA;KAC5B,CAAA;IACD;;;;;;OAMG;IACH,IAAI,CAAC,EAAE,KAAK,CAAC,MAAM,GAAG;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,EAAE,CAAA;KAAE,CAAC,CAAA;IACxE;;;OAGG;IACH,IAAI,CAAC,EAAE,MAAM,EAAE,CAAA;IACf;;;;OAIG;IACH,KAAK,CAAC,EAAE,MAAM,EAAE,CAAA;IAChB;;;;;;OAMG;IACH,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IAC/B,gEAAgE;IAChE,OAAO,CAAC,EAAE,MAAM,EAAE,CAAA;CACnB;AAED,wBAAgB,YAAY,IAAI,SAAS,CAMxC;AAED;;;;;;;;;GASG;AACH,wBAAgB,iBAAiB,IAAI,MAAM,EAAE,CAU5C;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,oBAAoB,CAAC,cAAc,EAAE,OAAO,GAAG,OAAO,CAErE;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,CAGlF;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,WAAW,IAAI,OAAO,GAAG,IAAI,CAM5C"}
@@ -1,5 +1,5 @@
1
- export { NO_TRIAL, TrialWidget, effectivePlan, paidPlanIds, resolvePlanBadge, resolveTrial, useBillingStore, useTrial } from '../chunk-ZOUIXHKI.js';
1
+ export { NO_TRIAL, TrialWidget, effectivePlan, paidPlanIds, resolvePlanBadge, resolveTrial, useBillingStore, useTrial } from '../chunk-IUCDHAAB.js';
2
2
  import '../chunk-VX3WJLKK.js';
3
- import '../chunk-W5IBKM3K.js';
3
+ import '../chunk-QOS6UAQ4.js';
4
4
  //# sourceMappingURL=index.js.map
5
5
  //# sourceMappingURL=index.js.map
@@ -1,5 +1,5 @@
1
- import { markWorkspaceSwitch, clearOrgSnapshot, useTenant, useTenantOptional, setAutoPick } from './chunk-KSUIF56I.js';
2
- import { persistOrgId, cn, getPersistedOrgId } from './chunk-W5IBKM3K.js';
1
+ import { markWorkspaceSwitch, clearOrgSnapshot, useTenant, useTenantOptional, setAutoPick } from './chunk-IDOTNT43.js';
2
+ import { persistOrgId, cn, getPersistedOrgId } from './chunk-QOS6UAQ4.js';
3
3
  import { createClient } from '@supabase/supabase-js';
4
4
  import { EMPTY_APP_CONFIG, getActiveUnitId, getActiveTenantId, setGlobalSupabaseClient, useTranslation, getSupabaseClientOptional as getSupabaseClientOptional$1 } from '@fayz-ai/core';
5
5
  import { createDedupedFetch } from '@fayz-ai/sdk';
@@ -267,6 +267,10 @@ var SYSTEM_PERMISSION_MAP = {
267
267
  "settings.update": "manage_settings"
268
268
  };
269
269
  var ALL_SYSTEM_PERMISSIONS = ["manage_team", "manage_billing", "manage_settings", "manage_permissions"];
270
+ var FEATURE_ALIASES = {
271
+ people: ["registry.customers"],
272
+ catalog: ["services"]
273
+ };
270
274
  function buildPermissionProfiles(roles, permissions, rolePerms, overrides) {
271
275
  const overrideMap = /* @__PURE__ */ new Map();
272
276
  for (const o of overrides) {
@@ -313,9 +317,11 @@ function buildPermissionProfiles(roles, permissions, rolePerms, overrides) {
313
317
  const action = permId.slice(dotIdx + 1);
314
318
  const mappedAction = actionMap[action];
315
319
  if (!mappedAction) continue;
316
- if (!features[category]) features[category] = [];
317
- if (!features[category].includes(mappedAction)) {
318
- features[category].push(mappedAction);
320
+ for (const feature of [category, ...FEATURE_ALIASES[category] ?? []]) {
321
+ if (!features[feature]) features[feature] = [];
322
+ if (!features[feature].includes(mappedAction)) {
323
+ features[feature].push(mappedAction);
324
+ }
319
325
  }
320
326
  }
321
327
  const systemPermissions = [];
@@ -1342,5 +1348,5 @@ function WorkspaceSwitchingHost() {
1342
1348
  }
1343
1349
 
1344
1350
  export { OrgMark, WorkspaceChooser, WorkspaceChooserGate, WorkspaceSwitching, WorkspaceSwitchingHost, activePluginIds, createFayzSupabaseClient, createMockOrgAdapter, createSupabaseOrgAdapter, getFayzSupabaseClient, getFayzSupabaseClientOptional, getSupabaseClientOptional, hasPlugin, orgInitials, resolveAppId, searchWorkspaces, useAppConfigStore, useWorkspaceSwitchingStore };
1345
- //# sourceMappingURL=chunk-ZUM3Y7VB.js.map
1346
- //# sourceMappingURL=chunk-ZUM3Y7VB.js.map
1351
+ //# sourceMappingURL=chunk-4YF6R7T3.js.map
1352
+ //# sourceMappingURL=chunk-4YF6R7T3.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/data/client.ts","../src/org/team-rows.ts","../src/directory/app-id.ts","../src/org/adapters/supabase.ts","../src/org/adapters/mock.ts","../src/stores/app-config.store.ts","../src/org/OrgMark.tsx","../src/org/workspace-search.ts","../src/org/WorkspaceChooser.tsx","../src/lib/supabase.ts","../src/app/useDomainTenant.ts","../src/org/WorkspaceChooserGate.tsx","../src/org/switching.store.ts","../src/org/WorkspaceSwitching.tsx","../src/org/WorkspaceSwitchingHost.tsx"],"names":["capitalize","slugify","React","jsx","jsxs","cn","_getOpt","useState","React3","create","useTranslation","React4","Check"],"mappings":"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","file":"chunk-4YF6R7T3.js","sourcesContent":["import { createClient, type SupabaseClient } from '@supabase/supabase-js'\nimport { setGlobalSupabaseClient, getActiveUnitId, getActiveTenantId } from '@fayz-ai/core'\nimport { createDedupedFetch } from '@fayz-ai/sdk'\n\nlet _client: SupabaseClient | null = null\n\n/**\n * Para onde a requisição vai, nos três formatos que `fetch` aceita.\n *\n * `input` pode ser uma string, uma URL ou um Request — e ler `.url` de uma\n * string devolve `undefined` em silêncio, que é como um filtro destes deixa\n * passar exatamente o que devia barrar.\n */\nexport function requestUrl(input: RequestInfo | URL): string {\n if (typeof input === 'string') return input\n if (input instanceof URL) return input.toString()\n return input?.url ?? ''\n}\n\n/** O caminho que o Supabase dá a toda função de borda. Exportada para o teste. */\nexport function isEdgeFunctionCall(input: RequestInfo | URL): boolean {\n return requestUrl(input).includes('/functions/v1/')\n}\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/admin] Supabase URL and anon key are required. ' +\n 'Pass supabaseUrl and supabaseAnonKey to createFayzApp.',\n )\n }\n\n // Every read goes through this client — the one place that can see two\n // components asking the same thing at the same instant.\n const deduped = createDedupedFetch()\n\n _client = createClient(url, anonKey, {\n auth: { autoRefreshToken: true, persistSession: true },\n global: {\n // The active unit rides on every request so the DATABASE can stamp a\n // write with it (041's trigger reads this header). Reads are narrowed by\n // an explicit filter, not by this — a header cannot be trusted to narrow,\n // and it must never be able to widen: the policies resolve unit access\n // through `public.user_unit_ids()`, never through what was sent here.\n //\n // `x-fayz-unit` is in the dedupe vary list. Without that, two identical\n // URLs under different units collapse into one response.\n fetch: (input: RequestInfo | URL, init: RequestInit = {}) => {\n // Estes cabeçalhos são para o BANCO, e só para ele. Uma função de borda\n // recebe o tenant no corpo (`tenantId`) e nunca leu nenhum dos dois — o\n // que ela faz com um cabeçalho desconhecido é RECUSAR O PREFLIGHT, e o\n // navegador então bloqueia o POST antes de ele sair. Nenhuma requisição\n // chega ao log, e quem está usando vê a palavra \"CORS\".\n //\n // As vinte funções deste repositório declaram listas fixas de\n // `Access-Control-Allow-Headers` e nenhuma delas cita `x-fayz-tenant`.\n // Mandar o cabeçalho para lá não compra nada e derruba todas de uma vez.\n if (isEdgeFunctionCall(input)) return deduped(input, init)\n\n const unit = getActiveUnitId()\n // `x-fayz-tenant` rides the same way, for the reason 145 spells out:\n // the archetype policies resolve tenant through app.current_tenant_id(),\n // which knew only the signed JWT claim (nobody mints one) or \"your only\n // account\". A user with two accounts therefore read NOTHING from\n // public.people / orders / products — silently, and long before any\n // screen moved. This is the app finally saying which account it is in.\n //\n // Same rule as the unit header, and 145 enforces it: the value only\n // CHOOSES among the accounts the user already belongs to, validated\n // against app.memberships. It narrows; it can never widen.\n const tenant = getActiveTenantId()\n if (!unit && !tenant) return deduped(input, init)\n const headers = new Headers(init.headers)\n if (unit) headers.set('x-fayz-unit', unit)\n if (tenant) headers.set('x-fayz-tenant', tenant)\n return deduped(input, { ...init, headers })\n },\n },\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/admin] 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 { TeamPerson } from '@fayz-ai/core'\n\n/** A `people` row as the team query selects it. */\nexport interface TeamPeopleRow {\n id: string\n name?: string | null\n kind?: string | null\n email?: string | null\n avatar_url?: string | null\n is_active?: boolean | null\n}\n\n/** A `tenant_members` row as the team query selects it. */\nexport interface TeamMemberRow {\n id: string\n user_id: string\n role?: string | null\n person_id?: string | null\n created_at?: string | null\n}\n\n/** A `profiles` row for a member's login. */\nexport interface TeamProfileRow {\n id: string\n full_name?: string | null\n email?: string | null\n avatar_url?: string | null\n}\n\n/** The signed-in user, used to name their own row when `profiles` has no row for them. */\nexport interface TeamCurrentUser {\n id: string\n email?: string | null\n fullName?: string | null\n}\n\nconst capitalize = (s: string) => (s ? s.charAt(0).toUpperCase() + s.slice(1) : s)\n\n/**\n * Fallback display name for a login with no person record. `profiles` is not\n * guaranteed to have a row (accounts created before the trigger, seeded demos),\n * and its RLS only ever exposes your own — so the session is the last resort for\n * your own row, and the email handle the one after that.\n */\nfunction loginName(profile: TeamProfileRow | undefined, session: TeamCurrentUser | undefined): string {\n const candidates = [profile?.full_name, session?.fullName, profile?.email, session?.email]\n for (const candidate of candidates) {\n const value = candidate?.trim()\n if (value) return value.includes('@') ? value.split('@')[0] : value\n }\n return ''\n}\n\n/**\n * Merges the two halves of the team into one list.\n *\n * People of the configured kinds are the roster; `tenant_members` is the access\n * overlay linked by `person_id`. But a login is not required to have a person\n * record — the owner who created the workspace never gets one — and dropping\n * those rows left the Team screen empty for every account that had not staffed\n * itself as a person. So memberships that match no listed person come back as\n * rows of their own, named from their login profile and carrying no `personId`.\n * Logins come first: whoever holds access is the answer to \"who is my team?\"\n * before the roster of people who may never sign in.\n */\nexport function buildTeamRows(\n people: TeamPeopleRow[],\n members: TeamMemberRow[],\n profiles: TeamProfileRow[],\n currentUser?: TeamCurrentUser | null,\n): TeamPerson[] {\n const personIds = new Set(people.map((p) => p.id))\n const byPerson = new Map<string, TeamMemberRow>()\n const unlinked: TeamMemberRow[] = []\n\n for (const m of members) {\n if (m.person_id && personIds.has(m.person_id)) byPerson.set(m.person_id, m)\n else unlinked.push(m)\n }\n\n const profileById = new Map(profiles.map((p) => [p.id, p]))\n\n const toMembership = (m: TeamMemberRow) => ({\n memberId: m.id,\n userId: m.user_id,\n profileId: (m.role as string) ?? '',\n profileName: capitalize((m.role as string) ?? ''),\n joinedAt: m.created_at ?? undefined,\n })\n\n const loginRows: TeamPerson[] = unlinked.map((m) => {\n const profile = profileById.get(m.user_id)\n const session = currentUser && currentUser.id === m.user_id ? currentUser : undefined\n return {\n name: loginName(profile, session),\n email: profile?.email ?? session?.email ?? undefined,\n avatarUrl: profile?.avatar_url ?? undefined,\n isActive: true,\n membership: toMembership(m),\n }\n })\n\n const personRows: TeamPerson[] = people.map((p) => {\n const m = byPerson.get(p.id)\n return {\n personId: p.id,\n name: p.name ?? '',\n kind: p.kind ?? undefined,\n email: p.email ?? undefined,\n avatarUrl: p.avatar_url ?? undefined,\n isActive: p.is_active ?? true,\n membership: m ? toMembership(m) : undefined,\n }\n })\n\n return [...loginRows, ...personRows]\n}\n","/**\n * Which application THIS bundle is.\n *\n * The switcher needs it for one thing only: to know which tile is the one you\n * are already looking at. Everything else about an app — its name, icon, colour\n * and URL — comes from the `app.apps` registry, so a rename is a row and not a\n * release.\n *\n * Until now the only identity an app carried was `VITE_FAYZ_PROJECT_ID`, a\n * platform project uuid. That is a poor answer to \"which product is this\": the\n * ids for the shop already disagree between the app's own `.env` and the\n * platform's seed script, and nothing would have caught it, because a uuid does\n * not look wrong. `VITE_APP_ID` is the registry key instead — it matches\n * `app.apps.id`, and a typo shows up as \"nothing is highlighted\" on the first\n * run rather than as a wrong tile months later.\n *\n * Unset is a legitimate answer: the switcher lists every app the account runs\n * and highlights none, which is right for a bundle nobody has claimed yet.\n */\nexport function resolveAppId(): string | null {\n const env = (import.meta as unknown as { env?: Record<string, string | undefined> }).env\n const id = env?.VITE_APP_ID ?? env?.PUBLIC_APP_ID\n const trimmed = id?.trim()\n return trimmed ? trimmed : null\n}\n","import type {\n OrgAdapter,\n Organization,\n OrgMember,\n OrgMembership,\n TeamPerson,\n CreateOrgOptions,\n Location,\n Invite,\n} from '@fayz-ai/core'\nimport type { PermissionProfile, SystemPermission, AuthAdapter } from '@fayz-ai/core'\nimport { getFayzSupabaseClient } from '../../data/client'\nimport { buildTeamRows } from '../team-rows'\nimport { resolveAppId } from '../../directory/app-id'\nimport type { TeamMemberRow, TeamPeopleRow, TeamProfileRow } from '../team-rows'\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 trialEndsAt: (row['trial_ends_at'] 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\n/**\n * Como um login ganha nome.\n *\n * Era só `public.profiles` — e num pool onde essa tabela está VAZIA (nenhum\n * gatilho a preencheu) a tela de Equipe inteira aparecia sem nome nenhum: seis\n * linhas com \"?\" no avatar e a coluna do membro em branco. Quem é a pessoa por\n * trás de um acesso é a pergunta que essa tela existe para responder.\n *\n * A ficha ligada à associação (`person_id`, sempre preenchida desde a #120)\n * responde melhor e é dado da própria conta: nome e e-mail que a equipe\n * mantém, não uma cópia do provedor de identidade. `profiles` fica como\n * complemento — é de lá que vem o avatar.\n */\nasync function namesForLogins(\n rows: Array<Record<string, unknown>>,\n db: { from: (table: string) => any },\n): Promise<Map<string, Record<string, unknown>>> {\n const out = new Map<string, Record<string, unknown>>()\n if (rows.length === 0) return out\n\n const userIds = rows.map((r) => r['user_id'] as string).filter(Boolean)\n const personIds = rows.map((r) => r['person_id'] as string | null).filter(Boolean) as string[]\n\n const [profilesResult, peopleResult] = await Promise.all([\n userIds.length ? db.from('profiles').select('id, full_name, avatar_url, email').in('id', userIds) : Promise.resolve({ data: [] }),\n personIds.length ? db.from('people').select('id, name, email, avatar_url, kind').in('id', personIds) : Promise.resolve({ data: [] }),\n ])\n\n const byProfile = new Map(\n ((profilesResult?.data ?? []) as Array<Record<string, unknown>>).map((p) => [p['id'] as string, p]),\n )\n const byPerson = new Map(\n ((peopleResult?.data ?? []) as Array<Record<string, unknown>>).map((p) => [p['id'] as string, p]),\n )\n\n for (const row of rows) {\n const userId = row['user_id'] as string\n const profile = byProfile.get(userId)\n const person = byPerson.get(row['person_id'] as string)\n out.set(userId, {\n id: userId,\n full_name: person?.['name'] ?? profile?.['full_name'] ?? '',\n email: person?.['email'] ?? profile?.['email'] ?? '',\n avatar_url: profile?.['avatar_url'] ?? person?.['avatar_url'] ?? null,\n // Viaja junto para a tela poder RESOLVER a rota da ficha: o registro de\n // rotas é indexado por `arquétipo:kind`, e sem o kind o \"abrir a ficha\"\n // não sabe para onde ir.\n kind: person?.['kind'] ?? null,\n })\n }\n return out\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 personId: (row['person_id'] as string | null) ?? undefined,\n personKind: (profile['kind'] as string | null) ?? undefined,\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 app.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// The database names shared business domains; older UI surfaces still use\n// product-facing feature ids. Keep both until every plugin speaks the canonical\n// vocabulary so a valid database grant cannot hide an otherwise available page.\nconst FEATURE_ALIASES: Record<string, string[]> = {\n people: ['registry.customers'],\n catalog: ['services'],\n}\n\n// Map DB permission ids to feature action grants\nexport function 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 //\n // `manage` IS KEPT, not folded into `edit`. profileHasPermission answers\n // `actions.includes(action) || actions.includes('manage')` — manage is the\n // wildcard that implies the rest. Collapsing it here destroyed that meaning\n // BEFORE the engine ever saw it: a role granted `financial.manage` stored\n // `['edit']`, which contains neither `read` nor `manage`, so the Financeiro\n // role could not open the Financeiro module — the nav gates on `read`. Same\n // for every other `X.manage` grant in the catalog.\n const actionMap: Record<string, string> = {\n read: 'read',\n create: 'create',\n update: 'edit',\n manage: 'manage',\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 // LAST dot, not the first: a feature id may contain dots (plugin-crm\n // declares `crm.leads`), an action never does. Splitting on the first one\n // read `crm.leads.read` as feature `crm` + action `leads.read`, which no\n // action map knows — so every dotted feature the matrix granted came back\n // empty on the next load, silently.\n const dotIdx = permId.lastIndexOf('.')\n if (dotIdx <= 0) 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 for (const feature of [category, ...(FEATURE_ALIASES[category] ?? [])]) {\n if (!features[feature]) features[feature] = []\n if (!features[feature].includes(mappedAction)) {\n features[feature].push(mappedAction)\n }\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 acceptPendingInvites(): Promise<number> {\n const { data, error } = await supabase().rpc('accept_pending_invitations')\n if (error) {\n // A pool still on the pre-022 spine has no such function. Not fatal —\n // the user just lands org-less, exactly as before this shipped.\n console.warn('[org] accept_pending_invitations failed:', error.message)\n return 0\n }\n return typeof data === 'number' ? data : 0\n },\n\n async listUserOrgs(userId: string): Promise<OrgMembership[]> {\n return dedup(`listUserOrgs:${userId}`, async () => {\n const { data, error } = await core()\n .from('v_team_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 let rows = (data ?? []) as Array<Record<string, unknown>>\n\n // Narrow to the accounts that run THIS app (008). A beauty account\n // listed inside the restaurant product is not a shortcut — it opens a\n // rail whose screens its data cannot fill. The app you are looking at\n // is the bundle's own fact (VITE_APP_ID); the database cannot infer it,\n // because one account may run several apps at once.\n //\n // Best-effort on purpose: no app id, no view (a pool predating 008), or\n // any error at all leaves the list exactly as it was. Hiding an account\n // because a filter failed is worse than showing one too many.\n const appId = resolveAppId()\n if (appId && rows.length > 1) {\n const { data: scoped, error: scopeError } = await core()\n .from('v_tenant_apps')\n .select('tenant_id')\n .eq('app_id', appId)\n if (!scopeError && Array.isArray(scoped)) {\n const runsThisApp = new Set(scoped.map((r) => (r as { tenant_id: string }).tenant_id))\n const kept = rows.filter((row) => runsThisApp.has(row['tenant_id'] as string))\n // An empty result would leave the person with no workspace at all\n // and no way to say so; the unfiltered list is the safer answer.\n if (kept.length > 0) rows = kept\n }\n }\n\n // Every field here is nullable in practice and none of them is worth\n // the whole list. A pool on the pre-014 spine answers this query with\n // `tenant` and `role` NULL — the workspace picker has to read across\n // accounts, and until 014 the policies on public.tenants and app.roles\n // were scoped to the account you had not chosen yet. `capitalize(null)`\n // threw, took listUserOrgs with it, and left a seven-workspace account\n // looking at \"you belong to none\". A missing name is a bad row; it is\n // not a reason to lose the six good ones next to it.\n return rows.map((row) => {\n const tenant = (row['tenant'] as Record<string, unknown> | null) ?? {}\n const role = (row['role'] as string | null) ?? ''\n return {\n orgId: row['tenant_id'] as string,\n orgName: (tenant['name'] as string) ?? '',\n orgSlug: (tenant['slug'] as string) ?? '',\n orgLogoUrl: (tenant['logo_url'] as string | null) ?? undefined,\n profileId: role,\n profileName: capitalize(role),\n }\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: options?.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('v_team_members')\n .select('*')\n .eq('tenant_id', orgId)\n\n if (error) throw error\n\n const rows = (data ?? []) as Array<Record<string, unknown>>\n const profileMap = await namesForLogins(rows, core())\n\n return rows.map((row) => {\n const profile = profileMap.get(row['user_id'] as string) ?? {}\n return mapMemberRow({ ...row, profile })\n })\n },\n\n // Person-first team list: people of `personKinds` are the roster and\n // `tenant_members` (login + role) is the overlay linked by person_id — plus\n // every membership that links to no listed person, so an account with access\n // is never missing from its own Team screen. See buildTeamRows.\n async listTeam(orgId: string, personKinds: string[]): Promise<TeamPerson[]> {\n if (!personKinds || personKinds.length === 0) return []\n\n const [peopleResult, membersResult] = await Promise.all([\n core()\n .from('people')\n .select('id, name, kind, email, avatar_url, is_active')\n .eq('tenant_id', orgId)\n .in('kind', personKinds)\n // Only people still on the roster. `not is false` rather than\n // `eq true` so a row that never set the flag stays visible — the\n // same `?? true` reading buildTeamRows applies. A deactivated\n // person who still holds a login does not vanish: their membership\n // stops matching a listed person and comes back as a login row,\n // which is the invariant that keeps access auditable.\n .not('is_active', 'is', false),\n core()\n .from('v_team_members')\n .select('id, user_id, role, person_id, created_at')\n .eq('tenant_id', orgId),\n ])\n if (peopleResult.error) throw peopleResult.error\n\n const people = (peopleResult.data ?? []) as TeamPeopleRow[]\n const members = (membersResult.data ?? []) as TeamMemberRow[]\n\n // Login-only rows are named from the person their membership points at,\n // falling back to the auth profile (see namesForLogins — `profiles` is\n // empty in some pools, which left this whole screen nameless). The\n // session is the last fallback, and only for your own row.\n const [nameMap, sessionResult] = await Promise.all([\n namesForLogins(members as unknown as Array<Record<string, unknown>>, core()),\n core().auth.getSession(),\n ])\n\n const sessionUser = sessionResult?.data?.session?.user\n const currentUser = sessionUser\n ? {\n id: sessionUser.id,\n email: sessionUser.email,\n fullName: (sessionUser.user_metadata?.['full_name'] as string | undefined) ?? undefined,\n }\n : null\n\n return buildTeamRows(people, members, [...nameMap.values()] as unknown as TeamProfileRow[], currentUser)\n },\n\n // Verbs, not writes into the projection: v_team_members is a JOINed view\n // and accepts neither UPDATE nor DELETE, and each RPC checks the permission\n // in one place. `_orgId` stays in the signature for the adapter contract —\n // the RPCs take the tenant from the session, not from a parameter.\n async updateMemberProfile(_orgId: string, memberId: string, profileId: string): Promise<void> {\n // member_set_role refuses to demote the last owner. This screen cannot\n // know it was the last one, which is exactly why the check moved.\n const { error } = await core().rpc('member_set_role', { p_membership: memberId, p_role: profileId })\n if (error) throw error\n },\n\n async removeMember(_orgId: string, memberId: string): Promise<void> {\n const { error } = await core().rpc('member_remove', { p_membership: memberId })\n if (error) throw error\n },\n\n // #136 moved authorization into app.*, reachable through the v_authz_*\n // views (security_invoker, so RLS still decides what a caller sees) and a\n // small set of RPCs. The four public mirrors this used to read and write —\n // permissions, role_permissions, tenant_roles, tenant_role_overrides — are\n // dropped by @fayz-ai/db 003.\n //\n // The RPCs take the tenant from the SESSION, not a parameter, so orgId is\n // asserted against the active tenant rather than passed down: writing to\n // one org while another is active was never possible and should fail\n // loudly rather than silently touch the wrong one.\n async listProfiles(orgId: string): Promise<PermissionProfile[]> {\n const [permsResult, rolesResult, grantsResult] = await Promise.all([\n core().from('v_authz_permissions').select('key, plugin'),\n core().from('v_authz_roles').select('id, key, name, description, is_system').eq('tenant_id', orgId),\n core().from('v_authz_role_permissions').select('role_id, permission').eq('tenant_id', orgId),\n ])\n\n if (permsResult.error) throw permsResult.error\n if (rolesResult.error) throw rolesResult.error\n if (grantsResult.error) throw grantsResult.error\n\n const dbRoles = (rolesResult.data ?? []) as Array<{\n id: string; key: string; name: string; description: string | null; is_system: boolean\n }>\n const keyOf = new Map(dbRoles.map((r) => [r.id, r.key]))\n\n // The app still declares its own role SET; the database now supplies the\n // custom ones a tenant created. A system role the DB knows and the app\n // does not is still shown — it holds grants either way.\n const declared: RoleIdentity[] = roles.map((r) => ({ ...r, isSystem: true }))\n const declaredIds = new Set(declared.map((r) => r.id))\n const fromDb: RoleIdentity[] = dbRoles\n .filter((r) => !declaredIds.has(r.key))\n .map((r) => ({ id: r.key, name: r.name, description: r.description ?? undefined, isSystem: r.is_system }))\n\n // app.role_permissions is per TENANT, so every grant is that tenant's own.\n // The global defaults table this used to read was documented as always\n // empty and measured empty in every pool, so there is no third source to\n // merge — the grants go in as overrides and the base layer is bare.\n const overrides = ((grantsResult.data ?? []) as Array<{ role_id: string; permission: string }>)\n .flatMap((g) => {\n const role = keyOf.get(g.role_id)\n return role ? [{ role, permission_id: g.permission, granted: true }] : []\n })\n\n return buildPermissionProfiles(\n [...declared, ...fromDb],\n ((permsResult.data ?? []) as Array<{ key: string; plugin: string }>)\n .map((p) => ({ id: p.key, category: p.plugin })),\n [],\n overrides,\n )\n },\n\n async createProfile(\n orgId: string,\n profile: Omit<PermissionProfile, 'id' | 'isSystem'>,\n ): Promise<PermissionProfile> {\n const existingRoles = await core().from('v_authz_roles').select('key, is_system').eq('tenant_id', orgId)\n if (existingRoles.error) throw existingRoles.error\n const rows = (existingRoles.data ?? []) as Array<{ key: string; is_system: boolean }>\n const existing = new Set(rows.map((r) => 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 // role_create_from_template always clones something — there is no \"empty\n // role\" verb. Cloning the narrowest role available and then setting the\n // grants explicitly lands on exactly the requested set either way, and\n // never on a role that briefly held more than it should.\n const seed = rows.find((r) => r.is_system && r.key === 'viewer')?.key\n ?? rows.find((r) => r.is_system)?.key\n ?? rows[0]?.key\n if (!seed) throw new Error('createProfile: the tenant has no role to clone from')\n\n const created = await core().rpc('role_create_from_template', {\n p_role_key: key,\n p_name: profile.name,\n p_template_role: seed,\n p_template: null,\n p_description: profile.description ?? null,\n })\n if (created.error) throw created.error\n const roleId = created.data as string\n\n const keys = Object.entries(profile.grants ?? {}).flatMap(([category, actions]) =>\n actions.map((action) => `${category}.${DB_ACTION[action] ?? action}`),\n )\n const set = await core().rpc('role_set_permissions', { p_role_id: roleId, p_keys: keys })\n if (set.error) throw set.error\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 // The RPCs address a role by its uuid; the matrix addresses it by key.\n const found = await core()\n .from('v_authz_roles').select('id, name, description, is_system')\n .eq('tenant_id', orgId).eq('key', profileId).maybeSingle()\n if (found.error) throw found.error\n if (!found.data) throw new Error(`Profile not found: ${profileId}`)\n const role = found.data as { id: string; name: string; description: string | null; is_system: boolean }\n\n if (data.name !== undefined || data.description !== undefined) {\n const { error } = await core().rpc('role_rename', {\n p_role_id: role.id,\n p_name: data.name ?? role.name,\n // Explicit, not coalesced: role_rename treats NULL as \"clear it\", so\n // an untouched description has to be sent back as it was.\n p_description: data.description !== undefined ? (data.description ?? null) : role.description,\n })\n if (error) throw error\n }\n\n if (data.grants) {\n const keys = Object.entries(data.grants).flatMap(([category, actions]) =>\n actions.map((action) => `${category}.${DB_ACTION[action] ?? action}`),\n )\n // One call, not delete-then-insert: role_set_permissions reconciles to\n // the given set inside one transaction, so the role is never briefly\n // holding nothing.\n const { error } = await core().rpc('role_set_permissions', { p_role_id: role.id, p_keys: keys })\n if (error) throw error\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 const found = await core()\n .from('v_authz_roles').select('id, is_system')\n .eq('tenant_id', orgId).eq('key', profileId).maybeSingle()\n if (found.error) throw found.error\n if (!found.data) throw new Error('System roles cannot be deleted.')\n const role = found.data as { id: string; is_system: boolean }\n if (role.is_system) throw new Error('System roles cannot be deleted.')\n\n // role_delete refuses a role an active member still holds, and says how\n // many. That refusal is the point: it used to demote them silently.\n const { error } = await core().rpc('role_delete', { p_role_id: role.id })\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('v_units')\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 .rpc('unit_create', {\n p_name: input.name,\n p_kind: input.isHeadquarters ? 'hq' : 'branch',\n p_parent_unit: null,\n // app.units keeps a unit's contact details in metadata; v_units reads\n // them back out under the flat names this screen already uses.\n p_metadata: {\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 },\n })\n\n if (error) throw error\n const created = await core().from('v_units').select('*').eq('id', data as string).single()\n if (created.error) throw created.error\n return mapLocationRow(created.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 { EMPTY_APP_CONFIG, type AppConfig } from '@fayz-ai/core'\n\n// ---------------------------------------------------------------------------\n// app-config.store — what THIS tenant has, as the database says it (#280).\n//\n// The shell used to learn what to render from `app.manifest.json`, a file that\n// shipped next to the code. That is why eleven applications needed eleven\n// repositories, and why turning a feature on for one customer was a deploy.\n// Since migration 150 the answer is a row, and `app_config()` returns branding,\n// activations, menu composition and the caller's permissions in one stamped\n// round trip.\n//\n// ── Why the manifest still matters ──────────────────────────────────────────\n// It says what a plugin CAN do; this says what this tenant HAS. Neither\n// replaces the other, and confusing them is how a plugin ends up shipping a\n// customer's configuration.\n//\n// ── Why `stale` and not `loading` alone ─────────────────────────────────────\n// Config drives the frame of the app, so re-fetching it must not blank the\n// screen. A refresh keeps the previous answer readable and marks it stale; only\n// the very first load has nothing to show.\n//\n// ── Por que o config sabe DE QUEM ele é ─────────────────────────────────────\n// Trocar de conta não é atualizar: é outra resposta. Sem `tenantId` aqui, o\n// shell pintava a conta nova com a configuração da anterior (ou com o padrão do\n// bundle) até a chamada voltar — rail curto, e o guarda de rota negando com\n// \"acesso restrito\" porque o perfil ainda não tinha chegado. Depois tudo\n// trocava de uma vez, e o que o usuário via era um pisca.\n//\n// Com o dono anotado, quem renderiza consegue perguntar \"isto é sobre a conta\n// em que eu estou?\" — e, quando não é, esperar mostrando esqueleto em vez de\n// mostrar outra coisa.\n// ---------------------------------------------------------------------------\n\ninterface AppConfigStore {\n config: AppConfig\n /** De quem é a configuração em `config`. `null` = nenhuma ainda. */\n tenantId: string | null\n /** True until the first answer arrives — not on every refresh. */\n initializing: boolean\n /** A refresh is in flight; the config on screen is the previous one. */\n stale: boolean\n /** The read failed. The shell still renders: an empty config is legible. */\n error: string | null\n setConfig: (config: AppConfig, tenantId?: string | null) => void\n /** Uma conta nova entrou em cena: o que está em tela não é sobre ela. */\n beginTenant: (tenantId: string | null) => void\n setStale: (stale: boolean) => void\n setError: (error: string | null) => void\n reset: () => void\n}\n\nconst initialState = {\n config: EMPTY_APP_CONFIG,\n tenantId: null,\n initializing: true,\n stale: false,\n error: null,\n}\n\nexport const useAppConfigStore = create<AppConfigStore>((set) => ({\n ...initialState,\n setConfig: (config, tenantId) =>\n set({\n config,\n tenantId: tenantId === undefined ? config.tenant_id ?? null : tenantId,\n initializing: false,\n stale: false,\n error: null,\n }),\n // Não limpa o que está em tela: quem espera desenha esqueleto, e um esqueleto\n // sobre a última resposta é melhor que um branco.\n beginTenant: (tenantId) => set({ tenantId, initializing: true, error: null }),\n setStale: (stale) => set({ stale }),\n setError: (error) => set({ error, initializing: false, stale: false }),\n reset: () => set(initialState),\n}))\n\n/** Active plugin ids, facets folded in — what a screen asks before rendering. */\nexport function activePluginIds(config: AppConfig): string[] {\n return [...new Set(config.plugins.filter((p) => p.status === 'active').map((p) => p.plugin))]\n}\n\n/**\n * Is this plugin — or one named part of it — on for this tenant?\n *\n * The facet argument is what makes a plugin with free and paid halves possible:\n * `has('financial')` asks about the plugin, `has('financial', 'reconciliation')`\n * asks about the part somebody pays for.\n */\nexport function hasPlugin(config: AppConfig, plugin: string, facet?: string): boolean {\n const wanted = facet ?? ''\n return config.plugins.some(\n (p) => p.plugin === plugin && (p.facet ?? '') === wanted && p.status === 'active',\n )\n}\n","import * as React from 'react'\nimport { Building2 } from 'lucide-react'\nimport { cn } from '../lib/cn'\nimport { useAppConfigStore } from '../stores/app-config.store'\n\n/**\n * A cara de uma conta: a marca dela, ou as iniciais.\n *\n * Existia em TRÊS cópias — o gatilho do rail, o seletor pós-login e o diálogo\n * de troca — e cada uma aprendeu as regras abaixo separado. As duas primeiras\n * cortavam a marca (`object-cover`), e só uma delas sabia da arte por\n * superfície. Um componente, uma regra.\n *\n * ── As três regras ─────────────────────────────────────────────────────────\n *\n * 1. **Contido, nunca cortado.** O que chega aqui costuma ser um wordmark\n * largo, e cortar o meio dele é o que fazia \"Espaço Facial\" virar \"aço\".\n *\n * 2. **O ladrilho JÁ VEM PRONTO na imagem.** `markUrl` aponta para um quadrado\n * acabado — fundo escuro, cantos arredondados, glifo claro dentro — gerado\n * uma vez e guardado. A alternativa era o componente montar isso a cada\n * render (fundo por classe, glifo por cima, uma regra de contraste por\n * superfície), que foi o que fez a marca sumir duas vezes, em direções\n * opostas. Uma imagem pronta lê igual no rail, no popover e no seletor\n * pós-login, e não tem regra para errar.\n *\n * 3. **A marca do documento é só da conta ATIVA.** `app_config()` descreve o\n * inquilino em que a sessão está. Usá-la nas linhas da lista pinta todas as\n * contas com o ícone de uma — e o seletor pós-login nem tem conta ativa\n * ainda, então lá cada linha usa sempre a arte da própria conta.\n */\nexport interface OrgMarkProps {\n name: string\n /** A marca da conta, como a lista a conhece (`tenants.logo_url`). */\n logoUrl?: string\n className?: string\n /** A superfície onde o ladrilho está. O popover é claro mesmo num rail escuro. */\n tone?: 'sidebar' | 'popover'\n /** Este ladrilho é o da conta ativa — só ele pode usar o documento de marca. */\n current?: boolean\n}\n\n/** Duas letras no máximo: primeira + última palavra (\"Artorius Steakhouse\" → AS). */\nexport function orgInitials(name: string): string {\n const words = name.trim().split(/\\s+/).filter(Boolean)\n if (!words.length) return '?'\n if (words.length === 1) return words[0]!.slice(0, 2).toUpperCase()\n return (words[0]![0]! + words[words.length - 1]![0]!).toUpperCase()\n}\n\nexport function OrgMark({ name, logoUrl, className, tone = 'sidebar', current = false }: OrgMarkProps) {\n const identity = useAppConfigStore((state) => (state.config.branding as { identity?: Record<string, unknown> })?.identity)\n const pick = (key: string) => (typeof identity?.[key] === 'string' ? (identity[key] as string) : undefined)\n const src = (current ? pick('markUrl') : undefined) ?? logoUrl\n\n const [status, setStatus] = React.useState<'loading' | 'ok' | 'error'>('loading')\n const imgRef = React.useRef<HTMLImageElement>(null)\n // Imagem já em cache termina ANTES do React pendurar o `onLoad`, e esse\n // evento nunca dispara — o esqueleto ficaria pulsando para sempre sobre uma\n // marca pronta. `complete` num layout effect é quem pergunta isso a tempo.\n // O mesmo efeito volta a esperar quando a marca TROCA (troca de conta, ou o\n // `markUrl` que só chega depois do config): manter `ok` mostrava a marca\n // anterior por um quadro. Um efeito só, porque um passivo logo em seguida\n // desfazia o que este acabou de decidir.\n React.useLayoutEffect(() => {\n const el = imgRef.current\n setStatus(el?.complete ? (el.naturalWidth > 0 ? 'ok' : 'error') : 'loading')\n }, [src])\n\n // Squircle com um fio de contorno, para a marca manter a forma agora que nada\n // à volta dela é delineado — o único objeto sólido no topo do rail.\n const base = cn(\n 'shrink-0 overflow-hidden rounded-lg ring-1 ring-inset',\n tone === 'popover' ? 'ring-black/5' : 'ring-white/10',\n className ?? 'h-6 w-6',\n )\n\n // `cover` porque a arte já é o ladrilho inteiro: quadrada, com fundo e com a\n // margem que ela mesma escolheu. Nada a compor aqui.\n //\n // Enquanto ela não chega, um quadrado cinza no lugar exato que ela vai\n // ocupar. Sem isso o gatilho do rail e cada linha do seletor nasciam com um\n // buraco — a lista aparecia montada e as marcas pingavam depois, cada uma no\n // seu tempo, e o topo do rail pulava quando a primeira entrava. O esqueleto\n // reserva o espaço desde o primeiro quadro; e se a imagem falhar, o que fica\n // é a iniciais — a mesma coisa que uma conta sem marca nenhuma mostra.\n if (src && status !== 'error') {\n return (\n <span className={cn(base, 'relative block')}>\n <img\n ref={imgRef}\n src={src}\n alt=\"\"\n onLoad={() => setStatus('ok')}\n onError={() => setStatus('error')}\n className={cn(\n 'h-full w-full object-cover transition-opacity duration-200',\n status === 'ok' ? 'opacity-100' : 'opacity-0',\n )}\n />\n {status === 'loading' && (\n <span\n aria-hidden\n className={cn(\n 'absolute inset-0 animate-pulse',\n tone === 'popover' ? 'bg-muted' : 'bg-sidebar-accent',\n )}\n />\n )}\n </span>\n )\n }\n\n return (\n <span\n aria-hidden\n className={cn(\n base,\n 'flex items-center justify-center text-[10px] font-semibold uppercase leading-none tracking-tight',\n tone === 'popover' ? 'bg-muted text-foreground' : 'bg-sidebar-accent text-sidebar-accent-foreground',\n )}\n >\n {orgInitials(name) || <Building2 className=\"h-3.5 w-3.5\" />}\n </span>\n )\n}\n","// ---------------------------------------------------------------------------\n// workspace-search — achar a conta numa lista que não cabe na tela.\n//\n// Com quinze contas o seletor já passava do rodapé: a lista empurrava \"Nova\n// área de trabalho\" e a seção de Unidades para fora da janela, e achar uma\n// conta virava rolar um menu procurando por reconhecimento visual. Numa rede de\n// franquias isso não é quinze, é duzentas.\n//\n// ── Por que um teto E uma busca, e não só um deles ─────────────────────────\n// Só teto esconde contas sem oferecer caminho. Só busca obriga a digitar mesmo\n// quando há três contas. Juntos: quem tem poucas contas nunca vê a caixa, e\n// quem tem muitas vê as primeiras e um campo — que é como todo seletor de conta\n// grande funciona.\n// ---------------------------------------------------------------------------\n\n/** Acima disto o seletor oferece busca. Abaixo, a lista inteira cabe. */\nexport const WORKSPACE_SEARCH_THRESHOLD = 8\n\n/** Quantas linhas o menu mostra de uma vez quando há busca. */\nexport const WORKSPACE_VISIBLE_LIMIT = 7\n\n/** Sem acento e sem caixa: quem procura \"Espaco\" tem de achar \"Espaço\". */\nexport function foldName(value: string): string {\n return value.normalize('NFD').replace(/[̀-ͯ]/g, '').toLowerCase()\n}\n\nexport interface SearchableWorkspace {\n orgId: string\n orgName: string\n}\n\nexport interface WorkspaceSearchResult<T extends SearchableWorkspace> {\n /** As linhas a desenhar agora. */\n visible: T[]\n /** Quantas ficaram de fora do teto — 0 quando a lista coube inteira. */\n hidden: number\n /** A busca vale a pena nesta lista? */\n searchable: boolean\n}\n\n/**\n * Filtra e corta, mantendo a conta ATIVA sempre visível.\n *\n * Ela fica visível mesmo fora do teto e mesmo fora do filtro: o menu é também\n * onde se lê em que conta se está, e esconder a resposta dessa pergunta para\n * caber mais linha é trocar a pergunta principal pela secundária.\n */\nexport function searchWorkspaces<T extends SearchableWorkspace>(\n all: T[],\n query: string,\n currentId?: string | null,\n limit = WORKSPACE_VISIBLE_LIMIT,\n): WorkspaceSearchResult<T> {\n const searchable = all.length > WORKSPACE_SEARCH_THRESHOLD\n if (!searchable) return { visible: all, hidden: 0, searchable: false }\n\n const q = foldName(query.trim())\n const matched = q ? all.filter((w) => foldName(w.orgName).includes(q)) : all\n\n const current = all.find((w) => w.orgId === currentId)\n const head = current && !matched.includes(current) ? [current] : []\n const rest = matched.filter((w) => w.orgId !== current?.orgId)\n const ordered = current && matched.includes(current) ? [current, ...rest] : [...head, ...rest]\n\n return {\n visible: ordered.slice(0, limit),\n hidden: Math.max(0, ordered.length - limit),\n searchable: true,\n }\n}\n","import * as React from 'react'\nimport { OrgMark } from './OrgMark'\nimport type { OrgMembership } from '@fayz-ai/core'\nimport { useTranslation } from '@fayz-ai/core'\nimport { Button, Checkbox, cn } from '@fayz-ai/ui'\nimport { Building2, Check } from 'lucide-react'\nimport { useTenant } from './context'\nimport { setAutoPick } from './choice'\nimport { searchWorkspaces } from './workspace-search'\n\nexport interface WorkspaceChooserProps {\n /** Every workspace this account can open in THIS app. */\n memberships: OrgMembership[]\n /** The last one this browser was in — pre-selected, not auto-entered. */\n suggestedId: string | null\n /** Present only when there is a workspace to go back to (the switcher route). */\n onCancel?: () => void\n}\n\n/**\n * \"Which of your workspaces?\" — asked once, on the way in.\n *\n * Deliberately a full screen rather than a dialog. Behind it the shell would be\n * rendering an account nobody has chosen yet, and every plugin on it would be\n * firing tenant-scoped requests against that guess; a dialog implies there is\n * something valid underneath, and there is not.\n */\nexport function WorkspaceChooser({ memberships, suggestedId, onCancel }: WorkspaceChooserProps) {\n const t = useTranslation()\n const tr = (key: string, fallback: string) => {\n const v = t(key)\n return !v || v === key ? fallback : v\n }\n\n const { switchOrg } = useTenant()\n const [selected, setSelected] = React.useState<string | null>(\n suggestedId ?? memberships[0]?.orgId ?? null,\n )\n // Off by default, deliberately, for as long as this flow is being validated:\n // asking every time is a second of friction, and silently opening the wrong\n // account is a support ticket. Opting out stays available; it is just not\n // something anyone gets handed without choosing it.\n const [remember, setRemember] = React.useState(false)\n const [query, setQuery] = React.useState('')\n // Teto MAIOR que o do menu: aqui a lista é a tela inteira, não um popover\n // espremido entre o gatilho e o rodapé.\n const search = React.useMemo(\n () => searchWorkspaces(memberships, query, selected, 12),\n [memberships, query, selected],\n )\n const [entering, setEntering] = React.useState(false)\n\n const enter = async (orgId: string) => {\n if (entering) return\n setEntering(true)\n // The preference is written BEFORE the switch: switchOrg re-renders this\n // component out of existence, so anything queued after it may never run.\n setAutoPick(remember)\n try {\n await switchOrg(orgId)\n } finally {\n setEntering(false)\n }\n }\n\n return (\n <div className=\"flex min-h-screen items-center justify-center bg-background p-4\">\n <div className=\"w-full max-w-md\">\n <div className=\"mb-6 text-center\">\n <h1 className=\"text-xl font-semibold text-foreground\">\n {tr('organization.chooseWorkspace', 'Escolha uma área de trabalho')}\n </h1>\n <p className=\"mt-1 text-sm text-muted-foreground\">\n {tr(\n 'organization.chooseWorkspaceDescription',\n 'Você tem acesso a mais de uma. Selecione em qual deseja entrar.',\n )}\n </p>\n </div>\n\n {/* A lista cresce com a rede de franquias; a tela, não. Ver\n ./workspace-search — e a mesma caixa está no seletor do rail, de\n propósito: é a mesma pergunta, feita antes e depois de entrar. */}\n {search.searchable && (\n <input\n value={query}\n onChange={(e) => setQuery(e.target.value)}\n placeholder={tr('organization.searchWorkspace', 'Buscar conta…')}\n autoFocus\n className=\"mb-3 w-full rounded-lg border border-border bg-card px-3 py-2 text-sm text-foreground outline-none placeholder:text-muted-foreground focus:border-primary\"\n />\n )}\n\n <div\n role=\"radiogroup\"\n aria-label={tr('organization.workspaces', 'Workspaces')}\n className=\"space-y-2\"\n >\n {search.visible.length === 0 && (\n <p className=\"py-6 text-center text-sm text-muted-foreground\">\n {tr('organization.noWorkspaceMatch', 'Nenhuma conta com esse nome.')}\n </p>\n )}\n {search.visible.map((m) => {\n const isSelected = m.orgId === selected\n const isSuggested = m.orgId === suggestedId\n return (\n <button\n key={m.orgId}\n type=\"button\"\n role=\"radio\"\n aria-checked={isSelected}\n disabled={entering}\n onClick={() => setSelected(m.orgId)}\n // A double click should not have to become a click and a\n // journey down to the button.\n onDoubleClick={() => void enter(m.orgId)}\n className={cn(\n 'flex w-full items-center gap-3 rounded-lg border p-3 text-left transition-colors',\n 'disabled:opacity-60',\n isSelected\n ? 'border-primary bg-primary/5'\n : 'border-border hover:border-primary/50 hover:bg-muted/50',\n )}\n >\n <OrgMark name={m.orgName} logoUrl={m.orgLogoUrl} tone=\"popover\" className=\"h-9 w-9\" />\n <span className=\"min-w-0 flex-1\">\n <span className=\"block truncate text-sm font-medium text-foreground\">\n {m.orgName || m.orgSlug || m.orgId}\n </span>\n <span className=\"block truncate text-xs text-muted-foreground\">\n {m.profileName}\n {isSuggested && ` · ${tr('organization.lastUsed', 'último acesso')}`}\n </span>\n </span>\n {isSelected && <Check className=\"h-4 w-4 shrink-0 text-primary\" />}\n </button>\n )\n })}\n </div>\n {search.hidden > 0 && (\n <p className=\"mt-3 text-center text-xs text-muted-foreground\">\n {tr('organization.moreWorkspaces', 'mais {n} — busque pelo nome').replace('{n}', String(search.hidden))}\n </p>\n )}\n\n {/* Not a <label>: Checkbox renders a <button>, and a label does not\n forward its click to one. The text carries its own handler instead,\n outside the button, so neither click double-toggles the other. */}\n <div className=\"mt-5 flex items-center gap-2.5 text-sm text-muted-foreground\">\n <Checkbox\n checked={remember}\n onChange={setRemember}\n disabled={entering}\n aria-label={tr('organization.rememberChoice', 'Não perguntar novamente neste dispositivo')}\n />\n <span className=\"cursor-pointer select-none\" onClick={() => !entering && setRemember(!remember)}>\n {tr('organization.rememberChoice', 'Não perguntar novamente neste dispositivo')}\n </span>\n </div>\n\n <div className=\"mt-5 flex gap-2\">\n {onCancel && (\n <Button variant=\"outline\" className=\"flex-1\" onClick={onCancel} disabled={entering}>\n {tr('common.cancel', 'Cancelar')}\n </Button>\n )}\n <Button\n className=\"flex-1\"\n disabled={!selected || entering}\n onClick={() => selected && void enter(selected)}\n >\n {entering ? tr('common.loading', 'Entrando…') : tr('organization.enter', 'Entrar')}\n </Button>\n </div>\n\n {/* The escape hatch for the checkbox above: somebody who ticked it and\n later needs a different workspace has to be told where the question\n went, or \"do not ask again\" reads as \"never again\". */}\n <p className=\"mt-4 text-center text-xs text-muted-foreground\">\n {tr(\n 'organization.switchLaterHint',\n 'Você pode trocar a qualquer momento pelo seletor no topo da tela.',\n )}\n </p>\n </div>\n </div>\n )\n}\n\n/** The workspace's face, at picker size: its logo, or its initials. */\n","// Shim → native Supabase client (unified singleton across shell + plugins).\nimport type { SupabaseClient } from '@supabase/supabase-js'\nimport { getSupabaseClientOptional as _getOpt } from '@fayz-ai/core'\nexport { createSupabaseProvider, setGlobalSupabaseClient } from '@fayz-ai/core'\n// @fayz-ai/core returns a loosely-typed client (no hard supabase coupling); the\n// shell does `.from(...)` against the single public client, so surface it as\n// the real client type.\nexport const getSupabaseClientOptional = (): SupabaseClient | null =>\n _getOpt() as unknown as SupabaseClient | null\nexport {\n getFayzSupabaseClient as getSupabaseClient,\n getFayzSupabaseClientOptional as getSupabaseClientSafe,\n createFayzSupabaseClient as createSupabaseClient,\n} from '../data/client'\nimport { getFayzSupabaseClient } from '../data/client'\n// Core tables now live in the public schema — the \"core\" client is just the\n// plain public client. Kept as a backward-compatible alias for call sites.\nexport const getCoreClient = getFayzSupabaseClient\nexport const getCoreSupabaseClient = getFayzSupabaseClient\nexport const getProjectSupabaseClient = getFayzSupabaseClient\nexport type { SupabaseClient }\n","import { useEffect, useState } from 'react'\nimport { getSupabaseClientOptional } from '../lib/supabase'\n\n/**\n * De quem é este endereço.\n *\n * Um inquilino com domínio próprio não deveria escolher conta: ele digitou o\n * endereço DELE. O seletor \"escolha uma área de trabalho\" é a resposta certa\n * para quem entra por `app.fayz.ai` com cinco contas; para quem entra por\n * `sistema.espacofacial.com.br` ele é uma pergunta cuja resposta já está na\n * barra de endereço.\n *\n * A porta é `tenant_branding_public`: anônima de propósito, porque a pergunta\n * vem ANTES da sessão — é ela que dá marca à tela de login e à loja pública.\n * Ela devolve só o recorte público (nome, slug, logo, cor, domínio); nada de\n * módulos, nada de ajustes, nada que não esteja na fachada do prédio.\n *\n * ── Em desenvolvimento ─────────────────────────────────────────────────────\n * `localhost` não tem domínio para resolver, então `?domain=` simula um. Só em\n * DEV: em produção o endereço é a única fonte, e um parâmetro que troca de\n * conta seria uma porta aberta na frente da casa.\n */\nexport interface DomainTenant {\n tenantId: string\n name: string | null\n slug: string | null\n logoUrl: string | null\n primaryColor: string | null\n}\n\nconst LOCAL = /^(localhost|127\\.0\\.0\\.1|\\[::1\\])$/\n\nexport function resolveHostname(): string | null {\n if (typeof window === 'undefined') return null\n const host = window.location.hostname\n if (!LOCAL.test(host)) return host\n if (!import.meta.env?.DEV) return null\n return new URLSearchParams(window.location.search).get('domain')\n}\n\nexport function useDomainTenant(): { tenant: DomainTenant | null; resolving: boolean } {\n const [tenant, setTenant] = useState<DomainTenant | null>(null)\n const [resolving, setResolving] = useState(true)\n\n useEffect(() => {\n const host = resolveHostname()\n const supabase = getSupabaseClientOptional()\n if (!host || !supabase) {\n setResolving(false)\n return\n }\n let cancelled = false\n void (async () => {\n try {\n const { data } = await supabase.rpc('tenant_branding_public', { p_domain: host })\n const row = data as Record<string, unknown> | null\n const id = typeof row?.tenant_id === 'string' ? row.tenant_id : null\n if (!cancelled && id) {\n setTenant({\n tenantId: id,\n name: (row?.name as string) ?? null,\n slug: (row?.slug as string) ?? null,\n logoUrl: (row?.logo_url as string) ?? null,\n primaryColor: (row?.primary_color as string) ?? null,\n })\n }\n } catch {\n // Um domínio que não resolve não é erro: é o caso comum de quem entra\n // pelo endereço do produto. O seletor segue sendo a resposta.\n } finally {\n if (!cancelled) setResolving(false)\n }\n })()\n return () => {\n cancelled = true\n }\n }, [])\n\n return { tenant, resolving }\n}\n","import * as React from 'react'\nimport { getPersistedOrgId } from './store'\nimport { useTenantOptional } from './context'\nimport { WorkspaceChooser } from './WorkspaceChooser'\nimport { useDomainTenant } from '../app/useDomainTenant'\n\nexport interface WorkspaceChooserGateProps {\n /** Held on screen while the membership list is still in flight. */\n fallback?: React.ReactNode\n children: React.ReactNode\n}\n\n/**\n * Puts the workspace picker in front of the shell when this account owes a\n * choice, and gets out of the way when it does not.\n *\n * There is no new state to keep: `decideWorkspaceChoice` already refuses to\n * pick for the provider in exactly this case, so \"a list we have read, more\n * than one row in it, and no active workspace\" IS the question being open.\n * A separate flag would be a second copy of that fact, free to disagree.\n *\n * Mounted between the setup gate and the shell: an account with NO workspace\n * belongs to the setup flow (there is nothing to choose from), and an account\n * with one never sees this at all.\n */\nexport function WorkspaceChooserGate({ fallback, children }: WorkspaceChooserGateProps) {\n const tenant = useTenantOptional()\n // Quem entra pelo PRÓPRIO domínio não escolhe conta: ele já respondeu a\n // pergunta na barra de endereço. Ver ../app/useDomainTenant.ts.\n const { tenant: byDomain, resolving: resolvingDomain } = useDomainTenant()\n const switchOrg = tenant?.switchOrg\n const entering = React.useRef(false)\n\n React.useEffect(() => {\n if (!byDomain || !tenant?.orgsKnown || tenant.org || !switchOrg || entering.current) return\n // Só entra se a pessoa for MEMBRO. O domínio diz de quem é a casa; quem\n // pode entrar continua sendo a membership — um endereço nunca concede\n // acesso, só escolhe entre as contas que já são dela.\n if (!tenant.userOrgs.some((m) => m.orgId === byDomain.tenantId)) return\n // Pelo MESMO caminho do seletor. Montar a organização à mão aqui deixava de\n // fora `settings` — e sem settings não há marca, não há tema, e o shell\n // ficava preso na moldura do bundle.\n entering.current = true\n void switchOrg(byDomain.tenantId)\n }, [byDomain, tenant?.orgsKnown, tenant?.org, tenant?.userOrgs, switchOrg])\n\n if (!tenant) return <>{children}</>\n\n const { org, userOrgs, orgsKnown, settled } = tenant\n\n // Already in a workspace — nothing to ask.\n if (org) return <>{children}</>\n\n // Hold rather than hand over, for the same reason the setup gate does: the\n // shell would paint an account-shaped app and fire every plugin's\n // tenant-scoped request against no tenant, then be replaced.\n if (!settled) return <>{fallback ?? null}</>\n\n // \"We asked and could not tell\" is not \"you have several\". Only a list we\n // actually read can raise this screen; anything else falls through to the\n // shell, which is where the existing empty-switcher behaviour already lives.\n if (!orgsKnown || userOrgs.length <= 1) return <>{children}</>\n\n // O domínio ainda está sendo resolvido, ou já resolveu numa conta que a\n // pessoa tem: segurar em vez de perguntar. Mostrar o seletor e trocá-lo por\n // uma conta um instante depois é a pergunta feita e respondida sozinha.\n if (resolvingDomain) return <>{fallback ?? null}</>\n if (byDomain && userOrgs.some((m) => m.orgId === byDomain.tenantId)) return <>{fallback ?? null}</>\n\n return (\n <WorkspaceChooser\n memberships={userOrgs}\n suggestedId={\n userOrgs.some((m) => m.orgId === getPersistedOrgId()) ? getPersistedOrgId() : null\n }\n />\n )\n}\n","import { create } from 'zustand'\nimport { clearOrgSnapshot } from './cache'\nimport { markWorkspaceSwitch } from './choice'\nimport { persistOrgId } from './store'\n\nexport interface SwitchTarget {\n orgId: string\n orgName: string\n /** So the transition shows the same mark the switcher row did. */\n orgLogoUrl?: string\n}\n\nexport interface WorkspaceSwitchingStore {\n /** The workspace being entered, while the transition is on screen. */\n target: SwitchTarget | null\n /** Commit to a workspace and raise the transition. Ends in a reload. */\n begin: (target: SwitchTarget) => void\n cancel: () => void\n}\n\n/**\n * Changing workspace, as a two-phase move: commit now, rebuild on the far side\n * of a reload.\n *\n * Switching in place was the alternative and it does not work. `switchOrg`\n * swaps the active tenant and re-hydrates the org, but every plugin store, the\n * offline cache and whatever screen is open still hold the PREVIOUS tenant's\n * rows, and nothing invalidates them centrally. The result is a shell that says\n * one workspace while the table under it lists another's — a tenant boundary\n * failure as far as anyone reading the screen is concerned, even though the\n * database never leaked a row.\n */\nexport const useWorkspaceSwitchingStore = create<WorkspaceSwitchingStore>((set) => ({\n target: null,\n\n begin: (target) => {\n // Order matters, and all three have to happen BEFORE the reload:\n // the marker — so the picker does not re-ask what was just answered\n // the pin — so \"last used\" is the workspace being entered\n // the snapshot— or the cached bootstrap of the OLD workspace paints\n // first on the far side and the switch silently undoes\n // itself.\n markWorkspaceSwitch(target.orgId)\n persistOrgId(target.orgId)\n clearOrgSnapshot()\n // ...e a paleta de boot, que é a QUARTA coisa que atravessa o reload.\n //\n // O `@fayz-ai/sdk` guarda a paleta resolvida para o boot seguinte pintar na\n // cor do aplicativo em vez de num cinza neutro. Numa troca de conta essa\n // paleta é a da conta ANTERIOR: sem limpá-la, o primeiro quadro do lado de\n // lá é a marca de quem se acabou de sair — e agora que a casca de boot\n // desenha a trilha, essa cor errada ocupa um quinto da tela.\n try { localStorage.removeItem('fayz:boot-theme') } catch { /* modo privado */ }\n set({ target })\n },\n\n cancel: () => set({ target: null }),\n}))\n","import * as React from 'react'\nimport { OrgMark } from './OrgMark'\nimport { useTranslation } from '@fayz-ai/core'\nimport { Check, ShieldCheck, Building2 } from 'lucide-react'\nimport { cn } from '@fayz-ai/ui'\n\n/** How long each step holds before the next one starts. */\nconst STEP_MS = 850\n\nexport interface WorkspaceSwitchingProps {\n /** The workspace being entered, named — the one fact that makes this concrete. */\n orgName: string\n /** Its logo, when it has one. */\n orgLogoUrl?: string\n /** Runs once the last step has been shown. Reloads the page, in practice. */\n onDone: () => void\n}\n\n/**\n * The screen between two workspaces.\n *\n * Changing tenant ends in a full reload, because half the app holds the old\n * tenant's rows in plugin stores and caches that nothing else invalidates. A\n * reload with no cover reads as a crash — the app blanks, comes back, and the\n * numbers are different. This covers it and says what is happening, so the\n * second it costs is spent visibly rather than suspiciously.\n *\n * Sized like a moment, not a toast: the workspace name is the largest thing on\n * screen because it is the answer to the only question anyone has here — where\n * am I about to be. The steps are honest about the order of operations, and the\n * last one is a security claim, so it gets an icon rather than another dot.\n */\nexport function WorkspaceSwitching({ orgName, orgLogoUrl, onDone }: WorkspaceSwitchingProps) {\n const t = useTranslation()\n const tr = (key: string, fallback: string) => {\n const v = t(key)\n return !v || v === key ? fallback : v\n }\n\n const steps = React.useMemo(\n () => [\n tr('organization.switching.step1', 'Alterando organização'),\n tr('organization.switching.step2', 'Garantindo segurança dos dados'),\n tr('organization.switching.step3', 'Carregando suas informações'),\n ],\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [],\n )\n\n const [step, setStep] = React.useState(0)\n\n // One timer that advances, then hands over — not one timer per step, which\n // would leak a reload if the component unmounted between two of them.\n const doneRef = React.useRef(onDone)\n doneRef.current = onDone\n React.useEffect(() => {\n const id = window.setInterval(() => {\n setStep((s) => {\n if (s < steps.length - 1) return s + 1\n window.clearInterval(id)\n // Out of the interval callback: the reload tears down this tree, and\n // React does not want that happening inside a state updater.\n window.setTimeout(() => doneRef.current(), STEP_MS)\n return s\n })\n }, STEP_MS)\n return () => window.clearInterval(id)\n }, [steps.length])\n\n return (\n <div\n role=\"status\"\n aria-live=\"polite\"\n aria-label={`${steps[step]} — ${orgName}`}\n className=\"saas-switch-veil fixed inset-0 z-[100] flex items-center justify-center bg-background px-6\"\n >\n <div className=\"saas-switch-rise flex w-full max-w-sm flex-col items-center\">\n {/* The mark, with the loading indicator as a ring around it rather than\n a spinner beside it — one object doing both jobs. */}\n <div className=\"relative flex h-20 w-20 items-center justify-center\">\n <span\n aria-hidden\n className=\"saas-switch-pulse absolute inset-0 rounded-2xl bg-primary/25\"\n />\n <OrgMark name={orgName} logoUrl={orgLogoUrl} tone=\"popover\" className=\"h-16 w-16 rounded-2xl shadow-sm\" />\n </div>\n\n <p className=\"mt-7 text-xs font-medium uppercase tracking-[0.14em] text-muted-foreground\">\n {tr('organization.switching.eyebrow', 'Entrando em')}\n </p>\n {/* The largest thing here on purpose. Balanced leading and a wrap\n rather than an ellipsis: a truncated workspace name is exactly the\n reassurance this screen exists to give, cut in half. */}\n <h1 className=\"mt-1.5 text-pretty text-center text-3xl font-semibold leading-tight tracking-tight text-foreground sm:text-4xl\">\n {orgName}\n </h1>\n\n {/* Reserved height, top-aligned: the rows are written one at a time,\n and without a floor for the full list each arrival would shove the\n name and mark upward. The block stays put; only the list fills. */}\n <ul className=\"mt-9 flex w-full min-h-[7.5rem] flex-col items-start sm:min-h-[8.5rem]\">\n {steps.slice(0, step + 1).map((label, i) => {\n const done = i < step\n const isSecurity = i === 1\n return (\n <li key={label} className=\"saas-switch-step flex w-full gap-3\">\n {/* The rail: a thread down from the step above, then this\n step's own marker. */}\n <span className=\"flex w-6 shrink-0 flex-col items-center\">\n {i > 0 && (\n // Tinted, not `bg-border`: on a light surface the border\n // token is invisible at 1px, and this thread is the part\n // that makes three rows read as one advancing sequence\n // rather than three unrelated lines.\n <span aria-hidden className=\"saas-switch-link h-5 w-0.5 rounded-full bg-primary/30\" />\n )}\n <span className=\"flex h-7 w-6 items-center justify-center\">\n {done ? (\n <Check className=\"h-5 w-5 text-primary\" strokeWidth={2.5} />\n ) : isSecurity ? (\n <ShieldCheck className=\"saas-switch-dot h-5 w-5 text-primary\" strokeWidth={2} />\n ) : (\n <span className=\"saas-switch-dot h-2 w-2 rounded-full bg-primary\" />\n )}\n </span>\n </span>\n <span\n className={cn(\n 'flex h-7 items-center text-base transition-colors duration-300 sm:text-lg',\n // Only ever two states now — done, or happening. Nothing is\n // on screen before its turn, so there is no \"ahead\" tone.\n done ? 'text-muted-foreground' : 'font-medium text-foreground',\n // Push the label down past the connector so it stays level\n // with its own marker rather than with the thread above it.\n i > 0 && 'mt-5',\n )}\n >\n {label}\n </span>\n </li>\n )\n })}\n </ul>\n </div>\n </div>\n )\n}\n\n","import * as React from 'react'\nimport { useWorkspaceSwitchingStore } from './switching.store'\nimport { WorkspaceSwitching } from './WorkspaceSwitching'\n\n/**\n * Renders the workspace transition over whatever is on screen, and performs the\n * reload it exists to cover.\n *\n * Mounted once, high in the shell: the switch can be started from the topbar\n * picker or from anywhere else that grows one, and none of those places should\n * own a full-screen overlay.\n */\nexport function WorkspaceSwitchingHost() {\n const target = useWorkspaceSwitchingStore((s) => s.target)\n if (!target) return null\n\n return (\n <WorkspaceSwitching\n orgName={target.orgName}\n orgLogoUrl={target.orgLogoUrl}\n // A full reload, not a router navigation: the point is to discard every\n // plugin store and cache still holding the previous tenant's rows, and\n // only a fresh document does that. `reload()` keeps the current URL, so\n // whoever switched lands on the same screen in the new workspace.\n onDone={() => window.location.reload()}\n />\n )\n}\n"]}
@@ -1,5 +1,5 @@
1
1
  import { usePermissionsStore } from './chunk-UQ2NTFQC.js';
2
- import { useOrganizationStore, getPersistedOrgId } from './chunk-W5IBKM3K.js';
2
+ import { useOrganizationStore, getPersistedOrgId } from './chunk-QOS6UAQ4.js';
3
3
  import * as React from 'react';
4
4
  import { errorMessage } from '@fayz-ai/core';
5
5
  import { useAuthStore, readAppHandoff } from '@fayz-ai/auth';
@@ -152,7 +152,7 @@ function OrgProvider({
152
152
  children
153
153
  }) {
154
154
  const { user, isLoading: authLoading } = useAuthStore();
155
- const { currentOrg, userOrgs, loading, setCurrentOrg, setUserOrgs, setMembers, setLoading, reset } = useOrganizationStore();
155
+ const { currentOrg, userOrgs, loading, setCurrentOrg, paintCurrentOrg, setUserOrgs, setMembers, setLoading, reset } = useOrganizationStore();
156
156
  const setProfiles = usePermissionsStore((s) => s.setProfiles);
157
157
  const setCurrentProfile = usePermissionsStore((s) => s.setCurrentProfile);
158
158
  const setProfileKnownFor = usePermissionsStore((s) => s.setProfileKnownFor);
@@ -180,7 +180,7 @@ function OrgProvider({
180
180
  useIsomorphicLayoutEffect(() => {
181
181
  if (!snapshot) return;
182
182
  setUserOrgs(snapshot.userOrgs);
183
- setCurrentOrg(snapshot.org);
183
+ paintCurrentOrg(snapshot.org);
184
184
  setMembers(snapshot.members);
185
185
  setProfiles(snapshot.profiles);
186
186
  setCurrentProfile(snapshot.profiles.find((p) => p.id === snapshot.currentProfileId) ?? null);
@@ -371,5 +371,5 @@ function OrgProvider({
371
371
  }
372
372
 
373
373
  export { ORG_CACHE_TTL_MS, OrgProvider, clearOrgSnapshot, decideWorkspaceChoice, getAutoPick, markWorkspaceSwitch, readOrgSnapshot, setAutoPick, takeWorkspaceSwitch, useOrgAdapter, useOrgAdapterOptional, useTenant, useTenantOptional };
374
- //# sourceMappingURL=chunk-KSUIF56I.js.map
375
- //# sourceMappingURL=chunk-KSUIF56I.js.map
374
+ //# sourceMappingURL=chunk-IDOTNT43.js.map
375
+ //# sourceMappingURL=chunk-IDOTNT43.js.map