@elevasis/ui 2.79.0 → 2.81.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 (108) hide show
  1. package/dist/{CoreAuthKitInner-PSTKG4B3.js → CoreAuthKitInner-5J7P7ZDL.js} +1 -1
  2. package/dist/api/index.js +6 -6
  3. package/dist/app/index.d.ts +1 -15
  4. package/dist/app/index.js +18 -18
  5. package/dist/auth/index.js +10 -10
  6. package/dist/charts/index.d.ts +4 -4
  7. package/dist/charts/index.js +10 -10
  8. package/dist/{chunk-NCPNKI3V.js → chunk-2HXDI4RY.js} +1 -1
  9. package/dist/{chunk-TVTSASST.js → chunk-34B3ACOZ.js} +9 -1
  10. package/dist/{chunk-AZCDL2SS.js → chunk-3ZADOARU.js} +5 -5
  11. package/dist/{chunk-2IU6BP6F.js → chunk-42C2WVYU.js} +11 -10
  12. package/dist/{chunk-3ONNZ4SO.js → chunk-52AZTFUR.js} +6 -6
  13. package/dist/{chunk-MGCXAAX4.js → chunk-5GYJ3IDO.js} +15 -9
  14. package/dist/{chunk-SJRIO26Q.js → chunk-6J3SCCZ2.js} +2 -2
  15. package/dist/{chunk-A37T4NIZ.js → chunk-6YWBMLEM.js} +22 -11
  16. package/dist/{chunk-GWCLI2RX.js → chunk-75OLN23F.js} +22 -39
  17. package/dist/{chunk-LDQSTEFW.js → chunk-7D4FKBB4.js} +38 -14
  18. package/dist/{chunk-JZQNUQE4.js → chunk-7RS2NUC6.js} +10 -2
  19. package/dist/{chunk-7ICEQPBU.js → chunk-AI5OYVLR.js} +1 -1
  20. package/dist/{chunk-G3WOMHVI.js → chunk-BLYK6I4D.js} +4 -3
  21. package/dist/{chunk-5ZK7K7YP.js → chunk-DEZW7QDI.js} +38 -25
  22. package/dist/{chunk-QLEY6Q7K.js → chunk-FPRDEKFY.js} +1 -1
  23. package/dist/{chunk-SVZR4GYA.js → chunk-G6VHIXWD.js} +1 -1
  24. package/dist/{chunk-VM2OWOXL.js → chunk-GY7FXTC4.js} +2 -3
  25. package/dist/{chunk-GFSOQH3N.js → chunk-HDITVHZT.js} +8 -11
  26. package/dist/{chunk-ASI3FDPC.js → chunk-HDLYC63N.js} +1 -1
  27. package/dist/{chunk-2GIJBHZT.js → chunk-IIMC4TRH.js} +3 -3
  28. package/dist/{chunk-22TWX4XG.js → chunk-ILOKKA6L.js} +8 -8
  29. package/dist/{chunk-4ZHX5KOT.js → chunk-JLKZUO2I.js} +1 -1
  30. package/dist/{chunk-WJO6QEI7.js → chunk-K635QVGI.js} +33 -78
  31. package/dist/{chunk-R42OYAQ2.js → chunk-KU7KN5VN.js} +1 -1
  32. package/dist/{chunk-6AJUWYKS.js → chunk-LGJASP5H.js} +1 -1
  33. package/dist/{chunk-4IYWLUXA.js → chunk-LTKBVL7D.js} +14 -10
  34. package/dist/{chunk-INCEZAM3.js → chunk-LTRJZOHA.js} +1 -1
  35. package/dist/{chunk-RMLWK3IR.js → chunk-O4XUKLRY.js} +1 -1
  36. package/dist/{chunk-3RK2NNJX.js → chunk-PJN6CMWZ.js} +1 -1
  37. package/dist/{chunk-KXNRTJAE.js → chunk-PNCJJE4Z.js} +1 -1
  38. package/dist/{chunk-4VGPEDQF.js → chunk-PSGSFPWA.js} +126 -69
  39. package/dist/{chunk-QMAIUPXK.js → chunk-QEQXPWOK.js} +23 -231
  40. package/dist/{chunk-M77G2MGW.js → chunk-QFKOHZM3.js} +3 -3
  41. package/dist/{chunk-P6HHXMLJ.js → chunk-ROC2TFPS.js} +10 -9
  42. package/dist/{chunk-QMOBXKW3.js → chunk-SHJYK2X4.js} +222 -191
  43. package/dist/{chunk-ODXLZZFR.js → chunk-SOBKRB4N.js} +1 -1
  44. package/dist/{chunk-SXZMHLH6.js → chunk-SWC54W3A.js} +4 -4
  45. package/dist/{chunk-G4IEH7NX.js → chunk-TLMNBOAG.js} +5 -5
  46. package/dist/{chunk-N6K2Q5BM.js → chunk-WDABHUIL.js} +9 -21
  47. package/dist/{chunk-3KCLWJDC.js → chunk-XUL4UBYJ.js} +22 -11
  48. package/dist/{chunk-UD657ICS.js → chunk-YJ437RDY.js} +29 -16
  49. package/dist/components/index.d.ts +18 -20
  50. package/dist/components/index.js +48 -48
  51. package/dist/components/navigation/index.js +11 -11
  52. package/dist/execution/index.js +2 -2
  53. package/dist/features/auth/index.d.ts +1 -1
  54. package/dist/features/auth/index.js +12 -12
  55. package/dist/features/clients/index.js +14 -15
  56. package/dist/features/content/index.js +13 -13
  57. package/dist/features/crm/index.d.ts +0 -14
  58. package/dist/features/crm/index.js +16 -16
  59. package/dist/features/dashboard/index.d.ts +8 -8
  60. package/dist/features/dashboard/index.js +13 -13
  61. package/dist/features/delivery/index.d.ts +0 -14
  62. package/dist/features/delivery/index.js +25 -25
  63. package/dist/features/knowledge/index.js +10 -10
  64. package/dist/features/lead-gen/index.d.ts +103 -48
  65. package/dist/features/lead-gen/index.js +17 -17
  66. package/dist/features/monitoring/index.d.ts +10 -10
  67. package/dist/features/monitoring/index.js +15 -15
  68. package/dist/features/monitoring/requests/index.js +12 -12
  69. package/dist/features/notes/index.js +1 -1
  70. package/dist/features/operations/index.d.ts +12 -12
  71. package/dist/features/operations/index.js +18 -18
  72. package/dist/features/public-agent-chat/index.js +4 -4
  73. package/dist/features/seo/index.d.ts +105 -17
  74. package/dist/features/seo/index.js +13 -13
  75. package/dist/features/settings/index.d.ts +1 -1
  76. package/dist/features/settings/index.js +13 -13
  77. package/dist/hooks/access/index.d.ts +60 -1
  78. package/dist/hooks/access/index.js +10 -10
  79. package/dist/hooks/delivery/index.d.ts +0 -14
  80. package/dist/hooks/delivery/index.js +6 -6
  81. package/dist/hooks/published.d.ts +286 -107
  82. package/dist/hooks/published.js +23 -23
  83. package/dist/hooks/user-notes/index.js +1 -1
  84. package/dist/initialization/index.d.ts +13 -1
  85. package/dist/initialization/index.js +1 -1
  86. package/dist/knowledge/index.d.ts +1 -1
  87. package/dist/knowledge/index.js +93 -91
  88. package/dist/{knowledge-search-index-6GQK55IQ.js → knowledge-search-index-UPKXCXQP.js} +91 -91
  89. package/dist/layout/index.js +14 -14
  90. package/dist/organization/index.d.ts +17 -1
  91. package/dist/organization/index.js +2 -2
  92. package/dist/profile/index.d.ts +1 -1
  93. package/dist/profile/index.js +1 -1
  94. package/dist/provider/ElevasisServiceContext.js +1 -1
  95. package/dist/provider/index.d.ts +0 -14
  96. package/dist/provider/index.js +10 -10
  97. package/dist/provider/published.d.ts +0 -14
  98. package/dist/provider/published.js +10 -10
  99. package/dist/sse/index.d.ts +7 -1
  100. package/dist/sse/index.js +36 -2
  101. package/dist/test-utils/index.d.ts +3 -1
  102. package/dist/test-utils/index.js +32 -9
  103. package/dist/types/index.d.ts +13 -15
  104. package/dist/utils/index.d.ts +25 -7
  105. package/dist/utils/index.js +4 -4
  106. package/package.json +24 -14
  107. /package/dist/{chunk-Y6I3IC45.js → chunk-6XBZPKMI.js} +0 -0
  108. /package/dist/{chunk-5F3QGBEI.js → chunk-7ZUXA2NW.js} +0 -0
