@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
@@ -50,12 +50,31 @@ export declare const getHost: typeof getAgent;
50
50
  * and there is one agent now, gated (or not) like the chat itself.
51
51
  */
52
52
  export declare function openAssistantAs(area: AgentRole): boolean;
53
+ /**
54
+ * The TRADE this account runs, as the database says it.
55
+ *
56
+ * A single binary shipping many businesses — the central app carries whichever
57
+ * trade walks in — cannot state its own subject in config: the restaurant and
58
+ * the clinic are the same build. `app.apps` already answers it per tenant, and
59
+ * the switcher reads the same row.
60
+ *
61
+ * The first app is the one whose preset draws the rail (see useAppPreset), so
62
+ * it is also the one the assistant should say it is working in. An account
63
+ * with no row gets nothing — silence beats naming the wrong business.
64
+ */
65
+ export declare function tenantAppName(): string | undefined;
53
66
  /**
54
67
  * Who the model is this turn.
55
68
  *
56
69
  * No colleague list any more: there is nobody to hand off to, and the agent's
57
70
  * reach is a question of tools it can ask for rather than a person it must
58
- * call. Empty when the app named nobody, so the guidance is unchanged.
71
+ * call.
72
+ *
73
+ * An app that named NOBODY is not left silent: it gets the generic line — the
74
+ * assistant of whatever trade this tenant runs. That is the shape the central
75
+ * app needs, and the one a hard-coded cast broke: "You are the FullControl
76
+ * assistant, help the team run sales and money" is a lie in a restaurant
77
+ * account that opened the very same build.
59
78
  */
60
79
  export declare function buildPersonaGuidance(): string;
61
80
  /** Publishes the app's agent for the lifetime of the shell. */
