@elevasis/ui 1.7.5 → 1.8.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 (43) hide show
  1. package/dist/api/index.js +2 -3
  2. package/dist/auth/index.js +3 -4
  3. package/dist/charts/index.js +6 -8
  4. package/dist/{chunk-SFF5MJEI.js → chunk-2YBPRE6H.js} +1 -2
  5. package/dist/{chunk-U34YGJQB.js → chunk-3I2LOKQU.js} +1 -1
  6. package/dist/{chunk-PVVQTENF.js → chunk-3PURTICE.js} +1 -1
  7. package/dist/{chunk-2JBWPFHF.js → chunk-6TMW6VQ2.js} +1 -1
  8. package/dist/{chunk-6HZAMY6T.js → chunk-ARZM3OTI.js} +6 -2
  9. package/dist/{chunk-OK3XFSJJ.js → chunk-BWZMI4KP.js} +963 -10
  10. package/dist/{chunk-4KPI7YCY.js → chunk-EHXOR5LA.js} +2 -3
  11. package/dist/{chunk-Y7UY3HI4.js → chunk-ESOQEOOX.js} +2 -2
  12. package/dist/{chunk-L2CM2CUA.js → chunk-GZVH423C.js} +26 -3
  13. package/dist/{chunk-Y6DNK5ZD.js → chunk-JRJW2H57.js} +35 -9
  14. package/dist/{chunk-LBPALY25.js → chunk-JUPCUF77.js} +2 -2
  15. package/dist/chunk-QWYJHM3S.js +1068 -0
  16. package/dist/{chunk-NEK6JKPW.js → chunk-WUQWCUCB.js} +1 -1
  17. package/dist/chunk-Z4TPHMRD.js +231 -0
  18. package/dist/components/index.css +65 -0
  19. package/dist/components/index.d.ts +261 -2
  20. package/dist/components/index.js +1136 -80
  21. package/dist/hooks/index.css +452 -0
  22. package/dist/hooks/index.d.ts +1831 -13
  23. package/dist/hooks/index.js +15 -6
  24. package/dist/hooks/published.css +452 -0
  25. package/dist/hooks/published.d.ts +866 -6
  26. package/dist/hooks/published.js +15 -370
  27. package/dist/index.css +3 -0
  28. package/dist/index.d.ts +1665 -2
  29. package/dist/index.js +14 -17
  30. package/dist/initialization/index.js +3 -4
  31. package/dist/organization/index.js +3 -4
  32. package/dist/profile/index.js +1 -2
  33. package/dist/provider/index.css +3 -0
  34. package/dist/provider/index.js +7 -10
  35. package/dist/provider/published.js +6 -9
  36. package/dist/utils/index.d.ts +92 -1
  37. package/dist/utils/index.js +1 -2
  38. package/package.json +7 -3
  39. package/dist/chunk-4VGWQ5AN.js +0 -91
  40. package/dist/chunk-KA7LO7U5.js +0 -28
  41. package/dist/chunk-LFYO3MDC.js +0 -58
  42. package/dist/chunk-TIRMFDM4.js +0 -33
  43. package/dist/chunk-TYV5NJV2.js +0 -1