@@ -1,13 +1,24 @@
1
- import { useNotificationAdapter } from './chunk-4VGPEDQF.js';
2
- import { showApiErrorNotification } from './chunk-KXNRTJAE.js';
1
+ import { useNotificationAdapter } from './chunk-PSGSFPWA.js';
2
+ import { showApiErrorNotification } from './chunk-PNCJJE4Z.js';
3
3
  import { OrganizationContext } from './chunk-DD3CCMCZ.js';
4
- import { GC_TIME_MEDIUM, STALE_TIME_DEFAULT, GC_TIME_SHORT, STALE_TIME_MONITORING } from './chunk-5ZK7K7YP.js';
4
+ import { GC_TIME_MEDIUM, STALE_TIME_DEFAULT, GC_TIME_SHORT, STALE_TIME_MONITORING } from './chunk-DEZW7QDI.js';
5
5
  import { useElevasisServices } from './chunk-BI5VDO2K.js';
6
- import { useQuery, useQueryClient, useMutation } from '@tanstack/react-query';
7
- import { z } from 'zod';
6
+ import { PageLimitSchema } from './chunk-34B3ACOZ.js';
8
7
  import { useContext } from 'react';
8
+ import { useQueryClient, useMutation, useQuery } from '@tanstack/react-query';
9
+ import { z } from 'zod';
9
10
  import { notifications } from '@mantine/notifications';
10
11
 
12
+ // src/hooks/settings/roles/queryKeys.ts
13
+ var orgRolesKeys = {
14
+ all: ["org-roles"],
15
+ list: (organizationId) => [...orgRolesKeys.all, organizationId]
16
+ };
17
+ var memberRolesKeys = {
18
+ all: ["member-roles"],
19
+ detail: (organizationId, membershipId) => [...memberRolesKeys.all, organizationId, membershipId]
20
+ };
21
+
11
22
  // ../core/src/auth/multi-tenancy/memberships/membership.ts
