@burdenoff/microfe-adaptercloud 2026.706.1 → 2026.706.3

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 (53) hide show
  1. package/dist/adaptercloud/AdapterCloudRoot.js +52 -44
  2. package/dist/adaptercloud/AdapterCloudRoot.js.map +1 -1
  3. package/dist/adaptercloud/AdapterCloudRoutes.js +22 -14
  4. package/dist/adaptercloud/AdapterCloudRoutes.js.map +1 -1
  5. package/dist/adaptercloud/components/ConfirmDialog.js +27 -0
  6. package/dist/adaptercloud/components/ConfirmDialog.js.map +1 -0
  7. package/dist/adaptercloud/components/DataState.js +1 -1
  8. package/dist/adaptercloud/components/DataState.js.map +1 -1
  9. package/dist/adaptercloud/components/viz/BarChart.js +32 -0
  10. package/dist/adaptercloud/components/viz/BarChart.js.map +1 -0
  11. package/dist/adaptercloud/components/viz/Sparkline.js +50 -0
  12. package/dist/adaptercloud/components/viz/Sparkline.js.map +1 -0
  13. package/dist/adaptercloud/components/viz/StackedBar.js +1 -0
  14. package/dist/adaptercloud/components/viz/TopologyGraph.js +96 -0
  15. package/dist/adaptercloud/components/viz/TopologyGraph.js.map +1 -0
  16. package/dist/adaptercloud/components/viz/index.js +4 -0
  17. package/dist/adaptercloud/hooks/useAdapterCloudApi.js +71 -34
  18. package/dist/adaptercloud/hooks/useAdapterCloudApi.js.map +1 -1
  19. package/dist/adaptercloud/pages/OverviewPage.js +159 -156
  20. package/dist/adaptercloud/pages/OverviewPage.js.map +1 -1
  21. package/dist/adaptercloud/pages/adapters/AdapterDetailPage.js +179 -113
  22. package/dist/adaptercloud/pages/adapters/AdapterDetailPage.js.map +1 -1
  23. package/dist/adaptercloud/pages/adapters/AdapterFormPage.js +263 -179
  24. package/dist/adaptercloud/pages/adapters/AdapterFormPage.js.map +1 -1
  25. package/dist/adaptercloud/pages/adapters/AdaptersListPage.js +2 -0
  26. package/dist/adaptercloud/pages/adapters/AdaptersListPage.js.map +1 -1
  27. package/dist/adaptercloud/pages/connections/ConnectionDetailPage.js +141 -124
  28. package/dist/adaptercloud/pages/connections/ConnectionDetailPage.js.map +1 -1
  29. package/dist/adaptercloud/pages/connections/ConnectionFormPage.js +2 -0
  30. package/dist/adaptercloud/pages/connections/ConnectionFormPage.js.map +1 -1
  31. package/dist/adaptercloud/pages/connections/ConnectionsListPage.js +158 -93
  32. package/dist/adaptercloud/pages/connections/ConnectionsListPage.js.map +1 -1
  33. package/dist/adaptercloud/pages/costs/CostsPage.js +183 -109
  34. package/dist/adaptercloud/pages/costs/CostsPage.js.map +1 -1
  35. package/dist/adaptercloud/pages/drift/DriftListPage.js +172 -71
  36. package/dist/adaptercloud/pages/drift/DriftListPage.js.map +1 -1
  37. package/dist/adaptercloud/pages/policies/PoliciesListPage.js +179 -96
  38. package/dist/adaptercloud/pages/policies/PoliciesListPage.js.map +1 -1
  39. package/dist/adaptercloud/pages/policies/PolicyDetailPage.js +109 -91
  40. package/dist/adaptercloud/pages/policies/PolicyDetailPage.js.map +1 -1
  41. package/dist/adaptercloud/pages/policies/PolicyFormPage.js +211 -184
  42. package/dist/adaptercloud/pages/policies/PolicyFormPage.js.map +1 -1
  43. package/dist/adaptercloud/pages/resources/ResourceDetailPage.js +183 -127
  44. package/dist/adaptercloud/pages/resources/ResourceDetailPage.js.map +1 -1
  45. package/dist/adaptercloud/pages/resources/ResourcesListPage.js +121 -84
  46. package/dist/adaptercloud/pages/resources/ResourcesListPage.js.map +1 -1
  47. package/dist/adaptercloud/pages/sync-runs/SyncRunsListPage.js +236 -153
  48. package/dist/adaptercloud/pages/sync-runs/SyncRunsListPage.js.map +1 -1
  49. package/dist/adaptercloud/pages/topology/TopologyPage.js +397 -0
  50. package/dist/adaptercloud/pages/topology/TopologyPage.js.map +1 -0
  51. package/dist/adaptercloud/pages/violations/ViolationsListPage.js +192 -131
  52. package/dist/adaptercloud/pages/violations/ViolationsListPage.js.map +1 -1
  53. package/package.json +1 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TopologyGraph.js","names":[],"sources":["../../../../src/adaptercloud/components/viz/TopologyGraph.tsx"],"sourcesContent":["/**\n * TopologyGraph — a tokenized, dependency graph of the estate. Deterministic\n * layered layout: nodes are grouped into columns by `group` (class of system),\n * stacked within the column; edges are drawn as SVG bezier curves between node\n * centres. Clicking a node highlights its incident edges and selects it (the\n * parent renders an inspector). No external graph lib — pure SVG + tokens.\n *\n * Data is REAL: the parent feeds nodes from `adaListResources` and edges from\n * `adaListTopologyEdges`.\n */\nimport { useMemo, type FC } from 'react';\n\nexport interface TopologyNode {\n id: string;\n label: string;\n /** Column grouping label, e.g. \"Public Cloud\", \"Kubernetes\", \"Edge / IoT\". */\n group: string;\n type?: string;\n /** Resource state — drives the node accent (DRIFTED → warning, ORPHANED → error, else default). */\n state?: string;\n}\n\nexport interface TopologyEdge {\n id: string;\n from: string;\n to: string;\n kind?: string;\n /** Optional: mark an edge as drifted to render it amber. */\n drifted?: boolean;\n}\n\nconst NODE_W = 168;\nconst NODE_H = 44;\nconst COL_GAP = 120;\nconst ROW_GAP = 26;\nconst PAD = 28;\n\ninterface TopologyGraphProps {\n nodes: TopologyNode[];\n edges: TopologyEdge[];\n selectedId?: string | null;\n onSelect?: (id: string) => void;\n}\n\nexport const TopologyGraph: FC<TopologyGraphProps> = ({ nodes, edges, selectedId, onSelect }) => {\n const { positioned, width, height, edgePaths } = useMemo(() => {\n // group → ordered nodes\n const groups = new Map<string, TopologyNode[]>();\n for (const n of nodes) {\n const g = groups.get(n.group) ?? [];\n g.push(n);\n groups.set(n.group, g);\n }\n const groupNames = [...groups.keys()];\n const maxCol = Math.max(1, ...[...groups.values()].map((g) => g.length));\n\n const pos = new Map<string, { x: number; y: number; node: TopologyNode }>();\n groupNames.forEach((name, ci) => {\n const colNodes = groups.get(name)!;\n const colHeight = colNodes.length * NODE_H + (colNodes.length - 1) * ROW_GAP;\n const fullHeight = maxCol * NODE_H + (maxCol - 1) * ROW_GAP;\n const yStart = PAD + (fullHeight - colHeight) / 2;\n colNodes.forEach((node, ri) => {\n pos.set(node.id, {\n x: PAD + ci * (NODE_W + COL_GAP),\n y: yStart + ri * (NODE_H + ROW_GAP),\n node,\n });\n });\n });\n\n const w = PAD * 2 + groupNames.length * NODE_W + Math.max(0, groupNames.length - 1) * COL_GAP;\n const h = PAD * 2 + maxCol * NODE_H + Math.max(0, maxCol - 1) * ROW_GAP;\n\n const paths = edges\n .map((e) => {\n const a = pos.get(e.from);\n const b = pos.get(e.to);\n if (!a || !b) return null;\n const x1 = a.x + NODE_W;\n const y1 = a.y + NODE_H / 2;\n const x2 = b.x;\n const y2 = b.y + NODE_H / 2;\n const mx = (x1 + x2) / 2;\n const d = `M${x1},${y1} C${mx},${y1} ${mx},${y2} ${x2},${y2}`;\n return { ...e, d };\n })\n .filter(Boolean) as (TopologyEdge & { d: string })[];\n\n return { positioned: [...pos.values()], width: w, height: h, edgePaths: paths };\n }, [nodes, edges]);\n\n const incident = useMemo(() => {\n if (!selectedId) return new Set<string>();\n return new Set(edgePaths.filter((e) => e.from === selectedId || e.to === selectedId).map((e) => e.id));\n }, [selectedId, edgePaths]);\n\n const stateAccent = (state?: string) =>\n state === 'DRIFTED'\n ? 'border-status-warning-text/60'\n : state === 'ORPHANED' || state === 'DELETED'\n ? 'border-status-error-text/60'\n : 'border-border-strong';\n\n return (\n <div className=\"relative w-full overflow-auto rounded-xl border border-border-subtle bg-bg-sunken/40\">\n <div className=\"relative\" style={{ width, height, minWidth: '100%' }}>\n <svg className=\"absolute inset-0 h-full w-full\" width={width} height={height} aria-hidden>\n {edgePaths.map((e) => {\n const active = incident.has(e.id);\n const cls = e.drifted\n ? 'stroke-status-warning-text'\n : active\n ? 'stroke-accent-blue'\n : 'stroke-border-strong';\n return (\n <path\n key={e.id}\n d={e.d}\n fill=\"none\"\n className={cls}\n strokeWidth={active ? 2 : 1.25}\n strokeOpacity={selectedId && !active && !e.drifted ? 0.35 : 0.9}\n />\n );\n })}\n </svg>\n\n {positioned.map(({ x, y, node }) => {\n const selected = node.id === selectedId;\n return (\n <button\n key={node.id}\n type=\"button\"\n onClick={() => onSelect?.(node.id)}\n style={{ left: x, top: y, width: NODE_W, height: NODE_H }}\n className={`absolute flex items-center gap-2 rounded-lg border bg-bg-surface/90 px-3 text-left backdrop-blur transition-all focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-[var(--color-focus-ring)] ${\n selected ? 'border-accent-blue ring-2 ring-accent-blue/40' : stateAccent(node.state)\n }`}\n title={node.type ? `${node.label} · ${node.type}` : node.label}\n >\n <span\n className={`h-2 w-2 shrink-0 rounded-full ${\n node.state === 'DRIFTED'\n ? 'bg-status-warning-text'\n : node.state === 'ORPHANED' || node.state === 'DELETED'\n ? 'bg-status-error-text'\n : 'bg-status-success-text'\n }`}\n aria-hidden\n />\n <span className=\"min-w-0 flex-1\">\n <span className=\"block truncate text-sm font-medium text-text-primary\">{node.label}</span>\n {node.type && (\n <span className=\"block truncate font-mono text-[10px] text-text-secondary\">{node.type}</span>\n )}\n </span>\n </button>\n );\n })}\n </div>\n </div>\n );\n};\n"],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import "./StackedBar.js";
2
+ import "./BarChart.js";
3
+ import "./Sparkline.js";
4
+ import "./TopologyGraph.js";
@@ -77,6 +77,11 @@ var s = {
77
77
  ...s.all,
78
78
  "sync-run",
79
79
  e
80
+ ],
81
+ topology: (e) => [
82
+ ...s.all,
83
+ "topology",
84
+ e
80
85
  ]
81
86
  }, c = async (e, t, n) => {
82
87
  let r = await a({
@@ -89,23 +94,24 @@ var s = {
89
94
  if (r.errors?.length) throw Error(r.errors[0]?.message ?? "GraphQL request failed");
90
95
  if (!r.data) throw Error("GraphQL response did not include data");
91
96
  return /^\s*mutation\b/.test(e) && o(), r.data;
92
- }, l = 30 * 1e3, u = "\n id name slug kind status vendor version description capabilities tags\n configSchema workspaceId createdAt updatedAt\n", d = "\n id name adapterId authMethod status environment region resourceCount\n secretRef targetRef config tags lastError lastSyncedAt workspaceId createdAt updatedAt\n", f = "\n id connectionId externalId resourceType name region state monthlyCost\n providerTags attributes tags lastSeenAt workspaceId createdAt updatedAt\n", p = "\n id name description kind enforcement severity expression appliesTo isActive\n tags workspaceId createdAt updatedAt\n", m = "\n id policyId resourceId message status severity evidence waiverReason\n detectedAt resolvedAt resolvedById workspaceId createdAt updatedAt\n", h = "\n id resourceId attributePath expectedValue observedValue severity status\n detectedAt remediatedAt workspaceId createdAt updatedAt\n", g = "\n id connectionId kind status discoveredCount reconciledCount driftCount\n violationCount error summary startedAt finishedAt workspaceId createdAt updatedAt\n", _ = (t = {}) => {
97
+ }, l = 30 * 1e3, u = "\n id name slug kind status vendor version description capabilities tags\n configSchema workspaceId createdAt updatedAt\n", d = "\n id name adapterId authMethod status environment region resourceCount\n secretRef targetRef config tags lastError lastSyncedAt workspaceId createdAt updatedAt\n", f = "\n id connectionId externalId resourceType name region state monthlyCost\n providerTags attributes tags lastSeenAt workspaceId createdAt updatedAt\n", p = "\n id name description kind enforcement severity expression appliesTo isActive\n tags workspaceId createdAt updatedAt\n", m = "\n id policyId resourceId message status severity evidence waiverReason\n detectedAt resolvedAt resolvedById workspaceId createdAt updatedAt\n", h = "\n id resourceId attributePath expectedValue observedValue severity status\n detectedAt remediatedAt workspaceId createdAt updatedAt\n", g = "\n id connectionId kind status discoveredCount reconciledCount driftCount\n violationCount error summary startedAt finishedAt workspaceId createdAt updatedAt\n", _ = "cursor hasMore totalCount", v = (t = {}) => {
93
98
  let { apiGatewayUrl: n } = e();
94
99
  return r({
95
100
  queryKey: s.adapters(t),
96
101
  queryFn: async () => (await c(`query AdaListAdapters($kind: AdaAdapterKind, $status: AdaAdapterStatus, $pagination: PaginationInput) {
97
102
  adaListAdapters(kind: $kind, status: $status, pagination: $pagination) {
98
103
  items { ${u} }
99
- pageInfo { cursor hasMore }
104
+ pageInfo { ${_} }
100
105
  }
101
106
  }`, {
102
107
  kind: t.kind,
103
108
  status: t.status,
104
109
  pagination: t.pagination
105
110
  }, n)).adaListAdapters,
111
+ placeholderData: (e) => e,
106
112
  staleTime: l
107
113
  });
108
- }, v = (t) => {
114
+ }, y = (t) => {
109
115
  let { apiGatewayUrl: n } = e();
110
116
  return r({
111
117
  queryKey: s.adapter(t ?? ""),
@@ -118,7 +124,7 @@ var s = {
118
124
  enabled: !!t,
119
125
  staleTime: l
120
126
  });
121
- }, y = () => {
127
+ }, b = () => {
122
128
  let t = i(), { apiGatewayUrl: r } = e();
123
129
  return n({
124
130
  mutationFn: async (e) => (await c(`mutation AdaCreateAdapter($input: AdaCreateAdapterInput!) {
@@ -128,7 +134,7 @@ var s = {
128
134
  t.invalidateQueries({ queryKey: [...s.all, "adapters"] });
129
135
  }
130
136
  });
131
- }, b = () => {
137
+ }, x = () => {
132
138
  let t = i(), { apiGatewayUrl: r } = e();
133
139
  return n({
134
140
  mutationFn: async ({ id: e, input: t }) => (await c(`mutation AdaUpdateAdapter($id: ID!, $input: AdaUpdateAdapterInput!) {
@@ -141,7 +147,7 @@ var s = {
141
147
  t.invalidateQueries({ queryKey: [...s.all, "adapters"] }), t.invalidateQueries({ queryKey: s.adapter(e.id) });
142
148
  }
143
149
  });
144
- }, x = () => {
150
+ }, S = () => {
145
151
  let t = i(), { apiGatewayUrl: r } = e();
146
152
  return n({
147
153
  mutationFn: async (e) => (await c("mutation AdaArchiveAdapter($id: ID!) { adaArchiveAdapter(id: $id) }", { id: e }, r)).adaArchiveAdapter,
@@ -149,7 +155,7 @@ var s = {
149
155
  t.invalidateQueries({ queryKey: [...s.all, "adapters"] });
150
156
  }
151
157
  });
152
- }, S = (t = {}) => {
158
+ }, C = (t = {}) => {
153
159
  let { apiGatewayUrl: n } = e();
154
160
  return r({
155
161
  queryKey: s.connections(t),
@@ -159,16 +165,17 @@ var s = {
159
165
  ${d}
160
166
  adapter { id name slug kind }
161
167
  }
162
- pageInfo { cursor hasMore }
168
+ pageInfo { ${_} }
163
169
  }
164
170
  }`, {
165
171
  adapterId: t.adapterId,
166
172
  status: t.status,
167
173
  pagination: t.pagination
168
174
  }, n)).adaListConnections,
175
+ placeholderData: (e) => e,
169
176
  staleTime: l
170
177
  });
171
- }, C = (t) => {
178
+ }, w = (t) => {
172
179
  let { apiGatewayUrl: n } = e();
173
180
  return r({
174
181
  queryKey: s.connection(t ?? ""),
@@ -182,7 +189,7 @@ var s = {
182
189
  enabled: !!t,
183
190
  staleTime: l
184
191
  });
185
- }, w = () => {
192
+ }, T = () => {
186
193
  let t = i(), { apiGatewayUrl: r } = e();
187
194
  return n({
188
195
  mutationFn: async (e) => (await c(`mutation AdaCreateConnection($input: AdaCreateConnectionInput!) {
@@ -192,7 +199,7 @@ var s = {
192
199
  t.invalidateQueries({ queryKey: [...s.all, "connections"] });
193
200
  }
194
201
  });
195
- }, T = () => {
202
+ }, E = () => {
196
203
  let t = i(), { apiGatewayUrl: r } = e();
197
204
  return n({
198
205
  mutationFn: async ({ id: e, input: t }) => (await c(`mutation AdaUpdateConnection($id: ID!, $input: AdaUpdateConnectionInput!) {
@@ -205,7 +212,7 @@ var s = {
205
212
  t.invalidateQueries({ queryKey: [...s.all, "connections"] }), t.invalidateQueries({ queryKey: s.connection(e.id) });
206
213
  }
207
214
  });
208
- }, E = () => {
215
+ }, D = () => {
209
216
  let r = i(), { apiGatewayUrl: a } = e();
210
217
  return n({
211
218
  mutationFn: async ({ id: e, status: t }) => (await c(`mutation AdaSetConnectionStatus($id: ID!, $status: AdaConnectionStatus!) {
@@ -218,7 +225,7 @@ var s = {
218
225
  t.success("Connection health updated"), r.invalidateQueries({ queryKey: [...s.all, "connections"] }), r.invalidateQueries({ queryKey: s.connection(e.id) });
219
226
  }
220
227
  });
221
- }, D = () => {
228
+ }, O = () => {
222
229
  let r = i(), { apiGatewayUrl: a } = e();
223
230
  return n({
224
231
  mutationFn: async (e) => (await c(`mutation AdaDisableConnection($id: ID!) {
@@ -228,7 +235,7 @@ var s = {
228
235
  t.success("Connection disabled"), r.invalidateQueries({ queryKey: [...s.all, "connections"] }), r.invalidateQueries({ queryKey: s.connection(e.id) });
229
236
  }
230
237
  });
231
- }, O = (t = {}) => {
238
+ }, k = (t = {}) => {
232
239
  let { apiGatewayUrl: n } = e();
233
240
  return r({
234
241
  queryKey: s.resources(t),
@@ -238,7 +245,7 @@ var s = {
238
245
  ${f}
239
246
  connection { id name }
240
247
  }
241
- pageInfo { cursor hasMore }
248
+ pageInfo { ${_} }
242
249
  }
243
250
  }`, {
244
251
  connectionId: t.connectionId,
@@ -246,9 +253,10 @@ var s = {
246
253
  state: t.state,
247
254
  pagination: t.pagination
248
255
  }, n)).adaListResources,
256
+ placeholderData: (e) => e,
249
257
  staleTime: l
250
258
  });
251
- }, k = (t) => {
259
+ }, A = (t) => {
252
260
  let { apiGatewayUrl: n } = e();
253
261
  return r({
254
262
  queryKey: s.resource(t ?? ""),
@@ -262,7 +270,7 @@ var s = {
262
270
  enabled: !!t,
263
271
  staleTime: l
264
272
  });
265
- }, A = (t = {}) => {
273
+ }, j = (t = {}) => {
266
274
  let { apiGatewayUrl: n } = e();
267
275
  return r({
268
276
  queryKey: s.policies(t),
@@ -276,9 +284,10 @@ var s = {
276
284
  kind: t.kind,
277
285
  pagination: t.pagination
278
286
  }, n)).adaListPolicies,
287
+ placeholderData: (e) => e,
279
288
  staleTime: l
280
289
  });
281
- }, j = (t) => {
290
+ }, M = (t) => {
282
291
  let { apiGatewayUrl: n } = e();
283
292
  return r({
284
293
  queryKey: s.policy(t ?? ""),
@@ -291,7 +300,7 @@ var s = {
291
300
  enabled: !!t,
292
301
  staleTime: l
293
302
  });
294
- }, M = () => {
303
+ }, N = () => {
295
304
  let t = i(), { apiGatewayUrl: r } = e();
296
305
  return n({
297
306
  mutationFn: async (e) => (await c(`mutation AdaCreatePolicy($input: AdaCreatePolicyInput!) {
@@ -301,7 +310,20 @@ var s = {
301
310
  t.invalidateQueries({ queryKey: [...s.all, "policies"] });
302
311
  }
303
312
  });
304
- }, N = () => {
313
+ }, P = () => {
314
+ let r = i(), { apiGatewayUrl: a } = e();
315
+ return n({
316
+ mutationFn: async ({ id: e, input: t }) => (await c(`mutation AdaUpdatePolicy($id: ID!, $input: AdaUpdatePolicyInput!) {
317
+ adaUpdatePolicy(id: $id, input: $input) { ${p} }
318
+ }`, {
319
+ id: e,
320
+ input: t
321
+ }, a)).adaUpdatePolicy,
322
+ onSuccess: (e) => {
323
+ t.success("Policy updated"), r.invalidateQueries({ queryKey: [...s.all, "policies"] }), r.invalidateQueries({ queryKey: s.policy(e.id) });
324
+ }
325
+ });
326
+ }, F = () => {
305
327
  let t = i(), { apiGatewayUrl: r } = e();
306
328
  return n({
307
329
  mutationFn: async (e) => (await c("mutation AdaArchivePolicy($id: ID!) { adaArchivePolicy(id: $id) }", { id: e }, r)).adaArchivePolicy,
@@ -309,7 +331,7 @@ var s = {
309
331
  t.invalidateQueries({ queryKey: [...s.all, "policies"] });
310
332
  }
311
333
  });
312
- }, P = (t = {}) => {
334
+ }, I = (t = {}) => {
313
335
  let { apiGatewayUrl: n } = e();
314
336
  return r({
315
337
  queryKey: s.violations(t),
@@ -319,7 +341,7 @@ var s = {
319
341
  ${m}
320
342
  policy { id name kind severity }
321
343
  }
322
- pageInfo { cursor hasMore }
344
+ pageInfo { ${_} }
323
345
  }
324
346
  }`, {
325
347
  policyId: t.policyId,
@@ -327,9 +349,10 @@ var s = {
327
349
  status: t.status,
328
350
  pagination: t.pagination
329
351
  }, n)).adaListViolations,
352
+ placeholderData: (e) => e,
330
353
  staleTime: l
331
354
  });
332
- }, F = () => {
355
+ }, L = () => {
333
356
  let r = i(), { apiGatewayUrl: a } = e();
334
357
  return n({
335
358
  mutationFn: async ({ id: e, status: t, waiverReason: n }) => (await c(`mutation AdaResolveViolation($id: ID!, $status: AdaViolationStatus!, $waiverReason: String) {
@@ -350,7 +373,7 @@ var s = {
350
373
  }[e.status] ?? "Violation updated"), r.invalidateQueries({ queryKey: [...s.all, "violations"] });
351
374
  }
352
375
  });
353
- }, I = (t = {}) => {
376
+ }, R = (t = {}) => {
354
377
  let { apiGatewayUrl: n } = e();
355
378
  return r({
356
379
  queryKey: s.drift(t),
@@ -362,7 +385,7 @@ var s = {
362
385
  }, n)).adaListDriftRecords,
363
386
  staleTime: l
364
387
  });
365
- }, L = () => {
388
+ }, z = () => {
366
389
  let r = i(), { apiGatewayUrl: a } = e();
367
390
  return n({
368
391
  mutationFn: async (e) => (await c(`mutation AdaRemediateDrift($id: ID!) {
@@ -372,23 +395,27 @@ var s = {
372
395
  t.success("Drift marked remediated"), r.invalidateQueries({ queryKey: [...s.all, "drift"] }), r.invalidateQueries({ queryKey: [...s.all, "resources"] });
373
396
  }
374
397
  });
375
- }, R = (t = {}) => {
398
+ }, B = (t = {}) => {
376
399
  let { apiGatewayUrl: n } = e();
377
400
  return r({
378
401
  queryKey: s.syncRuns(t),
379
402
  queryFn: async () => (await c(`query AdaListSyncRuns($connectionId: ID, $status: AdaSyncStatus, $pagination: PaginationInput) {
380
403
  adaListSyncRuns(connectionId: $connectionId, status: $status, pagination: $pagination) {
381
- items { ${g} }
382
- pageInfo { cursor hasMore }
404
+ items {
405
+ ${g}
406
+ connection { id name adapter { id kind } }
407
+ }
408
+ pageInfo { ${_} }
383
409
  }
384
410
  }`, {
385
411
  connectionId: t.connectionId,
386
412
  status: t.status,
387
413
  pagination: t.pagination
388
414
  }, n)).adaListSyncRuns,
415
+ placeholderData: (e) => e,
389
416
  staleTime: l
390
417
  });
391
- }, z = () => {
418
+ }, V = () => {
392
419
  let r = i(), { apiGatewayUrl: a } = e();
393
420
  return n({
394
421
  mutationFn: async (e) => (await c(`mutation AdaStartSyncRun($input: AdaStartSyncRunInput!) {
@@ -398,7 +425,7 @@ var s = {
398
425
  t.success("Sync run started"), r.invalidateQueries({ queryKey: [...s.all, "sync-runs"] }), r.invalidateQueries({ queryKey: [...s.all, "connections"] });
399
426
  }
400
427
  });
401
- }, B = () => {
428
+ }, H = () => {
402
429
  let r = i(), { apiGatewayUrl: a } = e();
403
430
  return n({
404
431
  mutationFn: async (e) => (await c(`mutation AdaCancelSyncRun($id: ID!) {
@@ -408,26 +435,36 @@ var s = {
408
435
  t.success("Sync run cancelled"), r.invalidateQueries({ queryKey: [...s.all, "sync-runs"] });
409
436
  }
410
437
  });
411
- }, V = (t) => {
438
+ }, U = (t) => {
412
439
  let { apiGatewayUrl: n } = e();
413
440
  return r({
414
441
  queryKey: s.costSummary(t),
415
442
  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,
416
443
  staleTime: l
417
444
  });
418
- }, H = (t = {}) => {
445
+ }, W = (t = {}) => {
419
446
  let { apiGatewayUrl: n } = e();
420
447
  return r({
421
448
  queryKey: s.costRecords(t),
422
- queryFn: async () => (await c("query AdaListCostRecords($connectionId: ID, $resourceId: ID, $service: String) {\n adaListCostRecords(connectionId: $connectionId, resourceId: $resourceId, service: $service) {\n id service amount currency periodStart periodEnd breakdown\n connectionId resourceId workspaceId createdAt updatedAt\n }\n }", {
449
+ queryFn: async () => (await c("query AdaListCostRecords($connectionId: ID, $resourceId: ID, $service: String) {\n adaListCostRecords(connectionId: $connectionId, resourceId: $resourceId, service: $service) {\n id service amount currency periodStart periodEnd breakdown\n connectionId resourceId workspaceId createdAt updatedAt\n resource { id name }\n connection { id name }\n }\n }", {
423
450
  connectionId: t.connectionId,
424
451
  resourceId: t.resourceId,
425
452
  service: t.service
426
453
  }, n)).adaListCostRecords,
427
454
  staleTime: l
428
455
  });
456
+ }, G = (t = {}) => {
457
+ let { apiGatewayUrl: n } = e();
458
+ return r({
459
+ queryKey: s.topology(t),
460
+ queryFn: async () => (await c("query AdaListTopologyEdges($resourceId: ID, $kind: AdaEdgeKind) {\n adaListTopologyEdges(resourceId: $resourceId, kind: $kind) {\n id fromResourceId toResourceId kind bidirectional weight workspaceId createdAt updatedAt\n }\n }", {
461
+ resourceId: t.resourceId,
462
+ kind: t.kind
463
+ }, n)).adaListTopologyEdges,
464
+ staleTime: l
465
+ });
429
466
  };
430
467
  //#endregion
431
- export { v as useAdapter, _ as useAdapters, x as useArchiveAdapter, N as useArchivePolicy, B as useCancelSyncRun, C as useConnection, S as useConnections, H as useCostRecords, V as useCostSummary, y as useCreateAdapter, w as useCreateConnection, M as useCreatePolicy, D as useDisableConnection, I as useDriftRecords, A as usePolicies, j as usePolicy, L as useRemediateDrift, F as useResolveViolation, k as useResource, O as useResources, E as useSetConnectionStatus, z as useStartSyncRun, R as useSyncRuns, b as useUpdateAdapter, T as useUpdateConnection, P as useViolations };
468
+ export { y as useAdapter, v as useAdapters, S as useArchiveAdapter, F as useArchivePolicy, H as useCancelSyncRun, w as useConnection, C as useConnections, W 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, G as useTopology, x as useUpdateAdapter, E as useUpdateConnection, P as useUpdatePolicy, I as useViolations };
432
469
 
433
470
  //# 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 AdaDriftStatus,\n AdaPolicy,\n AdaPolicyKind,\n AdaPolicyPage,\n AdaPolicyViolation,\n AdaPolicyViolationPage,\n AdaResource,\n AdaResourcePage,\n AdaResourceState,\n AdaSyncRun,\n AdaSyncRunPage,\n AdaSyncStatus,\n AdaViolationStatus,\n PaginationInput,\n AdaCreateAdapterInput,\n AdaUpdateAdapterInput,\n AdaCreateConnectionInput,\n AdaUpdateConnectionInput,\n AdaCreatePolicyInput,\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};\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// ============================================================================\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 { cursor hasMore }\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 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 { cursor hasMore }\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 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 { cursor hasMore }\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 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 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 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 { cursor hasMore }\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 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 const result = await adaQuery<{ adaListDriftRecords: AdaDriftRecord[] }>(\n `query AdaListDriftRecords($resourceId: ID, $status: AdaDriftStatus) {\n adaListDriftRecords(resourceId: $resourceId, status: $status) { ${DRIFT_FIELDS} }\n }`,\n { resourceId: filter.resourceId, status: filter.status },\n apiGatewayUrl\n );\n return result.adaListDriftRecords;\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 { ${SYNC_RUN_FIELDS} }\n pageInfo { cursor hasMore }\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 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 useCostRecords = (filter: CostRecordListFilter = {}) => {\n const { apiGatewayUrl } = useAdapterCloud();\n return useQuery({\n queryKey: adaKeys.costRecords(filter as Record<string, unknown>),\n queryFn: async () => {\n const result = await adaQuery<{ adaListCostRecords: AdaCostRecord[] }>(\n `query AdaListCostRecords($connectionId: ID, $resourceId: ID, $service: String) {\n adaListCostRecords(connectionId: $connectionId, resourceId: $resourceId, service: $service) {\n id service amount currency periodStart periodEnd breakdown\n connectionId resourceId workspaceId createdAt updatedAt\n }\n }`,\n {\n connectionId: filter.connectionId,\n resourceId: filter.resourceId,\n service: filter.service,\n },\n apiGatewayUrl\n );\n return result.adaListCostRecords;\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 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};\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 const result = await adaQuery<{ adaListDriftRecords: AdaDriftRecord[] }>(\n `query AdaListDriftRecords($resourceId: ID, $status: AdaDriftStatus) {\n adaListDriftRecords(resourceId: $resourceId, status: $status) { ${DRIFT_FIELDS} }\n }`,\n { resourceId: filter.resourceId, status: filter.status },\n apiGatewayUrl\n );\n return result.adaListDriftRecords;\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 useCostRecords = (filter: CostRecordListFilter = {}) => {\n const { apiGatewayUrl } = useAdapterCloud();\n return useQuery({\n queryKey: adaKeys.costRecords(filter as Record<string, unknown>),\n queryFn: async () => {\n const result = await adaQuery<{ adaListCostRecords: AdaCostRecord[] }>(\n `query AdaListCostRecords($connectionId: ID, $resourceId: ID, $service: String) {\n adaListCostRecords(connectionId: $connectionId, resourceId: $resourceId, service: $service) {\n id service amount currency periodStart periodEnd breakdown\n connectionId resourceId workspaceId createdAt updatedAt\n resource { id name }\n connection { id name }\n }\n }`,\n {\n connectionId: filter.connectionId,\n resourceId: filter.resourceId,\n service: filter.service,\n },\n apiGatewayUrl\n );\n return result.adaListCostRecords;\n },\n staleTime: STALE,\n });\n};\n\n// ============================================================================\n// Topology\n// ============================================================================\n\nexport interface TopologyFilter {\n resourceId?: string;\n kind?: AdaEdgeKind;\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 result = await adaQuery<{ adaListTopologyEdges: AdaTopologyEdge[] }>(\n `query AdaListTopologyEdges($resourceId: ID, $kind: AdaEdgeKind) {\n adaListTopologyEdges(resourceId: $resourceId, kind: $kind) {\n id fromResourceId toResourceId kind bidirectional weight workspaceId createdAt updatedAt\n }\n }`,\n { resourceId: filter.resourceId, kind: filter.kind },\n apiGatewayUrl\n );\n return result.adaListTopologyEdges;\n },\n staleTime: STALE,\n });\n};\n"],"mappings":"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"}