@burdenoff/microfe-adaptercloud 2026.825.4 → 2026.827.1

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 (48) hide show
  1. package/dist/adaptercloud/components/ActiveSwitch.d.ts +17 -0
  2. package/dist/adaptercloud/components/ActiveSwitch.d.ts.map +1 -0
  3. package/dist/adaptercloud/components/ActiveSwitch.js +28 -0
  4. package/dist/adaptercloud/components/ActiveSwitch.js.map +1 -0
  5. package/dist/adaptercloud/components/index.d.ts +1 -0
  6. package/dist/adaptercloud/components/index.d.ts.map +1 -1
  7. package/dist/adaptercloud/hooks/useAdapterCloudApi.d.ts +28 -2
  8. package/dist/adaptercloud/hooks/useAdapterCloudApi.d.ts.map +1 -1
  9. package/dist/adaptercloud/hooks/useAdapterCloudApi.js +43 -18
  10. package/dist/adaptercloud/hooks/useAdapterCloudApi.js.map +1 -1
  11. package/dist/adaptercloud/pages/OverviewPage.d.ts.map +1 -1
  12. package/dist/adaptercloud/pages/OverviewPage.js +4 -4
  13. package/dist/adaptercloud/pages/OverviewPage.js.map +1 -1
  14. package/dist/adaptercloud/pages/adapters/AdaptersListPage.d.ts.map +1 -1
  15. package/dist/adaptercloud/pages/adapters/AdaptersListPage.js +6 -5
  16. package/dist/adaptercloud/pages/adapters/AdaptersListPage.js.map +1 -1
  17. package/dist/adaptercloud/pages/connections/ConnectionDetailPage.d.ts.map +1 -1
  18. package/dist/adaptercloud/pages/connections/ConnectionDetailPage.js +217 -104
  19. package/dist/adaptercloud/pages/connections/ConnectionDetailPage.js.map +1 -1
  20. package/dist/adaptercloud/pages/connections/ConnectionsListPage.d.ts.map +1 -1
  21. package/dist/adaptercloud/pages/connections/ConnectionsListPage.js +6 -5
  22. package/dist/adaptercloud/pages/connections/ConnectionsListPage.js.map +1 -1
  23. package/dist/adaptercloud/pages/costs/CostsPage.d.ts.map +1 -1
  24. package/dist/adaptercloud/pages/costs/CostsPage.js +183 -156
  25. package/dist/adaptercloud/pages/costs/CostsPage.js.map +1 -1
  26. package/dist/adaptercloud/pages/drift/DriftListPage.d.ts.map +1 -1
  27. package/dist/adaptercloud/pages/drift/DriftListPage.js +108 -107
  28. package/dist/adaptercloud/pages/drift/DriftListPage.js.map +1 -1
  29. package/dist/adaptercloud/pages/policies/PoliciesListPage.d.ts.map +1 -1
  30. package/dist/adaptercloud/pages/policies/PoliciesListPage.js +141 -131
  31. package/dist/adaptercloud/pages/policies/PoliciesListPage.js.map +1 -1
  32. package/dist/adaptercloud/pages/policies/PolicyDetailPage.d.ts.map +1 -1
  33. package/dist/adaptercloud/pages/policies/PolicyDetailPage.js +171 -117
  34. package/dist/adaptercloud/pages/policies/PolicyDetailPage.js.map +1 -1
  35. package/dist/adaptercloud/pages/resources/ResourcesListPage.d.ts.map +1 -1
  36. package/dist/adaptercloud/pages/resources/ResourcesListPage.js +85 -66
  37. package/dist/adaptercloud/pages/resources/ResourcesListPage.js.map +1 -1
  38. package/dist/adaptercloud/pages/sync-runs/SyncRunsListPage.d.ts.map +1 -1
  39. package/dist/adaptercloud/pages/sync-runs/SyncRunsListPage.js +148 -121
  40. package/dist/adaptercloud/pages/sync-runs/SyncRunsListPage.js.map +1 -1
  41. package/dist/adaptercloud/pages/violations/ViolationsListPage.d.ts.map +1 -1
  42. package/dist/adaptercloud/pages/violations/ViolationsListPage.js +145 -144
  43. package/dist/adaptercloud/pages/violations/ViolationsListPage.js.map +1 -1
  44. package/dist/utils/pageContext.d.ts +0 -2
  45. package/dist/utils/pageContext.d.ts.map +1 -1
  46. package/dist/utils/pageContext.js +1 -3
  47. package/dist/utils/pageContext.js.map +1 -1
  48. package/package.json +1 -1
@@ -0,0 +1,17 @@
1
+ import { FC } from 'react';
2
+
3
+ interface ActiveSwitchProps {
4
+ checked: boolean;
5
+ onToggle: () => void;
6
+ disabled?: boolean;
7
+ /** Accessible name — describes the action the switch performs. */
8
+ label: string;
9
+ /** Optional visible text rendered beside the switch. */
10
+ children?: React.ReactNode;
11
+ /** Stop the click from reaching a clickable ancestor (e.g. a card row). */
12
+ stopPropagation?: boolean;
13
+ className?: string;
14
+ }
15
+ export declare const ActiveSwitch: FC<ActiveSwitchProps>;
16
+ export {};
17
+ //# sourceMappingURL=ActiveSwitch.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ActiveSwitch.d.ts","sourceRoot":"","sources":["../../../src/adaptercloud/components/ActiveSwitch.tsx"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,EAAE,EAAE,MAAM,OAAO,CAAC;AAGhC,UAAU,iBAAiB;IACzB,OAAO,EAAE,OAAO,CAAC;IACjB,QAAQ,EAAE,MAAM,IAAI,CAAC;IACrB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,kEAAkE;IAClE,KAAK,EAAE,MAAM,CAAC;IACd,wDAAwD;IACxD,QAAQ,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IAC3B,2EAA2E;IAC3E,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,eAAO,MAAM,YAAY,EAAE,EAAE,CAAC,iBAAiB,CAmC9C,CAAC"}
@@ -0,0 +1,28 @@
1
+ import { cn as e } from "../utils/cn.js";
2
+ import { jsx as t, jsxs as n } from "react/jsx-runtime";
3
+ //#region src/adaptercloud/components/ActiveSwitch.tsx
4
+ var r = ({ checked: r, onToggle: i, disabled: a = !1, label: o, children: s, stopPropagation: c = !1, className: l }) => /* @__PURE__ */ n("div", {
5
+ className: e("flex items-center gap-2", l),
6
+ children: [/* @__PURE__ */ t("button", {
7
+ type: "button",
8
+ role: "switch",
9
+ "aria-checked": r,
10
+ "aria-label": o,
11
+ disabled: a,
12
+ onClick: (e) => {
13
+ c && e.stopPropagation(), i();
14
+ },
15
+ className: e("relative inline-flex h-5 w-9 shrink-0 items-center rounded-full border transition-colors focus:outline-none focus-visible:ring-2 focus-visible:ring-[var(--color-focus-ring)] disabled:opacity-60", r ? "border-transparent bg-action-primary-bg" : "border-border-subtle bg-bg-sunken"),
16
+ children: /* @__PURE__ */ t("span", {
17
+ "aria-hidden": "true",
18
+ className: e("inline-block h-3.5 w-3.5 transform rounded-full shadow-sm transition-transform", r ? "translate-x-4 bg-action-primary-text" : "translate-x-0.5 bg-text-secondary")
19
+ })
20
+ }), s && /* @__PURE__ */ t("span", {
21
+ className: "text-xs text-text-secondary",
22
+ children: s
23
+ })]
24
+ });
25
+ //#endregion
26
+ export { r as ActiveSwitch };
27
+
28
+ //# sourceMappingURL=ActiveSwitch.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ActiveSwitch.js","names":[],"sources":["../../../src/adaptercloud/components/ActiveSwitch.tsx"],"sourcesContent":["/**\n * Active Switch Component\n * @module adaptercloud/components\n *\n * The inline on/off control used wherever a governance object's `isActive`\n * flag can be flipped in place (policy list rows, policy detail header). Pure\n * presentation — the caller owns the mutation and the optimistic state.\n */\n\nimport type { FC } from 'react';\nimport { cn } from '../utils/cn';\n\ninterface ActiveSwitchProps {\n checked: boolean;\n onToggle: () => void;\n disabled?: boolean;\n /** Accessible name — describes the action the switch performs. */\n label: string;\n /** Optional visible text rendered beside the switch. */\n children?: React.ReactNode;\n /** Stop the click from reaching a clickable ancestor (e.g. a card row). */\n stopPropagation?: boolean;\n className?: string;\n}\n\nexport const ActiveSwitch: FC<ActiveSwitchProps> = ({\n checked,\n onToggle,\n disabled = false,\n label,\n children,\n stopPropagation = false,\n className,\n}) => (\n <div className={cn('flex items-center gap-2', className)}>\n <button\n type=\"button\"\n role=\"switch\"\n aria-checked={checked}\n aria-label={label}\n disabled={disabled}\n onClick={(e) => {\n if (stopPropagation) e.stopPropagation();\n onToggle();\n }}\n className={cn(\n 'relative inline-flex h-5 w-9 shrink-0 items-center rounded-full border transition-colors focus:outline-none focus-visible:ring-2 focus-visible:ring-[var(--color-focus-ring)] disabled:opacity-60',\n checked ? 'border-transparent bg-action-primary-bg' : 'border-border-subtle bg-bg-sunken'\n )}\n >\n <span\n aria-hidden=\"true\"\n className={cn(\n 'inline-block h-3.5 w-3.5 transform rounded-full shadow-sm transition-transform',\n checked ? 'translate-x-4 bg-action-primary-text' : 'translate-x-0.5 bg-text-secondary'\n )}\n />\n </button>\n {children && <span className=\"text-xs text-text-secondary\">{children}</span>}\n </div>\n);\n"],"mappings":";;;AAyBA,IAAa,KAAuC,EAClD,YACA,aACA,cAAW,IACX,UACA,aACA,qBAAkB,IAClB,mBAEA,kBAAC,OAAD;CAAK,WAAW,EAAG,2BAA2B,CAAS;WAAvD,CACE,kBAAC,UAAD;EACE,MAAK;EACL,MAAK;EACL,gBAAc;EACd,cAAY;EACF;EACV,UAAU,MAAM;GAEd,AADI,KAAiB,EAAE,gBAAgB,GACvC,EAAS;EACX;EACA,WAAW,EACT,qMACA,IAAU,4CAA4C,mCACxD;YAEA,kBAAC,QAAD;GACE,eAAY;GACZ,WAAW,EACT,kFACA,IAAU,yCAAyC,mCACrD;EACD,CAAA;CACK,CAAA,GACP,KAAY,kBAAC,QAAD;EAAM,WAAU;EAA+B;CAAe,CAAA,CACxE"}
@@ -9,4 +9,5 @@ export { SeverityBadge } from './SeverityBadge';
9
9
  export { EmptyState } from './EmptyState';
10
10
  export { DataState } from './DataState';
11
11
  export { ConfirmDialog } from './ConfirmDialog';