@@ -1 +1 @@
1
- {"version":3,"file":"agent-staff.d.ts","sourceRoot":"","sources":["../../src/lib/agent-staff.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,eAAe,CAAA;AAI7D;;;;;;;;;;;;;;;;;;;GAmBG;AAEH,UAAU,UAAU;IAClB,2DAA2D;IAC3D,KAAK,EAAE,aAAa,GAAG,IAAI,CAAA;IAC3B,QAAQ,EAAE,CAAC,KAAK,EAAE,aAAa,GAAG,IAAI,KAAK,IAAI,CAAA;CAChD;AAED,eAAO,MAAM,aAAa,yEAGvB,CAAA;AAEH;;;;;;GAMG;AACH,wBAAgB,SAAS,CAAC,KAAK,EAAE,aAAa,EAAE,GAAG,SAAS,GAAG,aAAa,GAAG,IAAI,CAGlF;AAED,wBAAgB,QAAQ,IAAI,aAAa,GAAG,SAAS,CAEpD;AAED,4DAA4D;AAC5D,eAAO,MAAM,cAAc,iBAAW,CAAA;AACtC,4DAA4D;AAC5D,eAAO,MAAM,OAAO,iBAAW,CAAA;AAE/B;;;;;;;;;;GAUG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,SAAS,GAAG,OAAO,CAIxD;AAED;;;;;;GAMG;AACH,wBAAgB,oBAAoB,IAAI,MAAM,CAa7C;AAMD,+DAA+D;AAC/D,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,aAAa,EAAE,GAAG,SAAS,GAAG,IAAI,CAWzE;AAED,wBAAgB,QAAQ,IAAI,aAAa,GAAG,SAAS,CAEpD;AAED,4DAA4D;AAC5D,eAAO,MAAM,cAAc,iBAAW,CAAA"}
1
+ {"version":3,"file":"agent-staff.d.ts","sourceRoot":"","sources":["../../src/lib/agent-staff.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,eAAe,CAAA;AAK7D;;;;;;;;;;;;;;;;;;;GAmBG;AAEH,UAAU,UAAU;IAClB,2DAA2D;IAC3D,KAAK,EAAE,aAAa,GAAG,IAAI,CAAA;IAC3B,QAAQ,EAAE,CAAC,KAAK,EAAE,aAAa,GAAG,IAAI,KAAK,IAAI,CAAA;CAChD;AAED,eAAO,MAAM,aAAa,yEAGvB,CAAA;AAEH;;;;;;GAMG;AACH,wBAAgB,SAAS,CAAC,KAAK,EAAE,aAAa,EAAE,GAAG,SAAS,GAAG,aAAa,GAAG,IAAI,CAGlF;AAED,wBAAgB,QAAQ,IAAI,aAAa,GAAG,SAAS,CAEpD;AAED,4DAA4D;AAC5D,eAAO,MAAM,cAAc,iBAAW,CAAA;AACtC,4DAA4D;AAC5D,eAAO,MAAM,OAAO,iBAAW,CAAA;AAE/B;;;;;;;;;;GAUG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,SAAS,GAAG,OAAO,CAIxD;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,aAAa,IAAI,MAAM,GAAG,SAAS,CAKlD;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,oBAAoB,IAAI,MAAM,CAwB7C;AAMD,+DAA+D;AAC/D,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,aAAa,EAAE,GAAG,SAAS,GAAG,IAAI,CAWzE;AAED,wBAAgB,QAAQ,IAAI,aAAa,GAAG,SAAS,CAEpD;AAED,4DAA4D;AAC5D,eAAO,MAAM,cAAc,iBAAW,CAAA"}
@@ -30,5 +30,21 @@ export declare function resolveFayzApiBaseUrl(override?: string): string | undef
30
30
  /** The other half of the address: which project on that platform this app is. */
31
31
  export declare function resolveFayzProjectId(override?: string): string | undefined;
32
32
  export declare function resolveFayzAgentConnection(override?: FayzAgentConnectionConfig | false): ResolvedFayzAgentConnection | null;
33
+ /**
34
+ * WHY the assistant is dark, in the words of whoever can fix it.
35
+ *
36
+ * `resolveFayzAgentConnection` answering `null` is one bit, and the panel used
37
+ * to translate that bit into "defina chat.apiEndpoint" — advice that is wrong
38
+ * for every app in the fleet, because none of them set `apiEndpoint`: they are
39
+ * wired by env. Three apps (control, full-control, ticket-control) shipped for
40
+ * weeks with a dead FAB and nobody could read why from the screen.
41
+ *
42
+ * So the gap names the MISSING VARIABLES. Never the values — a publishable key
43
+ * is public by design, but a diagnostic that prints credentials becomes a
44
+ * screenshot in a support thread.
45
+ */
46
+ export declare function describeFayzAgentGap(override?: FayzAgentConnectionConfig | false): {
47
+ missing: string[];
48
+ } | null;
33
49
  export declare function getFayzAgentClient(connection: ResolvedFayzAgentConnection): FayzAgentClient;
34
50
  //# sourceMappingURL=fayz-agent.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"fayz-agent.d.ts","sourceRoot":"","sources":["../../src/lib/fayz-agent.ts"],"names":[],"mappings":"AAAA,OAAO,EAAyB,KAAK,eAAe,EAAE,MAAM,oBAAoB,CAAA;AAEhF;;;;;;;;GAQG;AAEH,MAAM,WAAW,yBAAyB;IACxC,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,cAAc,CAAC,EAAE,MAAM,CAAA;CACxB;AAED,MAAM,WAAW,2BAA2B;IAC1C,SAAS,EAAE,MAAM,CAAA;IACjB,UAAU,EAAE,MAAM,CAAA;IAClB,cAAc,EAAE,MAAM,CAAA;CACvB;AAOD;;;;;;;GAOG;AACH,wBAAgB,qBAAqB,CAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAE3E;AAED,iFAAiF;AACjF,wBAAgB,oBAAoB,CAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAE1E;AAED,wBAAgB,0BAA0B,CACxC,QAAQ,CAAC,EAAE,yBAAyB,GAAG,KAAK,GAC3C,2BAA2B,GAAG,IAAI,CASpC;AAID,wBAAgB,kBAAkB,CAAC,UAAU,EAAE,2BAA2B,GAAG,eAAe,CAW3F"}
1
+ {"version":3,"file":"fayz-agent.d.ts","sourceRoot":"","sources":["../../src/lib/fayz-agent.ts"],"names":[],"mappings":"AAAA,OAAO,EAAyB,KAAK,eAAe,EAAE,MAAM,oBAAoB,CAAA;AAEhF;;;;;;;;GAQG;AAEH,MAAM,WAAW,yBAAyB;IACxC,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,cAAc,CAAC,EAAE,MAAM,CAAA;CACxB;AAED,MAAM,WAAW,2BAA2B;IAC1C,SAAS,EAAE,MAAM,CAAA;IACjB,UAAU,EAAE,MAAM,CAAA;IAClB,cAAc,EAAE,MAAM,CAAA;CACvB;AAOD;;;;;;;GAOG;AACH,wBAAgB,qBAAqB,CAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAE3E;AAED,iFAAiF;AACjF,wBAAgB,oBAAoB,CAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAE1E;AAED,wBAAgB,0BAA0B,CACxC,QAAQ,CAAC,EAAE,yBAAyB,GAAG,KAAK,GAC3C,2BAA2B,GAAG,IAAI,CASpC;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,oBAAoB,CAClC,QAAQ,CAAC,EAAE,yBAAyB,GAAG,KAAK,GAC3C;IAAE,OAAO,EAAE,MAAM,EAAE,CAAA;CAAE,GAAG,IAAI,CAO9B;AAID,wBAAgB,kBAAkB,CAAC,UAAU,EAAE,2BAA2B,GAAG,eAAe,CAW3F"}
@@ -1,5 +1,5 @@
1
1
  import type { OrgAdapter } from '@fayz-ai/core';
2
- import type { AuthAdapter } from '@fayz-ai/core';
2
+ import type { PermissionProfile, AuthAdapter } from '@fayz-ai/core';
3
3
  /** Minimal role identity the adapter needs to build profiles. Grants come from
4
4
  * the DB catalog; id/name/order/description come from what the app declares. */
5
5
  export interface RoleIdentity {
@@ -10,6 +10,17 @@ export interface RoleIdentity {
10
10
  * (duplicated by users, stored in app.roles) are false. Defaults true. */
11
11
  isSystem?: boolean;
12
12
  }
13
+ export declare function buildPermissionProfiles(roles: RoleIdentity[], permissions: Array<{
14
+ id: string;
15
+ category: string;
16
+ }>, rolePerms: Array<{
17
+ role: string;
18
+ permission_id: string;
19
+ }>, overrides: Array<{
20
+ role: string;
21
+ permission_id: string;
22
+ granted: boolean;
23
+ }>): PermissionProfile[];
13
24
  export interface SupabaseOrgAdapterConfig {
14
25
  /** Deprecated — core tables now live in the public schema; this field is ignored. */
15
26
  coreSchema?: string;
@@ -1 +1 @@
1
- {"version":3,"file":"supabase.d.ts","sourceRoot":"","sources":["../../../src/org/adapters/supabase.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,UAAU,EAQX,MAAM,eAAe,CAAA;AACtB,OAAO,KAAK,EAAuC,WAAW,EAAE,MAAM,eAAe,CAAA;AA4JrF;iFACiF;AACjF,MAAM,WAAW,YAAY;IAC3B,EAAE,EAAE,MAAM,CAAA;IACV,IAAI,EAAE,MAAM,CAAA;IACZ,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB;+EAC2E;IAC3E,QAAQ,CAAC,EAAE,OAAO,CAAA;CACnB;AA4ID,MAAM,WAAW,wBAAwB;IACvC,qFAAqF;IACrF,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB;uDACmD;IACnD,KAAK,CAAC,EAAE,YAAY,EAAE,CAAA;IACtB;;gEAE4D;IAC5D,WAAW,CAAC,EAAE,WAAW,CAAA;IACzB;;;;;;4DAMwD;IACxD,OAAO,CAAC,EAAE,MAAM,CAAA;CACjB;AAED,wBAAgB,wBAAwB,CAAC,MAAM,CAAC,EAAE,wBAAwB,GAAG,UAAU,CAggBtF"}
1
+ {"version":3,"file":"supabase.d.ts","sourceRoot":"","sources":["../../../src/org/adapters/supabase.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,UAAU,EAQX,MAAM,eAAe,CAAA;AACtB,OAAO,KAAK,EAAE,iBAAiB,EAAoB,WAAW,EAAE,MAAM,eAAe,CAAA;AA4JrF;iFACiF;AACjF,MAAM,WAAW,YAAY;IAC3B,EAAE,EAAE,MAAM,CAAA;IACV,IAAI,EAAE,MAAM,CAAA;IACZ,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB;+EAC2E;IAC3E,QAAQ,CAAC,EAAE,OAAO,CAAA;CACnB;AA6CD,wBAAgB,uBAAuB,CACrC,KAAK,EAAE,YAAY,EAAE,EACrB,WAAW,EAAE,KAAK,CAAC;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,CAAC,EACpD,SAAS,EAAE,KAAK,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,aAAa,EAAE,MAAM,CAAA;CAAE,CAAC,EACzD,SAAS,EAAE,KAAK,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,aAAa,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,OAAO,CAAA;CAAE,CAAC,GAC1E,iBAAiB,EAAE,CA8FrB;AAMD,MAAM,WAAW,wBAAwB;IACvC,qFAAqF;IACrF,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB;uDACmD;IACnD,KAAK,CAAC,EAAE,YAAY,EAAE,CAAA;IACtB;;gEAE4D;IAC5D,WAAW,CAAC,EAAE,WAAW,CAAA;IACzB;;;;;;4DAMwD;IACxD,OAAO,CAAC,EAAE,MAAM,CAAA;CACjB;AAED,wBAAgB,wBAAwB,CAAC,MAAM,CAAC,EAAE,wBAAwB,GAAG,UAAU,CAggBtF"}
@@ -1 +1 @@
1
- {"version":3,"file":"context.d.ts","sourceRoot":"","sources":["../../src/org/context.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAC9B,OAAO,EAAgB,KAAK,UAAU,EAAE,KAAK,YAAY,EAAE,KAAK,aAAa,EAAE,MAAM,eAAe,CAAA;AAqBpG,wBAAgB,aAAa,IAAI,UAAU,CAM1C;AAED,wBAAgB,qBAAqB,IAAI,UAAU,GAAG,IAAI,CAEzD;AAMD,MAAM,WAAW,aAAa;IAC5B,wCAAwC;IACxC,GAAG,EAAE,YAAY,GAAG,IAAI,CAAA;IACxB,2CAA2C;IAC3C,QAAQ,EAAE,aAAa,EAAE,CAAA;IACzB,OAAO,EAAE,OAAO,CAAA;IAChB;;;;;;;;OAQG;IACH,OAAO,EAAE,OAAO,CAAA;IAChB;;;;;;OAMG;IACH,SAAS,EAAE,OAAO,CAAA;IAClB;;;;;;;;OAQG;IACH,SAAS,EAAE,MAAM,GAAG,IAAI,CAAA;IACxB,wDAAwD;IACxD,SAAS,EAAE,MAAM,IAAI,CAAA;IACrB,4BAA4B;IAC5B,SAAS,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAA;IAC3C,+CAA+C;IAC/C,UAAU,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAA;CAChC;AAID;;;GAGG;AACH,wBAAgB,SAAS,IAAI,aAAa,CAMzC;AAED,wBAAgB,iBAAiB,IAAI,aAAa,GAAG,IAAI,CAExD;AAMD,MAAM,WAAW,gBAAgB;IAC/B,OAAO,EAAE,UAAU,CAAA;IACnB,mEAAmE;IACnE,UAAU,CAAC,EAAE,OAAO,CAAA;IACpB;;;;;OAKG;IACH,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAA;CAC1B;AAKD,wBAAgB,WAAW,CAAC,EAC1B,OAAO,EACP,UAAkB,EAClB,UAA6B,EAC7B,QAAQ,GACT,EAAE,gBAAgB,qBAgVlB"}
1
+ {"version":3,"file":"context.d.ts","sourceRoot":"","sources":["../../src/org/context.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAC9B,OAAO,EAAgB,KAAK,UAAU,EAAE,KAAK,YAAY,EAAE,KAAK,aAAa,EAAE,MAAM,eAAe,CAAA;AAqBpG,wBAAgB,aAAa,IAAI,UAAU,CAM1C;AAED,wBAAgB,qBAAqB,IAAI,UAAU,GAAG,IAAI,CAEzD;AAMD,MAAM,WAAW,aAAa;IAC5B,wCAAwC;IACxC,GAAG,EAAE,YAAY,GAAG,IAAI,CAAA;IACxB,2CAA2C;IAC3C,QAAQ,EAAE,aAAa,EAAE,CAAA;IACzB,OAAO,EAAE,OAAO,CAAA;IAChB;;;;;;;;OAQG;IACH,OAAO,EAAE,OAAO,CAAA;IAChB;;;;;;OAMG;IACH,SAAS,EAAE,OAAO,CAAA;IAClB;;;;;;;;OAQG;IACH,SAAS,EAAE,MAAM,GAAG,IAAI,CAAA;IACxB,wDAAwD;IACxD,SAAS,EAAE,MAAM,IAAI,CAAA;IACrB,4BAA4B;IAC5B,SAAS,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAA;IAC3C,+CAA+C;IAC/C,UAAU,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAA;CAChC;AAID;;;GAGG;AACH,wBAAgB,SAAS,IAAI,aAAa,CAMzC;AAED,wBAAgB,iBAAiB,IAAI,aAAa,GAAG,IAAI,CAExD;AAMD,MAAM,WAAW,gBAAgB;IAC/B,OAAO,EAAE,UAAU,CAAA;IACnB,mEAAmE;IACnE,UAAU,CAAC,EAAE,OAAO,CAAA;IACpB;;;;;OAKG;IACH,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAA;CAC1B;AAKD,wBAAgB,WAAW,CAAC,EAC1B,OAAO,EACP,UAAkB,EAClB,UAA6B,EAC7B,QAAQ,GACT,EAAE,gBAAgB,qBAkVlB"}
package/dist/org/index.js CHANGED
@@ -1,6 +1,6 @@
1
- export { OrgMark, WorkspaceChooser, WorkspaceChooserGate, WorkspaceSwitching, WorkspaceSwitchingHost, createMockOrgAdapter, createSupabaseOrgAdapter, orgInitials, useWorkspaceSwitchingStore } from '../chunk-ZUM3Y7VB.js';
2
- export { ORG_CACHE_TTL_MS, OrgProvider, clearOrgSnapshot, decideWorkspaceChoice, getAutoPick, markWorkspaceSwitch, readOrgSnapshot, setAutoPick, takeWorkspaceSwitch, useOrgAdapter, useOrgAdapterOptional, useTenant, useTenantOptional } from '../chunk-KSUIF56I.js';
1
+ export { OrgMark, WorkspaceChooser, WorkspaceChooserGate, WorkspaceSwitching, WorkspaceSwitchingHost, createMockOrgAdapter, createSupabaseOrgAdapter, orgInitials, useWorkspaceSwitchingStore } from '../chunk-4YF6R7T3.js';
2
+ export { ORG_CACHE_TTL_MS, OrgProvider, clearOrgSnapshot, decideWorkspaceChoice, getAutoPick, markWorkspaceSwitch, readOrgSnapshot, setAutoPick, takeWorkspaceSwitch, useOrgAdapter, useOrgAdapterOptional, useTenant, useTenantOptional } from '../chunk-IDOTNT43.js';
3
3
  import '../chunk-UQ2NTFQC.js';
4
- export { getPersistedOrgId, persistOrgId, useOrganizationStore } from '../chunk-W5IBKM3K.js';
4
+ export { getPersistedOrgId, persistOrgId, useOrganizationStore } from '../chunk-QOS6UAQ4.js';
5
5
  //# sourceMappingURL=index.js.map
6
6
  //# sourceMappingURL=index.js.map
@@ -9,7 +9,23 @@ export interface OrgStore {
9
9
  * the Person-first Team screen; empty = legacy membership-only mode. */
10
10
  teamPersonKinds: string[];
11
11
  loading: boolean;
12
+ /**
13
+ * A conta ativa, e a ESCOLHA que ela representa: persiste o pino.
14
+ *
15
+ * Use quando alguém decidiu — a troca de conta, a resolução do boot. Para
16
+ * apenas PINTAR o que já se sabia, use `paintCurrentOrg`.
17
+ */
12
18
  setCurrentOrg: (org: Organization | null) => void;
19
+ /**
20
+ * Pinta a conta sem gravar o pino.
21
+ *
22
+ * O snapshot repinta a última conta conhecida antes de o primeiro filho
23
+ * renderizar, para ninguém ver um quadro sem org. Isso é CACHE, não
24
+ * decisão — e enquanto ele gravava o pino, vencia o
25
+ * `decideWorkspaceChoice`: quem usa duas contas ficava preso na última que
26
+ * o snapshot viu, e nada escolhido sobrevivia ao boot.
27
+ */
28
+ paintCurrentOrg: (org: Organization | null) => void;
13
29
  setUserOrgs: (orgs: OrgMembership[]) => void;
14
30
  setMembers: (members: OrgMember[]) => void;
15
31
  setTeamPersonKinds: (kinds: string[]) => void;
@@ -1 +1 @@
1
- {"version":3,"file":"store.d.ts","sourceRoot":"","sources":["../../src/org/store.ts"],"names":[],"mappings":"AACA,OAAO,EAAqB,KAAK,YAAY,EAAE,KAAK,SAAS,EAAE,KAAK,aAAa,EAAE,MAAM,eAAe,CAAA;AAQxG,iBAAS,iBAAiB,IAAI,MAAM,GAAG,IAAI,CAO1C;AAED,iBAAS,YAAY,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,GAAG,IAAI,CAWhD;AAMD,MAAM,WAAW,QAAQ;IACvB,UAAU,EAAE,YAAY,GAAG,IAAI,CAAA;IAC/B,QAAQ,EAAE,aAAa,EAAE,CAAA;IACzB,OAAO,EAAE,SAAS,EAAE,CAAA;IACpB;6EACyE;IACzE,eAAe,EAAE,MAAM,EAAE,CAAA;IACzB,OAAO,EAAE,OAAO,CAAA;IAEhB,aAAa,EAAE,CAAC,GAAG,EAAE,YAAY,GAAG,IAAI,KAAK,IAAI,CAAA;IACjD,WAAW,EAAE,CAAC,IAAI,EAAE,aAAa,EAAE,KAAK,IAAI,CAAA;IAC5C,UAAU,EAAE,CAAC,OAAO,EAAE,SAAS,EAAE,KAAK,IAAI,CAAA;IAC1C,kBAAkB,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,IAAI,CAAA;IAC7C,UAAU,EAAE,CAAC,OAAO,EAAE,OAAO,KAAK,IAAI,CAAA;IACtC,KAAK,EAAE,MAAM,IAAI,CAAA;CAClB;AAED,eAAO,MAAM,oBAAoB,uEA6B9B,CAAA;AAEH,OAAO,EAAE,iBAAiB,EAAE,YAAY,EAAE,CAAA"}
1
+ {"version":3,"file":"store.d.ts","sourceRoot":"","sources":["../../src/org/store.ts"],"names":[],"mappings":"AACA,OAAO,EAAqB,KAAK,YAAY,EAAE,KAAK,SAAS,EAAE,KAAK,aAAa,EAAE,MAAM,eAAe,CAAA;AAQxG,iBAAS,iBAAiB,IAAI,MAAM,GAAG,IAAI,CAO1C;AAED,iBAAS,YAAY,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,GAAG,IAAI,CAWhD;AAMD,MAAM,WAAW,QAAQ;IACvB,UAAU,EAAE,YAAY,GAAG,IAAI,CAAA;IAC/B,QAAQ,EAAE,aAAa,EAAE,CAAA;IACzB,OAAO,EAAE,SAAS,EAAE,CAAA;IACpB;6EACyE;IACzE,eAAe,EAAE,MAAM,EAAE,CAAA;IACzB,OAAO,EAAE,OAAO,CAAA;IAEhB;;;;;OAKG;IACH,aAAa,EAAE,CAAC,GAAG,EAAE,YAAY,GAAG,IAAI,KAAK,IAAI,CAAA;IACjD;;;;;;;;OAQG;IACH,eAAe,EAAE,CAAC,GAAG,EAAE,YAAY,GAAG,IAAI,KAAK,IAAI,CAAA;IACnD,WAAW,EAAE,CAAC,IAAI,EAAE,aAAa,EAAE,KAAK,IAAI,CAAA;IAC5C,UAAU,EAAE,CAAC,OAAO,EAAE,SAAS,EAAE,KAAK,IAAI,CAAA;IAC1C,kBAAkB,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,IAAI,CAAA;IAC7C,UAAU,EAAE,CAAC,OAAO,EAAE,OAAO,KAAK,IAAI,CAAA;IACtC,KAAK,EAAE,MAAM,IAAI,CAAA;CAClB;AAED,eAAO,MAAM,oBAAoB,uEAmC9B,CAAA;AAEH,OAAO,EAAE,iBAAiB,EAAE,YAAY,EAAE,CAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"light.d.ts","sourceRoot":"","sources":["../../src/theme/light.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,UAAU,CAAA;AAK3C,eAAO,MAAM,UAAU,EAAE,WA6DxB,CAAA"}
1
+ {"version":3,"file":"light.d.ts","sourceRoot":"","sources":["../../src/theme/light.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,UAAU,CAAA;AAK3C,eAAO,MAAM,UAAU,EAAE,WAiExB,CAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../src/theme/utils.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,WAAW,EACX,cAAc,EACd,kBAAkB,EAClB,SAAS,EAIV,MAAM,UAAU,CAAA;AAqCjB,MAAM,WAAW,kBAAkB;IACjC,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,MAAM,CAAC,EAAE,OAAO,CAAC,cAAc,CAAC,CAAA;IAChC,gFAAgF;IAChF,UAAU,CAAC,EAAE,OAAO,CAAC,cAAc,CAAC,CAAA;IACpC,UAAU,CAAC,EAAE,OAAO,CAAC,kBAAkB,CAAC,CAAA;IACxC,8EAA8E;IAC9E,KAAK,CAAC,EAAE,MAAM,CAAA;CACf;AAED;;;;;;GAMG;AACH,wBAAgB,WAAW,CAAC,KAAK,EAAE,SAAS,GAAG,kBAAkB,GAAG,KAAK,IAAI,SAAS,CAGrF;AA+BD;;;;;;;GAOG;AACH,wBAAgB,YAAY,CAAC,KAAK,EAAE,SAAS,GAAG,kBAAkB,CA8FjE;AAED,wBAAgB,WAAW,CAAC,SAAS,EAAE,kBAAkB,GAAG,WAAW,CA2BtE;AAoGD,wBAAgB,UAAU,CAAC,KAAK,EAAE,WAAW,EAAE,OAAO,CAAC,EAAE,WAAW,GAAG,IAAI,CAoB1E;AAED,wBAAgB,mBAAmB,IAAI,OAAO,GAAG,MAAM,CAGtD;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,eAAe,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CA4B1D"}
1
+ {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../src/theme/utils.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,WAAW,EACX,cAAc,EACd,kBAAkB,EAClB,SAAS,EAIV,MAAM,UAAU,CAAA;AAqCjB,MAAM,WAAW,kBAAkB;IACjC,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,MAAM,CAAC,EAAE,OAAO,CAAC,cAAc,CAAC,CAAA;IAChC,gFAAgF;IAChF,UAAU,CAAC,EAAE,OAAO,CAAC,cAAc,CAAC,CAAA;IACpC,UAAU,CAAC,EAAE,OAAO,CAAC,kBAAkB,CAAC,CAAA;IACxC,8EAA8E;IAC9E,KAAK,CAAC,EAAE,MAAM,CAAA;CACf;AAED;;;;;;GAMG;AACH,wBAAgB,WAAW,CAAC,KAAK,EAAE,SAAS,GAAG,kBAAkB,GAAG,KAAK,IAAI,SAAS,CAGrF;AA8ED;;;;;;;GAOG;AACH,wBAAgB,YAAY,CAAC,KAAK,EAAE,SAAS,GAAG,kBAAkB,CA+GjE;AAED,wBAAgB,WAAW,CAAC,SAAS,EAAE,kBAAkB,GAAG,WAAW,CA2BtE;AAoGD,wBAAgB,UAAU,CAAC,KAAK,EAAE,WAAW,EAAE,OAAO,CAAC,EAAE,WAAW,GAAG,IAAI,CAoB1E;AAED,wBAAgB,mBAAmB,IAAI,OAAO,GAAG,MAAM,CAGtD;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,eAAe,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CA4B1D"}
@@ -1 +1 @@
1
- {"version":3,"file":"PersonTimeline.d.ts","sourceRoot":"","sources":["../../src/timeline/PersonTimeline.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAmB,MAAM,OAAO,CAAA;AAmJvC;;;;;;GAMG;AACH,wBAAgB,cAAc,CAAC,EAC7B,QAAQ,EACR,QAAQ,EACR,UAAU,GACX,EAAE;IACD,QAAQ,EAAE,MAAM,CAAA;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB;;;;;;OAMG;IACH,UAAU,CAAC,EAAE,MAAM,CAAA;CACpB,qBA8FA"}
1
+ {"version":3,"file":"PersonTimeline.d.ts","sourceRoot":"","sources":["../../src/timeline/PersonTimeline.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAmB,MAAM,OAAO,CAAA;AAMvC;;;;;;GAMG;AACH,wBAAgB,cAAc,CAAC,EAC7B,QAAQ,EACR,QAAQ,EACR,UAAU,GACX,EAAE;IACD,QAAQ,EAAE,MAAM,CAAA;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB;;;;;;OAMG;IACH,UAAU,CAAC,EAAE,MAAM,CAAA;CACpB,qBAwFA"}
@@ -0,0 +1,32 @@
1
+ import React from 'react';
2
+ import type { TimelineItem, TimelineTone } from './types';
3
+ declare function TimelineSkeleton(): React.JSX.Element;
4
+ /**
5
+ * A lista: trilho, bolha e cartão, do jeito que a ficha inteira mostra
6
+ * histórico.
7
+ *
8
+ * `renderActions` é a única costura que a aba Registros precisou: ver e
9
+ * arquivar um documento são verbos DAQUELA aba, e a Atividade — que é leitura —
10
+ * não tem nenhum.
11
+ */
12
+ export declare function TimelineList({ items, toneFor, hrefFor, onSelect, renderActions, renderPreview, expandedIds, }: {
13
+ items: TimelineItem[];
14
+ /** Tom da bolha quando o item não declara o seu. */
15
+ toneFor?: (item: TimelineItem) => TimelineTone;
16
+ hrefFor?: (item: TimelineItem) => string | undefined;
17
+ /** Clique no cartão quando ele não é um link — o caso da aba Registros, que
18
+ * abre o documento na própria aba em vez de navegar. */
19
+ onSelect?: (item: TimelineItem) => void;
20
+ renderActions?: (item: TimelineItem) => React.ReactNode;
21
+ /**
22
+ * O conteúdo do item, aberto dentro do cartão — para ler sem clicar.
23
+ *
24
+ * Só é chamado para o que `expandedIds` mandar abrir: montar o corpo de cem
25
+ * formulários para esconder noventa e nove custa a rolagem inteira.
26
+ */
27
+ renderPreview?: (item: TimelineItem) => React.ReactNode;
28
+ /** Quais itens estão abertos. Ausente = nenhum. */
29
+ expandedIds?: ReadonlySet<string>;
30
+ }): React.JSX.Element;
31
+ export { TimelineSkeleton };
32
+ //# sourceMappingURL=TimelineList.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TimelineList.d.ts","sourceRoot":"","sources":["../../src/timeline/TimelineList.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAA;AAKzB,OAAO,KAAK,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,SAAS,CAAA;AAwEzD,iBAAS,gBAAgB,sBAyBxB;AA2GD;;;;;;;GAOG;AACH,wBAAgB,YAAY,CAAC,EAC3B,KAAK,EACL,OAAO,EACP,OAAO,EACP,QAAQ,EACR,aAAa,EACb,aAAa,EACb,WAAW,GACZ,EAAE;IACD,KAAK,EAAE,YAAY,EAAE,CAAA;IACrB,oDAAoD;IACpD,OAAO,CAAC,EAAE,CAAC,IAAI,EAAE,YAAY,KAAK,YAAY,CAAA;IAC9C,OAAO,CAAC,EAAE,CAAC,IAAI,EAAE,YAAY,KAAK,MAAM,GAAG,SAAS,CAAA;IACpD;6DACyD;IACzD,QAAQ,CAAC,EAAE,CAAC,IAAI,EAAE,YAAY,KAAK,IAAI,CAAA;IACvC,aAAa,CAAC,EAAE,CAAC,IAAI,EAAE,YAAY,KAAK,KAAK,CAAC,SAAS,CAAA;IACvD;;;;;OAKG;IACH,aAAa,CAAC,EAAE,CAAC,IAAI,EAAE,YAAY,KAAK,KAAK,CAAC,SAAS,CAAA;IACvD,mDAAmD;IACnD,WAAW,CAAC,EAAE,WAAW,CAAC,MAAM,CAAC,CAAA;CAClC,qBAoBA;AAED,OAAO,EAAE,gBAAgB,EAAE,CAAA"}
@@ -1,6 +1,7 @@
1
1
  import './core-sources';
2
2
  export { PersonTimeline } from './PersonTimeline';
3
+ export { TimelineList, TimelineSkeleton } from './TimelineList';
3
4
  export { usePersonTimeline } from './usePersonTimeline';
4
5
  export { registerTimelineSource, unregisterTimelineSource, getTimelineSources } from './registry';
5
- export type { TimelineItem, TimelineSource, TimelineFetchArgs } from './types';
6
+ export type { TimelineItem, TimelineSource, TimelineFetchArgs, TimelineTone } from './types';
6
7
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/timeline/index.ts"],"names":[],"mappings":"AACA,OAAO,gBAAgB,CAAA;AAEvB,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAA;AACjD,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAA;AACvD,OAAO,EAAE,sBAAsB,EAAE,wBAAwB,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAA;AACjG,YAAY,EAAE,YAAY,EAAE,cAAc,EAAE,iBAAiB,EAAE,MAAM,SAAS,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/timeline/index.ts"],"names":[],"mappings":"AACA,OAAO,gBAAgB,CAAA;AAEvB,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAA;AAGjD,OAAO,EAAE,YAAY,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAA;AAC/D,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAA;AACvD,OAAO,EAAE,sBAAsB,EAAE,wBAAwB,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAA;AACjG,YAAY,EAAE,YAAY,EAAE,cAAc,EAAE,iBAAiB,EAAE,YAAY,EAAE,MAAM,SAAS,CAAA"}
@@ -0,0 +1,3 @@
1
+ export { PersonTimeline, TimelineList, TimelineSkeleton, getTimelineSources, registerTimelineSource, unregisterTimelineSource, usePersonTimeline } from './chunk-WXNTUCX3.js';
2
+ //# sourceMappingURL=timeline-LECYQ4IA.js.map
3
+ //# sourceMappingURL=timeline-LECYQ4IA.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"names":[],"mappings":"","file":"timeline-LECYQ4IA.js"}
@@ -1,6 +1,12 @@
1
1
  import type React from 'react';
2
2
  import type { EntityArchetype } from './entities';
3
3
  export type FieldType = 'text' | 'email' | 'phone' | 'url' | 'image' | 'number' | 'currency' | 'select' | 'multiselect' | 'segmented' | 'relation' | 'date' | 'datetime' | 'time' | 'boolean' | 'textarea' | 'markdown' | 'color' | 'computed'
4
+ /** O endereço inteiro num campo só, gravado em `public.addresses`. */
5
+ | 'address'
6
+ /** Conta e PIX de quem a casa paga, gravados em `public.payee_accounts`. */
7
+ | 'bank'
8
+ /** Etiquetas livres: quem cadastra inventa ao digitar. */
9
+ | 'tags'
4
10
  /** Escape hatch: the field supplies its own input via `renderInput`. */
5
11
  | 'custom';
6
12
  /** Foreign-key source for a `relation` field (options loaded from a table). */
@@ -109,6 +115,10 @@ export interface EntityDef<T = Record<string, any>> {
109
115
  fields: FieldDef[];
110
116
  /** Named groups for organizing fields in forms and detail views */
111
117
  fieldGroups?: FieldGroup[];
118
+ /** O que desenhar no lugar da foto, no alto da ficha. */
119
+ renderAvatar?: (item: any) => React.ReactNode;
120
+ /** A lixeira de um cadastro DESLIGA; ela não apaga. Ver EntityDef.deleteMode. */
121
+ deleteMode?: 'soft' | 'hard';
112
122
  /** Custom tabs on the detail page (in addition to Overview) */
113
123
  detailTabs?: DetailTab[];
114
124
  data?: {
@@ -123,8 +133,9 @@ export interface EntityDef<T = Record<string, any>> {
123
133
  archetype?: EntityArchetype;
124
134
  /** The `kind` discriminator value for the archetype table */
125
135
  archetypeKind?: string;
126
- /** Static filters applied to all queries (e.g. { kind: 'supplier' }) */
127
- filters?: Record<string, string>;
136
+ /** Recorte FIXO da entidade sobre a tabela; uma lista vira `IN`. Ver
137
+ * `@fayz-ai/core` types/crud. */
138
+ filters?: Record<string, string | string[]>;
128
139
  /** Default values merged into every create payload */
129
140
  defaults?: Record<string, unknown>;
130
141
  /** Cache TTL in ms for list queries (default: 60 000 — 1 minute) */
@@ -1 +1 @@
1
- {"version":3,"file":"crud.d.ts","sourceRoot":"","sources":["../../src/types/crud.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"crud.d.ts","sourceRoot":"","sources":["../../src/types/crud.ts"],"names":[],"mappings":"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"}
@@ -10,6 +10,8 @@ export { UnitPickerDialog } from './UnitPickerDialog';
10
10
  export { useUnitPickerStore, openUnitPicker } from './picker.store';
11
11
  export { UnitMenuSection, UnitIndicator } from './UnitMenuSection';
12
12
  export { useUnitBootstrap } from './useUnitBootstrap';
13
+ export { useUnitFilter } from './useUnitFilter';
14
+ export type { UnitFilter, UnitFilterOption } from './useUnitFilter';
13
15
  export { UnitsSettingsPage } from './UnitsSettingsPage';
14
16
  export { UnitModeCard } from './UnitModeCard';
15
17
  export { MemberAccessRailPage, useMemberAccessPanel } from './MemberAccessRailPage';
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/units/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAA;AACtC,YAAY,EAAE,QAAQ,EAAE,eAAe,EAAE,MAAM,SAAS,CAAA;AACxD,OAAO,EAAE,WAAW,EAAE,MAAM,UAAU,CAAA;AACtC,OAAO,EAAE,eAAe,EAAE,eAAe,EAAE,MAAM,OAAO,CAAA;AACxD,OAAO,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,MAAM,SAAS,CAAA;AAC7D,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAA;AAC7C,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAA;AACvD,OAAO,EAAE,qBAAqB,EAAE,MAAM,mBAAmB,CAAA;AACzD,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAA;AACrD,OAAO,EAAE,kBAAkB,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAA;AACnE,OAAO,EAAE,eAAe,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAA;AAClE,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAA;AACrD,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAA;AACvD,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAA;AAC7C,OAAO,EAAE,oBAAoB,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAA;AACnF,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAA;AACjD,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAA;AACjD,OAAO,EAAE,eAAe,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAA;AAClE,OAAO,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAA;AAC3D,OAAO,EACL,UAAU,EAAE,eAAe,EAAE,gBAAgB,EAAE,gBAAgB,EAC/D,cAAc,EAAE,kBAAkB,EAClC,aAAa,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,mBAAmB,EACvE,oBAAoB,EAAE,oBAAoB,EAAE,mBAAmB,EAC/D,kBAAkB,EAAE,aAAa,GAClC,MAAM,QAAQ,CAAA;AACf,YAAY,EAAE,IAAI,EAAE,WAAW,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,QAAQ,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/units/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAA;AACtC,YAAY,EAAE,QAAQ,EAAE,eAAe,EAAE,MAAM,SAAS,CAAA;AACxD,OAAO,EAAE,WAAW,EAAE,MAAM,UAAU,CAAA;AACtC,OAAO,EAAE,eAAe,EAAE,eAAe,EAAE,MAAM,OAAO,CAAA;AACxD,OAAO,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,MAAM,SAAS,CAAA;AAC7D,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAA;AAC7C,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAA;AACvD,OAAO,EAAE,qBAAqB,EAAE,MAAM,mBAAmB,CAAA;AACzD,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAA;AACrD,OAAO,EAAE,kBAAkB,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAA;AACnE,OAAO,EAAE,eAAe,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAA;AAClE,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAA;AACrD,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAA;AAC/C,YAAY,EAAE,UAAU,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAA;AACnE,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAA;AACvD,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAA;AAC7C,OAAO,EAAE,oBAAoB,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAA;AACnF,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAA;AACjD,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAA;AACjD,OAAO,EAAE,eAAe,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAA;AAClE,OAAO,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAA;AAC3D,OAAO,EACL,UAAU,EAAE,eAAe,EAAE,gBAAgB,EAAE,gBAAgB,EAC/D,cAAc,EAAE,kBAAkB,EAClC,aAAa,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,mBAAmB,EACvE,oBAAoB,EAAE,oBAAoB,EAAE,mBAAmB,EAC/D,kBAAkB,EAAE,aAAa,GAClC,MAAM,QAAQ,CAAA;AACf,YAAY,EAAE,IAAI,EAAE,WAAW,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,QAAQ,CAAA"}
@@ -0,0 +1,46 @@
1
+ import type { ListFilterDef } from '@fayz-ai/ui';
2
+ import type { Unit } from './data';
3
+ export interface UnitFilterOption {
4
+ id: string;
5
+ name: string;
6
+ }
7
+ export interface UnitFilter {
8
+ /** False when the tenant has no unit mode, or the person reaches one unit or
9
+ * none: a filter with a single option is a control that lies. */
10
+ visible: boolean;
11
+ /** `undefined` = every unit the person reaches (never the whole tenant: the
12
+ * database fences the rest). */
13
+ value: string | undefined;
14
+ setValue: (unitId: string | undefined) => void;
15
+ options: UnitFilterOption[];
16
+ label: string;
17
+ allLabel: string;
18
+ /** Ready for `ListFilterBar.filters`; null when not `visible`. */
19
+ def: ListFilterDef | null;
20
+ }
21
+ /** The units a person may pick: the ones they reach, branches only (a region
22
+ * is a grouping, not somewhere rows live), active, by name. Same fallback as
23
+ * the switcher when the pool predates per-person reach. */
24
+ export declare function unitFilterOptions(units: Unit[], myUnitIds: string[]): UnitFilterOption[];
25
+ /** A unit the person no longer reaches falls back to "all of mine" rather
26
+ * than an empty list that reads as missing data. */
27
+ export declare function standableUnit(raw: string | undefined, options: UnitFilterOption[]): string | undefined;
28
+ export declare function unitFilterVisible(unitMode: boolean, options: UnitFilterOption[]): boolean;
29
+ /**
30
+ * The "Unidade" filter every list shows under unit mode.
31
+ *
32
+ * - `scope: 'list'` (default) — the V1 behaviour: the list starts on the unit
33
+ * the person is standing in, can be pointed at another reachable unit or at
34
+ * all of them, and snaps back when the active unit changes. The caller
35
+ * narrows its own query with `value`.
36
+ * - `scope: 'global'` — for lists whose provider already narrows by the active
37
+ * unit (the generic CRUD): picking here switches the active unit itself.
38
+ *
39
+ * Options are only the units the person reaches. This narrows, it never
40
+ * grants: RLS decides what is readable, so a stale or forged value can hide
41
+ * rows, never reveal one.
42
+ */
43
+ export declare function useUnitFilter(options?: {
44
+ scope?: 'list' | 'global';
45
+ }): UnitFilter;
46
+ //# sourceMappingURL=useUnitFilter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useUnitFilter.d.ts","sourceRoot":"","sources":["../../src/units/useUnitFilter.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAA;AAEhD,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,QAAQ,CAAA;AAKlC,MAAM,WAAW,gBAAgB;IAC/B,EAAE,EAAE,MAAM,CAAA;IACV,IAAI,EAAE,MAAM,CAAA;CACb;AAED,MAAM,WAAW,UAAU;IACzB;sEACkE;IAClE,OAAO,EAAE,OAAO,CAAA;IAChB;qCACiC;IACjC,KAAK,EAAE,MAAM,GAAG,SAAS,CAAA;IACzB,QAAQ,EAAE,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,KAAK,IAAI,CAAA;IAC9C,OAAO,EAAE,gBAAgB,EAAE,CAAA;IAC3B,KAAK,EAAE,MAAM,CAAA;IACb,QAAQ,EAAE,MAAM,CAAA;IAChB,kEAAkE;IAClE,GAAG,EAAE,aAAa,GAAG,IAAI,CAAA;CAC1B;AAOD;;4DAE4D;AAC5D,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE,SAAS,EAAE,MAAM,EAAE,GAAG,gBAAgB,EAAE,CAQxF;AAED;qDACqD;AACrD,wBAAgB,aAAa,CAAC,GAAG,EAAE,MAAM,GAAG,SAAS,EAAE,OAAO,EAAE,gBAAgB,EAAE,GAAG,MAAM,GAAG,SAAS,CAEtG;AAED,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,OAAO,EAAE,OAAO,EAAE,gBAAgB,EAAE,GAAG,OAAO,CAEzF;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAgB,aAAa,CAAC,OAAO,GAAE;IAAE,KAAK,CAAC,EAAE,MAAM,GAAG,QAAQ,CAAA;CAAO,GAAG,UAAU,CA+CrF"}
package/package.json CHANGED
@@ -3,7 +3,7 @@
3
3
  "fayz": {
4
4
  "status": "beta"
5
5
  },
6
- "version": "0.30.3",
6
+ "version": "0.33.0",
7
7
  "description": "Fayz SDK admin layer — the admin shell, CRUD engine, multi-tenancy, billing, permissions and org management",
8
8
  "type": "module",
9
9
  "sideEffects": [
@@ -59,12 +59,12 @@
59
59
  "@radix-ui/react-dialog": "^1.1.0",
60
60
  "@tanstack/react-table": "^8.20.0",
61
61
  "cmdk": "^1.0.0",
62
- "@fayz-ai/auth": "^0.30.0",
63
- "@fayz-ai/core": "^0.30.3",
64
- "@fayz-ai/db": "^0.18.2",
65
- "@fayz-ai/plugin-auth": "^0.12.10",
62
+ "@fayz-ai/auth": "^0.33.0",
63
+ "@fayz-ai/core": "^0.33.0",
64
+ "@fayz-ai/db": "^0.20.0",
65
+ "@fayz-ai/plugin-auth": "^0.12.13",
66
66
  "@fayz-ai/sdk": "^0.30.1",
67
- "@fayz-ai/ui": "^0.30.3"
67
+ "@fayz-ai/ui": "^0.33.0"
68
68
  },
69
69
  "devDependencies": {
70
70
  "@supabase/supabase-js": "^2.45.0",
@@ -1,7 +0,0 @@
1
- export { ScheduleEditor } from './chunk-XDYY5PLH.js';
2
- import './chunk-ZUM3Y7VB.js';
3
- import './chunk-KSUIF56I.js';
4
- import './chunk-UQ2NTFQC.js';
5
- import './chunk-W5IBKM3K.js';
6
- //# sourceMappingURL=ScheduleEditor-YE42HL7P.js.map
7
- //# sourceMappingURL=ScheduleEditor-YE42HL7P.js.map
@@ -1,9 +0,0 @@
1
- export { SubscriptionPage } from './chunk-U6LV4GIH.js';
2
- import './chunk-YUHCC7JY.js';
3
- import './chunk-ZOUIXHKI.js';
4
- import './chunk-VX3WJLKK.js';
5
- import './chunk-KSUIF56I.js';
6
- import './chunk-UQ2NTFQC.js';
7
- import './chunk-W5IBKM3K.js';
8
- //# sourceMappingURL=SubscriptionPage-TVAEOFNC.js.map
9
- //# sourceMappingURL=SubscriptionPage-TVAEOFNC.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/org/choice.ts","../src/org/cache.ts","../src/org/context.tsx"],"names":[],"mappings":"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","file":"chunk-KSUIF56I.js","sourcesContent":["import type { OrgMembership } from '@fayz-ai/core'\n\n/**\n * Which workspace this account lands in, when it belongs to more than one.\n *\n * The provider used to answer this by itself — `handoff ?? pinned ?? first` —\n * and that last fallback is a guess with no way to correct it: an account in\n * seven workspaces opened whichever one sorted first and never learnt that the\n * other six existed. The rule below keeps every branch that IS an answer and\n * hands the remaining case to the person, once.\n */\n\nconst AUTOPICK_KEY = 'fayz:workspace-autopick'\n\n/**\n * The workspace a switch already committed to, surviving exactly one reload.\n *\n * Changing workspace ends in a full page reload — the only way to guarantee\n * that every plugin store, cache and open screen is rebuilt against the new\n * tenant instead of showing the previous one's rows. That reload comes back\n * through the same boot path as a fresh login, so without this marker the\n * picker would open and ask a question the user answered one second ago.\n *\n * sessionStorage, not local: it is about THIS navigation, and a tab opened\n * tomorrow should ask again.\n */\nconst SWITCHING_KEY = 'fayz:workspace-switching'\n\n/** Records the destination, for the boot that happens after the reload. */\nexport function markWorkspaceSwitch(orgId: string): void {\n try {\n if (typeof sessionStorage === 'undefined') return\n sessionStorage.setItem(SWITCHING_KEY, orgId)\n } catch {\n // ignore\n }\n}\n\n/** Reads the destination and consumes it — it is good for one boot only. */\nexport function takeWorkspaceSwitch(): string | null {\n try {\n if (typeof sessionStorage === 'undefined') return null\n const v = sessionStorage.getItem(SWITCHING_KEY)\n if (v) sessionStorage.removeItem(SWITCHING_KEY)\n return v\n } catch {\n return null\n }\n}\n\n/** Whether the last explicit choice stands in for every future login. */\nexport function getAutoPick(): boolean {\n try {\n if (typeof localStorage === 'undefined') return false\n return localStorage.getItem(AUTOPICK_KEY) === '1'\n } catch {\n return false\n }\n}\n\nexport function setAutoPick(on: boolean): void {\n try {\n if (typeof localStorage === 'undefined') return\n if (on) localStorage.setItem(AUTOPICK_KEY, '1')\n else localStorage.removeItem(AUTOPICK_KEY)\n } catch {\n // ignore\n }\n}\n\nexport interface WorkspaceChoiceInput {\n /** Every workspace this account belongs to, as the membership list read it. */\n memberships: OrgMembership[]\n /** A switch that is completing across a reload — already answered, once. */\n switchingToId?: string | null\n /** A sibling app's switcher named a workspace on the way in (008). */\n handoffId: string | null\n /** `fayz:current-org` — the last workspace this browser was in. */\n pinnedId: string | null\n /** \"Não perguntar novamente\" is on for this browser. */\n autoPick: boolean\n}\n\nexport type WorkspaceChoice =\n /** Open this one without asking. */\n | { kind: 'resolved'; orgId: string }\n /** Put the picker on screen; `suggestedId` is the row to pre-select. */\n | { kind: 'ask'; suggestedId: string | null }\n /** No workspace at all — the first-run setup flow's business, not ours. */\n | { kind: 'none' }\n\n/**\n * The decision, as a function, so the one piece of logic that decides what a\n * multi-workspace account sees after login can be tested without a browser.\n */\nexport function decideWorkspaceChoice({\n memberships,\n switchingToId = null,\n handoffId,\n pinnedId,\n autoPick,\n}: WorkspaceChoiceInput): WorkspaceChoice {\n if (memberships.length === 0) return { kind: 'none' }\n\n const has = (id: string | null): string | null =>\n id && memberships.some((m) => m.orgId === id) ? id : null\n\n // The freshest answer there is: this reload IS the switch completing.\n const switching = has(switchingToId)\n if (switching) return { kind: 'resolved', orgId: switching }\n\n // A handoff is somebody clicking a specific account in a sibling app's\n // switcher one second ago. That is a fresher answer than anything stored\n // here, and asking again would be asking a question already answered.\n const handoff = has(handoffId)\n if (handoff) return { kind: 'resolved', orgId: handoff }\n\n // One workspace is not a choice.\n if (memberships.length === 1) return { kind: 'resolved', orgId: memberships[0]!.orgId }\n\n // The pin is a HINT, always re-validated against the list we just read: a\n // workspace someone was removed from falls through to the question instead of\n // opening an account they can no longer see.\n const pinned = has(pinnedId)\n if (pinned && autoPick) return { kind: 'resolved', orgId: pinned }\n\n return { kind: 'ask', suggestedId: pinned }\n}\n","import type { Organization, OrgMember, OrgMembership, PermissionProfile } from '@fayz-ai/core'\n\n/**\n * Snapshot of the org bootstrap (org + memberships + members + permission\n * profiles) so a page reload doesn't wait on the whole chain again.\n *\n * Every mount used to pay `acceptPendingInvites → listUserOrgs → getOrg →\n * listMembers + listProfiles` before `org.id` existed, and every screen keyed\n * off the tenant (Conectores, plugin tabs, permission gates) sat idle until\n * then. The snapshot paints that state synchronously and the network is only\n * touched again once it goes stale.\n */\n\nconst STORAGE_KEY = 'fayz:org-snapshot'\nconst VERSION = 1\n\n/** Served without touching the network. */\nexport const ORG_CACHE_TTL_MS = 5 * 60 * 1000\n/** Older than this and the snapshot is dropped instead of painted. */\nconst MAX_AGE_MS = 24 * 60 * 60 * 1000\n/** Bigger than this (huge member lists) and we skip persisting rather than blow the quota. */\nconst MAX_BYTES = 512 * 1024\n\nexport interface OrgSnapshot {\n version: number\n /** Who the snapshot belongs to — a different user gets a cold load. */\n userId: string\n /** When the data last came from the server (store patches don't move it). */\n savedAt: number\n org: Organization\n userOrgs: OrgMembership[]\n members: OrgMember[]\n profiles: PermissionProfile[]\n currentProfileId: string | null\n}\n\nexport type OrgSnapshotInput = Omit<OrgSnapshot, 'version' | 'savedAt'>\n\nfunction storage(): Storage | null {\n try {\n if (typeof localStorage === 'undefined') return null\n return localStorage\n } catch {\n return null\n }\n}\n\nexport function readOrgSnapshot(): OrgSnapshot | null {\n const store = storage()\n if (!store) return null\n try {\n const raw = store.getItem(STORAGE_KEY)\n if (!raw) return null\n const snapshot = JSON.parse(raw) as OrgSnapshot\n if (snapshot?.version !== VERSION || !snapshot.org?.id || !snapshot.userId) return null\n if (snapshotAge(snapshot) > MAX_AGE_MS) {\n store.removeItem(STORAGE_KEY)\n return null\n }\n return snapshot\n } catch {\n return null\n }\n}\n\nexport function snapshotAge(snapshot: OrgSnapshot): number {\n const age = Date.now() - snapshot.savedAt\n // A clock that moved backwards shouldn't hand out an eternally fresh cache.\n return age < 0 ? Number.POSITIVE_INFINITY : age\n}\n\nexport function isSnapshotFresh(snapshot: OrgSnapshot, ttlMs: number): boolean {\n return snapshotAge(snapshot) < ttlMs\n}\n\n/** Record a fresh server read — restarts the TTL window. */\nexport function saveOrgSnapshot(input: OrgSnapshotInput): void {\n write({ ...input, version: VERSION, savedAt: Date.now() })\n}\n\n/**\n * Keep the snapshot in step with store writes made outside the provider\n * (renaming the org in Settings, editing a role) WITHOUT restarting the TTL —\n * otherwise a UI-only change would push the next revalidation out forever.\n */\nexport function patchOrgSnapshot(input: OrgSnapshotInput): void {\n const current = readOrgSnapshot()\n if (!current || current.userId !== input.userId) return\n write({ ...input, version: VERSION, savedAt: current.savedAt })\n}\n\nexport function clearOrgSnapshot(): void {\n try {\n storage()?.removeItem(STORAGE_KEY)\n } catch {\n // ignore\n }\n}\n\nfunction write(snapshot: OrgSnapshot): void {\n const store = storage()\n if (!store) return\n try {\n const raw = JSON.stringify(snapshot)\n if (raw.length > MAX_BYTES) return\n store.setItem(STORAGE_KEY, raw)\n } catch {\n // Quota or serialization failure — the cache is an optimization, not state.\n }\n}\n","import * as React from 'react'\nimport { errorMessage, type OrgAdapter, type Organization, type OrgMembership } from '@fayz-ai/core'\nimport { useAuthStore, readAppHandoff } from '@fayz-ai/auth'\nimport { useOrganizationStore, getPersistedOrgId } from './store'\nimport { decideWorkspaceChoice, getAutoPick, takeWorkspaceSwitch } from './choice'\nimport { usePermissionsStore } from '../permissions'\nimport {\n ORG_CACHE_TTL_MS,\n clearOrgSnapshot,\n isSnapshotFresh,\n patchOrgSnapshot,\n readOrgSnapshot,\n saveOrgSnapshot,\n type OrgSnapshot,\n} from './cache'\n\n// ---------------------------------------------------------------------------\n// Adapter context\n// ---------------------------------------------------------------------------\n\nconst OrgAdapterContext = React.createContext<OrgAdapter | null>(null)\n\nexport function useOrgAdapter(): OrgAdapter {\n const adapter = React.useContext(OrgAdapterContext)\n if (!adapter) {\n throw new Error('useOrgAdapter must be used within an <OrgProvider>')\n }\n return adapter\n}\n\nexport function useOrgAdapterOptional(): OrgAdapter | null {\n return React.useContext(OrgAdapterContext)\n}\n\n// ---------------------------------------------------------------------------\n// Tenant / org hook\n// ---------------------------------------------------------------------------\n\nexport interface TenantContext {\n /** The currently active organization */\n org: Organization | null\n /** All orgs the current user belongs to */\n userOrgs: OrgMembership[]\n loading: boolean\n /**\n * The bootstrap has finished at least once, so `org === null` now MEANS\n * \"belongs to no workspace\" instead of \"we have not looked yet\".\n *\n * `loading` cannot answer that: it starts `false`, before the effect that\n * loads anything has run. Anything deciding what to render from an empty org\n * — the setup gate — reads this, or it decides during the gap and flips its\n * mind a frame later.\n */\n settled: boolean\n /**\n * The membership list was actually READ for this account, and answered.\n *\n * Distinct from `settled`, which only says the wait is over — it is set in a\n * `finally`, so a failed `listUserOrgs` settles too. Anything that treats\n * \"no orgs\" as a FACT (the first-run setup gate) has to ask this instead.\n */\n orgsKnown: boolean\n /**\n * A leitura das contas FALHOU — e falhou é diferente de \"não tem nenhuma\".\n *\n * `orgsKnown: false` já dizia \"não sabemos\", mas dizia isso também no\n * instante antes de saber, então ninguém podia agir nele. Sem esta mensagem\n * um erro de rede chegava na tela como um sistema de uma linha só e um\n * seletor oferecendo \"criar área de trabalho\" — a resposta errada,\n * apresentada com a mesma cara da certa.\n */\n loadError: string | null\n /** Tenta ler as contas de novo, depois de uma falha. */\n retryOrgs: () => void\n /** Switch the active org */\n switchOrg: (orgId: string) => Promise<void>\n /** Refresh the current org from the adapter */\n refreshOrg: () => Promise<void>\n}\n\nconst TenantContext = React.createContext<TenantContext | null>(null)\n\n/**\n * Access the current tenant / organization.\n * Must be used inside <OrgProvider>.\n */\nexport function useTenant(): TenantContext {\n const ctx = React.useContext(TenantContext)\n if (!ctx) {\n throw new Error('useTenant must be used inside <OrgProvider>')\n }\n return ctx\n}\n\nexport function useTenantOptional(): TenantContext | null {\n return React.useContext(TenantContext)\n}\n\n// ---------------------------------------------------------------------------\n// Provider\n// ---------------------------------------------------------------------------\n\nexport interface OrgProviderProps {\n adapter: OrgAdapter\n /** When true, automatically creates an org if the user has none */\n autoCreate?: boolean\n /**\n * How long the cached org bootstrap is served before the provider goes back\n * to the network (default 5 min). A cached load paints synchronously, so\n * screens that key off `org.id` don't wait a round trip on every reload.\n * `0` disables the cache and restores the always-fetch behaviour.\n */\n cacheTtlMs?: number\n children: React.ReactNode\n}\n\nconst useIsomorphicLayoutEffect =\n typeof window !== 'undefined' ? React.useLayoutEffect : React.useEffect\n\nexport function OrgProvider({\n adapter,\n autoCreate = false,\n cacheTtlMs = ORG_CACHE_TTL_MS,\n children,\n}: OrgProviderProps) {\n const { user, isLoading: authLoading } = useAuthStore()\n const { currentOrg, userOrgs, loading, setCurrentOrg, setUserOrgs, setMembers, setLoading, reset } =\n useOrganizationStore()\n const setProfiles = usePermissionsStore((s) => s.setProfiles)\n const setCurrentProfile = usePermissionsStore((s) => s.setCurrentProfile)\n const setProfileKnownFor = usePermissionsStore((s) => s.setProfileKnownFor)\n\n const adapterRef = React.useRef(adapter)\n adapterRef.current = adapter\n\n const [snapshot] = React.useState<OrgSnapshot | null>(() =>\n cacheTtlMs > 0 ? readOrgSnapshot() : null,\n )\n // One load per signed-in user per mount — auth reports `isLoading` and `user`\n // in two separate store writes, so the effect would otherwise fire twice.\n const loadedForRef = React.useRef<string | null>(null)\n\n // WHOSE bootstrap has finished, not whether one has. A boolean could not tell\n // the difference between \"we know this account has no workspace\" and \"we knew\n // that about the account that just signed out\" — which is what flashed the\n // setup flow over every login: sign-out settled it, and sign-in kept the\n // stale `true` for the whole round trip.\n //\n // A painted snapshot is already an answer for its own user: that account HAS a\n // workspace, and revalidation will not turn that into \"has none\".\n const [settledFor, setSettledFor] = React.useState<string | null>(() =>\n snapshot?.org ? snapshot.userId : null,\n )\n // Same shape, different question: WHOSE membership list came back. Seeded\n // from a painted snapshot for the same reason — that account's list was read\n // once and cached, and revalidation cannot turn \"has one\" into \"has none\".\n const [orgsReadFor, setOrgsReadFor] = React.useState<string | null>(() =>\n snapshot?.org ? snapshot.userId : null,\n )\n // Signed out there is nothing to wait for; signed in, only this user's answer counts.\n const [loadError, setLoadError] = React.useState<string | null>(null)\n const [retryTick, setRetryTick] = React.useState(0)\n const retryOrgs = React.useCallback(() => {\n // `loadedForRef` é o que impede a releitura; zerá-lo é o que faz o efeito\n // abaixo rodar de novo para o mesmo usuário.\n loadedForRef.current = null\n setLoadError(null)\n setRetryTick((n) => n + 1)\n }, [])\n\n const settled = user ? settledFor === user.id : !authLoading\n const orgsKnown = !!user && orgsReadFor === user.id\n\n // Paint the last known org before the first child renders. The stores are\n // filled in a layout effect, so nothing gets a frame with `org === null`.\n useIsomorphicLayoutEffect(() => {\n if (!snapshot) return\n setUserOrgs(snapshot.userOrgs)\n setCurrentOrg(snapshot.org)\n setMembers(snapshot.members)\n setProfiles(snapshot.profiles)\n setCurrentProfile(snapshot.profiles.find((p) => p.id === snapshot.currentProfileId) ?? null)\n // O snapshot É uma resposta: quem entra por ele já sabe quem é.\n setProfileKnownFor(snapshot.org.id)\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [])\n\n // Keep the snapshot in step with store writes made outside this provider —\n // renaming the org in Settings, editing a role — so the cache never serves a\n // value the user already changed on screen. Patching leaves `savedAt` alone:\n // a UI-only edit must not push the next revalidation further out.\n React.useEffect(() => {\n if (cacheTtlMs <= 0 || !user) return\n const uid = user.id\n const sync = () => {\n const org = useOrganizationStore.getState()\n if (!org.currentOrg) return\n const perms = usePermissionsStore.getState()\n patchOrgSnapshot({\n userId: uid,\n org: org.currentOrg,\n userOrgs: org.userOrgs,\n members: org.members,\n profiles: perms.profiles,\n // realProfile, not currentProfile: an impersonation preview is not\n // something to cache back as the user's own role.\n currentProfileId: perms.realProfile?.id ?? null,\n })\n }\n const unsubscribeOrg = useOrganizationStore.subscribe(sync)\n const unsubscribePerms = usePermissionsStore.subscribe(sync)\n return () => {\n unsubscribeOrg()\n unsubscribePerms()\n }\n }, [user?.id, cacheTtlMs])\n\n // Load the org's members + permission profiles into the shared stores whenever\n // an org resolves. This is what makes the role list, the invite dialog's role\n // dropdown, and permission checks work — previously nothing loaded them here,\n // so those surfaces came up empty. Also resolves the signed-in user's own role.\n const hydrateOrg = React.useCallback(\n async (org: Organization, memberships: OrgMembership[], uid: string | undefined) => {\n try {\n const [members, profiles] = await Promise.all([\n adapterRef.current.listMembers(org.id),\n adapterRef.current.listProfiles(org.id),\n ])\n setMembers(members)\n setProfiles(profiles)\n const myMembership = uid ? members.find((m) => m.userId === uid) : undefined\n const profile = profiles.find((p) => p.id === myMembership?.profileId) ?? null\n setCurrentProfile(profile)\n // Everything the next reload needs, stamped now — this is the only\n // place the TTL window restarts.\n if (cacheTtlMs > 0 && uid) {\n saveOrgSnapshot({\n userId: uid,\n org,\n userOrgs: memberships,\n members,\n profiles,\n currentProfileId: profile?.id ?? null,\n })\n }\n } catch {\n // Non-fatal — leave stores as-is if the load fails.\n } finally {\n // Respondida é respondida, mesmo que a resposta seja \"nenhum papel\" ou\n // que a leitura tenha falhado. Segurar a tela para sempre esperando uma\n // resposta que não vem é pior que mostrar o que se sabe.\n setProfileKnownFor(org.id)\n }\n },\n [setMembers, setProfiles, setCurrentProfile, setProfileKnownFor, cacheTtlMs],\n )\n\n // Load orgs when user is authenticated\n React.useEffect(() => {\n if (!user) {\n // A cold load reports `user === null` while the session hydrates — that's\n // not a sign-out, so the painted snapshot stands until auth settles.\n if (authLoading) return\n loadedForRef.current = null\n reset()\n clearOrgSnapshot()\n setSettledFor(null)\n setOrgsReadFor(null)\n return\n }\n\n const cached = snapshot?.userId === user.id ? snapshot : null\n\n // Already painted and still inside its window: skip the whole bootstrap.\n if (cached && isSnapshotFresh(cached, cacheTtlMs)) {\n setSettledFor(user.id)\n setOrgsReadFor(user.id)\n return\n }\n\n // A snapshot from another account was painted — drop it before loading.\n if (snapshot && snapshot.userId !== user.id && loadedForRef.current === null) {\n reset()\n clearOrgSnapshot()\n }\n\n if (loadedForRef.current === user.id) return\n loadedForRef.current = user.id\n\n // Stale but painted: revalidate quietly, so screens keep the data they're\n // showing instead of flipping back to a skeleton.\n const silent = !!cached\n\n let cancelled = false\n\n async function loadOrgs() {\n if (!silent) setLoading(true)\n try {\n // Redeem invites first — an invitee has no membership until this runs,\n // and without it autoCreate below would hand them a personal org\n // instead of the one that invited them.\n let accepted = 0\n try {\n accepted = (await adapterRef.current.acceptPendingInvites?.()) ?? 0\n } catch {\n // Non-fatal: fall through and load whatever memberships exist.\n }\n\n if (cancelled) return\n\n let memberships = await adapterRef.current.listUserOrgs(user!.id)\n\n // An empty list right after accepting means the read was deduped onto a\n // request that started before the invite landed. Ask once more.\n if (memberships.length === 0 && accepted > 0) {\n memberships = await adapterRef.current.listUserOrgs(user!.id)\n }\n\n // UMA LISTA VAZIA É A ÚNICA RESPOSTA QUE MERECE DÚVIDA.\n //\n // Ela é a que decide se esta conta entra no aplicativo ou no fluxo de\n // criação de área de trabalho — e é também a única que a infraestrutura\n // consegue produzir por engano. A leitura passa por RLS: sem a sessão\n // ainda aplicada, a política simplesmente não casa com nenhuma linha e\n // a resposta é `200 []`, indistinguível de \"esta conta não tem nenhuma\".\n // Logo depois do login essa janela existe, e o sintoma é exatamente o\n // relatado: o assistente de criação aparece sozinho e some no refresh.\n //\n // Perguntar de novo é o único jeito de separar as duas. Custa duas\n // requisições e menos de um segundo, e só para quem de fato não tem\n // workspace nenhum — que é uma vez na vida da conta. O erro na outra\n // direção custa o aplicativo inteiro coberto por um fluxo do qual não\n // se sai.\n for (let attempt = 0; memberships.length === 0 && attempt < 2; attempt++) {\n await new Promise((resolve) => setTimeout(resolve, 250 * (attempt + 1)))\n if (cancelled) return\n memberships = await adapterRef.current.listUserOrgs(user!.id)\n }\n\n if (cancelled) return\n\n setUserOrgs(memberships)\n // The read answered. Everything after this can still fail without\n // turning \"this account has no workspace\" into a guess.\n setOrgsReadFor(user!.id)\n\n // Auto-create org if user has none\n if (memberships.length === 0 && accepted === 0 && autoCreate) {\n const newOrg = await adapterRef.current.createOrg(\n user!.fullName ? `${user!.fullName}'s Organization` : 'My Organization',\n user!.id,\n )\n if (!cancelled) {\n const ownMembership: OrgMembership[] = [\n {\n orgId: newOrg.id,\n orgName: newOrg.name,\n orgSlug: newOrg.slug,\n profileId: 'owner',\n profileName: 'Owner',\n },\n ]\n setUserOrgs(ownMembership)\n setCurrentOrg(newOrg)\n await hydrateOrg(newOrg, ownMembership, user!.id)\n }\n return\n }\n\n // Which workspace to open — or whether to open one at all. The ladder\n // lives in `decideWorkspaceChoice`; the only branch that changed shape\n // here is the last one. It used to be `?? memberships[0]`, which turned\n // \"we do not know which of your seven accounts you meant\" into a silent\n // guess the user could not see, let alone correct.\n const choice = decideWorkspaceChoice({\n memberships,\n // Consumed here, and only here: this is the one boot the marker was\n // written for, and leaving it behind would pin the next one too.\n switchingToId: takeWorkspaceSwitch(),\n handoffId: readAppHandoff()?.tenantId ?? null,\n pinnedId: getPersistedOrgId(),\n autoPick: getAutoPick(),\n })\n\n // Leaving `currentOrg` null IS the ask: the chooser gate reads exactly\n // this state — a membership list we have read, more than one row in it,\n // and no active workspace — so no extra flag has to be kept in sync.\n if (choice.kind !== 'resolved') return\n\n if (!cancelled) {\n const org = await adapterRef.current.getOrg(choice.orgId)\n if (!cancelled) {\n setCurrentOrg(org)\n await hydrateOrg(org, memberships, user!.id)\n }\n }\n } catch (err) {\n // Engolir aqui era o defeito: a lista ficava vazia, `orgsKnown` ficava\n // falso, e a tela não tinha como distinguir isso de uma conta nova.\n if (!cancelled) setLoadError(errorMessage(err))\n } finally {\n if (!cancelled && !silent) setLoading(false)\n // Settled even when the load threw: the answer is then \"we asked and\n // could not tell\", and holding the screen forever is worse than showing\n // the app. It is about the wait being over, not about success.\n if (!cancelled) setSettledFor(user!.id)\n }\n }\n\n void loadOrgs()\n\n return () => {\n cancelled = true\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [user?.id, authLoading, retryTick])\n\n async function switchOrg(orgId: string): Promise<void> {\n setLoading(true)\n try {\n const org = await adapterRef.current.getOrg(orgId)\n setCurrentOrg(org)\n await hydrateOrg(org, useOrganizationStore.getState().userOrgs, user?.id)\n } finally {\n setLoading(false)\n }\n }\n\n // Explicit refresh always goes to the network and restarts the cache window.\n async function refreshOrg(): Promise<void> {\n if (!currentOrg) return\n setLoading(true)\n try {\n const org = await adapterRef.current.getOrg(currentOrg.id)\n setCurrentOrg(org)\n await hydrateOrg(org, useOrganizationStore.getState().userOrgs, user?.id)\n } finally {\n setLoading(false)\n }\n }\n\n const tenantValue: TenantContext = {\n org: currentOrg,\n userOrgs,\n loading,\n settled,\n orgsKnown,\n loadError,\n retryOrgs,\n switchOrg,\n refreshOrg,\n }\n\n return (\n <OrgAdapterContext.Provider value={adapter}>\n <TenantContext.Provider value={tenantValue}>\n {children}\n </TenantContext.Provider>\n </OrgAdapterContext.Provider>\n )\n}\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/org/store.ts"],"names":[],"mappings":";;;;;AAGA,IAAM,WAAA,GAAc,kBAAA;AAMpB,SAAS,iBAAA,GAAmC;AAC1C,EAAA,IAAI;AACF,IAAA,IAAI,OAAO,YAAA,KAAiB,WAAA,EAAa,OAAO,IAAA;AAChD,IAAA,OAAO,YAAA,CAAa,QAAQ,WAAW,CAAA;AAAA,EACzC,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,IAAA;AAAA,EACT;AACF;AAEA,SAAS,aAAa,KAAA,EAA4B;AAChD,EAAA,IAAI;AACF,IAAA,IAAI,OAAO,iBAAiB,WAAA,EAAa;AACzC,IAAA,IAAI,KAAA,EAAO;AACT,MAAA,YAAA,CAAa,OAAA,CAAQ,aAAa,KAAK,CAAA;AAAA,IACzC,CAAA,MAAO;AACL,MAAA,YAAA,CAAa,WAAW,WAAW,CAAA;AAAA,IACrC;AAAA,EACF,CAAA,CAAA,MAAQ;AAAA,EAER;AACF;AAuBO,IAAM,oBAAA,GAAuB,MAAA,CAAiB,CAAC,GAAA,MAAS;AAAA,EAC7D,UAAA,EAAY,IAAA;AAAA,EACZ,UAAU,EAAC;AAAA,EACX,SAAS,EAAC;AAAA,EACV,iBAAiB,EAAC;AAAA,EAClB,OAAA,EAAS,KAAA;AAAA,EAET,aAAA,EAAe,CAAC,GAAA,KAAQ;AACtB,IAAA,iBAAA,CAAkB,KAAK,EAAE,CAAA;AACzB,IAAA,YAAA,CAAa,GAAA,EAAK,MAAM,IAAI,CAAA;AAC5B,IAAA,GAAA,CAAI,EAAE,UAAA,EAAY,GAAA,EAAK,CAAA;AAAA,EACzB,CAAA;AAAA,EACA,aAAa,CAAC,IAAA,KAAS,IAAI,EAAE,QAAA,EAAU,MAAM,CAAA;AAAA,EAC7C,YAAY,CAAC,OAAA,KAAY,GAAA,CAAI,EAAE,SAAS,CAAA;AAAA,EACxC,oBAAoB,CAAC,KAAA,KAAU,IAAI,EAAE,eAAA,EAAiB,OAAO,CAAA;AAAA,EAC7D,YAAY,CAAC,OAAA,KAAY,GAAA,CAAI,EAAE,SAAS,CAAA;AAAA,EACxC,OAAO,MAAM;AACX,IAAA,iBAAA,CAAkB,MAAS,CAAA;AAU3B,IAAA,GAAA,CAAI,EAAE,UAAA,EAAY,IAAA,EAAM,QAAA,EAAU,EAAC,EAAG,OAAA,EAAS,EAAC,EAAG,OAAA,EAAS,KAAA,EAAO,CAAA;AAAA,EACrE;AACF,CAAA,CAAE","file":"chunk-W5IBKM3K.js","sourcesContent":["import { create } from 'zustand'\nimport { setActiveTenantId, type Organization, type OrgMember, type OrgMembership } from '@fayz-ai/core'\n\nconst STORAGE_KEY = 'fayz:current-org'\n\n// ---------------------------------------------------------------------------\n// Persistence helpers\n// ---------------------------------------------------------------------------\n\nfunction getPersistedOrgId(): string | null {\n try {\n if (typeof localStorage === 'undefined') return null\n return localStorage.getItem(STORAGE_KEY)\n } catch {\n return null\n }\n}\n\nfunction persistOrgId(orgId: string | null): void {\n try {\n if (typeof localStorage === 'undefined') return\n if (orgId) {\n localStorage.setItem(STORAGE_KEY, orgId)\n } else {\n localStorage.removeItem(STORAGE_KEY)\n }\n } catch {\n // ignore\n }\n}\n\n// ---------------------------------------------------------------------------\n// Store interface\n// ---------------------------------------------------------------------------\n\nexport interface OrgStore {\n currentOrg: Organization | null\n userOrgs: OrgMembership[]\n members: OrgMember[]\n /** Person `kind`s that make up the team (from config.team.personKinds). Drives\n * the Person-first Team screen; empty = legacy membership-only mode. */\n teamPersonKinds: string[]\n loading: boolean\n\n setCurrentOrg: (org: Organization | null) => void\n setUserOrgs: (orgs: OrgMembership[]) => void\n setMembers: (members: OrgMember[]) => void\n setTeamPersonKinds: (kinds: string[]) => void\n setLoading: (loading: boolean) => void\n reset: () => void\n}\n\nexport const useOrganizationStore = create<OrgStore>((set) => ({\n currentOrg: null,\n userOrgs: [],\n members: [],\n teamPersonKinds: [],\n loading: false,\n\n setCurrentOrg: (org) => {\n setActiveTenantId(org?.id)\n persistOrgId(org?.id ?? null)\n set({ currentOrg: org })\n },\n setUserOrgs: (orgs) => set({ userOrgs: orgs }),\n setMembers: (members) => set({ members }),\n setTeamPersonKinds: (kinds) => set({ teamPersonKinds: kinds }),\n setLoading: (loading) => set({ loading }),\n reset: () => {\n setActiveTenantId(undefined)\n // NOTE: do NOT clear the persisted org id here. The org providers call\n // reset() whenever the auth store transiently reports `user === null` —\n // which happens on every fresh load while the Supabase session hydrates\n // asynchronously. Wiping 'fayz:current-org' at that moment drops a\n // multi-org user's workspace selection BEFORE loadOrgs can read it back,\n // so the app always falls to memberships[0] on reload (single-org users\n // never noticed). The pin is a last-selected hint that's re-validated\n // against the fresh membership list on load, so it's safe to keep across\n // sign-out too (a mismatching pin just falls back to memberships[0]).\n set({ currentOrg: null, userOrgs: [], members: [], loading: false })\n },\n}))\n\nexport { getPersistedOrgId, persistOrgId }\n"]}