12
23
  function transformMembershipToTableRow(membership) {
13
24
  return {
@@ -74,7 +85,7 @@ var ListMembershipsQuerySchema = z.object({
74
85
  // arrives as a bare string. Normalize both shapes to an array.
75
86
  statuses: z.union([MembershipStatusSchema, z.array(MembershipStatusSchema)]).transform((value) => Array.isArray(value) ? value : [value]).optional(),
76
87
  order: z.enum(["asc", "desc"]).optional(),
77
- limit: z.coerce.number().int().min(1).max(100).optional(),
88
+ limit: PageLimitSchema.optional(),
78
89
  before: z.string().optional(),
79
90
  // WorkOS pagination cursor
80
91
  after: z.string().optional()
@@ -83,7 +94,22 @@ var ListMembershipsQuerySchema = z.object({
83
94
  message: "Either userId or organizationId must be provided"
84
95
  });
85
96
 
86
- // src/hooks/settings/roles/usePermissionCatalog.ts
97
+ // src/hooks/settings/roles/useCreateOrgRole.ts
98
+ function useCreateOrgRole() {
99
+ const { apiRequest } = useElevasisServices();
100
+ const organization = useContext(OrganizationContext);
101
+ const orgId = organization?.currentSupabaseOrganizationId ?? null;
102
+ const queryClient = useQueryClient();
103
+ return useMutation({
104
+ mutationFn: (input) => apiRequest(`/organizations/${orgId}/roles`, {
105
+ method: "POST",
106
+ body: JSON.stringify(input)
107
+ }),
108
+ onSettled: () => {
109
+ queryClient.invalidateQueries({ queryKey: orgRolesKeys.list(orgId) });
110
+ }
111
+ });
112
+ }
87
113
  var STALE_TIME_CATALOG = 60 * 60 * 1e3;
88
114
  function usePermissionCatalog() {
89
115
  const { apiRequest, isReady } = useElevasisServices();
@@ -96,185 +122,149 @@ function usePermissionCatalog() {
96
122
  }
97
123
 
98
124
  // src/hooks/settings/organization/organizationMembershipService.ts
99
- var OrganizationMembershipService = class {
100
- constructor(apiRequest) {
101
- this.apiRequest = apiRequest;
125
+ async function getUserMemberships(apiRequest, userId) {
126
+ const searchParams = new URLSearchParams();
127
+ searchParams.append("userId", userId);
128
+ const url = `/memberships?${searchParams.toString()}`;
129
+ const response = await apiRequest(url);
130
+ return response.data.map((membership) => ({
131
+ ...membership,
132
+ createdAt: membership.createdAt,
133
+ updatedAt: membership.updatedAt
134
+ }));
135
+ }
136
+ async function getOrganizationMembers(apiRequest, organizationId) {
137
+ const searchParams = new URLSearchParams();
138
+ searchParams.append("organizationId", organizationId);
139
+ const url = `/memberships?${searchParams.toString()}`;
140
+ const response = await apiRequest(url);
141
+ return response.data.map((membership) => ({
142
+ ...membership,
143
+ createdAt: membership.createdAt,
144
+ updatedAt: membership.updatedAt
145
+ }));
146
+ }
147
+ async function listMemberships(apiRequest, params) {
148
+ if (params) {
149
+ ListMembershipsQuerySchema.parse(params);
102
150
  }
103
- /**
104
- * Get user's organization memberships
105
- */
106
- async getUserMemberships(userId) {
107
- const searchParams = new URLSearchParams();
108
- searchParams.append("userId", userId);
109
- const url = `/memberships?${searchParams.toString()}`;
110
- const response = await this.apiRequest(url);
111
- return response.data.map((membership) => ({
112
- ...membership,
113
- createdAt: membership.createdAt,
114
- updatedAt: membership.updatedAt
115
- }));
151
+ const searchParams = new URLSearchParams();
152
+ if (params?.userId) {
153
+ searchParams.append("userId", params.userId);
116
154
  }
117
- /**
118
- * Get organization members
119
- */
120
- async getOrganizationMembers(organizationId) {
121
- const searchParams = new URLSearchParams();
122
- searchParams.append("organizationId", organizationId);
123
- const url = `/memberships?${searchParams.toString()}`;
124
- const response = await this.apiRequest(url);
125
- return response.data.map((membership) => ({
126
- ...membership,
127
- createdAt: membership.createdAt,
128
- updatedAt: membership.updatedAt
129
- }));
155
+ if (params?.organizationId) {
156
+ searchParams.append("organizationId", params.organizationId);
130
157
  }
131
- /**
132
- * List memberships with filtering
133
- */
134
- async listMemberships(params) {
135
- if (params) {
136
- ListMembershipsQuerySchema.parse(params);
137
- }
138
- const searchParams = new URLSearchParams();
139
- if (params?.userId) {
140
- searchParams.append("userId", params.userId);
141
- }
142
- if (params?.organizationId) {
143
- searchParams.append("organizationId", params.organizationId);
144
- }
145
- if (params?.statuses) {
146
- params.statuses.forEach((status) => searchParams.append("statuses", status));
147
- }
148
- if (params?.limit) {
149
- searchParams.append("limit", params.limit.toString());
150
- }
151
- if (params?.before) {
152
- searchParams.append("before", params.before);
153
- }
154
- if (params?.after) {
155
- searchParams.append("after", params.after);
156
- }
157
- if (params?.order) {
158
- searchParams.append("order", params.order);
159
- }
160
- const url = `/memberships${searchParams.toString() ? `?${searchParams.toString()}` : ""}`;
161
- const response = await this.apiRequest(url);
162
- return {
163
- ...response,
164
- data: response.data.map((membership) => ({
165
- ...membership,
166
- createdAt: membership.createdAt,
167
- updatedAt: membership.updatedAt
168
- }))
169
- };
170
- }
171
- /**
172
- * Get a single membership by ID
173
- */
174
- async getMembership(membershipId) {
175
- MembershipIdParamSchema.parse({ id: membershipId });
176
- const membership = await this.apiRequest(`/memberships/${membershipId}`);
177
- return {
178
- ...membership,
179
- createdAt: membership.createdAt,
180
- updatedAt: membership.updatedAt
181
- };
182
- }
183
- /**
184
- * Create a new organization membership
185
- */
186
- async createMembership(data) {
187
- const validated = CreateMembershipSchema.parse(data);
188
- const membership = await this.apiRequest("/memberships", {
189
- method: "POST",
190
- body: JSON.stringify(validated)
191
- });
192
- return {
193
- ...membership,
194
- createdAt: membership.createdAt,
195
- updatedAt: membership.updatedAt
196
- };
158
+ if (params?.statuses) {
159
+ params.statuses.forEach((status) => searchParams.append("statuses", status));
197
160
  }
198
- /**
199
- * Update an existing membership
200
- */
201
- async updateMembership(membershipId, data) {
202
- MembershipIdParamSchema.parse({ id: membershipId });
203
- const validated = UpdateMembershipSchema.parse(data);
204
- const membership = await this.apiRequest(`/memberships/${membershipId}`, {
205
- method: "PUT",
206
- body: JSON.stringify(validated)
207
- });
208
- return {
209
- ...membership,
210
- createdAt: membership.createdAt,
211
- updatedAt: membership.updatedAt
212
- };
161
+ if (params?.limit) {
162
+ searchParams.append("limit", params.limit.toString());
213
163
  }
214
- /**
215
- * Delete a membership
216
- */
217
- async deleteMembership(membershipId) {
218
- MembershipIdParamSchema.parse({ id: membershipId });
219
- await this.apiRequest(`/memberships/${membershipId}`, {
220
- method: "DELETE"
221
- });
164
+ if (params?.before) {
165
+ searchParams.append("before", params.before);
222
166
  }
223
- /**
224
- * Deactivate a membership (soft delete)
225
- */
226
- async deactivateMembership(membershipId) {
227
- MembershipIdParamSchema.parse({ id: membershipId });
228
- const membership = await this.apiRequest(`/memberships/${membershipId}/deactivate`, {
229
- method: "POST"
230
- });
231
- return {
232
- ...membership,
233
- createdAt: membership.createdAt,
234
- updatedAt: membership.updatedAt
235
- };
167
+ if (params?.after) {
168
+ searchParams.append("after", params.after);
236
169
  }
237
- /**
238
- * Reactivate a membership
239
- */
240
- async reactivateMembership(membershipId) {
241
- MembershipIdParamSchema.parse({ id: membershipId });
242
- const membership = await this.apiRequest(`/memberships/${membershipId}/reactivate`, {
243
- method: "POST"
244
- });
245
- return {
246
- ...membership,
247
- createdAt: membership.createdAt,
248
- updatedAt: membership.updatedAt
249
- };
170
+ if (params?.order) {
171
+ searchParams.append("order", params.order);
250
172
  }
251
- /**
252
- * Write the WorkOS membership link the acceptance path failed to record --
253
- * the repair for a membership reported as `accepted_unlinked`.
254
- *
255
- * Idempotent on the server: an already-linked row returns unchanged. A row in
256
- * any other state is refused with a 409 rather than guessed at.
257
- */
258
- async repairMembershipLink(membershipId) {
259
- MembershipIdParamSchema.parse({ id: membershipId });
260
- const membership = await this.apiRequest(`/memberships/${membershipId}/repair-link`, {
261
- method: "POST"
262
- });
263
- return {
173
+ const url = `/memberships${searchParams.toString() ? `?${searchParams.toString()}` : ""}`;
174
+ const response = await apiRequest(url);
175
+ return {
176
+ ...response,
177
+ data: response.data.map((membership) => ({
264
178
  ...membership,
265
179
  createdAt: membership.createdAt,
266
180
  updatedAt: membership.updatedAt
267
- };
268
- }
181
+ }))
182
+ };
183
+ }
184
+ async function getMembership(apiRequest, membershipId) {
185
+ MembershipIdParamSchema.parse({ id: membershipId });
186
+ const membership = await apiRequest(`/memberships/${membershipId}`);
187
+ return {
188
+ ...membership,
189
+ createdAt: membership.createdAt,
190
+ updatedAt: membership.updatedAt
191
+ };
192
+ }
193
+ async function createMembership(apiRequest, data) {
194
+ const validated = CreateMembershipSchema.parse(data);
195
+ const membership = await apiRequest("/memberships", {
196
+ method: "POST",
197
+ body: JSON.stringify(validated)
198
+ });
199
+ return {
200
+ ...membership,
201
+ createdAt: membership.createdAt,
202
+ updatedAt: membership.updatedAt
203
+ };
204
+ }
205
+ async function updateMembership(apiRequest, membershipId, data) {
206
+ MembershipIdParamSchema.parse({ id: membershipId });
207
+ const validated = UpdateMembershipSchema.parse(data);
208
+ const membership = await apiRequest(`/memberships/${membershipId}`, {
209
+ method: "PUT",
210
+ body: JSON.stringify(validated)
211
+ });
212
+ return {
213
+ ...membership,
214
+ createdAt: membership.createdAt,
215
+ updatedAt: membership.updatedAt
216
+ };
217
+ }
218
+ async function deleteMembership(apiRequest, membershipId) {
219
+ MembershipIdParamSchema.parse({ id: membershipId });
220
+ await apiRequest(`/memberships/${membershipId}`, {
221
+ method: "DELETE"
222
+ });
223
+ }
224
+ async function deactivateMembership(apiRequest, membershipId) {
225
+ MembershipIdParamSchema.parse({ id: membershipId });
226
+ const membership = await apiRequest(`/memberships/${membershipId}/deactivate`, {
227
+ method: "POST"
228
+ });
229
+ return {
230
+ ...membership,
231
+ createdAt: membership.createdAt,
232
+ updatedAt: membership.updatedAt
233
+ };
234
+ }
235
+ async function reactivateMembership(apiRequest, membershipId) {
236
+ MembershipIdParamSchema.parse({ id: membershipId });
237
+ const membership = await apiRequest(`/memberships/${membershipId}/reactivate`, {
238
+ method: "POST"
239
+ });
240
+ return {
241
+ ...membership,
242
+ createdAt: membership.createdAt,
243
+ updatedAt: membership.updatedAt
244
+ };
245
+ }
246
+ async function repairMembershipLink(apiRequest, membershipId) {
247
+ MembershipIdParamSchema.parse({ id: membershipId });
248
+ const membership = await apiRequest(`/memberships/${membershipId}/repair-link`, {
249
+ method: "POST"
250
+ });
251
+ return {
252
+ ...membership,
253
+ createdAt: membership.createdAt,
254
+ updatedAt: membership.updatedAt
255
+ };
256
+ }
257
+
258
+ // src/hooks/settings/organization/queryKeys.ts
259
+ var membershipsKeys = {
260
+ all: ["memberships"],
261
+ user: (userId, params) => [...membershipsKeys.all, "user", userId, params]
269
262
  };
270
263
  function useUserMemberships(userId, params) {
271
264
  const { apiRequest, isReady } = useElevasisServices();
272
265
  return useQuery({
273
- queryKey: ["memberships", "user", userId, params],
274
- queryFn: async () => {
275
- const membershipService = new OrganizationMembershipService(apiRequest);
276
- return await membershipService.getUserMemberships(userId);
277
- },
266
+ queryKey: membershipsKeys.user(userId, params),
267
+ queryFn: () => getUserMemberships(apiRequest, userId),
278
268
  enabled: isReady && !!userId,
279
269
  refetchOnWindowFocus: false,
280
270
  staleTime: STALE_TIME_DEFAULT,
@@ -286,17 +276,14 @@ function useDeactivateMembership() {
286
276
  const adapter = useNotificationAdapter();
287
277
  const queryClient = useQueryClient();
288
278
  return useMutation({
289
- mutationFn: async ({ membershipId }) => {
290
- const membershipService = new OrganizationMembershipService(apiRequest);
291
- return await membershipService.deactivateMembership(membershipId);
292
- },
279
+ mutationFn: ({ membershipId }) => deactivateMembership(apiRequest, membershipId),
293
280
  onError: (error) => {
294
281
  adapter.apiError(error);
295
282
  },
296
283
  // Fires on both success and failure. A prior `onSuccess` invalidated the
297
284
  // same key redundantly.
298
285
  onSettled: () => {
299
- queryClient.invalidateQueries({ queryKey: ["memberships"] });
286
+ queryClient.invalidateQueries({ queryKey: membershipsKeys.all });
300
287
  }
301
288
  });
302
289
  }
@@ -305,15 +292,12 @@ function useReactivateMembership() {
305
292
  const adapter = useNotificationAdapter();
306
293
  const queryClient = useQueryClient();
307
294
  return useMutation({
308
- mutationFn: async ({ membershipId }) => {
309
- const membershipService = new OrganizationMembershipService(apiRequest);
310
- return await membershipService.reactivateMembership(membershipId);
311
- },
295
+ mutationFn: ({ membershipId }) => reactivateMembership(apiRequest, membershipId),
312
296
  onError: (error) => {
313
297
  adapter.apiError(error);
314
298
  },
315
299
  onSettled: () => {
316
- queryClient.invalidateQueries({ queryKey: ["memberships"] });
300
+ queryClient.invalidateQueries({ queryKey: membershipsKeys.all });
317
301
  }
318
302
  });
319
303
  }
@@ -322,12 +306,42 @@ function useOrgRoles(orgId) {
322
306
  const organization = useContext(OrganizationContext);
323
307
  const targetOrgId = orgId ?? organization?.currentSupabaseOrganizationId ?? void 0;
324
308
  return useQuery({
325
- queryKey: ["org-roles", targetOrgId],
309
+ queryKey: orgRolesKeys.list(targetOrgId),
326
310
  queryFn: () => apiRequest(`/organizations/${targetOrgId}/roles`),
327
311
  enabled: isReady && !!targetOrgId,
328
312
  staleTime: STALE_TIME_DEFAULT
329
313
  });
330
314
  }
315
+ function useUpdateOrgRole() {
316
+ const { apiRequest } = useElevasisServices();
317
+ const organization = useContext(OrganizationContext);
318
+ const orgId = organization?.currentSupabaseOrganizationId ?? null;
319
+ const queryClient = useQueryClient();
320
+ return useMutation({
321
+ mutationFn: ({ roleId, input }) => apiRequest(`/organizations/${orgId}/roles/${roleId}`, {
322
+ method: "PATCH",
323
+ body: JSON.stringify(input)
324
+ }),
325
+ onSettled: (_data, _error, { roleId }) => {
326
+ queryClient.invalidateQueries({ queryKey: orgRolesKeys.list(orgId) });
327
+ queryClient.invalidateQueries({ queryKey: ["org-role", orgId, roleId] });
328
+ }
329
+ });
330
+ }
331
+ function useDeleteOrgRole() {
332
+ const { apiRequest } = useElevasisServices();
333
+ const organization = useContext(OrganizationContext);
334
+ const orgId = organization?.currentSupabaseOrganizationId ?? null;
335
+ const queryClient = useQueryClient();
336
+ return useMutation({
337
+ mutationFn: (roleId) => apiRequest(`/organizations/${orgId}/roles/${roleId}`, {
338
+ method: "DELETE"
339
+ }),
340
+ onSettled: () => {
341
+ queryClient.invalidateQueries({ queryKey: orgRolesKeys.list(orgId) });
342
+ }
343
+ });
344
+ }
331
345
  function useAssignRole() {
332
346
  const { apiRequest } = useElevasisServices();
333
347
  const organization = useContext(OrganizationContext);
@@ -339,9 +353,9 @@ function useAssignRole() {
339
353
  body: JSON.stringify({ roleId })
340
354
  }),
341
355
  onSettled: (_data, _error, { membershipId }) => {
342
- queryClient.invalidateQueries({ queryKey: ["member-roles", orgId, membershipId] });
356
+ queryClient.invalidateQueries({ queryKey: memberRolesKeys.detail(orgId, membershipId) });
343
357
  queryClient.invalidateQueries({ queryKey: ["organization-permissions", orgId] });
344
- queryClient.invalidateQueries({ queryKey: ["org-roles", orgId] });
358
+ queryClient.invalidateQueries({ queryKey: orgRolesKeys.list(orgId) });
345
359
  }
346
360
  });
347
361
  }
@@ -355,12 +369,23 @@ function useRevokeRole() {
355
369
  method: "DELETE"
356
370
  }),
357
371
  onSettled: (_data, _error, { membershipId }) => {
358
- queryClient.invalidateQueries({ queryKey: ["member-roles", orgId, membershipId] });
372
+ queryClient.invalidateQueries({ queryKey: memberRolesKeys.detail(orgId, membershipId) });
359
373
  queryClient.invalidateQueries({ queryKey: ["organization-permissions", orgId] });
360
- queryClient.invalidateQueries({ queryKey: ["org-roles", orgId] });
374
+ queryClient.invalidateQueries({ queryKey: orgRolesKeys.list(orgId) });
361
375
  }
362
376
  });
363
377
  }
378
+ function useEffectivePermissions(membershipId) {
379
+ const { apiRequest, isReady } = useElevasisServices();
380
+ const organization = useContext(OrganizationContext);
381
+ const orgId = organization?.currentSupabaseOrganizationId ?? null;
382
+ return useQuery({
383
+ queryKey: memberRolesKeys.detail(orgId, membershipId),
384
+ queryFn: () => apiRequest(`/memberships/${membershipId}/effective-permissions`),
385
+ enabled: isReady && !!membershipId,
386
+ staleTime: STALE_TIME_DEFAULT
387
+ });
388
+ }
364
389
 
365
390
  // src/hooks/settings/webhooks/webhookEndpointService.ts
366
391
  var WebhookEndpointService = class {
@@ -401,10 +426,16 @@ var WebhookEndpointService = class {
401
426
  });
402
427
  }
403
428
  };
429
+
430
+ // src/hooks/settings/webhooks/queryKeys.ts
431
+ var webhookEndpointsKeys = {
432
+ all: ["webhook-endpoints"],
433
+ list: (organizationId) => [...webhookEndpointsKeys.all, organizationId]
434
+ };
404
435
  function useListWebhookEndpoints() {
405
436
  const { apiRequest, workOSOrganizationId, isReady } = useElevasisServices();
406
437
  return useQuery({
407
- queryKey: ["webhook-endpoints", workOSOrganizationId],
438
+ queryKey: webhookEndpointsKeys.list(workOSOrganizationId),
408
439
  queryFn: async () => {
409
440
  const service = new WebhookEndpointService(apiRequest);
410
441
  return await service.listEndpoints();
@@ -421,7 +452,7 @@ function useCreateWebhookEndpoint() {
421
452
  return await service.createEndpoint(data);
422
453
  },
423
454
  onSuccess: () => {
424
- queryClient.invalidateQueries({ queryKey: ["webhook-endpoints"] });
455
+ queryClient.invalidateQueries({ queryKey: webhookEndpointsKeys.all });
425
456
  },
426
457
  onError: (error) => {
427
458
  console.error("Failed to create webhook endpoint:", error);
@@ -438,7 +469,7 @@ function useDeleteWebhookEndpoint() {
438
469
  return await service.deleteEndpoint(endpointId);
439
470
  },
440
471
  onSuccess: () => {
441
- queryClient.invalidateQueries({ queryKey: ["webhook-endpoints"] });
472
+ queryClient.invalidateQueries({ queryKey: webhookEndpointsKeys.all });
442
473
  notifications.show({
443
474
  title: "Success",
444
475
  message: "Webhook endpoint deleted",
@@ -460,7 +491,7 @@ function useUpdateWebhookEndpoint() {
460
491
  return await service.updateEndpoint(endpointId, data);
461
492
  },
462
493
  onSuccess: () => {
463
- queryClient.invalidateQueries({ queryKey: ["webhook-endpoints"] });
494
+ queryClient.invalidateQueries({ queryKey: webhookEndpointsKeys.all });
464
495
  notifications.show({
465
496
  title: "Success",
466
497
  message: "Webhook endpoint updated",
@@ -512,4 +543,4 @@ function useOrganizationMembers(organizationId, params) {
512
543
  });
513
544
  }
514
545
 
515
- export { MEMBERSHIP_STATUS_COLORS, OrganizationMembershipService, PROVISIONING_STATE_DISPLAY, WebhookEndpointService, transformMembershipToTableRow, useAssignRole, useCreateWebhookEndpoint, useDeactivateMembership, useDeleteWebhookEndpoint, useListWebhookEndpoints, useOrgRoles, useOrganizationMembers, usePermissionCatalog, useReactivateMembership, useRevokeRole, useUpdateWebhookEndpoint, useUserMemberships };
546
+ export { MEMBERSHIP_STATUS_COLORS, PROVISIONING_STATE_DISPLAY, WebhookEndpointService, createMembership, deactivateMembership, deleteMembership, getMembership, getOrganizationMembers, getUserMemberships, listMemberships, memberRolesKeys, membershipsKeys, orgRolesKeys, reactivateMembership, repairMembershipLink, transformMembershipToTableRow, updateMembership, useAssignRole, useCreateOrgRole, useCreateWebhookEndpoint, useDeactivateMembership, useDeleteOrgRole, useDeleteWebhookEndpoint, useEffectivePermissions, useListWebhookEndpoints, useOrgRoles, useOrganizationMembers, usePermissionCatalog, useReactivateMembership, useRevokeRole, useUpdateOrgRole, useUpdateWebhookEndpoint, useUserMemberships, webhookEndpointsKeys };
@@ -1,5 +1,5 @@
1
1
  import { PageContainer } from './chunk-BZZCNLT6.js';
2
- import { SubshellContentContainer } from './chunk-4VGPEDQF.js';
2
+ import { SubshellContentContainer } from './chunk-PSGSFPWA.js';
3
3
  import { jsx } from 'react/jsx-runtime';
4
4
 
5
5
  var SubshellPageLayout = ({ children, className }) => /* @__PURE__ */ jsx(SubshellContentContainer, { className, children: /* @__PURE__ */ jsx(PageContainer, { children }) });
@@ -1,9 +1,9 @@
1
1
  import { createLiveTempMessageIdentity } from './chunk-QFGNRKIE.js';
2
- import { sessionsKeys, isExecutionInFlight } from './chunk-4VGPEDQF.js';
3
- import { SessionIdParamSchema, ExecutionIdParamsSchema, WebSocketSessionTurnSchema } from './chunk-2GIJBHZT.js';
2
+ import { sessionsKeys, isExecutionInFlight } from './chunk-PSGSFPWA.js';
3
+ import { SessionIdParamSchema, ExecutionIdParamsSchema, WebSocketSessionTurnSchema } from './chunk-IIMC4TRH.js';
4
4
  import { useOrganization } from './chunk-DD3CCMCZ.js';
5
- import { STALE_TIME_MONITORING, STALE_TIME_DEFAULT } from './chunk-5ZK7K7YP.js';
6
- import { REFETCH_INTERVAL_RUNNING, WS_MAX_RETRIES_BEFORE_ERROR, WS_RECONNECT_BASE_DELAY, WS_RECONNECT_MAX_DELAY } from './chunk-Y6I3IC45.js';
5
+ import { STALE_TIME_MONITORING, STALE_TIME_DEFAULT } from './chunk-DEZW7QDI.js';
6
+ import { REFETCH_INTERVAL_RUNNING, WS_MAX_RETRIES_BEFORE_ERROR, WS_RECONNECT_BASE_DELAY, WS_RECONNECT_MAX_DELAY } from './chunk-6XBZPKMI.js';
7
7
  import { useElevasisServices } from './chunk-BI5VDO2K.js';
8
8
  import { useAuthContext } from './chunk-BRJ3QZ4E.js';
9
9
  import { useQuery, useQueryClient } from '@tanstack/react-query';
@@ -1,14 +1,14 @@
1
- import { eqOrgId, sanitizePostgrestValue, useBatchDeleteRows } from './chunk-7ICEQPBU.js';
1
+ import { eqOrgId, sanitizePostgrestValue, useBatchDeleteRows } from './chunk-AI5OYVLR.js';
2
2
  import { useSupabase } from './chunk-MKH2KOAO.js';
3
3
  import { useTableSort, sortData } from './chunk-2Y6AKWGU.js';
4
4
  import { useTableSelection } from './chunk-WDBNW44Z.js';
5
- import { SubshellPageLayout } from './chunk-ODXLZZFR.js';
5
+ import { SubshellPageLayout } from './chunk-SOBKRB4N.js';
6
6
  import { TableSelectionToolbar, SortableHeader } from './chunk-TUMSNGTX.js';
7
7
  import { FilterBar } from './chunk-PDHTXPSF.js';
8
- import { usePaginationState, PageTitleCaption, StatCard, EmptyState, CustomModal, SubshellContentContainer } from './chunk-4VGPEDQF.js';
9
- import { showApiErrorNotification } from './chunk-KXNRTJAE.js';
8
+ import { usePaginationState, PageTitleCaption, StatCard, EmptyState, CustomModal, SubshellContentContainer } from './chunk-PSGSFPWA.js';
9
+ import { showApiErrorNotification } from './chunk-PNCJJE4Z.js';
10
10
  import { useOrganization } from './chunk-DD3CCMCZ.js';
11
- import { PAGE_SIZE_DEFAULT } from './chunk-5ZK7K7YP.js';
11
+ import { PAGE_SIZE_DEFAULT } from './chunk-DEZW7QDI.js';
12
12
  import { Stack, SimpleGrid, Paper, Select, TextInput, Group, Button, Center, Loader, Table, Checkbox, Text, Badge, Pagination, Title, Anchor, Card, Divider } from '@mantine/core';
13
13
  import { IconFileText, IconCircleCheck, IconPencil, IconAlertTriangle, IconEye, IconClick, IconTarget, IconBrain, IconSearch, IconFilterOff, IconExternalLink, IconArrowLeft, IconPercentage, IconChartLine, IconForms } from '@tabler/icons-react';
14
14
  import { useState, useMemo } from 'react';
@@ -1,6 +1,6 @@
1
- import { REFETCH_INTERVAL_DASHBOARD } from './chunk-Y6I3IC45.js';
1
+ import { REFETCH_INTERVAL_DASHBOARD } from './chunk-6XBZPKMI.js';
2
2
  import { useElevasisServices } from './chunk-BI5VDO2K.js';
3
- import { ResourceTypeSchema, NonEmptyStringSchema, OriginResourceTypeSchema, UuidSchema } from './chunk-TVTSASST.js';
3
+ import { ResourceTypeSchema, NonEmptyStringSchema, OriginResourceTypeSchema, UuidSchema, PaginationQuerySchema, PageOffsetSchema, PageLimitSchema } from './chunk-34B3ACOZ.js';
4
4
  import { useQuery, useQueryClient, useMutation } from '@tanstack/react-query';
5
5
  import { z } from 'zod';
6
6
 
@@ -50,7 +50,7 @@ var OptionalOriginTrackingSchema = z.object({
50
50
  originResourceType: OriginResourceTypeSchema.optional(),
51
51
  originResourceId: z.string().max(100).optional()
52
52
  });
53
- z.object({
53
+ var CreateScheduleInputSchema = z.object({
54
54
  organizationId: UuidSchema,
55
55
  name: NonEmptyStringSchema.max(255),
56
56
  description: z.string().max(1e3).optional(),
@@ -60,27 +60,15 @@ z.object({
60
60
  idempotencyKey: z.string().max(255).optional(),
61
61
  metadata: z.record(z.string(), z.unknown()).optional()
62
62
  }).merge(OptionalOriginTrackingSchema);
63
- var CreateScheduleRequestSchema = z.object({
64
- name: z.string().min(1, "Name is required").max(255),
65
- description: z.string().max(1e3).optional(),
66
- target: z.object({
67
- resourceType: ResourceTypeSchema,
68
- resourceId: z.string().min(1, "Resource ID is required").max(255)
69
- }),
70
- scheduleConfig: TaskScheduleConfigSchema,
71
- maxRetries: z.number().int().min(0).max(10).optional(),
72
- idempotencyKey: z.string().max(255).optional(),
73
- // Origin tracking (optional)
74
- originExecutionId: z.string().uuid().optional(),
75
- originResourceType: OriginResourceTypeSchema.optional(),
76
- originResourceId: z.string().max(255).optional()
63
+ var CreateScheduleRequestSchema = CreateScheduleInputSchema.omit({
64
+ organizationId: true,
65
+ metadata: true
77
66
  });
78
67
  z.object({
79
68
  status: z.enum(["active", "paused", "completed", "cancelled"]).optional(),
80
69
  targetResourceType: ResourceTypeSchema.optional(),
81
70
  targetResourceId: z.string().optional(),
82
- limit: z.coerce.number().int().min(1).max(100).optional().default(50),
83
- offset: z.coerce.number().int().min(0).optional().default(0)
71
+ ...PaginationQuerySchema.shape
84
72
  });
85
73
  var GetScheduleParamsSchema = z.object({
86
74
  id: z.string().uuid("Invalid schedule ID")
@@ -135,8 +123,8 @@ z.object({
135
123
  id: z.string().uuid("Invalid schedule ID")
136
124
  });
137
125
  z.object({
138
- limit: z.coerce.number().int().min(1).max(100).optional().default(20),
139
- offset: z.coerce.number().int().min(0).optional().default(0)
126
+ limit: PageLimitSchema.default(20),
127
+ offset: PageOffsetSchema
140
128
  });
141
129
  var ScheduleResponseSchema = z.object({
142
130
  id: z.string().uuid(),