12
+ export { ActiveSwitch } from './ActiveSwitch';
12
13
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/adaptercloud/components/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC1C,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAC5C,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAC5C,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAChD,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC1C,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACxC,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/adaptercloud/components/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC1C,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAC5C,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAC5C,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAChD,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC1C,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACxC,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAChD,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC"}
@@ -15,6 +15,7 @@ export declare const adaKeys: {
15
15
  policy: (id: string) => readonly ["adaptercloud", "policy", string];
16
16
  violations: (filter: Record<string, unknown>) => readonly ["adaptercloud", "violations", Record<string, unknown>];
17
17
  drift: (filter: Record<string, unknown>) => readonly ["adaptercloud", "drift", Record<string, unknown>];
18
+ driftCount: (status?: AdaDriftStatus) => readonly ["adaptercloud", "drift", "count", AdaDriftStatus | null];
18
19
  syncRuns: (filter: Record<string, unknown>) => readonly ["adaptercloud", "sync-runs", Record<string, unknown>];
19
20
  syncRun: (id: string) => readonly ["adaptercloud", "sync-run", string];
20
21
  topology: (filter: Record<string, unknown>) => readonly ["adaptercloud", "topology", Record<string, unknown>];
@@ -78,7 +79,14 @@ export interface ViolationListFilter {
78
79
  status?: AdaViolationStatus;
79
80
  pagination?: PaginationInput;
80
81
  }
81
- export declare const useViolations: (filter?: ViolationListFilter) => import('@tanstack/react-query').UseQueryResult<NoInfer<AdaPolicyViolationPage>, Error>;
82
+ /**
83
+ * @param options.enabled Set false to hold the query until its inputs are
84
+ * known (e.g. a policy-scoped count whose route id has not resolved), so it
85
+ * never falls back to an unintended estate-wide fetch.
86
+ */
87
+ export declare const useViolations: (filter?: ViolationListFilter, options?: {
88
+ enabled?: boolean;
89
+ }) => import('@tanstack/react-query').UseQueryResult<NoInfer<AdaPolicyViolationPage>, Error>;
82
90
  export declare const useResolveViolation: () => import('@tanstack/react-query').UseMutationResult<AdaPolicyViolation, Error, {
83
91
  id: string;
84
92
  status: AdaViolationStatus;
@@ -89,13 +97,31 @@ export interface DriftListFilter {
89
97
  status?: AdaDriftStatus;
90
98
  }
91
99
  export declare const useDriftRecords: (filter?: DriftListFilter) => import('@tanstack/react-query').UseQueryResult<NoInfer<AdaDriftRecord[]>, Error>;
100
+ /**
101
+ * Exact, estate-wide count of drift records for one status (every status when
102
+ * omitted).
103
+ *
104
+ * Reads `pageInfo.totalCount` from a `limit: 1` query rather than measuring a
105
+ * fetched page: {@link useDriftRecords} caps at the service's 100-row page
106
+ * ceiling, so counting its result silently plateaus once an estate has more
107
+ * drift than that. Resolves to `null` when a deployed schema does not expose
108
+ * `totalCount`, which callers must render as "unknown" rather than as zero.
109
+ */
110
+ export declare const useDriftCount: (status?: AdaDriftStatus) => import('@tanstack/react-query').UseQueryResult<number | null, Error>;
92
111
  export declare const useRemediateDrift: () => import('@tanstack/react-query').UseMutationResult<AdaDriftRecord, Error, string, unknown>;
93
112
  export interface SyncRunListFilter {
94
113
  connectionId?: string;
95
114
  status?: AdaSyncStatus;
96
115
  pagination?: PaginationInput;
97
116
  }
98
- export declare const useSyncRuns: (filter?: SyncRunListFilter) => import('@tanstack/react-query').UseQueryResult<NoInfer<AdaSyncRunPage>, Error>;
117
+ /**
118
+ * @param options.enabled Set false to hold the query until its inputs are
119
+ * known (e.g. a connection-scoped panel whose route id has not resolved),
120
+ * so it never falls back to an unintended estate-wide fetch.
121
+ */
122
+ export declare const useSyncRuns: (filter?: SyncRunListFilter, options?: {
123
+ enabled?: boolean;
124
+ }) => import('@tanstack/react-query').UseQueryResult<NoInfer<AdaSyncRunPage>, Error>;
99
125
  export declare const useStartSyncRun: () => import('@tanstack/react-query').UseMutationResult<AdaSyncRun, Error, AdaStartSyncRunInput, unknown>;
100
126
  export declare const useCancelSyncRun: () => import('@tanstack/react-query').UseMutationResult<AdaSyncRun, Error, string, unknown>;
101
127
  export declare const useCostSummary: (connectionId?: string) => import('@tanstack/react-query').UseQueryResult<NoInfer<AdaCostSummary>, Error>;
@@ -1 +1 @@
1
- {"version":3,"file":"useAdapterCloudApi.d.ts","sourceRoot":"","sources":["../../../src/adaptercloud/hooks/useAdapterCloudApi.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"useAdapterCloudApi.d.ts","sourceRoot":"","sources":["../../../src/adaptercloud/hooks/useAdapterCloudApi.ts"],"names":[],"mappings":"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"}
@@ -68,6 +68,12 @@ var s = {
68
68
  "drift",
69
69
  e
70
70
  ],
71
+ driftCount: (e) => [
72
+ ...s.all,
73
+ "drift",
74
+ "count",
75
+ e ?? null
76
+ ],
71
77
  syncRuns: (e) => [
72
78
  ...s.all,
73
79
  "sync-runs",
@@ -332,9 +338,10 @@ var s = {
332
338
  t.invalidateQueries({ queryKey: [...s.all, "policies"] });
333
339
  }
334
340
  });
335
- }, I = (t = {}) => {
336
- let { apiGatewayUrl: n } = e();
341
+ }, I = (t = {}, n = {}) => {
342
+ let { apiGatewayUrl: i } = e();
337
343
  return r({
344
+ enabled: n.enabled ?? !0,
338
345
  queryKey: s.violations(t),
339
346
  queryFn: async () => (await c(`query AdaListViolations($policyId: ID, $resourceId: ID, $status: AdaViolationStatus, $pagination: PaginationInput) {
340
347
  adaListViolations(policyId: $policyId, resourceId: $resourceId, status: $status, pagination: $pagination) {
@@ -349,7 +356,7 @@ var s = {
349
356
  resourceId: t.resourceId,
350
357
  status: t.status,
351
358
  pagination: t.pagination
352
- }, n)).adaListViolations,
359
+ }, i)).adaListViolations,
353
360
  placeholderData: (e) => e,
354
361
  staleTime: l
355
362
  });
@@ -390,7 +397,24 @@ var s = {
390
397
  }, n)).adaListDriftRecords.items,
391
398
  staleTime: l
392
399
  });
393
- }, z = () => {
400
+ }, z = (t) => {
401
+ let { apiGatewayUrl: n } = e();
402
+ return r({
403
+ queryKey: s.driftCount(t),
404
+ queryFn: async () => (await c(`query AdaCountDriftRecords($status: AdaDriftStatus, $pagination: PaginationInput) {
405
+ adaListDriftRecords(status: $status, pagination: $pagination) {
406
+ pageInfo { ${_} }
407
+ }
408
+ }`, {
409
+ status: t,
410
+ pagination: {
411
+ limit: 1,
412
+ offset: 0
413
+ }
414
+ }, n)).adaListDriftRecords.pageInfo.totalCount ?? null,
415
+ staleTime: l
416
+ });
417
+ }, B = () => {
394
418
  let r = i(), { apiGatewayUrl: a } = e();
395
419
  return n({
396
420
  mutationFn: async (e) => (await c(`mutation AdaRemediateDrift($id: ID!) {
@@ -400,9 +424,10 @@ var s = {
400
424
  t.success("Drift marked remediated"), r.invalidateQueries({ queryKey: [...s.all, "drift"] }), r.invalidateQueries({ queryKey: [...s.all, "resources"] });
401
425
  }
402
426
  });
403
- }, B = (t = {}) => {
404
- let { apiGatewayUrl: n } = e();
427
+ }, V = (t = {}, n = {}) => {
428
+ let { apiGatewayUrl: i } = e();
405
429
  return r({
430
+ enabled: n.enabled ?? !0,
406
431
  queryKey: s.syncRuns(t),
407
432
  queryFn: async () => (await c(`query AdaListSyncRuns($connectionId: ID, $status: AdaSyncStatus, $pagination: PaginationInput) {
408
433
  adaListSyncRuns(connectionId: $connectionId, status: $status, pagination: $pagination) {
@@ -416,11 +441,11 @@ var s = {
416
441
  connectionId: t.connectionId,
417
442
  status: t.status,
418
443
  pagination: t.pagination
419
- }, n)).adaListSyncRuns,
444
+ }, i)).adaListSyncRuns,
420
445
  placeholderData: (e) => e,
421
446
  staleTime: l
422
447
  });
423
- }, V = () => {
448
+ }, H = () => {
424
449
  let r = i(), { apiGatewayUrl: a } = e();
425
450
  return n({
426
451
  mutationFn: async (e) => (await c(`mutation AdaStartSyncRun($input: AdaStartSyncRunInput!) {
@@ -430,7 +455,7 @@ var s = {
430
455
  t.success("Sync run started"), r.invalidateQueries({ queryKey: [...s.all, "sync-runs"] }), r.invalidateQueries({ queryKey: [...s.all, "connections"] });
431
456
  }
432
457
  });
433
- }, H = () => {
458
+ }, U = () => {
434
459
  let r = i(), { apiGatewayUrl: a } = e();
435
460
  return n({
436
461
  mutationFn: async (e) => (await c(`mutation AdaCancelSyncRun($id: ID!) {
@@ -440,14 +465,14 @@ var s = {
440
465
  t.success("Sync run cancelled"), r.invalidateQueries({ queryKey: [...s.all, "sync-runs"] });
441
466
  }
442
467
  });
443
- }, U = (t) => {
468
+ }, W = (t) => {
444
469
  let { apiGatewayUrl: n } = e();
445
470
  return r({
446
471
  queryKey: s.costSummary(t),
447
472
  queryFn: async () => (await c("query AdaCostSummary($connectionId: ID) {\n adaCostSummary(connectionId: $connectionId) {\n currency total\n lines { service total }\n }\n }", { connectionId: t }, n)).adaCostSummary,
448
473
  staleTime: l
449
474
  });
450
- }, W = `query AdaListCostRecords($connectionId: ID, $resourceId: ID, $service: String, $pagination: PaginationInput) {
475
+ }, G = `query AdaListCostRecords($connectionId: ID, $resourceId: ID, $service: String, $pagination: PaginationInput) {
451
476
  adaListCostRecords(connectionId: $connectionId, resourceId: $resourceId, service: $service, pagination: $pagination) {
452
477
  items {
453
478
  id service amount currency periodStart periodEnd breakdown
@@ -457,14 +482,14 @@ var s = {
457
482
  }
458
483
  pageInfo { ${_} }
459
484
  }
460
- }`, G = (t = {}) => {
485
+ }`, K = (t = {}) => {
461
486
  let { apiGatewayUrl: n } = e();
462
487
  return r({
463
488
  queryKey: s.costRecords(t),
464
489
  queryFn: async () => {
465
490
  let e = [], r = 0;
466
491
  for (;;) {
467
- let i = (await c(W, {
492
+ let i = (await c(G, {
468
493
  connectionId: t.connectionId,
469
494
  resourceId: t.resourceId,
470
495
  service: t.service,
@@ -479,7 +504,7 @@ var s = {
479
504
  },
480
505
  staleTime: l
481
506
  });
482
- }, K = 100, q = () => {
507
+ }, q = 100, J = () => {
483
508
  let { apiGatewayUrl: t } = e();
484
509
  return r({
485
510
  queryKey: s.topologyResources(),
@@ -495,7 +520,7 @@ var s = {
495
520
  pageInfo { ${_} }
496
521
  }
497
522
  }`, { pagination: {
498
- limit: K,
523
+ limit: q,
499
524
  offset: n
500
525
  } }, t)).adaListResources;
501
526
  if (e.push(...r.items), !r.pageInfo.hasMore || r.items.length === 0) return e;
@@ -504,7 +529,7 @@ var s = {
504
529
  },
505
530
  staleTime: l
506
531
  });
507
- }, J = (t = {}) => {
532
+ }, Y = (t = {}) => {
508
533
  let { apiGatewayUrl: n } = e();
509
534
  return r({
510
535
  queryKey: s.topology(t),
@@ -523,7 +548,7 @@ var s = {
523
548
  resourceId: t.resourceId,
524
549
  kind: t.kind,
525
550
  pagination: {
526
- limit: K,
551
+ limit: q,
527
552
  offset: r
528
553
  }
529
554
  }, n)).adaListTopologyEdges;
@@ -535,6 +560,6 @@ var s = {
535
560
  });
536
561
  };
537
562
  //#endregion
538
- export { y as useAdapter, v as useAdapters, S as useArchiveAdapter, F as useArchivePolicy, H as useCancelSyncRun, w as useConnection, C as useConnections, G as useCostRecords, U as useCostSummary, b as useCreateAdapter, T as useCreateConnection, N as useCreatePolicy, O as useDisableConnection, R as useDriftRecords, j as usePolicies, M as usePolicy, z as useRemediateDrift, L as useResolveViolation, A as useResource, k as useResources, D as useSetConnectionStatus, V as useStartSyncRun, B as useSyncRuns, J as useTopology, q as useTopologyResources, x as useUpdateAdapter, E as useUpdateConnection, P as useUpdatePolicy, I as useViolations };
563
+ export { y as useAdapter, v as useAdapters, S as useArchiveAdapter, F as useArchivePolicy, U as useCancelSyncRun, w as useConnection, C as useConnections, K as useCostRecords, W as useCostSummary, b as useCreateAdapter, T as useCreateConnection, N as useCreatePolicy, O as useDisableConnection, z as useDriftCount, R as useDriftRecords, j as usePolicies, M as usePolicy, B as useRemediateDrift, L as useResolveViolation, A as useResource, k as useResources, D as useSetConnectionStatus, H as useStartSyncRun, V as useSyncRuns, Y as useTopology, J as useTopologyResources, x as useUpdateAdapter, E as useUpdateConnection, P as useUpdatePolicy, I as useViolations };
539
564
 
540
565
  //# sourceMappingURL=useAdapterCloudApi.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"useAdapterCloudApi.js","names":[],"sources":["../../../src/adaptercloud/hooks/useAdapterCloudApi.ts"],"sourcesContent":["/**\n * AdapterCloud API Hooks\n * @module adaptercloud/hooks\n *\n * Real, typed data layer for AdapterCloud (InfraVerse). Every hook talks to the\n * deployed `wspace-adaptercloud-svc` subgraph through the workspace GraphQL\n * gateway via `graphqlFetch`. Operations, fields, inputs, enums and the\n * Connection/pageInfo shapes are taken verbatim from the service's\n * `.hive-schema.graphql`. No mocks — every screen reads/writes real data.\n */\n\nimport { useMutation, useQuery, useQueryClient } from '@tanstack/react-query';\n\nimport { graphqlFetch } from '@burdenoff/fe-libs/shared/graphql';\nimport { clearGraphqlFetchResponseCache } from '@burdenoff/fe-libs/shared/graphql/fetch';\n\nimport { useAdapterCloud } from '../context';\nimport { notify } from '../lib/toast';\nimport type {\n AdaAdapter,\n AdaAdapterConnectionPage,\n AdaAdapterKind,\n AdaAdapterStatus,\n AdaConnection,\n AdaConnectionPage,\n AdaConnectionStatus,\n AdaCostRecord,\n AdaCostSummary,\n AdaDriftRecord,\n AdaDriftRecordPage,\n AdaDriftStatus,\n AdaPolicy,\n AdaPolicyKind,\n AdaPolicyPage,\n AdaPolicyViolation,\n AdaPolicyViolationPage,\n AdaResource,\n AdaResourcePage,\n AdaResourceState,\n AdaSyncRun,\n AdaSyncRunPage,\n AdaSyncStatus,\n AdaTopologyEdge,\n AdaEdgeKind,\n AdaViolationStatus,\n PaginationInput,\n AdaCreateAdapterInput,\n AdaUpdateAdapterInput,\n AdaCreateConnectionInput,\n AdaUpdateConnectionInput,\n AdaCreatePolicyInput,\n AdaUpdatePolicyInput,\n AdaStartSyncRunInput,\n} from '../types';\n\n// ============================================================================\n// Query keys\n// ============================================================================\n\nexport const adaKeys = {\n all: ['adaptercloud'] as const,\n health: () => [...adaKeys.all, 'health'] as const,\n costSummary: (connectionId?: string) =>\n [...adaKeys.all, 'cost-summary', connectionId ?? null] as const,\n costRecords: (filter: Record<string, unknown>) =>\n [...adaKeys.all, 'cost-records', filter] as const,\n adapters: (filter: Record<string, unknown>) => [...adaKeys.all, 'adapters', filter] as const,\n adapter: (id: string) => [...adaKeys.all, 'adapter', id] as const,\n connections: (filter: Record<string, unknown>) =>\n [...adaKeys.all, 'connections', filter] as const,\n connection: (id: string) => [...adaKeys.all, 'connection', id] as const,\n resources: (filter: Record<string, unknown>) => [...adaKeys.all, 'resources', filter] as const,\n resource: (id: string) => [...adaKeys.all, 'resource', id] as const,\n policies: (filter: Record<string, unknown>) => [...adaKeys.all, 'policies', filter] as const,\n policy: (id: string) => [...adaKeys.all, 'policy', id] as const,\n violations: (filter: Record<string, unknown>) => [...adaKeys.all, 'violations', filter] as const,\n drift: (filter: Record<string, unknown>) => [...adaKeys.all, 'drift', filter] as const,\n syncRuns: (filter: Record<string, unknown>) => [...adaKeys.all, 'sync-runs', filter] as const,\n syncRun: (id: string) => [...adaKeys.all, 'sync-run', id] as const,\n topology: (filter: Record<string, unknown>) => [...adaKeys.all, 'topology', filter] as const,\n topologyResources: () => [...adaKeys.all, 'topology-resources'] as const,\n};\n\n// ============================================================================\n// Low-level query wrapper\n// ============================================================================\n\nconst adaQuery = async <TData>(\n query: string,\n variables: Record<string, unknown>,\n baseUrl?: string\n): Promise<TData> => {\n const response = await graphqlFetch<TData>({\n gateway: 'workspace',\n baseUrl,\n query,\n variables,\n workspaceToken: true,\n });\n\n if (response.errors?.length) {\n throw new Error(response.errors[0]?.message ?? 'GraphQL request failed');\n }\n\n if (!response.data) {\n throw new Error('GraphQL response did not include data');\n }\n\n // After a successful mutation, drop the fe-libs graphqlFetch response cache\n // (≤30s TTL) so the follow-up React-Query refetch reads fresh data instead of\n // a stale cached response — otherwise writes appear to \"not take effect\" for\n // up to 30s. (fe-libs' own Apollo client does the same on every mutation.)\n if (/^\\s*mutation\\b/.test(query)) {\n clearGraphqlFetchResponseCache();\n }\n\n return response.data;\n};\n\nconst STALE = 30 * 1000;\n\n// ============================================================================\n// Reusable GraphQL field selections (inline strings)\n// ============================================================================\n\nconst ADAPTER_FIELDS = `\n id name slug kind status vendor version description capabilities tags\n configSchema workspaceId createdAt updatedAt\n`;\n\nconst CONNECTION_FIELDS = `\n id name adapterId authMethod status environment region resourceCount\n secretRef targetRef config tags lastError lastSyncedAt workspaceId createdAt updatedAt\n`;\n\nconst RESOURCE_FIELDS = `\n id connectionId externalId resourceType name region state monthlyCost\n providerTags attributes tags lastSeenAt workspaceId createdAt updatedAt\n`;\n\nconst POLICY_FIELDS = `\n id name description kind enforcement severity expression appliesTo isActive\n tags workspaceId createdAt updatedAt\n`;\n\nconst VIOLATION_FIELDS = `\n id policyId resourceId message status severity evidence waiverReason\n detectedAt resolvedAt resolvedById workspaceId createdAt updatedAt\n`;\n\nconst DRIFT_FIELDS = `\n id resourceId attributePath expectedValue observedValue severity status\n detectedAt remediatedAt workspaceId createdAt updatedAt\n`;\n\nconst SYNC_RUN_FIELDS = `\n id connectionId kind status discoveredCount reconciledCount driftCount\n violationCount error summary startedAt finishedAt workspaceId createdAt updatedAt\n`;\n\n// `totalCount` is the real estate-wide count exposed on AdaPageInfo (svc-added).\n// Requested where the Overview tiles need an accurate total; consumers fall back\n// to `items.length` when it is null/undefined so the UI keeps working if absent.\nconst PAGE_INFO_FIELDS = `cursor hasMore totalCount`;\n\n// ============================================================================\n// Health\n// ============================================================================\n\nexport const useAdaHealth = () => {\n const { apiGatewayUrl } = useAdapterCloud();\n return useQuery({\n queryKey: adaKeys.health(),\n queryFn: async () => {\n const result = await adaQuery<{ adaHealth: string }>(\n `query AdaHealth { adaHealth }`,\n {},\n apiGatewayUrl\n );\n return result.adaHealth;\n },\n staleTime: STALE,\n });\n};\n\n// ============================================================================\n// Adapters\n// ============================================================================\n\nexport interface AdapterListFilter {\n kind?: AdaAdapterKind;\n status?: AdaAdapterStatus;\n pagination?: PaginationInput;\n}\n\nexport const useAdapters = (filter: AdapterListFilter = {}) => {\n const { apiGatewayUrl } = useAdapterCloud();\n return useQuery({\n queryKey: adaKeys.adapters(filter as Record<string, unknown>),\n queryFn: async () => {\n const result = await adaQuery<{ adaListAdapters: AdaAdapterConnectionPage }>(\n `query AdaListAdapters($kind: AdaAdapterKind, $status: AdaAdapterStatus, $pagination: PaginationInput) {\n adaListAdapters(kind: $kind, status: $status, pagination: $pagination) {\n items { ${ADAPTER_FIELDS} }\n pageInfo { ${PAGE_INFO_FIELDS} }\n }\n }`,\n {\n kind: filter.kind,\n status: filter.status,\n pagination: filter.pagination,\n },\n apiGatewayUrl\n );\n return result.adaListAdapters;\n },\n placeholderData: (prev) => prev,\n staleTime: STALE,\n });\n};\n\nexport const useAdapter = (id: string | undefined) => {\n const { apiGatewayUrl } = useAdapterCloud();\n return useQuery({\n queryKey: adaKeys.adapter(id ?? ''),\n queryFn: async () => {\n const result = await adaQuery<{ adaAdapter: AdaAdapter | null }>(\n `query AdaAdapter($id: ID!) {\n adaAdapter(id: $id) {\n ${ADAPTER_FIELDS}\n connections { ${CONNECTION_FIELDS} }\n }\n }`,\n { id },\n apiGatewayUrl\n );\n return result.adaAdapter;\n },\n enabled: Boolean(id),\n staleTime: STALE,\n });\n};\n\nexport const useCreateAdapter = () => {\n const queryClient = useQueryClient();\n const { apiGatewayUrl } = useAdapterCloud();\n return useMutation({\n mutationFn: async (input: AdaCreateAdapterInput) => {\n const result = await adaQuery<{ adaCreateAdapter: AdaAdapter }>(\n `mutation AdaCreateAdapter($input: AdaCreateAdapterInput!) {\n adaCreateAdapter(input: $input) { ${ADAPTER_FIELDS} }\n }`,\n { input },\n apiGatewayUrl\n );\n return result.adaCreateAdapter;\n },\n onSuccess: () => {\n void queryClient.invalidateQueries({ queryKey: [...adaKeys.all, 'adapters'] });\n },\n });\n};\n\nexport const useUpdateAdapter = () => {\n const queryClient = useQueryClient();\n const { apiGatewayUrl } = useAdapterCloud();\n return useMutation({\n mutationFn: async ({ id, input }: { id: string; input: AdaUpdateAdapterInput }) => {\n const result = await adaQuery<{ adaUpdateAdapter: AdaAdapter }>(\n `mutation AdaUpdateAdapter($id: ID!, $input: AdaUpdateAdapterInput!) {\n adaUpdateAdapter(id: $id, input: $input) { ${ADAPTER_FIELDS} }\n }`,\n { id, input },\n apiGatewayUrl\n );\n return result.adaUpdateAdapter;\n },\n onSuccess: (adapter) => {\n void queryClient.invalidateQueries({ queryKey: [...adaKeys.all, 'adapters'] });\n void queryClient.invalidateQueries({ queryKey: adaKeys.adapter(adapter.id) });\n },\n });\n};\n\nexport const useArchiveAdapter = () => {\n const queryClient = useQueryClient();\n const { apiGatewayUrl } = useAdapterCloud();\n return useMutation({\n mutationFn: async (id: string) => {\n const result = await adaQuery<{ adaArchiveAdapter: boolean }>(\n `mutation AdaArchiveAdapter($id: ID!) { adaArchiveAdapter(id: $id) }`,\n { id },\n apiGatewayUrl\n );\n return result.adaArchiveAdapter;\n },\n onSuccess: () => {\n void queryClient.invalidateQueries({ queryKey: [...adaKeys.all, 'adapters'] });\n },\n });\n};\n\n// ============================================================================\n// Connections\n// ============================================================================\n\nexport interface ConnectionListFilter {\n adapterId?: string;\n status?: AdaConnectionStatus;\n pagination?: PaginationInput;\n}\n\nexport const useConnections = (filter: ConnectionListFilter = {}) => {\n const { apiGatewayUrl } = useAdapterCloud();\n return useQuery({\n queryKey: adaKeys.connections(filter as Record<string, unknown>),\n queryFn: async () => {\n const result = await adaQuery<{ adaListConnections: AdaConnectionPage }>(\n `query AdaListConnections($adapterId: ID, $status: AdaConnectionStatus, $pagination: PaginationInput) {\n adaListConnections(adapterId: $adapterId, status: $status, pagination: $pagination) {\n items {\n ${CONNECTION_FIELDS}\n adapter { id name slug kind }\n }\n pageInfo { ${PAGE_INFO_FIELDS} }\n }\n }`,\n {\n adapterId: filter.adapterId,\n status: filter.status,\n pagination: filter.pagination,\n },\n apiGatewayUrl\n );\n return result.adaListConnections;\n },\n placeholderData: (prev) => prev,\n staleTime: STALE,\n });\n};\n\nexport const useConnection = (id: string | undefined) => {\n const { apiGatewayUrl } = useAdapterCloud();\n return useQuery({\n queryKey: adaKeys.connection(id ?? ''),\n queryFn: async () => {\n const result = await adaQuery<{ adaConnection: AdaConnection | null }>(\n `query AdaConnection($id: ID!) {\n adaConnection(id: $id) {\n ${CONNECTION_FIELDS}\n adapter { ${ADAPTER_FIELDS} }\n resources { ${RESOURCE_FIELDS} }\n }\n }`,\n { id },\n apiGatewayUrl\n );\n return result.adaConnection;\n },\n enabled: Boolean(id),\n staleTime: STALE,\n });\n};\n\nexport const useCreateConnection = () => {\n const queryClient = useQueryClient();\n const { apiGatewayUrl } = useAdapterCloud();\n return useMutation({\n mutationFn: async (input: AdaCreateConnectionInput) => {\n const result = await adaQuery<{ adaCreateConnection: AdaConnection }>(\n `mutation AdaCreateConnection($input: AdaCreateConnectionInput!) {\n adaCreateConnection(input: $input) { ${CONNECTION_FIELDS} }\n }`,\n { input },\n apiGatewayUrl\n );\n return result.adaCreateConnection;\n },\n onSuccess: () => {\n void queryClient.invalidateQueries({ queryKey: [...adaKeys.all, 'connections'] });\n },\n });\n};\n\nexport const useUpdateConnection = () => {\n const queryClient = useQueryClient();\n const { apiGatewayUrl } = useAdapterCloud();\n return useMutation({\n mutationFn: async ({ id, input }: { id: string; input: AdaUpdateConnectionInput }) => {\n const result = await adaQuery<{ adaUpdateConnection: AdaConnection }>(\n `mutation AdaUpdateConnection($id: ID!, $input: AdaUpdateConnectionInput!) {\n adaUpdateConnection(id: $id, input: $input) { ${CONNECTION_FIELDS} }\n }`,\n { id, input },\n apiGatewayUrl\n );\n return result.adaUpdateConnection;\n },\n onSuccess: (connection) => {\n void queryClient.invalidateQueries({ queryKey: [...adaKeys.all, 'connections'] });\n void queryClient.invalidateQueries({ queryKey: adaKeys.connection(connection.id) });\n },\n });\n};\n\nexport const useSetConnectionStatus = () => {\n const queryClient = useQueryClient();\n const { apiGatewayUrl } = useAdapterCloud();\n return useMutation({\n mutationFn: async ({ id, status }: { id: string; status: AdaConnectionStatus }) => {\n const result = await adaQuery<{ adaSetConnectionStatus: AdaConnection }>(\n `mutation AdaSetConnectionStatus($id: ID!, $status: AdaConnectionStatus!) {\n adaSetConnectionStatus(id: $id, status: $status) { ${CONNECTION_FIELDS} }\n }`,\n { id, status },\n apiGatewayUrl\n );\n return result.adaSetConnectionStatus;\n },\n onSuccess: (connection) => {\n notify.success('Connection health updated');\n void queryClient.invalidateQueries({ queryKey: [...adaKeys.all, 'connections'] });\n void queryClient.invalidateQueries({ queryKey: adaKeys.connection(connection.id) });\n },\n });\n};\n\nexport const useDisableConnection = () => {\n const queryClient = useQueryClient();\n const { apiGatewayUrl } = useAdapterCloud();\n return useMutation({\n mutationFn: async (id: string) => {\n const result = await adaQuery<{ adaDisableConnection: AdaConnection }>(\n `mutation AdaDisableConnection($id: ID!) {\n adaDisableConnection(id: $id) { ${CONNECTION_FIELDS} }\n }`,\n { id },\n apiGatewayUrl\n );\n return result.adaDisableConnection;\n },\n onSuccess: (connection) => {\n notify.success('Connection disabled');\n void queryClient.invalidateQueries({ queryKey: [...adaKeys.all, 'connections'] });\n void queryClient.invalidateQueries({ queryKey: adaKeys.connection(connection.id) });\n },\n });\n};\n\n// ============================================================================\n// Resources\n// ============================================================================\n\nexport interface ResourceListFilter {\n connectionId?: string;\n resourceType?: string;\n state?: AdaResourceState;\n pagination?: PaginationInput;\n}\n\nexport const useResources = (filter: ResourceListFilter = {}) => {\n const { apiGatewayUrl } = useAdapterCloud();\n return useQuery({\n queryKey: adaKeys.resources(filter as Record<string, unknown>),\n queryFn: async () => {\n const result = await adaQuery<{ adaListResources: AdaResourcePage }>(\n `query AdaListResources($connectionId: ID, $resourceType: String, $state: AdaResourceState, $pagination: PaginationInput) {\n adaListResources(connectionId: $connectionId, resourceType: $resourceType, state: $state, pagination: $pagination) {\n items {\n ${RESOURCE_FIELDS}\n connection { id name }\n }\n pageInfo { ${PAGE_INFO_FIELDS} }\n }\n }`,\n {\n connectionId: filter.connectionId,\n resourceType: filter.resourceType,\n state: filter.state,\n pagination: filter.pagination,\n },\n apiGatewayUrl\n );\n return result.adaListResources;\n },\n placeholderData: (prev) => prev,\n staleTime: STALE,\n });\n};\n\nexport const useResource = (id: string | undefined) => {\n const { apiGatewayUrl } = useAdapterCloud();\n return useQuery({\n queryKey: adaKeys.resource(id ?? ''),\n queryFn: async () => {\n const result = await adaQuery<{ adaResource: AdaResource | null }>(\n `query AdaResource($id: ID!) {\n adaResource(id: $id) {\n ${RESOURCE_FIELDS}\n connection { ${CONNECTION_FIELDS} adapter { id name slug kind } }\n dependsOn { id name resourceType region state monthlyCost }\n }\n }`,\n { id },\n apiGatewayUrl\n );\n return result.adaResource;\n },\n enabled: Boolean(id),\n staleTime: STALE,\n });\n};\n\n// ============================================================================\n// Policies\n// ============================================================================\n\nexport interface PolicyListFilter {\n isActive?: boolean;\n kind?: AdaPolicyKind;\n pagination?: PaginationInput;\n}\n\nexport const usePolicies = (filter: PolicyListFilter = {}) => {\n const { apiGatewayUrl } = useAdapterCloud();\n return useQuery({\n queryKey: adaKeys.policies(filter as Record<string, unknown>),\n queryFn: async () => {\n const result = await adaQuery<{ adaListPolicies: AdaPolicyPage }>(\n `query AdaListPolicies($isActive: Boolean, $kind: AdaPolicyKind, $pagination: PaginationInput) {\n adaListPolicies(isActive: $isActive, kind: $kind, pagination: $pagination) {\n items { ${POLICY_FIELDS} }\n pageInfo { cursor hasMore }\n }\n }`,\n {\n isActive: filter.isActive,\n kind: filter.kind,\n pagination: filter.pagination,\n },\n apiGatewayUrl\n );\n return result.adaListPolicies;\n },\n placeholderData: (prev) => prev,\n staleTime: STALE,\n });\n};\n\nexport const usePolicy = (id: string | undefined) => {\n const { apiGatewayUrl } = useAdapterCloud();\n return useQuery({\n queryKey: adaKeys.policy(id ?? ''),\n queryFn: async () => {\n const result = await adaQuery<{ adaPolicy: AdaPolicy | null }>(\n `query AdaPolicy($id: ID!) {\n adaPolicy(id: $id) {\n ${POLICY_FIELDS}\n violations { ${VIOLATION_FIELDS} }\n }\n }`,\n { id },\n apiGatewayUrl\n );\n return result.adaPolicy;\n },\n enabled: Boolean(id),\n staleTime: STALE,\n });\n};\n\nexport const useCreatePolicy = () => {\n const queryClient = useQueryClient();\n const { apiGatewayUrl } = useAdapterCloud();\n return useMutation({\n mutationFn: async (input: AdaCreatePolicyInput) => {\n const result = await adaQuery<{ adaCreatePolicy: AdaPolicy }>(\n `mutation AdaCreatePolicy($input: AdaCreatePolicyInput!) {\n adaCreatePolicy(input: $input) { ${POLICY_FIELDS} }\n }`,\n { input },\n apiGatewayUrl\n );\n return result.adaCreatePolicy;\n },\n onSuccess: () => {\n void queryClient.invalidateQueries({ queryKey: [...adaKeys.all, 'policies'] });\n },\n });\n};\n\nexport const useUpdatePolicy = () => {\n const queryClient = useQueryClient();\n const { apiGatewayUrl } = useAdapterCloud();\n return useMutation({\n mutationFn: async ({ id, input }: { id: string; input: AdaUpdatePolicyInput }) => {\n const result = await adaQuery<{ adaUpdatePolicy: AdaPolicy }>(\n `mutation AdaUpdatePolicy($id: ID!, $input: AdaUpdatePolicyInput!) {\n adaUpdatePolicy(id: $id, input: $input) { ${POLICY_FIELDS} }\n }`,\n { id, input },\n apiGatewayUrl\n );\n return result.adaUpdatePolicy;\n },\n onSuccess: (policy) => {\n notify.success('Policy updated');\n void queryClient.invalidateQueries({ queryKey: [...adaKeys.all, 'policies'] });\n void queryClient.invalidateQueries({ queryKey: adaKeys.policy(policy.id) });\n },\n });\n};\n\nexport const useArchivePolicy = () => {\n const queryClient = useQueryClient();\n const { apiGatewayUrl } = useAdapterCloud();\n return useMutation({\n mutationFn: async (id: string) => {\n const result = await adaQuery<{ adaArchivePolicy: boolean }>(\n `mutation AdaArchivePolicy($id: ID!) { adaArchivePolicy(id: $id) }`,\n { id },\n apiGatewayUrl\n );\n return result.adaArchivePolicy;\n },\n onSuccess: () => {\n void queryClient.invalidateQueries({ queryKey: [...adaKeys.all, 'policies'] });\n },\n });\n};\n\n// ============================================================================\n// Violations\n// ============================================================================\n\nexport interface ViolationListFilter {\n policyId?: string;\n resourceId?: string;\n status?: AdaViolationStatus;\n pagination?: PaginationInput;\n}\n\nexport const useViolations = (filter: ViolationListFilter = {}) => {\n const { apiGatewayUrl } = useAdapterCloud();\n return useQuery({\n queryKey: adaKeys.violations(filter as Record<string, unknown>),\n queryFn: async () => {\n const result = await adaQuery<{ adaListViolations: AdaPolicyViolationPage }>(\n `query AdaListViolations($policyId: ID, $resourceId: ID, $status: AdaViolationStatus, $pagination: PaginationInput) {\n adaListViolations(policyId: $policyId, resourceId: $resourceId, status: $status, pagination: $pagination) {\n items {\n ${VIOLATION_FIELDS}\n policy { id name kind severity }\n }\n pageInfo { ${PAGE_INFO_FIELDS} }\n }\n }`,\n {\n policyId: filter.policyId,\n resourceId: filter.resourceId,\n status: filter.status,\n pagination: filter.pagination,\n },\n apiGatewayUrl\n );\n return result.adaListViolations;\n },\n placeholderData: (prev) => prev,\n staleTime: STALE,\n });\n};\n\nexport const useResolveViolation = () => {\n const queryClient = useQueryClient();\n const { apiGatewayUrl } = useAdapterCloud();\n return useMutation({\n mutationFn: async ({\n id,\n status,\n waiverReason,\n }: {\n id: string;\n status: AdaViolationStatus;\n waiverReason?: string;\n }) => {\n const result = await adaQuery<{ adaResolveViolation: AdaPolicyViolation }>(\n `mutation AdaResolveViolation($id: ID!, $status: AdaViolationStatus!, $waiverReason: String) {\n adaResolveViolation(id: $id, status: $status, waiverReason: $waiverReason) {\n ${VIOLATION_FIELDS}\n }\n }`,\n { id, status, waiverReason },\n apiGatewayUrl\n );\n return result.adaResolveViolation;\n },\n onSuccess: (violation) => {\n const label: Record<string, string> = {\n ACKNOWLEDGED: 'Violation acknowledged',\n RESOLVED: 'Violation resolved',\n WAIVED: 'Violation waived',\n OPEN: 'Violation reopened',\n };\n notify.success(label[violation.status] ?? 'Violation updated');\n void queryClient.invalidateQueries({ queryKey: [...adaKeys.all, 'violations'] });\n },\n });\n};\n\n// ============================================================================\n// Drift\n// ============================================================================\n\nexport interface DriftListFilter {\n resourceId?: string;\n status?: AdaDriftStatus;\n}\n\nexport const useDriftRecords = (filter: DriftListFilter = {}) => {\n const { apiGatewayUrl } = useAdapterCloud();\n return useQuery({\n queryKey: adaKeys.drift(filter as Record<string, unknown>),\n queryFn: async () => {\n // adaListDriftRecords returns AdaDriftRecordConnection (items + pageInfo),\n // matching every other ada*List query — the drift fields must be\n // requested under `items`, not directly on the connection.\n const result = await adaQuery<{ adaListDriftRecords: AdaDriftRecordPage }>(\n `query AdaListDriftRecords($resourceId: ID, $status: AdaDriftStatus, $pagination: PaginationInput) {\n adaListDriftRecords(resourceId: $resourceId, status: $status, pagination: $pagination) {\n items { ${DRIFT_FIELDS} }\n pageInfo { ${PAGE_INFO_FIELDS} }\n }\n }`,\n {\n resourceId: filter.resourceId,\n status: filter.status,\n // Callers historically relied on an unpaginated \"all matching drift\"\n // result (see DriftListPage) — request the server's page-size\n // ceiling (MAX_LIMIT in wspace-adaptercloud-svc's pagination utils)\n // explicitly rather than relying on the smaller default of 50.\n pagination: { limit: 100 },\n },\n apiGatewayUrl\n );\n return result.adaListDriftRecords.items;\n },\n staleTime: STALE,\n });\n};\n\nexport const useRemediateDrift = () => {\n const queryClient = useQueryClient();\n const { apiGatewayUrl } = useAdapterCloud();\n return useMutation({\n mutationFn: async (id: string) => {\n const result = await adaQuery<{ adaRemediateDrift: AdaDriftRecord }>(\n `mutation AdaRemediateDrift($id: ID!) {\n adaRemediateDrift(id: $id) { ${DRIFT_FIELDS} }\n }`,\n { id },\n apiGatewayUrl\n );\n return result.adaRemediateDrift;\n },\n onSuccess: () => {\n notify.success('Drift marked remediated');\n void queryClient.invalidateQueries({ queryKey: [...adaKeys.all, 'drift'] });\n void queryClient.invalidateQueries({ queryKey: [...adaKeys.all, 'resources'] });\n },\n });\n};\n\n// ============================================================================\n// Sync runs\n// ============================================================================\n\nexport interface SyncRunListFilter {\n connectionId?: string;\n status?: AdaSyncStatus;\n pagination?: PaginationInput;\n}\n\nexport const useSyncRuns = (filter: SyncRunListFilter = {}) => {\n const { apiGatewayUrl } = useAdapterCloud();\n return useQuery({\n queryKey: adaKeys.syncRuns(filter as Record<string, unknown>),\n queryFn: async () => {\n const result = await adaQuery<{ adaListSyncRuns: AdaSyncRunPage }>(\n `query AdaListSyncRuns($connectionId: ID, $status: AdaSyncStatus, $pagination: PaginationInput) {\n adaListSyncRuns(connectionId: $connectionId, status: $status, pagination: $pagination) {\n items {\n ${SYNC_RUN_FIELDS}\n connection { id name adapter { id kind } }\n }\n pageInfo { ${PAGE_INFO_FIELDS} }\n }\n }`,\n {\n connectionId: filter.connectionId,\n status: filter.status,\n pagination: filter.pagination,\n },\n apiGatewayUrl\n );\n return result.adaListSyncRuns;\n },\n placeholderData: (prev) => prev,\n staleTime: STALE,\n });\n};\n\nexport const useStartSyncRun = () => {\n const queryClient = useQueryClient();\n const { apiGatewayUrl } = useAdapterCloud();\n return useMutation({\n mutationFn: async (input: AdaStartSyncRunInput) => {\n const result = await adaQuery<{ adaStartSyncRun: AdaSyncRun }>(\n `mutation AdaStartSyncRun($input: AdaStartSyncRunInput!) {\n adaStartSyncRun(input: $input) { ${SYNC_RUN_FIELDS} }\n }`,\n { input },\n apiGatewayUrl\n );\n return result.adaStartSyncRun;\n },\n onSuccess: () => {\n notify.success('Sync run started');\n void queryClient.invalidateQueries({ queryKey: [...adaKeys.all, 'sync-runs'] });\n void queryClient.invalidateQueries({ queryKey: [...adaKeys.all, 'connections'] });\n },\n });\n};\n\nexport const useCancelSyncRun = () => {\n const queryClient = useQueryClient();\n const { apiGatewayUrl } = useAdapterCloud();\n return useMutation({\n mutationFn: async (id: string) => {\n const result = await adaQuery<{ adaCancelSyncRun: AdaSyncRun }>(\n `mutation AdaCancelSyncRun($id: ID!) {\n adaCancelSyncRun(id: $id) { ${SYNC_RUN_FIELDS} }\n }`,\n { id },\n apiGatewayUrl\n );\n return result.adaCancelSyncRun;\n },\n onSuccess: () => {\n notify.success('Sync run cancelled');\n void queryClient.invalidateQueries({ queryKey: [...adaKeys.all, 'sync-runs'] });\n },\n });\n};\n\n// ============================================================================\n// FinOps — cost\n// ============================================================================\n\nexport const useCostSummary = (connectionId?: string) => {\n const { apiGatewayUrl } = useAdapterCloud();\n return useQuery({\n queryKey: adaKeys.costSummary(connectionId),\n queryFn: async () => {\n const result = await adaQuery<{ adaCostSummary: AdaCostSummary }>(\n `query AdaCostSummary($connectionId: ID) {\n adaCostSummary(connectionId: $connectionId) {\n currency total\n lines { service total }\n }\n }`,\n { connectionId },\n apiGatewayUrl\n );\n return result.adaCostSummary;\n },\n staleTime: STALE,\n });\n};\n\nexport interface CostRecordListFilter {\n connectionId?: string;\n resourceId?: string;\n service?: string;\n}\n\nexport const LIST_COST_RECORDS_QUERY = `query AdaListCostRecords($connectionId: ID, $resourceId: ID, $service: String, $pagination: PaginationInput) {\n adaListCostRecords(connectionId: $connectionId, resourceId: $resourceId, service: $service, pagination: $pagination) {\n items {\n id service amount currency periodStart periodEnd breakdown\n connectionId resourceId workspaceId createdAt updatedAt\n resource { id name }\n connection { id name }\n }\n pageInfo { ${PAGE_INFO_FIELDS} }\n }\n}`;\n\nexport const useCostRecords = (filter: CostRecordListFilter = {}) => {\n const { apiGatewayUrl } = useAdapterCloud();\n return useQuery({\n queryKey: adaKeys.costRecords(filter as Record<string, unknown>),\n queryFn: async () => {\n const items: AdaCostRecord[] = [];\n let offset = 0;\n for (;;) {\n const result = await adaQuery<{\n adaListCostRecords: { items: AdaCostRecord[]; pageInfo: { hasMore: boolean } };\n }>(\n LIST_COST_RECORDS_QUERY,\n {\n connectionId: filter.connectionId,\n resourceId: filter.resourceId,\n service: filter.service,\n pagination: { limit: 100, offset },\n },\n apiGatewayUrl\n );\n const page = result.adaListCostRecords;\n items.push(...page.items);\n if (!page.pageInfo.hasMore || page.items.length === 0) return items;\n offset += page.items.length;\n }\n },\n staleTime: STALE,\n });\n};\n\n// ============================================================================\n// Topology\n// ============================================================================\n\nexport interface TopologyFilter {\n resourceId?: string;\n kind?: AdaEdgeKind;\n}\n\nconst TOPOLOGY_PAGE_SIZE = 100;\n\n/**\n * Load every resource needed by the estate graph. The normal inventory hook is\n * intentionally page-oriented; a dependency graph cannot silently drop nodes\n * after the first page without producing incorrect impact results.\n */\nexport const useTopologyResources = () => {\n const { apiGatewayUrl } = useAdapterCloud();\n return useQuery({\n queryKey: adaKeys.topologyResources(),\n queryFn: async () => {\n const items: AdaResource[] = [];\n let offset = 0;\n\n for (;;) {\n const result = await adaQuery<{ adaListResources: AdaResourcePage }>(\n `query AdaTopologyResources($pagination: PaginationInput) {\n adaListResources(pagination: $pagination) {\n items {\n ${RESOURCE_FIELDS}\n connection { id name }\n }\n pageInfo { ${PAGE_INFO_FIELDS} }\n }\n }`,\n { pagination: { limit: TOPOLOGY_PAGE_SIZE, offset } },\n apiGatewayUrl\n );\n const page = result.adaListResources;\n items.push(...page.items);\n if (!page.pageInfo.hasMore || page.items.length === 0) return items;\n offset += page.items.length;\n }\n },\n staleTime: STALE,\n });\n};\n\n/**\n * The estate's dependency edges (`adaListTopologyEdges`). Consumers pair this\n * with `useResources` to render the topology graph — edges reference resources\n * by id, resources supply the node labels/state/type.\n */\nexport const useTopology = (filter: TopologyFilter = {}) => {\n const { apiGatewayUrl } = useAdapterCloud();\n return useQuery({\n queryKey: adaKeys.topology(filter as Record<string, unknown>),\n queryFn: async () => {\n const items: AdaTopologyEdge[] = [];\n let offset = 0;\n\n for (;;) {\n const result = await adaQuery<{\n adaListTopologyEdges: { items: AdaTopologyEdge[]; pageInfo: { hasMore: boolean } };\n }>(\n `query AdaListTopologyEdges($resourceId: ID, $kind: AdaEdgeKind, $pagination: PaginationInput) {\n adaListTopologyEdges(resourceId: $resourceId, kind: $kind, pagination: $pagination) {\n items {\n id fromResourceId toResourceId kind bidirectional weight attributes\n workspaceId createdAt updatedAt\n }\n pageInfo { ${PAGE_INFO_FIELDS} }\n }\n }`,\n {\n resourceId: filter.resourceId,\n kind: filter.kind,\n pagination: { limit: TOPOLOGY_PAGE_SIZE, offset },\n },\n apiGatewayUrl\n );\n const page = result.adaListTopologyEdges;\n items.push(...page.items);\n if (!page.pageInfo.hasMore || page.items.length === 0) return items;\n offset += page.items.length;\n }\n },\n staleTime: STALE,\n });\n};\n"],"mappings":"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"}
1
+ {"version":3,"file":"useAdapterCloudApi.js","names":[],"sources":["../../../src/adaptercloud/hooks/useAdapterCloudApi.ts"],"sourcesContent":["/**\n * AdapterCloud API Hooks\n * @module adaptercloud/hooks\n *\n * Real, typed data layer for AdapterCloud (InfraVerse). Every hook talks to the\n * deployed `wspace-adaptercloud-svc` subgraph through the workspace GraphQL\n * gateway via `graphqlFetch`. Operations, fields, inputs, enums and the\n * Connection/pageInfo shapes are taken verbatim from the service's\n * `.hive-schema.graphql`. No mocks — every screen reads/writes real data.\n */\n\nimport { useMutation, useQuery, useQueryClient } from '@tanstack/react-query';\n\nimport { graphqlFetch } from '@burdenoff/fe-libs/shared/graphql';\nimport { clearGraphqlFetchResponseCache } from '@burdenoff/fe-libs/shared/graphql/fetch';\n\nimport { useAdapterCloud } from '../context';\nimport { notify } from '../lib/toast';\nimport type {\n AdaAdapter,\n AdaAdapterConnectionPage,\n AdaAdapterKind,\n AdaAdapterStatus,\n AdaConnection,\n AdaConnectionPage,\n AdaConnectionStatus,\n AdaCostRecord,\n AdaCostSummary,\n AdaDriftRecord,\n AdaDriftRecordPage,\n AdaDriftStatus,\n AdaPageInfo,\n AdaPolicy,\n AdaPolicyKind,\n AdaPolicyPage,\n AdaPolicyViolation,\n AdaPolicyViolationPage,\n AdaResource,\n AdaResourcePage,\n AdaResourceState,\n AdaSyncRun,\n AdaSyncRunPage,\n AdaSyncStatus,\n AdaTopologyEdge,\n AdaEdgeKind,\n AdaViolationStatus,\n PaginationInput,\n AdaCreateAdapterInput,\n AdaUpdateAdapterInput,\n AdaCreateConnectionInput,\n AdaUpdateConnectionInput,\n AdaCreatePolicyInput,\n AdaUpdatePolicyInput,\n AdaStartSyncRunInput,\n} from '../types';\n\n// ============================================================================\n// Query keys\n// ============================================================================\n\nexport const adaKeys = {\n all: ['adaptercloud'] as const,\n health: () => [...adaKeys.all, 'health'] as const,\n costSummary: (connectionId?: string) =>\n [...adaKeys.all, 'cost-summary', connectionId ?? null] as const,\n costRecords: (filter: Record<string, unknown>) =>\n [...adaKeys.all, 'cost-records', filter] as const,\n adapters: (filter: Record<string, unknown>) => [...adaKeys.all, 'adapters', filter] as const,\n adapter: (id: string) => [...adaKeys.all, 'adapter', id] as const,\n connections: (filter: Record<string, unknown>) =>\n [...adaKeys.all, 'connections', filter] as const,\n connection: (id: string) => [...adaKeys.all, 'connection', id] as const,\n resources: (filter: Record<string, unknown>) => [...adaKeys.all, 'resources', filter] as const,\n resource: (id: string) => [...adaKeys.all, 'resource', id] as const,\n policies: (filter: Record<string, unknown>) => [...adaKeys.all, 'policies', filter] as const,\n policy: (id: string) => [...adaKeys.all, 'policy', id] as const,\n violations: (filter: Record<string, unknown>) => [...adaKeys.all, 'violations', filter] as const,\n drift: (filter: Record<string, unknown>) => [...adaKeys.all, 'drift', filter] as const,\n driftCount: (status?: AdaDriftStatus) =>\n [...adaKeys.all, 'drift', 'count', status ?? null] as const,\n syncRuns: (filter: Record<string, unknown>) => [...adaKeys.all, 'sync-runs', filter] as const,\n syncRun: (id: string) => [...adaKeys.all, 'sync-run', id] as const,\n topology: (filter: Record<string, unknown>) => [...adaKeys.all, 'topology', filter] as const,\n topologyResources: () => [...adaKeys.all, 'topology-resources'] as const,\n};\n\n// ============================================================================\n// Low-level query wrapper\n// ============================================================================\n\nconst adaQuery = async <TData>(\n query: string,\n variables: Record<string, unknown>,\n baseUrl?: string\n): Promise<TData> => {\n const response = await graphqlFetch<TData>({\n gateway: 'workspace',\n baseUrl,\n query,\n variables,\n workspaceToken: true,\n });\n\n if (response.errors?.length) {\n throw new Error(response.errors[0]?.message ?? 'GraphQL request failed');\n }\n\n if (!response.data) {\n throw new Error('GraphQL response did not include data');\n }\n\n // After a successful mutation, drop the fe-libs graphqlFetch response cache\n // (≤30s TTL) so the follow-up React-Query refetch reads fresh data instead of\n // a stale cached response — otherwise writes appear to \"not take effect\" for\n // up to 30s. (fe-libs' own Apollo client does the same on every mutation.)\n if (/^\\s*mutation\\b/.test(query)) {\n clearGraphqlFetchResponseCache();\n }\n\n return response.data;\n};\n\nconst STALE = 30 * 1000;\n\n// ============================================================================\n// Reusable GraphQL field selections (inline strings)\n// ============================================================================\n\nconst ADAPTER_FIELDS = `\n id name slug kind status vendor version description capabilities tags\n configSchema workspaceId createdAt updatedAt\n`;\n\nconst CONNECTION_FIELDS = `\n id name adapterId authMethod status environment region resourceCount\n secretRef targetRef config tags lastError lastSyncedAt workspaceId createdAt updatedAt\n`;\n\nconst RESOURCE_FIELDS = `\n id connectionId externalId resourceType name region state monthlyCost\n providerTags attributes tags lastSeenAt workspaceId createdAt updatedAt\n`;\n\nconst POLICY_FIELDS = `\n id name description kind enforcement severity expression appliesTo isActive\n tags workspaceId createdAt updatedAt\n`;\n\nconst VIOLATION_FIELDS = `\n id policyId resourceId message status severity evidence waiverReason\n detectedAt resolvedAt resolvedById workspaceId createdAt updatedAt\n`;\n\nconst DRIFT_FIELDS = `\n id resourceId attributePath expectedValue observedValue severity status\n detectedAt remediatedAt workspaceId createdAt updatedAt\n`;\n\nconst SYNC_RUN_FIELDS = `\n id connectionId kind status discoveredCount reconciledCount driftCount\n violationCount error summary startedAt finishedAt workspaceId createdAt updatedAt\n`;\n\n// `totalCount` is the real estate-wide count exposed on AdaPageInfo (svc-added).\n// Requested where the Overview tiles need an accurate total; consumers fall back\n// to `items.length` when it is null/undefined so the UI keeps working if absent.\nconst PAGE_INFO_FIELDS = `cursor hasMore totalCount`;\n\n// ============================================================================\n// Health\n// ============================================================================\n\nexport const useAdaHealth = () => {\n const { apiGatewayUrl } = useAdapterCloud();\n return useQuery({\n queryKey: adaKeys.health(),\n queryFn: async () => {\n const result = await adaQuery<{ adaHealth: string }>(\n `query AdaHealth { adaHealth }`,\n {},\n apiGatewayUrl\n );\n return result.adaHealth;\n },\n staleTime: STALE,\n });\n};\n\n// ============================================================================\n// Adapters\n// ============================================================================\n\nexport interface AdapterListFilter {\n kind?: AdaAdapterKind;\n status?: AdaAdapterStatus;\n pagination?: PaginationInput;\n}\n\nexport const useAdapters = (filter: AdapterListFilter = {}) => {\n const { apiGatewayUrl } = useAdapterCloud();\n return useQuery({\n queryKey: adaKeys.adapters(filter as Record<string, unknown>),\n queryFn: async () => {\n const result = await adaQuery<{ adaListAdapters: AdaAdapterConnectionPage }>(\n `query AdaListAdapters($kind: AdaAdapterKind, $status: AdaAdapterStatus, $pagination: PaginationInput) {\n adaListAdapters(kind: $kind, status: $status, pagination: $pagination) {\n items { ${ADAPTER_FIELDS} }\n pageInfo { ${PAGE_INFO_FIELDS} }\n }\n }`,\n {\n kind: filter.kind,\n status: filter.status,\n pagination: filter.pagination,\n },\n apiGatewayUrl\n );\n return result.adaListAdapters;\n },\n placeholderData: (prev) => prev,\n staleTime: STALE,\n });\n};\n\nexport const useAdapter = (id: string | undefined) => {\n const { apiGatewayUrl } = useAdapterCloud();\n return useQuery({\n queryKey: adaKeys.adapter(id ?? ''),\n queryFn: async () => {\n const result = await adaQuery<{ adaAdapter: AdaAdapter | null }>(\n `query AdaAdapter($id: ID!) {\n adaAdapter(id: $id) {\n ${ADAPTER_FIELDS}\n connections { ${CONNECTION_FIELDS} }\n }\n }`,\n { id },\n apiGatewayUrl\n );\n return result.adaAdapter;\n },\n enabled: Boolean(id),\n staleTime: STALE,\n });\n};\n\nexport const useCreateAdapter = () => {\n const queryClient = useQueryClient();\n const { apiGatewayUrl } = useAdapterCloud();\n return useMutation({\n mutationFn: async (input: AdaCreateAdapterInput) => {\n const result = await adaQuery<{ adaCreateAdapter: AdaAdapter }>(\n `mutation AdaCreateAdapter($input: AdaCreateAdapterInput!) {\n adaCreateAdapter(input: $input) { ${ADAPTER_FIELDS} }\n }`,\n { input },\n apiGatewayUrl\n );\n return result.adaCreateAdapter;\n },\n onSuccess: () => {\n void queryClient.invalidateQueries({ queryKey: [...adaKeys.all, 'adapters'] });\n },\n });\n};\n\nexport const useUpdateAdapter = () => {\n const queryClient = useQueryClient();\n const { apiGatewayUrl } = useAdapterCloud();\n return useMutation({\n mutationFn: async ({ id, input }: { id: string; input: AdaUpdateAdapterInput }) => {\n const result = await adaQuery<{ adaUpdateAdapter: AdaAdapter }>(\n `mutation AdaUpdateAdapter($id: ID!, $input: AdaUpdateAdapterInput!) {\n adaUpdateAdapter(id: $id, input: $input) { ${ADAPTER_FIELDS} }\n }`,\n { id, input },\n apiGatewayUrl\n );\n return result.adaUpdateAdapter;\n },\n onSuccess: (adapter) => {\n void queryClient.invalidateQueries({ queryKey: [...adaKeys.all, 'adapters'] });\n void queryClient.invalidateQueries({ queryKey: adaKeys.adapter(adapter.id) });\n },\n });\n};\n\nexport const useArchiveAdapter = () => {\n const queryClient = useQueryClient();\n const { apiGatewayUrl } = useAdapterCloud();\n return useMutation({\n mutationFn: async (id: string) => {\n const result = await adaQuery<{ adaArchiveAdapter: boolean }>(\n `mutation AdaArchiveAdapter($id: ID!) { adaArchiveAdapter(id: $id) }`,\n { id },\n apiGatewayUrl\n );\n return result.adaArchiveAdapter;\n },\n onSuccess: () => {\n void queryClient.invalidateQueries({ queryKey: [...adaKeys.all, 'adapters'] });\n },\n });\n};\n\n// ============================================================================\n// Connections\n// ============================================================================\n\nexport interface ConnectionListFilter {\n adapterId?: string;\n status?: AdaConnectionStatus;\n pagination?: PaginationInput;\n}\n\nexport const useConnections = (filter: ConnectionListFilter = {}) => {\n const { apiGatewayUrl } = useAdapterCloud();\n return useQuery({\n queryKey: adaKeys.connections(filter as Record<string, unknown>),\n queryFn: async () => {\n const result = await adaQuery<{ adaListConnections: AdaConnectionPage }>(\n `query AdaListConnections($adapterId: ID, $status: AdaConnectionStatus, $pagination: PaginationInput) {\n adaListConnections(adapterId: $adapterId, status: $status, pagination: $pagination) {\n items {\n ${CONNECTION_FIELDS}\n adapter { id name slug kind }\n }\n pageInfo { ${PAGE_INFO_FIELDS} }\n }\n }`,\n {\n adapterId: filter.adapterId,\n status: filter.status,\n pagination: filter.pagination,\n },\n apiGatewayUrl\n );\n return result.adaListConnections;\n },\n placeholderData: (prev) => prev,\n staleTime: STALE,\n });\n};\n\nexport const useConnection = (id: string | undefined) => {\n const { apiGatewayUrl } = useAdapterCloud();\n return useQuery({\n queryKey: adaKeys.connection(id ?? ''),\n queryFn: async () => {\n const result = await adaQuery<{ adaConnection: AdaConnection | null }>(\n `query AdaConnection($id: ID!) {\n adaConnection(id: $id) {\n ${CONNECTION_FIELDS}\n adapter { ${ADAPTER_FIELDS} }\n resources { ${RESOURCE_FIELDS} }\n }\n }`,\n { id },\n apiGatewayUrl\n );\n return result.adaConnection;\n },\n enabled: Boolean(id),\n staleTime: STALE,\n });\n};\n\nexport const useCreateConnection = () => {\n const queryClient = useQueryClient();\n const { apiGatewayUrl } = useAdapterCloud();\n return useMutation({\n mutationFn: async (input: AdaCreateConnectionInput) => {\n const result = await adaQuery<{ adaCreateConnection: AdaConnection }>(\n `mutation AdaCreateConnection($input: AdaCreateConnectionInput!) {\n adaCreateConnection(input: $input) { ${CONNECTION_FIELDS} }\n }`,\n { input },\n apiGatewayUrl\n );\n return result.adaCreateConnection;\n },\n onSuccess: () => {\n void queryClient.invalidateQueries({ queryKey: [...adaKeys.all, 'connections'] });\n },\n });\n};\n\nexport const useUpdateConnection = () => {\n const queryClient = useQueryClient();\n const { apiGatewayUrl } = useAdapterCloud();\n return useMutation({\n mutationFn: async ({ id, input }: { id: string; input: AdaUpdateConnectionInput }) => {\n const result = await adaQuery<{ adaUpdateConnection: AdaConnection }>(\n `mutation AdaUpdateConnection($id: ID!, $input: AdaUpdateConnectionInput!) {\n adaUpdateConnection(id: $id, input: $input) { ${CONNECTION_FIELDS} }\n }`,\n { id, input },\n apiGatewayUrl\n );\n return result.adaUpdateConnection;\n },\n onSuccess: (connection) => {\n void queryClient.invalidateQueries({ queryKey: [...adaKeys.all, 'connections'] });\n void queryClient.invalidateQueries({ queryKey: adaKeys.connection(connection.id) });\n },\n });\n};\n\nexport const useSetConnectionStatus = () => {\n const queryClient = useQueryClient();\n const { apiGatewayUrl } = useAdapterCloud();\n return useMutation({\n mutationFn: async ({ id, status }: { id: string; status: AdaConnectionStatus }) => {\n const result = await adaQuery<{ adaSetConnectionStatus: AdaConnection }>(\n `mutation AdaSetConnectionStatus($id: ID!, $status: AdaConnectionStatus!) {\n adaSetConnectionStatus(id: $id, status: $status) { ${CONNECTION_FIELDS} }\n }`,\n { id, status },\n apiGatewayUrl\n );\n return result.adaSetConnectionStatus;\n },\n onSuccess: (connection) => {\n notify.success('Connection health updated');\n void queryClient.invalidateQueries({ queryKey: [...adaKeys.all, 'connections'] });\n void queryClient.invalidateQueries({ queryKey: adaKeys.connection(connection.id) });\n },\n });\n};\n\nexport const useDisableConnection = () => {\n const queryClient = useQueryClient();\n const { apiGatewayUrl } = useAdapterCloud();\n return useMutation({\n mutationFn: async (id: string) => {\n const result = await adaQuery<{ adaDisableConnection: AdaConnection }>(\n `mutation AdaDisableConnection($id: ID!) {\n adaDisableConnection(id: $id) { ${CONNECTION_FIELDS} }\n }`,\n { id },\n apiGatewayUrl\n );\n return result.adaDisableConnection;\n },\n onSuccess: (connection) => {\n notify.success('Connection disabled');\n void queryClient.invalidateQueries({ queryKey: [...adaKeys.all, 'connections'] });\n void queryClient.invalidateQueries({ queryKey: adaKeys.connection(connection.id) });\n },\n });\n};\n\n// ============================================================================\n// Resources\n// ============================================================================\n\nexport interface ResourceListFilter {\n connectionId?: string;\n resourceType?: string;\n state?: AdaResourceState;\n pagination?: PaginationInput;\n}\n\nexport const useResources = (filter: ResourceListFilter = {}) => {\n const { apiGatewayUrl } = useAdapterCloud();\n return useQuery({\n queryKey: adaKeys.resources(filter as Record<string, unknown>),\n queryFn: async () => {\n const result = await adaQuery<{ adaListResources: AdaResourcePage }>(\n `query AdaListResources($connectionId: ID, $resourceType: String, $state: AdaResourceState, $pagination: PaginationInput) {\n adaListResources(connectionId: $connectionId, resourceType: $resourceType, state: $state, pagination: $pagination) {\n items {\n ${RESOURCE_FIELDS}\n connection { id name }\n }\n pageInfo { ${PAGE_INFO_FIELDS} }\n }\n }`,\n {\n connectionId: filter.connectionId,\n resourceType: filter.resourceType,\n state: filter.state,\n pagination: filter.pagination,\n },\n apiGatewayUrl\n );\n return result.adaListResources;\n },\n placeholderData: (prev) => prev,\n staleTime: STALE,\n });\n};\n\nexport const useResource = (id: string | undefined) => {\n const { apiGatewayUrl } = useAdapterCloud();\n return useQuery({\n queryKey: adaKeys.resource(id ?? ''),\n queryFn: async () => {\n const result = await adaQuery<{ adaResource: AdaResource | null }>(\n `query AdaResource($id: ID!) {\n adaResource(id: $id) {\n ${RESOURCE_FIELDS}\n connection { ${CONNECTION_FIELDS} adapter { id name slug kind } }\n dependsOn { id name resourceType region state monthlyCost }\n }\n }`,\n { id },\n apiGatewayUrl\n );\n return result.adaResource;\n },\n enabled: Boolean(id),\n staleTime: STALE,\n });\n};\n\n// ============================================================================\n// Policies\n// ============================================================================\n\nexport interface PolicyListFilter {\n isActive?: boolean;\n kind?: AdaPolicyKind;\n pagination?: PaginationInput;\n}\n\nexport const usePolicies = (filter: PolicyListFilter = {}) => {\n const { apiGatewayUrl } = useAdapterCloud();\n return useQuery({\n queryKey: adaKeys.policies(filter as Record<string, unknown>),\n queryFn: async () => {\n const result = await adaQuery<{ adaListPolicies: AdaPolicyPage }>(\n `query AdaListPolicies($isActive: Boolean, $kind: AdaPolicyKind, $pagination: PaginationInput) {\n adaListPolicies(isActive: $isActive, kind: $kind, pagination: $pagination) {\n items { ${POLICY_FIELDS} }\n pageInfo { cursor hasMore }\n }\n }`,\n {\n isActive: filter.isActive,\n kind: filter.kind,\n pagination: filter.pagination,\n },\n apiGatewayUrl\n );\n return result.adaListPolicies;\n },\n placeholderData: (prev) => prev,\n staleTime: STALE,\n });\n};\n\nexport const usePolicy = (id: string | undefined) => {\n const { apiGatewayUrl } = useAdapterCloud();\n return useQuery({\n queryKey: adaKeys.policy(id ?? ''),\n queryFn: async () => {\n const result = await adaQuery<{ adaPolicy: AdaPolicy | null }>(\n `query AdaPolicy($id: ID!) {\n adaPolicy(id: $id) {\n ${POLICY_FIELDS}\n violations { ${VIOLATION_FIELDS} }\n }\n }`,\n { id },\n apiGatewayUrl\n );\n return result.adaPolicy;\n },\n enabled: Boolean(id),\n staleTime: STALE,\n });\n};\n\nexport const useCreatePolicy = () => {\n const queryClient = useQueryClient();\n const { apiGatewayUrl } = useAdapterCloud();\n return useMutation({\n mutationFn: async (input: AdaCreatePolicyInput) => {\n const result = await adaQuery<{ adaCreatePolicy: AdaPolicy }>(\n `mutation AdaCreatePolicy($input: AdaCreatePolicyInput!) {\n adaCreatePolicy(input: $input) { ${POLICY_FIELDS} }\n }`,\n { input },\n apiGatewayUrl\n );\n return result.adaCreatePolicy;\n },\n onSuccess: () => {\n void queryClient.invalidateQueries({ queryKey: [...adaKeys.all, 'policies'] });\n },\n });\n};\n\nexport const useUpdatePolicy = () => {\n const queryClient = useQueryClient();\n const { apiGatewayUrl } = useAdapterCloud();\n return useMutation({\n mutationFn: async ({ id, input }: { id: string; input: AdaUpdatePolicyInput }) => {\n const result = await adaQuery<{ adaUpdatePolicy: AdaPolicy }>(\n `mutation AdaUpdatePolicy($id: ID!, $input: AdaUpdatePolicyInput!) {\n adaUpdatePolicy(id: $id, input: $input) { ${POLICY_FIELDS} }\n }`,\n { id, input },\n apiGatewayUrl\n );\n return result.adaUpdatePolicy;\n },\n onSuccess: (policy) => {\n notify.success('Policy updated');\n void queryClient.invalidateQueries({ queryKey: [...adaKeys.all, 'policies'] });\n void queryClient.invalidateQueries({ queryKey: adaKeys.policy(policy.id) });\n },\n });\n};\n\nexport const useArchivePolicy = () => {\n const queryClient = useQueryClient();\n const { apiGatewayUrl } = useAdapterCloud();\n return useMutation({\n mutationFn: async (id: string) => {\n const result = await adaQuery<{ adaArchivePolicy: boolean }>(\n `mutation AdaArchivePolicy($id: ID!) { adaArchivePolicy(id: $id) }`,\n { id },\n apiGatewayUrl\n );\n return result.adaArchivePolicy;\n },\n onSuccess: () => {\n void queryClient.invalidateQueries({ queryKey: [...adaKeys.all, 'policies'] });\n },\n });\n};\n\n// ============================================================================\n// Violations\n// ============================================================================\n\nexport interface ViolationListFilter {\n policyId?: string;\n resourceId?: string;\n status?: AdaViolationStatus;\n pagination?: PaginationInput;\n}\n\n/**\n * @param options.enabled Set false to hold the query until its inputs are\n * known (e.g. a policy-scoped count whose route id has not resolved), so it\n * never falls back to an unintended estate-wide fetch.\n */\nexport const useViolations = (\n filter: ViolationListFilter = {},\n options: { enabled?: boolean } = {}\n) => {\n const { apiGatewayUrl } = useAdapterCloud();\n return useQuery({\n enabled: options.enabled ?? true,\n queryKey: adaKeys.violations(filter as Record<string, unknown>),\n queryFn: async () => {\n const result = await adaQuery<{ adaListViolations: AdaPolicyViolationPage }>(\n `query AdaListViolations($policyId: ID, $resourceId: ID, $status: AdaViolationStatus, $pagination: PaginationInput) {\n adaListViolations(policyId: $policyId, resourceId: $resourceId, status: $status, pagination: $pagination) {\n items {\n ${VIOLATION_FIELDS}\n policy { id name kind severity }\n }\n pageInfo { ${PAGE_INFO_FIELDS} }\n }\n }`,\n {\n policyId: filter.policyId,\n resourceId: filter.resourceId,\n status: filter.status,\n pagination: filter.pagination,\n },\n apiGatewayUrl\n );\n return result.adaListViolations;\n },\n placeholderData: (prev) => prev,\n staleTime: STALE,\n });\n};\n\nexport const useResolveViolation = () => {\n const queryClient = useQueryClient();\n const { apiGatewayUrl } = useAdapterCloud();\n return useMutation({\n mutationFn: async ({\n id,\n status,\n waiverReason,\n }: {\n id: string;\n status: AdaViolationStatus;\n waiverReason?: string;\n }) => {\n const result = await adaQuery<{ adaResolveViolation: AdaPolicyViolation }>(\n `mutation AdaResolveViolation($id: ID!, $status: AdaViolationStatus!, $waiverReason: String) {\n adaResolveViolation(id: $id, status: $status, waiverReason: $waiverReason) {\n ${VIOLATION_FIELDS}\n }\n }`,\n { id, status, waiverReason },\n apiGatewayUrl\n );\n return result.adaResolveViolation;\n },\n onSuccess: (violation) => {\n const label: Record<string, string> = {\n ACKNOWLEDGED: 'Violation acknowledged',\n RESOLVED: 'Violation resolved',\n WAIVED: 'Violation waived',\n OPEN: 'Violation reopened',\n };\n notify.success(label[violation.status] ?? 'Violation updated');\n void queryClient.invalidateQueries({ queryKey: [...adaKeys.all, 'violations'] });\n },\n });\n};\n\n// ============================================================================\n// Drift\n// ============================================================================\n\nexport interface DriftListFilter {\n resourceId?: string;\n status?: AdaDriftStatus;\n}\n\nexport const useDriftRecords = (filter: DriftListFilter = {}) => {\n const { apiGatewayUrl } = useAdapterCloud();\n return useQuery({\n queryKey: adaKeys.drift(filter as Record<string, unknown>),\n queryFn: async () => {\n // adaListDriftRecords returns AdaDriftRecordConnection (items + pageInfo),\n // matching every other ada*List query — the drift fields must be\n // requested under `items`, not directly on the connection.\n const result = await adaQuery<{ adaListDriftRecords: AdaDriftRecordPage }>(\n `query AdaListDriftRecords($resourceId: ID, $status: AdaDriftStatus, $pagination: PaginationInput) {\n adaListDriftRecords(resourceId: $resourceId, status: $status, pagination: $pagination) {\n items { ${DRIFT_FIELDS} }\n pageInfo { ${PAGE_INFO_FIELDS} }\n }\n }`,\n {\n resourceId: filter.resourceId,\n status: filter.status,\n // Callers historically relied on an unpaginated \"all matching drift\"\n // result (see DriftListPage) — request the server's page-size\n // ceiling (MAX_LIMIT in wspace-adaptercloud-svc's pagination utils)\n // explicitly rather than relying on the smaller default of 50.\n pagination: { limit: 100 },\n },\n apiGatewayUrl\n );\n return result.adaListDriftRecords.items;\n },\n staleTime: STALE,\n });\n};\n\n/**\n * Exact, estate-wide count of drift records for one status (every status when\n * omitted).\n *\n * Reads `pageInfo.totalCount` from a `limit: 1` query rather than measuring a\n * fetched page: {@link useDriftRecords} caps at the service's 100-row page\n * ceiling, so counting its result silently plateaus once an estate has more\n * drift than that. Resolves to `null` when a deployed schema does not expose\n * `totalCount`, which callers must render as \"unknown\" rather than as zero.\n */\nexport const useDriftCount = (status?: AdaDriftStatus) => {\n const { apiGatewayUrl } = useAdapterCloud();\n return useQuery({\n queryKey: adaKeys.driftCount(status),\n queryFn: async () => {\n const result = await adaQuery<{\n adaListDriftRecords: { pageInfo: AdaPageInfo };\n }>(\n `query AdaCountDriftRecords($status: AdaDriftStatus, $pagination: PaginationInput) {\n adaListDriftRecords(status: $status, pagination: $pagination) {\n pageInfo { ${PAGE_INFO_FIELDS} }\n }\n }`,\n { status, pagination: { limit: 1, offset: 0 } },\n apiGatewayUrl\n );\n return result.adaListDriftRecords.pageInfo.totalCount ?? null;\n },\n staleTime: STALE,\n });\n};\n\nexport const useRemediateDrift = () => {\n const queryClient = useQueryClient();\n const { apiGatewayUrl } = useAdapterCloud();\n return useMutation({\n mutationFn: async (id: string) => {\n const result = await adaQuery<{ adaRemediateDrift: AdaDriftRecord }>(\n `mutation AdaRemediateDrift($id: ID!) {\n adaRemediateDrift(id: $id) { ${DRIFT_FIELDS} }\n }`,\n { id },\n apiGatewayUrl\n );\n return result.adaRemediateDrift;\n },\n onSuccess: () => {\n notify.success('Drift marked remediated');\n void queryClient.invalidateQueries({ queryKey: [...adaKeys.all, 'drift'] });\n void queryClient.invalidateQueries({ queryKey: [...adaKeys.all, 'resources'] });\n },\n });\n};\n\n// ============================================================================\n// Sync runs\n// ============================================================================\n\nexport interface SyncRunListFilter {\n connectionId?: string;\n status?: AdaSyncStatus;\n pagination?: PaginationInput;\n}\n\n/**\n * @param options.enabled Set false to hold the query until its inputs are\n * known (e.g. a connection-scoped panel whose route id has not resolved),\n * so it never falls back to an unintended estate-wide fetch.\n */\nexport const useSyncRuns = (\n filter: SyncRunListFilter = {},\n options: { enabled?: boolean } = {}\n) => {\n const { apiGatewayUrl } = useAdapterCloud();\n return useQuery({\n enabled: options.enabled ?? true,\n queryKey: adaKeys.syncRuns(filter as Record<string, unknown>),\n queryFn: async () => {\n const result = await adaQuery<{ adaListSyncRuns: AdaSyncRunPage }>(\n `query AdaListSyncRuns($connectionId: ID, $status: AdaSyncStatus, $pagination: PaginationInput) {\n adaListSyncRuns(connectionId: $connectionId, status: $status, pagination: $pagination) {\n items {\n ${SYNC_RUN_FIELDS}\n connection { id name adapter { id kind } }\n }\n pageInfo { ${PAGE_INFO_FIELDS} }\n }\n }`,\n {\n connectionId: filter.connectionId,\n status: filter.status,\n pagination: filter.pagination,\n },\n apiGatewayUrl\n );\n return result.adaListSyncRuns;\n },\n placeholderData: (prev) => prev,\n staleTime: STALE,\n });\n};\n\nexport const useStartSyncRun = () => {\n const queryClient = useQueryClient();\n const { apiGatewayUrl } = useAdapterCloud();\n return useMutation({\n mutationFn: async (input: AdaStartSyncRunInput) => {\n const result = await adaQuery<{ adaStartSyncRun: AdaSyncRun }>(\n `mutation AdaStartSyncRun($input: AdaStartSyncRunInput!) {\n adaStartSyncRun(input: $input) { ${SYNC_RUN_FIELDS} }\n }`,\n { input },\n apiGatewayUrl\n );\n return result.adaStartSyncRun;\n },\n onSuccess: () => {\n notify.success('Sync run started');\n void queryClient.invalidateQueries({ queryKey: [...adaKeys.all, 'sync-runs'] });\n void queryClient.invalidateQueries({ queryKey: [...adaKeys.all, 'connections'] });\n },\n });\n};\n\nexport const useCancelSyncRun = () => {\n const queryClient = useQueryClient();\n const { apiGatewayUrl } = useAdapterCloud();\n return useMutation({\n mutationFn: async (id: string) => {\n const result = await adaQuery<{ adaCancelSyncRun: AdaSyncRun }>(\n `mutation AdaCancelSyncRun($id: ID!) {\n adaCancelSyncRun(id: $id) { ${SYNC_RUN_FIELDS} }\n }`,\n { id },\n apiGatewayUrl\n );\n return result.adaCancelSyncRun;\n },\n onSuccess: () => {\n notify.success('Sync run cancelled');\n void queryClient.invalidateQueries({ queryKey: [...adaKeys.all, 'sync-runs'] });\n },\n });\n};\n\n// ============================================================================\n// FinOps — cost\n// ============================================================================\n\nexport const useCostSummary = (connectionId?: string) => {\n const { apiGatewayUrl } = useAdapterCloud();\n return useQuery({\n queryKey: adaKeys.costSummary(connectionId),\n queryFn: async () => {\n const result = await adaQuery<{ adaCostSummary: AdaCostSummary }>(\n `query AdaCostSummary($connectionId: ID) {\n adaCostSummary(connectionId: $connectionId) {\n currency total\n lines { service total }\n }\n }`,\n { connectionId },\n apiGatewayUrl\n );\n return result.adaCostSummary;\n },\n staleTime: STALE,\n });\n};\n\nexport interface CostRecordListFilter {\n connectionId?: string;\n resourceId?: string;\n service?: string;\n}\n\nexport const LIST_COST_RECORDS_QUERY = `query AdaListCostRecords($connectionId: ID, $resourceId: ID, $service: String, $pagination: PaginationInput) {\n adaListCostRecords(connectionId: $connectionId, resourceId: $resourceId, service: $service, pagination: $pagination) {\n items {\n id service amount currency periodStart periodEnd breakdown\n connectionId resourceId workspaceId createdAt updatedAt\n resource { id name }\n connection { id name }\n }\n pageInfo { ${PAGE_INFO_FIELDS} }\n }\n}`;\n\nexport const useCostRecords = (filter: CostRecordListFilter = {}) => {\n const { apiGatewayUrl } = useAdapterCloud();\n return useQuery({\n queryKey: adaKeys.costRecords(filter as Record<string, unknown>),\n queryFn: async () => {\n const items: AdaCostRecord[] = [];\n let offset = 0;\n for (;;) {\n const result = await adaQuery<{\n adaListCostRecords: { items: AdaCostRecord[]; pageInfo: { hasMore: boolean } };\n }>(\n LIST_COST_RECORDS_QUERY,\n {\n connectionId: filter.connectionId,\n resourceId: filter.resourceId,\n service: filter.service,\n pagination: { limit: 100, offset },\n },\n apiGatewayUrl\n );\n const page = result.adaListCostRecords;\n items.push(...page.items);\n if (!page.pageInfo.hasMore || page.items.length === 0) return items;\n offset += page.items.length;\n }\n },\n staleTime: STALE,\n });\n};\n\n// ============================================================================\n// Topology\n// ============================================================================\n\nexport interface TopologyFilter {\n resourceId?: string;\n kind?: AdaEdgeKind;\n}\n\nconst TOPOLOGY_PAGE_SIZE = 100;\n\n/**\n * Load every resource needed by the estate graph. The normal inventory hook is\n * intentionally page-oriented; a dependency graph cannot silently drop nodes\n * after the first page without producing incorrect impact results.\n */\nexport const useTopologyResources = () => {\n const { apiGatewayUrl } = useAdapterCloud();\n return useQuery({\n queryKey: adaKeys.topologyResources(),\n queryFn: async () => {\n const items: AdaResource[] = [];\n let offset = 0;\n\n for (;;) {\n const result = await adaQuery<{ adaListResources: AdaResourcePage }>(\n `query AdaTopologyResources($pagination: PaginationInput) {\n adaListResources(pagination: $pagination) {\n items {\n ${RESOURCE_FIELDS}\n connection { id name }\n }\n pageInfo { ${PAGE_INFO_FIELDS} }\n }\n }`,\n { pagination: { limit: TOPOLOGY_PAGE_SIZE, offset } },\n apiGatewayUrl\n );\n const page = result.adaListResources;\n items.push(...page.items);\n if (!page.pageInfo.hasMore || page.items.length === 0) return items;\n offset += page.items.length;\n }\n },\n staleTime: STALE,\n });\n};\n\n/**\n * The estate's dependency edges (`adaListTopologyEdges`). Consumers pair this\n * with `useResources` to render the topology graph — edges reference resources\n * by id, resources supply the node labels/state/type.\n */\nexport const useTopology = (filter: TopologyFilter = {}) => {\n const { apiGatewayUrl } = useAdapterCloud();\n return useQuery({\n queryKey: adaKeys.topology(filter as Record<string, unknown>),\n queryFn: async () => {\n const items: AdaTopologyEdge[] = [];\n let offset = 0;\n\n for (;;) {\n const result = await adaQuery<{\n adaListTopologyEdges: { items: AdaTopologyEdge[]; pageInfo: { hasMore: boolean } };\n }>(\n `query AdaListTopologyEdges($resourceId: ID, $kind: AdaEdgeKind, $pagination: PaginationInput) {\n adaListTopologyEdges(resourceId: $resourceId, kind: $kind, pagination: $pagination) {\n items {\n id fromResourceId toResourceId kind bidirectional weight attributes\n workspaceId createdAt updatedAt\n }\n pageInfo { ${PAGE_INFO_FIELDS} }\n }\n }`,\n {\n resourceId: filter.resourceId,\n kind: filter.kind,\n pagination: { limit: TOPOLOGY_PAGE_SIZE, offset },\n },\n apiGatewayUrl\n );\n const page = result.adaListTopologyEdges;\n items.push(...page.items);\n if (!page.pageInfo.hasMore || page.items.length === 0) return items;\n offset += page.items.length;\n }\n },\n staleTime: STALE,\n });\n};\n"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"OverviewPage.d.ts","sourceRoot":"","sources":["../../../src/adaptercloud/pages/OverviewPage.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAgDH,wBAAgB,YAAY,gCAmY3B"}
1
+ {"version":3,"file":"OverviewPage.d.ts","sourceRoot":"","sources":["../../../src/adaptercloud/pages/OverviewPage.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAgDH,wBAAgB,YAAY,gCAoY3B"}
@@ -8,7 +8,7 @@ import { DataState as ee } from "../components/DataState.js";
8
8
  import { StackedBar as c } from "../components/viz/StackedBar.js";
9
9
  import { BarChart as l } from "../components/viz/BarChart.js";
10
10
  import "../components/viz/index.js";
11
- import { useAdapters as u, useConnections as d, useCostSummary as f, useDriftRecords as p, useResources as m, useSyncRuns as h, useViolations as g } from "../hooks/useAdapterCloudApi.js";
11
+ import { useAdapters as u, useConnections as d, useCostSummary as f, useDriftCount as p, useResources as m, useSyncRuns as h, useViolations as g } from "../hooks/useAdapterCloudApi.js";
12
12
  import { formatRelativeTime as _ } from "../utils/formatters.js";
13
13
  import { useCallback as v, useMemo as y } from "react";
14
14
  import { useI18n as te } from "@burdenoff/fe-libs/shared/providers/shell/I18nProvider";
@@ -26,7 +26,7 @@ function F() {
26
26
  }, [L]), z = u({ pagination: { limit: 100 } }), B = d({ pagination: { limit: 100 } }), V = m({ pagination: { limit: 100 } }), H = g({
27
27
  status: "OPEN",
28
28
  pagination: { limit: 50 }
29
- }), U = p({ status: "DETECTED" }), W = h({ pagination: { limit: 5 } }), G = f(), K = I?.firstName ?? I?.name ?? "there", q = y(() => {
29
+ }), U = p("DETECTED"), W = h({ pagination: { limit: 5 } }), G = f(), K = I?.firstName ?? I?.name ?? "there", q = y(() => {
30
30
  let e = B.data?.items ?? [], t = {
31
31
  CONNECTED: 0,
32
32
  DEGRADED: 0,
@@ -271,7 +271,7 @@ function F() {
271
271
  })]
272
272
  })
273
273
  }),
274
- U.data && U.data.length > 0 && /* @__PURE__ */ A("button", {
274
+ U.data != null && U.data > 0 && /* @__PURE__ */ A("button", {
275
275
  type: "button",
276
276
  onClick: () => F("/drift"),
277
277
  className: "mt-3 flex w-full items-center gap-2 rounded-lg border border-border-subtle bg-bg-surface px-4 py-3 text-left text-sm transition-colors hover:bg-accent/50",
@@ -280,7 +280,7 @@ function F() {
280
280
  /* @__PURE__ */ A("span", {
281
281
  className: "text-text-primary",
282
282
  children: [
283
- U.data.length,
283
+ U.data,
284
284
  " ",
285
285
  R("adaptercloud.overview.driftDetected", "drift records detected")
286
286
  ]