@@ -0,0 +1,1068 @@
1
+ import { CredentialNameSchema, UuidSchema, useErrorNotification } from './chunk-BWZMI4KP.js';
2
+ import { getTimeRangeDates } from './chunk-ARZM3OTI.js';
3
+ import { useNotificationAdapter } from './chunk-JRJW2H57.js';
4
+ import { GC_TIME_SHORT, STALE_TIME_MONITORING, GC_TIME_MEDIUM, STALE_TIME_DEFAULT, getErrorInfo, formatErrorMessage, getErrorTitle } from './chunk-Z4TPHMRD.js';
5
+ import { useElevasisServices } from './chunk-GZVH423C.js';
6
+ import { z } from 'zod';
7
+ import { create } from 'zustand';
8
+ import { useState, useRef, useEffect, useCallback, useMemo } from 'react';
9
+ import { persist } from 'zustand/middleware';
10
+ import { useQuery, useQueryClient, useMutation } from '@tanstack/react-query';
11
+ import { notifications } from '@mantine/notifications';
12
+
13
+ var MembershipRoleSchema = z.enum(["admin", "member"]);
14
+ z.enum(["active", "inactive"]);
15
+ var MembershipIdParamSchema = z.object({
16
+ id: z.string().min(1)
17
+ // WorkOS membership IDs can be various formats
18
+ }).strict();
19
+ var CreateMembershipSchema = z.object({
20
+ userId: z.string().min(1),
21
+ organizationId: z.string().min(1),
22
+ roleSlug: MembershipRoleSchema.default("member")
23
+ }).strict();
24
+ var UpdateMembershipSchema = z.object({
25
+ roleSlug: MembershipRoleSchema
26
+ }).strict();
27
+ var ListMembershipsQuerySchema = z.object({
28
+ userId: z.string().optional(),
29
+ organizationId: z.string().optional(),
30
+ limit: z.coerce.number().int().min(1).max(100).optional(),
31
+ before: z.string().optional(),
32
+ // WorkOS pagination cursor
33
+ after: z.string().optional()
34
+ // WorkOS pagination cursor
35
+ }).strict().refine(
36
+ (data) => data.userId || data.organizationId,
37
+ {
38
+ message: "Either userId or organizationId must be provided"
39
+ }
40
+ );
41
+ var CredentialTypeSchema = z.enum(["oauth", "api-key", "webhook-secret", "api-key-secret"]);
42
+ var CredentialValueSchema = z.record(z.string(), z.unknown()).refine((val) => Object.keys(val).length > 0, { message: "Credential value must not be empty" }).refine((val) => Object.keys(val).length <= 50, { message: "Credential value has too many keys (max 50)" }).refine(
43
+ (val) => {
44
+ for (const v of Object.values(val)) {
45
+ if (typeof v === "string" && v.length > 10240) {
46
+ return false;
47
+ }
48
+ }
49
+ return true;
50
+ },
51
+ { message: "Individual credential values too large (max 10KB per string)" }
52
+ );
53
+ var CreateCredentialRequestSchema = z.object({
54
+ name: CredentialNameSchema,
55
+ type: CredentialTypeSchema,
56
+ value: CredentialValueSchema,
57
+ provider: z.string().optional()
58
+ // OAuth provider ID ('dropbox', 'notion', 'google-sheets')
59
+ }).strict();
60
+ z.object({
61
+ id: UuidSchema,
62
+ name: z.string()
63
+ });
64
+ z.object({
65
+ credentials: z.array(
66
+ z.object({
67
+ id: UuidSchema,
68
+ name: z.string(),
69
+ type: z.string(),
70
+ provider: z.string().nullable(),
71
+ // OAuth provider or null for non-OAuth
72
+ createdAt: z.string().datetime()
73
+ })
74
+ )
75
+ });
76
+ var UpdateCredentialParamsSchema = z.object({
77
+ credentialId: UuidSchema
78
+ });
79
+ var UpdateCredentialRequestSchema = z.object({
80
+ value: CredentialValueSchema.optional(),
81
+ name: CredentialNameSchema.optional()
82
+ }).strict().refine((data) => data.value !== void 0 || data.name !== void 0, {
83
+ message: "At least one field (value or name) must be provided"
84
+ });
85
+ var DeleteCredentialParamsSchema = z.object({
86
+ credentialId: UuidSchema
87
+ });
88
+ z.object({
89
+ credentialName: CredentialNameSchema
90
+ });
91
+ z.object({
92
+ value: z.record(z.string(), z.unknown())
93
+ });
94
+ var CredentialSchemas = {
95
+ CreateRequest: CreateCredentialRequestSchema,
96
+ UpdateParams: UpdateCredentialParamsSchema,
97
+ UpdateRequest: UpdateCredentialRequestSchema,
98
+ DeleteParams: DeleteCredentialParamsSchema};
99
+ var useResourceSearch = create((set) => ({
100
+ query: "",
101
+ set: (query) => set({ query })
102
+ }));
103
+ var useStatusFilter = create((set) => ({
104
+ value: "all",
105
+ set: (value) => set({ value })
106
+ }));
107
+ function useVisibleResources() {
108
+ const [visibleIds, setVisibleIds] = useState(/* @__PURE__ */ new Set());
109
+ const observerRef = useRef(null);
110
+ const containerRef = useRef(null);
111
+ useEffect(() => {
112
+ observerRef.current = new IntersectionObserver(
113
+ (entries) => {
114
+ setVisibleIds((prev) => {
115
+ const next = new Set(prev);
116
+ for (const entry of entries) {
117
+ const id = entry.target.dataset.resourceId;
118
+ if (!id) continue;
119
+ if (entry.isIntersecting) {
120
+ next.add(id);
121
+ } else {
122
+ next.delete(id);
123
+ }
124
+ }
125
+ return next;
126
+ });
127
+ },
128
+ { threshold: 0.5 }
129
+ );
130
+ return () => {
131
+ observerRef.current?.disconnect();
132
+ };
133
+ }, []);
134
+ useEffect(() => {
135
+ const observer = observerRef.current;
136
+ const container = containerRef.current;
137
+ if (!observer || !container) return;
138
+ const cards = container.querySelectorAll("[data-resource-id]");
139
+ cards.forEach((card) => observer.observe(card));
140
+ return () => {
141
+ cards.forEach((card) => observer.unobserve(card));
142
+ };
143
+ });
144
+ const setContainerRef = useCallback((node) => {
145
+ containerRef.current = node;
146
+ }, []);
147
+ return { visibleIds, setContainerRef };
148
+ }
149
+ var FILTER_CYCLE = ["neutral", "include", "exclude"];
150
+ function createDomainFiltersStore(storageKey) {
151
+ return create()(
152
+ persist(
153
+ (set) => ({
154
+ filters: {},
155
+ cycle: (domainId) => set((state) => {
156
+ const current = state.filters[domainId] || "neutral";
157
+ const next = FILTER_CYCLE[(FILTER_CYCLE.indexOf(current) + 1) % FILTER_CYCLE.length];
158
+ return { filters: { ...state.filters, [domainId]: next } };
159
+ }),
160
+ reset: () => set({ filters: {} })
161
+ }),
162
+ { name: storageKey }
163
+ )
164
+ );
165
+ }
166
+ var useResourcesDomainFilters = createDomainFiltersStore("resources-domain-filters");
167
+ var useCommandViewDomainFilters = createDomainFiltersStore("command-view-domain-filters");
168
+ function filterByDomainFilters(items, filters) {
169
+ const includes = Object.entries(filters).filter(([, v]) => v === "include").map(([k]) => k);
170
+ const excludes = Object.entries(filters).filter(([, v]) => v === "exclude").map(([k]) => k);
171
+ if (includes.length === 0 && excludes.length === 0) return items;
172
+ return items.filter((r) => {
173
+ const domains = r.domains || [];
174
+ if (includes.length > 0 && !domains.some((d) => includes.includes(d))) return false;
175
+ if (excludes.length > 0 && domains.some((d) => excludes.includes(d))) return false;
176
+ return true;
177
+ });
178
+ }
179
+ var RANGE_MS = {
180
+ "1h": 60 * 60 * 1e3,
181
+ "24h": 24 * 60 * 60 * 1e3,
182
+ "7d": 7 * 24 * 60 * 60 * 1e3,
183
+ "30d": 30 * 24 * 60 * 60 * 1e3
184
+ };
185
+ function useTimeRangeDates(timeRange) {
186
+ return useMemo(() => {
187
+ const now = /* @__PURE__ */ new Date();
188
+ const start = new Date(now.getTime() - RANGE_MS[timeRange]);
189
+ return {
190
+ startDate: start.toISOString(),
191
+ endDate: now.toISOString()
192
+ };
193
+ }, [timeRange]);
194
+ }
195
+ function useActivityFilters(timeRange) {
196
+ const [filters, setFilters] = useState({
197
+ activityType: "all",
198
+ status: "all"
199
+ });
200
+ const updateFilter = useCallback((key, value) => {
201
+ setFilters((prev) => ({ ...prev, [key]: value }));
202
+ }, []);
203
+ const resetFilters = useCallback(() => {
204
+ setFilters({
205
+ activityType: "all",
206
+ status: "all"
207
+ });
208
+ }, []);
209
+ const getApiParams = useCallback(() => {
210
+ const params = {};
211
+ if (filters.activityType && filters.activityType !== "all") {
212
+ params.activityType = filters.activityType;
213
+ }
214
+ const { startDate } = getTimeRangeDates(timeRange);
215
+ params.startDate = startDate;
216
+ if (filters.status && filters.status !== "all") {
217
+ params.status = filters.status;
218
+ }
219
+ if (filters.search?.trim()) {
220
+ params.search = filters.search.trim();
221
+ }
222
+ return params;
223
+ }, [filters, timeRange]);
224
+ return {
225
+ filters,
226
+ updateFilter,
227
+ resetFilters,
228
+ getApiParams
229
+ };
230
+ }
231
+ var DEFAULT_FILTERS = {
232
+ resourceId: void 0,
233
+ status: "all",
234
+ resourceStatus: "all"
235
+ };
236
+ function useExecutionLogsFilters(_timeRange) {
237
+ const [filters, setFilters] = useState(DEFAULT_FILTERS);
238
+ const updateFilter = useCallback((key, value) => {
239
+ setFilters((prev) => ({ ...prev, [key]: value }));
240
+ }, []);
241
+ const resetFilters = useCallback(() => {
242
+ setFilters(DEFAULT_FILTERS);
243
+ }, []);
244
+ return { filters, updateFilter, resetFilters };
245
+ }
246
+ function useOrganizationMembers(organizationId, params) {
247
+ const { apiRequest } = useElevasisServices();
248
+ return useQuery({
249
+ queryKey: ["organization-members", organizationId, params],
250
+ queryFn: async () => {
251
+ const searchParams = new URLSearchParams();
252
+ searchParams.append("organizationId", organizationId);
253
+ const response = await apiRequest(`/memberships?${searchParams.toString()}`);
254
+ return response.data.map((membership) => ({
255
+ ...membership,
256
+ createdAt: membership.createdAt,
257
+ updatedAt: membership.updatedAt
258
+ }));
259
+ },
260
+ enabled: !!organizationId,
261
+ staleTime: STALE_TIME_MONITORING,
262
+ gcTime: GC_TIME_SHORT,
263
+ refetchOnWindowFocus: false
264
+ });
265
+ }
266
+
267
+ // src/hooks/settings/api-keys/apiKeyService.ts
268
+ var ApiKeyService = class {
269
+ constructor(apiRequest) {
270
+ this.apiRequest = apiRequest;
271
+ }
272
+ /**
273
+ * List API keys for the current organization
274
+ */
275
+ async listApiKeys() {
276
+ const response = await this.apiRequest("/api-keys");
277
+ return response.keys;
278
+ }
279
+ /**
280
+ * Create a new API key
281
+ */
282
+ async createApiKey(data) {
283
+ return await this.apiRequest("/api-keys", {
284
+ method: "POST",
285
+ body: JSON.stringify(data)
286
+ });
287
+ }
288
+ /**
289
+ * Update an API key's name
290
+ */
291
+ async updateApiKey(keyId, data) {
292
+ await this.apiRequest(`/api-keys/${keyId}`, {
293
+ method: "PATCH",
294
+ body: JSON.stringify(data)
295
+ });
296
+ }
297
+ /**
298
+ * Delete an API key
299
+ */
300
+ async deleteApiKey(keyId) {
301
+ await this.apiRequest(`/api-keys/${keyId}`, {
302
+ method: "DELETE"
303
+ });
304
+ }
305
+ };
306
+ function useListApiKeys() {
307
+ const { apiRequest, organizationId, isReady } = useElevasisServices();
308
+ return useQuery({
309
+ queryKey: ["api-keys", organizationId],
310
+ queryFn: async () => {
311
+ const service = new ApiKeyService(apiRequest);
312
+ return await service.listApiKeys();
313
+ },
314
+ enabled: isReady
315
+ });
316
+ }
317
+ function useCreateApiKey() {
318
+ const { apiRequest } = useElevasisServices();
319
+ const adapter = useNotificationAdapter();
320
+ const queryClient = useQueryClient();
321
+ return useMutation({
322
+ mutationFn: async (data) => {
323
+ const service = new ApiKeyService(apiRequest);
324
+ return await service.createApiKey(data);
325
+ },
326
+ onSuccess: () => {
327
+ queryClient.invalidateQueries({ queryKey: ["api-keys"] });
328
+ notifications.show({
329
+ title: "Success",
330
+ message: "API key created successfully. Please save it immediately!",
331
+ color: "teal"
332
+ });
333
+ },
334
+ onError: (error) => {
335
+ console.error("Failed to create API key:", error);
336
+ adapter.apiError(error);
337
+ }
338
+ });
339
+ }
340
+ function useDeleteApiKey() {
341
+ const { apiRequest } = useElevasisServices();
342
+ const adapter = useNotificationAdapter();
343
+ const queryClient = useQueryClient();
344
+ return useMutation({
345
+ mutationFn: async (keyId) => {
346
+ const service = new ApiKeyService(apiRequest);
347
+ return await service.deleteApiKey(keyId);
348
+ },
349
+ onSuccess: () => {
350
+ queryClient.invalidateQueries({ queryKey: ["api-keys"] });
351
+ notifications.show({
352
+ title: "Success",
353
+ message: "API key deleted successfully",
354
+ color: "teal"
355
+ });
356
+ },
357
+ onError: (error) => {
358
+ console.error("Failed to delete API key:", error);
359
+ adapter.apiError(error);
360
+ }
361
+ });
362
+ }
363
+ function useUpdateApiKey() {
364
+ const { apiRequest } = useElevasisServices();
365
+ const adapter = useNotificationAdapter();
366
+ const queryClient = useQueryClient();
367
+ return useMutation({
368
+ mutationFn: async ({ keyId, name }) => {
369
+ const service = new ApiKeyService(apiRequest);
370
+ return await service.updateApiKey(keyId, { name });
371
+ },
372
+ onSuccess: () => {
373
+ queryClient.invalidateQueries({ queryKey: ["api-keys"] });
374
+ notifications.show({
375
+ title: "Success",
376
+ message: "API key renamed successfully",
377
+ color: "teal"
378
+ });
379
+ },
380
+ onError: (error) => {
381
+ console.error("Failed to update API key:", error);
382
+ adapter.apiError(error);
383
+ }
384
+ });
385
+ }
386
+
387
+ // src/hooks/settings/credentials/credentialService.ts
388
+ var CredentialService = class {
389
+ constructor(apiRequest) {
390
+ this.apiRequest = apiRequest;
391
+ }
392
+ /**
393
+ * List credentials for the current organization
394
+ * Organization context is provided via workos-organization-id header
395
+ */
396
+ async listCredentials() {
397
+ const response = await this.apiRequest("/credentials");
398
+ return response.credentials;
399
+ }
400
+ /**
401
+ * Create a new credential
402
+ * Organization context is provided via workos-organization-id header
403
+ */
404
+ async createCredential(data) {
405
+ const validated = CredentialSchemas.CreateRequest.parse(data);
406
+ return await this.apiRequest(`/credentials`, {
407
+ method: "POST",
408
+ body: JSON.stringify(validated)
409
+ });
410
+ }
411
+ /**
412
+ * Update a credential value or metadata
413
+ * Organization context is provided via workos-organization-id header
414
+ */
415
+ async updateCredential(credentialId, updates) {
416
+ CredentialSchemas.UpdateParams.parse({ credentialId });
417
+ const validated = CredentialSchemas.UpdateRequest.parse(updates);
418
+ await this.apiRequest(`/credentials/${credentialId}`, {
419
+ method: "PATCH",
420
+ body: JSON.stringify(validated)
421
+ });
422
+ }
423
+ /**
424
+ * Delete a credential
425
+ * Organization context is provided via workos-organization-id header
426
+ */
427
+ async deleteCredential(credentialId) {
428
+ CredentialSchemas.DeleteParams.parse({ credentialId });
429
+ await this.apiRequest(`/credentials/${credentialId}`, {
430
+ method: "DELETE"
431
+ });
432
+ }
433
+ };
434
+ function useCredentials() {
435
+ const { apiRequest, organizationId, isReady } = useElevasisServices();
436
+ return useQuery({
437
+ queryKey: ["credentials", organizationId],
438
+ queryFn: async () => {
439
+ const service = new CredentialService(apiRequest);
440
+ return await service.listCredentials();
441
+ },
442
+ enabled: isReady
443
+ });
444
+ }
445
+ function useCreateCredential() {
446
+ const { apiRequest } = useElevasisServices();
447
+ const adapter = useNotificationAdapter();
448
+ const queryClient = useQueryClient();
449
+ return useMutation({
450
+ mutationFn: async (data) => {
451
+ const service = new CredentialService(apiRequest);
452
+ return await service.createCredential(data);
453
+ },
454
+ onSuccess: () => {
455
+ queryClient.invalidateQueries({ queryKey: ["credentials"] });
456
+ notifications.show({
457
+ title: "Success",
458
+ message: "Credential created successfully",
459
+ color: "green"
460
+ });
461
+ },
462
+ onError: (error) => {
463
+ console.error("Failed to create credential:", error);
464
+ adapter.apiError(error);
465
+ }
466
+ });
467
+ }
468
+ function useDeleteCredential() {
469
+ const { apiRequest } = useElevasisServices();
470
+ const adapter = useNotificationAdapter();
471
+ const queryClient = useQueryClient();
472
+ return useMutation({
473
+ mutationFn: async (credentialId) => {
474
+ const service = new CredentialService(apiRequest);
475
+ return await service.deleteCredential(credentialId);
476
+ },
477
+ onSuccess: () => {
478
+ queryClient.invalidateQueries({ queryKey: ["credentials"] });
479
+ notifications.show({
480
+ title: "Success",
481
+ message: "Credential deleted successfully",
482
+ color: "green"
483
+ });
484
+ },
485
+ onError: (error) => {
486
+ console.error("Failed to delete credential:", error);
487
+ adapter.apiError(error);
488
+ }
489
+ });
490
+ }
491
+ function useUpdateCredential() {
492
+ const { apiRequest } = useElevasisServices();
493
+ const adapter = useNotificationAdapter();
494
+ const queryClient = useQueryClient();
495
+ return useMutation({
496
+ mutationFn: async ({ credentialId, updates }) => {
497
+ const service = new CredentialService(apiRequest);
498
+ return await service.updateCredential(credentialId, updates);
499
+ },
500
+ onSuccess: () => {
501
+ queryClient.invalidateQueries({ queryKey: ["credentials"] });
502
+ notifications.show({
503
+ title: "Success",
504
+ message: "Credential updated successfully",
505
+ color: "green"
506
+ });
507
+ },
508
+ onError: (error) => {
509
+ console.error("Failed to update credential:", error);
510
+ adapter.apiError(error);
511
+ }
512
+ });
513
+ }
514
+
515
+ // src/hooks/settings/deployments/deploymentService.ts
516
+ var DeploymentService = class {
517
+ constructor(apiRequest) {
518
+ this.apiRequest = apiRequest;
519
+ }
520
+ async listDeployments() {
521
+ const response = await this.apiRequest("/deployments");
522
+ return response.deployments;
523
+ }
524
+ async getDeployment(id) {
525
+ return await this.apiRequest(`/deployments/${id}`);
526
+ }
527
+ async activateDeployment(id) {
528
+ return await this.apiRequest(`/deployments/${id}/activate`, { method: "POST" });
529
+ }
530
+ async deactivateDeployment(id) {
531
+ return await this.apiRequest(`/deployments/${id}/deactivate`, { method: "POST" });
532
+ }
533
+ async deleteDeployment(id) {
534
+ await this.apiRequest(`/deployments/${id}`, { method: "DELETE" });
535
+ }
536
+ };
537
+ function useListDeployments() {
538
+ const { apiRequest, organizationId, isReady } = useElevasisServices();
539
+ return useQuery({
540
+ queryKey: ["deployments", organizationId],
541
+ queryFn: async () => {
542
+ const service = new DeploymentService(apiRequest);
543
+ return await service.listDeployments();
544
+ },
545
+ enabled: isReady,
546
+ refetchInterval: (query) => {
547
+ const deployments = query.state.data ?? [];
548
+ return deployments.some((d) => d.status === "deploying") ? 5e3 : false;
549
+ }
550
+ });
551
+ }
552
+ function useActivateDeployment() {
553
+ const { apiRequest, organizationId } = useElevasisServices();
554
+ const queryClient = useQueryClient();
555
+ const showError = useErrorNotification();
556
+ return useMutation({
557
+ mutationFn: (deploymentId) => {
558
+ const service = new DeploymentService(apiRequest);
559
+ return service.activateDeployment(deploymentId);
560
+ },
561
+ onSuccess: () => {
562
+ queryClient.invalidateQueries({ queryKey: ["deployments", organizationId] });
563
+ notifications.show({ title: "Success", message: "Deployment activated", color: "teal" });
564
+ },
565
+ onError: (error) => {
566
+ console.error("Failed to activate deployment:", error);
567
+ showError(error);
568
+ }
569
+ });
570
+ }
571
+ function useDeactivateDeployment() {
572
+ const { apiRequest, organizationId } = useElevasisServices();
573
+ const queryClient = useQueryClient();
574
+ const showError = useErrorNotification();
575
+ return useMutation({
576
+ mutationFn: (deploymentId) => {
577
+ const service = new DeploymentService(apiRequest);
578
+ return service.deactivateDeployment(deploymentId);
579
+ },
580
+ onSuccess: () => {
581
+ queryClient.invalidateQueries({ queryKey: ["deployments", organizationId] });
582
+ notifications.show({ title: "Success", message: "Deployment deactivated", color: "teal" });
583
+ },
584
+ onError: (error) => {
585
+ console.error("Failed to deactivate deployment:", error);
586
+ showError(error);
587
+ }
588
+ });
589
+ }
590
+ function useDeleteDeployment() {
591
+ const { apiRequest, organizationId } = useElevasisServices();
592
+ const queryClient = useQueryClient();
593
+ const showError = useErrorNotification();
594
+ return useMutation({
595
+ mutationFn: (deploymentId) => {
596
+ const service = new DeploymentService(apiRequest);
597
+ return service.deleteDeployment(deploymentId);
598
+ },
599
+ onSuccess: () => {
600
+ queryClient.invalidateQueries({ queryKey: ["deployments", organizationId] });
601
+ notifications.show({ title: "Success", message: "Deployment deleted", color: "teal" });
602
+ },
603
+ onError: (error) => {
604
+ console.error("Failed to delete deployment:", error);
605
+ showError(error);
606
+ }
607
+ });
608
+ }
609
+
610
+ // src/hooks/settings/organization/organizationMembershipService.ts
611
+ var OrganizationMembershipService = class {
612
+ constructor(apiRequest) {
613
+ this.apiRequest = apiRequest;
614
+ }
615
+ /**
616
+ * Get user's organization memberships
617
+ */
618
+ async getUserMemberships(userId) {
619
+ const searchParams = new URLSearchParams();
620
+ searchParams.append("userId", userId);
621
+ const url = `/memberships?${searchParams.toString()}`;
622
+ const response = await this.apiRequest(url);
623
+ return response.data.map((membership) => ({
624
+ ...membership,
625
+ createdAt: membership.createdAt,
626
+ updatedAt: membership.updatedAt
627
+ }));
628
+ }
629
+ /**
630
+ * Get organization members
631
+ */
632
+ async getOrganizationMembers(organizationId) {
633
+ const searchParams = new URLSearchParams();
634
+ searchParams.append("organizationId", organizationId);
635
+ const url = `/memberships?${searchParams.toString()}`;
636
+ const response = await this.apiRequest(url);
637
+ return response.data.map((membership) => ({
638
+ ...membership,
639
+ createdAt: membership.createdAt,
640
+ updatedAt: membership.updatedAt
641
+ }));
642
+ }
643
+ /**
644
+ * List memberships with filtering
645
+ */
646
+ async listMemberships(params) {
647
+ if (params) {
648
+ ListMembershipsQuerySchema.parse(params);
649
+ }
650
+ const searchParams = new URLSearchParams();
651
+ if (params?.userId) {
652
+ searchParams.append("userId", params.userId);
653
+ }
654
+ if (params?.organizationId) {
655
+ searchParams.append("organizationId", params.organizationId);
656
+ }
657
+ if (params?.statuses) {
658
+ params.statuses.forEach((status) => searchParams.append("statuses", status));
659
+ }
660
+ if (params?.limit) {
661
+ searchParams.append("limit", params.limit.toString());
662
+ }
663
+ if (params?.before) {
664
+ searchParams.append("before", params.before);
665
+ }
666
+ if (params?.after) {
667
+ searchParams.append("after", params.after);
668
+ }
669
+ if (params?.order) {
670
+ searchParams.append("order", params.order);
671
+ }
672
+ const url = `/memberships${searchParams.toString() ? `?${searchParams.toString()}` : ""}`;
673
+ const response = await this.apiRequest(url);
674
+ return {
675
+ ...response,
676
+ data: response.data.map((membership) => ({
677
+ ...membership,
678
+ createdAt: membership.createdAt,
679
+ updatedAt: membership.updatedAt
680
+ }))
681
+ };
682
+ }
683
+ /**
684
+ * Get a single membership by ID
685
+ */
686
+ async getMembership(membershipId) {
687
+ MembershipIdParamSchema.parse({ id: membershipId });
688
+ const membership = await this.apiRequest(`/memberships/${membershipId}`);
689
+ return {
690
+ ...membership,
691
+ createdAt: membership.createdAt,
692
+ updatedAt: membership.updatedAt
693
+ };
694
+ }
695
+ /**
696
+ * Create a new organization membership
697
+ */
698
+ async createMembership(data) {
699
+ const validated = CreateMembershipSchema.parse(data);
700
+ const membership = await this.apiRequest("/memberships", {
701
+ method: "POST",
702
+ body: JSON.stringify(validated)
703
+ });
704
+ return {
705
+ ...membership,
706
+ createdAt: membership.createdAt,
707
+ updatedAt: membership.updatedAt
708
+ };
709
+ }
710
+ /**
711
+ * Update an existing membership
712
+ */
713
+ async updateMembership(membershipId, data) {
714
+ MembershipIdParamSchema.parse({ id: membershipId });
715
+ const validated = UpdateMembershipSchema.parse(data);
716
+ const membership = await this.apiRequest(`/memberships/${membershipId}`, {
717
+ method: "PUT",
718
+ body: JSON.stringify(validated)
719
+ });
720
+ return {
721
+ ...membership,
722
+ createdAt: membership.createdAt,
723
+ updatedAt: membership.updatedAt
724
+ };
725
+ }
726
+ /**
727
+ * Delete a membership
728
+ */
729
+ async deleteMembership(membershipId) {
730
+ MembershipIdParamSchema.parse({ id: membershipId });
731
+ await this.apiRequest(`/memberships/${membershipId}`, {
732
+ method: "DELETE"
733
+ });
734
+ }
735
+ /**
736
+ * Deactivate a membership (soft delete)
737
+ */
738
+ async deactivateMembership(membershipId) {
739
+ MembershipIdParamSchema.parse({ id: membershipId });
740
+ const membership = await this.apiRequest(`/memberships/${membershipId}/deactivate`, {
741
+ method: "POST"
742
+ });
743
+ return {
744
+ ...membership,
745
+ createdAt: membership.createdAt,
746
+ updatedAt: membership.updatedAt
747
+ };
748
+ }
749
+ /**
750
+ * Reactivate a membership
751
+ */
752
+ async reactivateMembership(membershipId) {
753
+ MembershipIdParamSchema.parse({ id: membershipId });
754
+ const membership = await this.apiRequest(`/memberships/${membershipId}/reactivate`, {
755
+ method: "POST"
756
+ });
757
+ return {
758
+ ...membership,
759
+ createdAt: membership.createdAt,
760
+ updatedAt: membership.updatedAt
761
+ };
762
+ }
763
+ };
764
+ function useUserMemberships(userId, params) {
765
+ const { apiRequest, isReady } = useElevasisServices();
766
+ return useQuery({
767
+ queryKey: ["memberships", "user", userId, params],
768
+ queryFn: async () => {
769
+ const membershipService = new OrganizationMembershipService(apiRequest);
770
+ return await membershipService.getUserMemberships(userId);
771
+ },
772
+ enabled: isReady && !!userId,
773
+ refetchOnWindowFocus: false,
774
+ staleTime: STALE_TIME_DEFAULT,
775
+ gcTime: GC_TIME_MEDIUM
776
+ });
777
+ }
778
+ function useUpdateMemberConfig() {
779
+ const { apiRequest } = useElevasisServices();
780
+ const adapter = useNotificationAdapter();
781
+ const queryClient = useQueryClient();
782
+ return useMutation({
783
+ mutationFn: async ({ membershipId, config }) => {
784
+ return apiRequest(`/memberships/${membershipId}/config`, {
785
+ method: "PATCH",
786
+ body: JSON.stringify({ config })
787
+ });
788
+ },
789
+ onSuccess: () => {
790
+ queryClient.invalidateQueries({ queryKey: ["memberships"] });
791
+ notifications.show({
792
+ title: "Success",
793
+ message: "Member config updated",
794
+ color: "teal"
795
+ });
796
+ },
797
+ onError: (error) => {
798
+ adapter.apiError(error);
799
+ }
800
+ });
801
+ }
802
+ function useDeactivateMembership() {
803
+ const { apiRequest } = useElevasisServices();
804
+ const adapter = useNotificationAdapter();
805
+ const queryClient = useQueryClient();
806
+ return useMutation({
807
+ mutationFn: async ({ membershipId }) => {
808
+ const membershipService = new OrganizationMembershipService(apiRequest);
809
+ return await membershipService.deactivateMembership(membershipId);
810
+ },
811
+ onMutate: async (variables) => {
812
+ await queryClient.cancelQueries({ queryKey: ["memberships"] });
813
+ const previousData = queryClient.getQueryData(["memberships"]);
814
+ if (variables.userId) {
815
+ queryClient.setQueryData(
816
+ ["memberships", "user", variables.userId],
817
+ (old) => {
818
+ if (!old) return old;
819
+ return old.map(
820
+ (membership) => membership.id === variables.membershipId ? { ...membership, status: "inactive", updatedAt: (/* @__PURE__ */ new Date()).toISOString() } : membership
821
+ );
822
+ }
823
+ );
824
+ }
825
+ if (variables.organizationId) {
826
+ queryClient.setQueryData(
827
+ ["memberships", "organization", variables.organizationId],
828
+ (old) => {
829
+ if (!old) return old;
830
+ return old.map(
831
+ (membership) => membership.id === variables.membershipId ? { ...membership, status: "inactive", updatedAt: (/* @__PURE__ */ new Date()).toISOString() } : membership
832
+ );
833
+ }
834
+ );
835
+ }
836
+ return { previousData };
837
+ },
838
+ onError: (error, _variables, context) => {
839
+ if (context?.previousData) {
840
+ queryClient.setQueryData(["memberships"], context.previousData);
841
+ }
842
+ adapter.apiError(error);
843
+ },
844
+ onSuccess: () => {
845
+ queryClient.invalidateQueries({ queryKey: ["memberships"] });
846
+ },
847
+ onSettled: () => {
848
+ queryClient.invalidateQueries({ queryKey: ["memberships"] });
849
+ }
850
+ });
851
+ }
852
+ function useReactivateMembership() {
853
+ const { apiRequest } = useElevasisServices();
854
+ const adapter = useNotificationAdapter();
855
+ const queryClient = useQueryClient();
856
+ return useMutation({
857
+ mutationFn: async ({ membershipId }) => {
858
+ const membershipService = new OrganizationMembershipService(apiRequest);
859
+ return await membershipService.reactivateMembership(membershipId);
860
+ },
861
+ onMutate: async (variables) => {
862
+ await queryClient.cancelQueries({ queryKey: ["memberships"] });
863
+ const previousData = queryClient.getQueryData(["memberships"]);
864
+ if (variables.userId) {
865
+ queryClient.setQueryData(
866
+ ["memberships", "user", variables.userId],
867
+ (old) => {
868
+ if (!old) return old;
869
+ return old.map(
870
+ (membership) => membership.id === variables.membershipId ? { ...membership, status: "active", updatedAt: (/* @__PURE__ */ new Date()).toISOString() } : membership
871
+ );
872
+ }
873
+ );
874
+ }
875
+ if (variables.organizationId) {
876
+ queryClient.setQueryData(
877
+ ["memberships", "organization", variables.organizationId],
878
+ (old) => {
879
+ if (!old) return old;
880
+ return old.map(
881
+ (membership) => membership.id === variables.membershipId ? { ...membership, status: "active", updatedAt: (/* @__PURE__ */ new Date()).toISOString() } : membership
882
+ );
883
+ }
884
+ );
885
+ }
886
+ return { previousData };
887
+ },
888
+ onError: (error, _variables, context) => {
889
+ if (context?.previousData) {
890
+ queryClient.setQueryData(["memberships"], context.previousData);
891
+ }
892
+ adapter.apiError(error);
893
+ },
894
+ onSuccess: () => {
895
+ queryClient.invalidateQueries({ queryKey: ["memberships"] });
896
+ },
897
+ onSettled: () => {
898
+ queryClient.invalidateQueries({ queryKey: ["memberships"] });
899
+ }
900
+ });
901
+ }
902
+
903
+ // src/hooks/settings/webhooks/webhookEndpointService.ts
904
+ var WebhookEndpointService = class {
905
+ constructor(apiRequest) {
906
+ this.apiRequest = apiRequest;
907
+ }
908
+ /**
909
+ * List webhook endpoints for the current organization
910
+ */
911
+ async listEndpoints() {
912
+ const response = await this.apiRequest("/webhook-endpoints");
913
+ return response.data;
914
+ }
915
+ /**
916
+ * Create a new webhook endpoint
917
+ */
918
+ async createEndpoint(data) {
919
+ return await this.apiRequest("/webhook-endpoints", {
920
+ method: "POST",
921
+ body: JSON.stringify(data)
922
+ });
923
+ }
924
+ /**
925
+ * Update an existing webhook endpoint (e.g., toggle status, rename)
926
+ */
927
+ async updateEndpoint(endpointId, data) {
928
+ return await this.apiRequest(`/webhook-endpoints/${endpointId}`, {
929
+ method: "PATCH",
930
+ body: JSON.stringify(data)
931
+ });
932
+ }
933
+ /**
934
+ * Delete a webhook endpoint
935
+ */
936
+ async deleteEndpoint(endpointId) {
937
+ await this.apiRequest(`/webhook-endpoints/${endpointId}`, {
938
+ method: "DELETE"
939
+ });
940
+ }
941
+ };
942
+
943
+ // src/hooks/settings/webhooks/useListWebhookEndpoints.ts
944
+ function useListWebhookEndpoints() {
945
+ const { apiRequest, organizationId, isReady } = useElevasisServices();
946
+ return useQuery({
947
+ queryKey: ["webhook-endpoints", organizationId],
948
+ queryFn: async () => {
949
+ const service = new WebhookEndpointService(apiRequest);
950
+ return await service.listEndpoints();
951
+ },
952
+ enabled: isReady
953
+ });
954
+ }
955
+ var showInfoNotification = (message) => {
956
+ notifications.show({
957
+ title: "Info",
958
+ message,
959
+ autoClose: 5e3,
960
+ color: "blue",
961
+ position: "top-right"
962
+ });
963
+ };
964
+ var showSuccessNotification = (message) => {
965
+ notifications.show({
966
+ title: "Action Successful",
967
+ message,
968
+ autoClose: 5e3,
969
+ color: "green",
970
+ position: "top-right"
971
+ });
972
+ };
973
+ var showErrorNotification = (error) => {
974
+ if (error instanceof Error) {
975
+ error = error.message;
976
+ }
977
+ notifications.show({
978
+ title: "Action Failed",
979
+ message: error,
980
+ autoClose: 5e3,
981
+ color: "red",
982
+ position: "top-right"
983
+ });
984
+ };
985
+ var showWarningNotification = (message) => {
986
+ notifications.show({
987
+ title: "Warning",
988
+ message,
989
+ autoClose: 5e3,
990
+ color: "orange",
991
+ position: "top-right"
992
+ });
993
+ };
994
+ var showApiErrorNotification = (error) => {
995
+ const { message, code, requestId, fields, retryAfter } = getErrorInfo(error);
996
+ notifications.show({
997
+ title: getErrorTitle(code),
998
+ message: formatErrorMessage(message, requestId, fields, retryAfter),
999
+ autoClose: retryAfter ? retryAfter * 1e3 : 5e3,
1000
+ color: "red",
1001
+ position: "top-right"
1002
+ });
1003
+ };
1004
+
1005
+ // src/hooks/settings/webhooks/useCreateWebhookEndpoint.ts
1006
+ function useCreateWebhookEndpoint() {
1007
+ const { apiRequest } = useElevasisServices();
1008
+ const queryClient = useQueryClient();
1009
+ return useMutation({
1010
+ mutationFn: async (data) => {
1011
+ const service = new WebhookEndpointService(apiRequest);
1012
+ return await service.createEndpoint(data);
1013
+ },
1014
+ onSuccess: () => {
1015
+ queryClient.invalidateQueries({ queryKey: ["webhook-endpoints"] });
1016
+ },
1017
+ onError: (error) => {
1018
+ console.error("Failed to create webhook endpoint:", error);
1019
+ showApiErrorNotification(error);
1020
+ }
1021
+ });
1022
+ }
1023
+ function useDeleteWebhookEndpoint() {
1024
+ const { apiRequest } = useElevasisServices();
1025
+ const queryClient = useQueryClient();
1026
+ return useMutation({
1027
+ mutationFn: async (endpointId) => {
1028
+ const service = new WebhookEndpointService(apiRequest);
1029
+ return await service.deleteEndpoint(endpointId);
1030
+ },
1031
+ onSuccess: () => {
1032
+ queryClient.invalidateQueries({ queryKey: ["webhook-endpoints"] });
1033
+ notifications.show({
1034
+ title: "Success",
1035
+ message: "Webhook endpoint deleted",
1036
+ color: "teal"
1037
+ });
1038
+ },
1039
+ onError: (error) => {
1040
+ console.error("Failed to delete webhook endpoint:", error);
1041
+ showApiErrorNotification(error);
1042
+ }
1043
+ });
1044
+ }
1045
+ function useUpdateWebhookEndpoint() {
1046
+ const { apiRequest } = useElevasisServices();
1047
+ const queryClient = useQueryClient();
1048
+ return useMutation({
1049
+ mutationFn: async ({ endpointId, data }) => {
1050
+ const service = new WebhookEndpointService(apiRequest);
1051
+ return await service.updateEndpoint(endpointId, data);
1052
+ },
1053
+ onSuccess: () => {
1054
+ queryClient.invalidateQueries({ queryKey: ["webhook-endpoints"] });
1055
+ notifications.show({
1056
+ title: "Success",
1057
+ message: "Webhook endpoint updated",
1058
+ color: "teal"
1059
+ });
1060
+ },
1061
+ onError: (error) => {
1062
+ console.error("Failed to update webhook endpoint:", error);
1063
+ showApiErrorNotification(error);
1064
+ }
1065
+ });
1066
+ }
1067
+
1068
+ export { ApiKeyService, CredentialService, DeploymentService, OrganizationMembershipService, WebhookEndpointService, filterByDomainFilters, showApiErrorNotification, showErrorNotification, showInfoNotification, showSuccessNotification, showWarningNotification, useActivateDeployment, useActivityFilters, useCommandViewDomainFilters, useCreateApiKey, useCreateCredential, useCreateWebhookEndpoint, useCredentials, useDeactivateDeployment, useDeactivateMembership, useDeleteApiKey, useDeleteCredential, useDeleteDeployment, useDeleteWebhookEndpoint, useExecutionLogsFilters, useListApiKeys, useListDeployments, useListWebhookEndpoints, useOrganizationMembers, useReactivateMembership, useResourceSearch, useResourcesDomainFilters, useStatusFilter, useTimeRangeDates, useUpdateApiKey, useUpdateCredential, useUpdateMemberConfig, useUpdateWebhookEndpoint, useUserMemberships, useVisibleResources };