@burdenoff/microfe-adaptercloud 2026.720.1 → 2026.801.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 (28) hide show
  1. package/dist/adaptercloud/AdapterCloudRoutes.js +1 -1
  2. package/dist/adaptercloud/AdapterCloudRoutes.js.map +1 -1
  3. package/dist/adaptercloud/context/AdapterCloudContext.js +1 -1
  4. package/dist/adaptercloud/context/AdapterCloudContext.js.map +1 -1
  5. package/dist/adaptercloud/hooks/useAdapterCloudApi.d.ts.map +1 -1
  6. package/dist/adaptercloud/hooks/useAdapterCloudApi.js +8 -4
  7. package/dist/adaptercloud/hooks/useAdapterCloudApi.js.map +1 -1
  8. package/dist/adaptercloud/pages/adapters/AdapterDetailPage.js +1 -1
  9. package/dist/adaptercloud/pages/adapters/AdapterDetailPage.js.map +1 -1
  10. package/dist/adaptercloud/pages/adapters/AdapterFormPage.js +1 -1
  11. package/dist/adaptercloud/pages/adapters/AdapterFormPage.js.map +1 -1
  12. package/dist/adaptercloud/pages/connections/ConnectionDetailPage.js +1 -1
  13. package/dist/adaptercloud/pages/connections/ConnectionDetailPage.js.map +1 -1
  14. package/dist/adaptercloud/pages/connections/ConnectionFormPage.js +1 -1
  15. package/dist/adaptercloud/pages/connections/ConnectionFormPage.js.map +1 -1
  16. package/dist/adaptercloud/pages/policies/PolicyDetailPage.js +1 -1
  17. package/dist/adaptercloud/pages/policies/PolicyDetailPage.js.map +1 -1
  18. package/dist/adaptercloud/pages/policies/PolicyFormPage.js +1 -1
  19. package/dist/adaptercloud/pages/policies/PolicyFormPage.js.map +1 -1
  20. package/dist/adaptercloud/pages/resources/ResourceDetailPage.js +1 -1
  21. package/dist/adaptercloud/pages/resources/ResourceDetailPage.js.map +1 -1
  22. package/dist/adaptercloud/pages/resources/ResourcesListPage.js +1 -1
  23. package/dist/adaptercloud/pages/resources/ResourcesListPage.js.map +1 -1
  24. package/dist/adaptercloud/pages/violations/ViolationsListPage.js +1 -1
  25. package/dist/adaptercloud/pages/violations/ViolationsListPage.js.map +1 -1
  26. package/dist/adaptercloud/types/index.d.ts +4 -0
  27. package/dist/adaptercloud/types/index.d.ts.map +1 -1
  28. package/package.json +7 -7
@@ -1,7 +1,7 @@
1
1
  import { useAdapterCloud as e } from "./context/AdapterCloudContext.js";
2
2
  import { OverviewPage as t } from "./pages/OverviewPage.js";
3
3
  import { Suspense as n, lazy as r } from "react";
4
- import { Navigate as i, Route as a, Routes as o, useLocation as s } from "react-router-dom";
4
+ import { Navigate as i, Route as a, Routes as o, useLocation as s } from "react-router";
5
5
  import { jsx as c, jsxs as l } from "react/jsx-runtime";
6
6
  //#region src/adaptercloud/AdapterCloudRoutes.tsx
7
7
  var u = r(() => import("./pages/adapters/AdaptersListPage.js").then((e) => ({ default: e.AdaptersListPage }))), d = r(() => import("./pages/adapters/AdapterDetailPage.js").then((e) => ({ default: e.AdapterDetailPage }))), f = r(() => import("./pages/adapters/AdapterFormPage.js").then((e) => ({ default: e.AdapterFormPage }))), p = r(() => import("./pages/connections/ConnectionsListPage.js").then((e) => ({ default: e.ConnectionsListPage }))), m = r(() => import("./pages/connections/ConnectionDetailPage.js").then((e) => ({ default: e.ConnectionDetailPage }))), h = r(() => import("./pages/connections/ConnectionFormPage.js").then((e) => ({ default: e.ConnectionFormPage }))), g = r(() => import("./pages/resources/ResourcesListPage.js").then((e) => ({ default: e.ResourcesListPage }))), _ = r(() => import("./pages/resources/ResourceDetailPage.js").then((e) => ({ default: e.ResourceDetailPage }))), v = r(() => import("./pages/topology/TopologyPage.js").then((e) => ({ default: e.TopologyPage }))), y = r(() => import("./pages/policies/PoliciesListPage.js").then((e) => ({ default: e.PoliciesListPage }))), b = r(() => import("./pages/policies/PolicyDetailPage.js").then((e) => ({ default: e.PolicyDetailPage }))), x = r(() => import("./pages/policies/PolicyFormPage.js").then((e) => ({ default: e.PolicyFormPage }))), S = r(() => import("./pages/violations/ViolationsListPage.js").then((e) => ({ default: e.ViolationsListPage }))), C = r(() => import("./pages/drift/DriftListPage.js").then((e) => ({ default: e.DriftListPage }))), w = r(() => import("./pages/sync-runs/SyncRunsListPage.js").then((e) => ({ default: e.SyncRunsListPage }))), T = r(() => import("./pages/costs/CostsPage.js").then((e) => ({ default: e.CostsPage }))), E = () => /* @__PURE__ */ c("div", {
@@ -1 +1 @@
1
- {"version":3,"file":"AdapterCloudRoutes.js","names":[],"sources":["../../src/adaptercloud/AdapterCloudRoutes.tsx"],"sourcesContent":["/**\n * AdapterCloud Routes\n * @module adaptercloud\n *\n * Domain routing for the AdapterCloud (InfraVerse) control plane: an overview\n * landing page plus fabric (adapters / connections / resources), governance\n * (policies / violations / drift) and operations (sync runs / FinOps).\n */\n\nimport { type FC, lazy, Suspense } from 'react';\nimport { Routes, Route, Navigate, useLocation } from 'react-router-dom';\nimport { useAdapterCloud } from './context/AdapterCloudContext';\n\n// Eager — overview landing page\nimport { OverviewPage } from './pages/OverviewPage';\n\n// Fabric — adapters\nconst AdaptersListPage = lazy(() =>\n import('./pages/adapters/AdaptersListPage').then((m) => ({ default: m.AdaptersListPage }))\n);\nconst AdapterDetailPage = lazy(() =>\n import('./pages/adapters/AdapterDetailPage').then((m) => ({ default: m.AdapterDetailPage }))\n);\nconst AdapterFormPage = lazy(() =>\n import('./pages/adapters/AdapterFormPage').then((m) => ({ default: m.AdapterFormPage }))\n);\n\n// Fabric — connections\nconst ConnectionsListPage = lazy(() =>\n import('./pages/connections/ConnectionsListPage').then((m) => ({\n default: m.ConnectionsListPage,\n }))\n);\nconst ConnectionDetailPage = lazy(() =>\n import('./pages/connections/ConnectionDetailPage').then((m) => ({\n default: m.ConnectionDetailPage,\n }))\n);\nconst ConnectionFormPage = lazy(() =>\n import('./pages/connections/ConnectionFormPage').then((m) => ({\n default: m.ConnectionFormPage,\n }))\n);\n\n// Fabric — resources\nconst ResourcesListPage = lazy(() =>\n import('./pages/resources/ResourcesListPage').then((m) => ({ default: m.ResourcesListPage }))\n);\nconst ResourceDetailPage = lazy(() =>\n import('./pages/resources/ResourceDetailPage').then((m) => ({ default: m.ResourceDetailPage }))\n);\n\n// Fabric — estate topology (dependency graph)\nconst TopologyPage = lazy(() =>\n import('./pages/topology/TopologyPage').then((m) => ({ default: m.TopologyPage }))\n);\n\n// Governance — policies\nconst PoliciesListPage = lazy(() =>\n import('./pages/policies/PoliciesListPage').then((m) => ({ default: m.PoliciesListPage }))\n);\nconst PolicyDetailPage = lazy(() =>\n import('./pages/policies/PolicyDetailPage').then((m) => ({ default: m.PolicyDetailPage }))\n);\nconst PolicyFormPage = lazy(() =>\n import('./pages/policies/PolicyFormPage').then((m) => ({ default: m.PolicyFormPage }))\n);\n\n// Governance — violations & drift\nconst ViolationsListPage = lazy(() =>\n import('./pages/violations/ViolationsListPage').then((m) => ({ default: m.ViolationsListPage }))\n);\nconst DriftListPage = lazy(() =>\n import('./pages/drift/DriftListPage').then((m) => ({ default: m.DriftListPage }))\n);\n\n// Operations — sync runs & costs\nconst SyncRunsListPage = lazy(() =>\n import('./pages/sync-runs/SyncRunsListPage').then((m) => ({ default: m.SyncRunsListPage }))\n);\nconst CostsPage = lazy(() =>\n import('./pages/costs/CostsPage').then((m) => ({ default: m.CostsPage }))\n);\n\n// Loading fallback component\nconst PageLoader: FC = () => (\n <div className=\"flex min-h-[400px] items-center justify-center\">\n <div className=\"h-8 w-8 animate-spin rounded-full border-b-2 border-accent-blue\" />\n </div>\n);\n\nexport const AdapterCloudRoutes: FC = () => {\n const { basePath, isStandalone } = useAdapterCloud();\n const location = useLocation();\n\n // Normalize base path\n const normalizedBasePath = basePath === '/' ? '' : (basePath ?? '').replace(/\\/$/, '');\n\n // Guard: Only render if path matches basePath (when integrated)\n if (normalizedBasePath && !isStandalone) {\n const pathMatches =\n location.pathname === normalizedBasePath ||\n location.pathname.startsWith(normalizedBasePath + '/');\n\n if (!pathMatches) {\n return null;\n }\n }\n\n return (\n <div className=\"flex min-h-full flex-col\">\n <Suspense fallback={<PageLoader />}>\n <Routes>\n {/* Overview — eager loaded */}\n <Route index element={<OverviewPage />} />\n\n {/* Adapters */}\n <Route path=\"adapters\" element={<AdaptersListPage />} />\n <Route path=\"adapters/new\" element={<AdapterFormPage />} />\n <Route path=\"adapters/:id\" element={<AdapterDetailPage />} />\n <Route path=\"adapters/:id/edit\" element={<AdapterFormPage />} />\n\n {/* Connections */}\n <Route path=\"connections\" element={<ConnectionsListPage />} />\n <Route path=\"connections/new\" element={<ConnectionFormPage />} />\n <Route path=\"connections/:id\" element={<ConnectionDetailPage />} />\n <Route path=\"connections/:id/edit\" element={<ConnectionFormPage />} />\n\n {/* Resources */}\n <Route path=\"resources\" element={<ResourcesListPage />} />\n <Route path=\"resources/:id\" element={<ResourceDetailPage />} />\n\n {/* Fabric — estate topology graph */}\n <Route path=\"topology\" element={<TopologyPage />} />\n\n {/* Policies */}\n <Route path=\"policies\" element={<PoliciesListPage />} />\n <Route path=\"policies/new\" element={<PolicyFormPage />} />\n <Route path=\"policies/:id\" element={<PolicyDetailPage />} />\n <Route path=\"policies/:id/edit\" element={<PolicyFormPage />} />\n\n {/* Governance */}\n <Route path=\"violations\" element={<ViolationsListPage />} />\n <Route path=\"drift\" element={<DriftListPage />} />\n\n {/* Operations */}\n <Route path=\"sync-runs\" element={<SyncRunsListPage />} />\n <Route path=\"costs\" element={<CostsPage />} />\n\n {/* Fallback */}\n <Route path=\"*\" element={<Navigate to=\"\" replace />} />\n </Routes>\n </Suspense>\n </div>\n );\n};\n"],"mappings":"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"}
1
+ {"version":3,"file":"AdapterCloudRoutes.js","names":[],"sources":["../../src/adaptercloud/AdapterCloudRoutes.tsx"],"sourcesContent":["/**\n * AdapterCloud Routes\n * @module adaptercloud\n *\n * Domain routing for the AdapterCloud (InfraVerse) control plane: an overview\n * landing page plus fabric (adapters / connections / resources), governance\n * (policies / violations / drift) and operations (sync runs / FinOps).\n */\n\nimport { type FC, lazy, Suspense } from 'react';\nimport { Routes, Route, Navigate, useLocation } from 'react-router';\nimport { useAdapterCloud } from './context/AdapterCloudContext';\n\n// Eager — overview landing page\nimport { OverviewPage } from './pages/OverviewPage';\n\n// Fabric — adapters\nconst AdaptersListPage = lazy(() =>\n import('./pages/adapters/AdaptersListPage').then((m) => ({ default: m.AdaptersListPage }))\n);\nconst AdapterDetailPage = lazy(() =>\n import('./pages/adapters/AdapterDetailPage').then((m) => ({ default: m.AdapterDetailPage }))\n);\nconst AdapterFormPage = lazy(() =>\n import('./pages/adapters/AdapterFormPage').then((m) => ({ default: m.AdapterFormPage }))\n);\n\n// Fabric — connections\nconst ConnectionsListPage = lazy(() =>\n import('./pages/connections/ConnectionsListPage').then((m) => ({\n default: m.ConnectionsListPage,\n }))\n);\nconst ConnectionDetailPage = lazy(() =>\n import('./pages/connections/ConnectionDetailPage').then((m) => ({\n default: m.ConnectionDetailPage,\n }))\n);\nconst ConnectionFormPage = lazy(() =>\n import('./pages/connections/ConnectionFormPage').then((m) => ({\n default: m.ConnectionFormPage,\n }))\n);\n\n// Fabric — resources\nconst ResourcesListPage = lazy(() =>\n import('./pages/resources/ResourcesListPage').then((m) => ({ default: m.ResourcesListPage }))\n);\nconst ResourceDetailPage = lazy(() =>\n import('./pages/resources/ResourceDetailPage').then((m) => ({ default: m.ResourceDetailPage }))\n);\n\n// Fabric — estate topology (dependency graph)\nconst TopologyPage = lazy(() =>\n import('./pages/topology/TopologyPage').then((m) => ({ default: m.TopologyPage }))\n);\n\n// Governance — policies\nconst PoliciesListPage = lazy(() =>\n import('./pages/policies/PoliciesListPage').then((m) => ({ default: m.PoliciesListPage }))\n);\nconst PolicyDetailPage = lazy(() =>\n import('./pages/policies/PolicyDetailPage').then((m) => ({ default: m.PolicyDetailPage }))\n);\nconst PolicyFormPage = lazy(() =>\n import('./pages/policies/PolicyFormPage').then((m) => ({ default: m.PolicyFormPage }))\n);\n\n// Governance — violations & drift\nconst ViolationsListPage = lazy(() =>\n import('./pages/violations/ViolationsListPage').then((m) => ({ default: m.ViolationsListPage }))\n);\nconst DriftListPage = lazy(() =>\n import('./pages/drift/DriftListPage').then((m) => ({ default: m.DriftListPage }))\n);\n\n// Operations — sync runs & costs\nconst SyncRunsListPage = lazy(() =>\n import('./pages/sync-runs/SyncRunsListPage').then((m) => ({ default: m.SyncRunsListPage }))\n);\nconst CostsPage = lazy(() =>\n import('./pages/costs/CostsPage').then((m) => ({ default: m.CostsPage }))\n);\n\n// Loading fallback component\nconst PageLoader: FC = () => (\n <div className=\"flex min-h-[400px] items-center justify-center\">\n <div className=\"h-8 w-8 animate-spin rounded-full border-b-2 border-accent-blue\" />\n </div>\n);\n\nexport const AdapterCloudRoutes: FC = () => {\n const { basePath, isStandalone } = useAdapterCloud();\n const location = useLocation();\n\n // Normalize base path\n const normalizedBasePath = basePath === '/' ? '' : (basePath ?? '').replace(/\\/$/, '');\n\n // Guard: Only render if path matches basePath (when integrated)\n if (normalizedBasePath && !isStandalone) {\n const pathMatches =\n location.pathname === normalizedBasePath ||\n location.pathname.startsWith(normalizedBasePath + '/');\n\n if (!pathMatches) {\n return null;\n }\n }\n\n return (\n <div className=\"flex min-h-full flex-col\">\n <Suspense fallback={<PageLoader />}>\n <Routes>\n {/* Overview — eager loaded */}\n <Route index element={<OverviewPage />} />\n\n {/* Adapters */}\n <Route path=\"adapters\" element={<AdaptersListPage />} />\n <Route path=\"adapters/new\" element={<AdapterFormPage />} />\n <Route path=\"adapters/:id\" element={<AdapterDetailPage />} />\n <Route path=\"adapters/:id/edit\" element={<AdapterFormPage />} />\n\n {/* Connections */}\n <Route path=\"connections\" element={<ConnectionsListPage />} />\n <Route path=\"connections/new\" element={<ConnectionFormPage />} />\n <Route path=\"connections/:id\" element={<ConnectionDetailPage />} />\n <Route path=\"connections/:id/edit\" element={<ConnectionFormPage />} />\n\n {/* Resources */}\n <Route path=\"resources\" element={<ResourcesListPage />} />\n <Route path=\"resources/:id\" element={<ResourceDetailPage />} />\n\n {/* Fabric — estate topology graph */}\n <Route path=\"topology\" element={<TopologyPage />} />\n\n {/* Policies */}\n <Route path=\"policies\" element={<PoliciesListPage />} />\n <Route path=\"policies/new\" element={<PolicyFormPage />} />\n <Route path=\"policies/:id\" element={<PolicyDetailPage />} />\n <Route path=\"policies/:id/edit\" element={<PolicyFormPage />} />\n\n {/* Governance */}\n <Route path=\"violations\" element={<ViolationsListPage />} />\n <Route path=\"drift\" element={<DriftListPage />} />\n\n {/* Operations */}\n <Route path=\"sync-runs\" element={<SyncRunsListPage />} />\n <Route path=\"costs\" element={<CostsPage />} />\n\n {/* Fallback */}\n <Route path=\"*\" element={<Navigate to=\"\" replace />} />\n </Routes>\n </Suspense>\n </div>\n );\n};\n"],"mappings":";;;;;;AAiBA,IAAM,IAAmB,QACvB,OAAO,wCAAqC,MAAM,OAAO,EAAE,SAAS,EAAE,iBAAiB,EAAE,CAC3F,GACM,IAAoB,QACxB,OAAO,yCAAsC,MAAM,OAAO,EAAE,SAAS,EAAE,kBAAkB,EAAE,CAC7F,GACM,IAAkB,QACtB,OAAO,uCAAoC,MAAM,OAAO,EAAE,SAAS,EAAE,gBAAgB,EAAE,CACzF,GAGM,IAAsB,QAC1B,OAAO,8CAA2C,MAAM,OAAO,EAC7D,SAAS,EAAE,oBACb,EAAE,CACJ,GACM,IAAuB,QAC3B,OAAO,+CAA4C,MAAM,OAAO,EAC9D,SAAS,EAAE,qBACb,EAAE,CACJ,GACM,IAAqB,QACzB,OAAO,6CAA0C,MAAM,OAAO,EAC5D,SAAS,EAAE,mBACb,EAAE,CACJ,GAGM,IAAoB,QACxB,OAAO,0CAAuC,MAAM,OAAO,EAAE,SAAS,EAAE,kBAAkB,EAAE,CAC9F,GACM,IAAqB,QACzB,OAAO,2CAAwC,MAAM,OAAO,EAAE,SAAS,EAAE,mBAAmB,EAAE,CAChG,GAGM,IAAe,QACnB,OAAO,oCAAiC,MAAM,OAAO,EAAE,SAAS,EAAE,aAAa,EAAE,CACnF,GAGM,IAAmB,QACvB,OAAO,wCAAqC,MAAM,OAAO,EAAE,SAAS,EAAE,iBAAiB,EAAE,CAC3F,GACM,IAAmB,QACvB,OAAO,wCAAqC,MAAM,OAAO,EAAE,SAAS,EAAE,iBAAiB,EAAE,CAC3F,GACM,IAAiB,QACrB,OAAO,sCAAmC,MAAM,OAAO,EAAE,SAAS,EAAE,eAAe,EAAE,CACvF,GAGM,IAAqB,QACzB,OAAO,4CAAyC,MAAM,OAAO,EAAE,SAAS,EAAE,mBAAmB,EAAE,CACjG,GACM,IAAgB,QACpB,OAAO,kCAA+B,MAAM,OAAO,EAAE,SAAS,EAAE,cAAc,EAAE,CAClF,GAGM,IAAmB,QACvB,OAAO,yCAAsC,MAAM,OAAO,EAAE,SAAS,EAAE,iBAAiB,EAAE,CAC5F,GACM,IAAY,QAChB,OAAO,8BAA2B,MAAM,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,CAC1E,GAGM,UACJ,kBAAC,OAAD;CAAK,WAAU;WACb,kBAAC,OAAD,EAAK,WAAU,kEAAmE,CAAA;AAC/E,CAAA,GAGM,UAA+B;CAC1C,IAAM,EAAE,aAAU,oBAAiB,EAAgB,GAC7C,IAAW,EAAY,GAGvB,IAAqB,MAAa,MAAM,MAAM,KAAY,IAAI,QAAQ,OAAO,EAAE;CAarF,OAVI,KAAsB,CAAC,KAKrB,EAHF,EAAS,aAAa,KACtB,EAAS,SAAS,WAAW,IAAqB,GAAG,KAG9C,OAKT,kBAAC,OAAD;EAAK,WAAU;YACb,kBAAC,GAAD;GAAU,UAAU,kBAAC,GAAD,CAAa,CAAA;aAC/B,kBAAC,GAAD,EAAA,UAAA;IAEE,kBAAC,GAAD;KAAO,OAAA;KAAM,SAAS,kBAAC,GAAD,CAAe,CAAA;IAAI,CAAA;IAGzC,kBAAC,GAAD;KAAO,MAAK;KAAW,SAAS,kBAAC,GAAD,CAAmB,CAAA;IAAI,CAAA;IACvD,kBAAC,GAAD;KAAO,MAAK;KAAe,SAAS,kBAAC,GAAD,CAAkB,CAAA;IAAI,CAAA;IAC1D,kBAAC,GAAD;KAAO,MAAK;KAAe,SAAS,kBAAC,GAAD,CAAoB,CAAA;IAAI,CAAA;IAC5D,kBAAC,GAAD;KAAO,MAAK;KAAoB,SAAS,kBAAC,GAAD,CAAkB,CAAA;IAAI,CAAA;IAG/D,kBAAC,GAAD;KAAO,MAAK;KAAc,SAAS,kBAAC,GAAD,CAAsB,CAAA;IAAI,CAAA;IAC7D,kBAAC,GAAD;KAAO,MAAK;KAAkB,SAAS,kBAAC,GAAD,CAAqB,CAAA;IAAI,CAAA;IAChE,kBAAC,GAAD;KAAO,MAAK;KAAkB,SAAS,kBAAC,GAAD,CAAuB,CAAA;IAAI,CAAA;IAClE,kBAAC,GAAD;KAAO,MAAK;KAAuB,SAAS,kBAAC,GAAD,CAAqB,CAAA;IAAI,CAAA;IAGrE,kBAAC,GAAD;KAAO,MAAK;KAAY,SAAS,kBAAC,GAAD,CAAoB,CAAA;IAAI,CAAA;IACzD,kBAAC,GAAD;KAAO,MAAK;KAAgB,SAAS,kBAAC,GAAD,CAAqB,CAAA;IAAI,CAAA;IAG9D,kBAAC,GAAD;KAAO,MAAK;KAAW,SAAS,kBAAC,GAAD,CAAe,CAAA;IAAI,CAAA;IAGnD,kBAAC,GAAD;KAAO,MAAK;KAAW,SAAS,kBAAC,GAAD,CAAmB,CAAA;IAAI,CAAA;IACvD,kBAAC,GAAD;KAAO,MAAK;KAAe,SAAS,kBAAC,GAAD,CAAiB,CAAA;IAAI,CAAA;IACzD,kBAAC,GAAD;KAAO,MAAK;KAAe,SAAS,kBAAC,GAAD,CAAmB,CAAA;IAAI,CAAA;IAC3D,kBAAC,GAAD;KAAO,MAAK;KAAoB,SAAS,kBAAC,GAAD,CAAiB,CAAA;IAAI,CAAA;IAG9D,kBAAC,GAAD;KAAO,MAAK;KAAa,SAAS,kBAAC,GAAD,CAAqB,CAAA;IAAI,CAAA;IAC3D,kBAAC,GAAD;KAAO,MAAK;KAAQ,SAAS,kBAAC,GAAD,CAAgB,CAAA;IAAI,CAAA;IAGjD,kBAAC,GAAD;KAAO,MAAK;KAAY,SAAS,kBAAC,GAAD,CAAmB,CAAA;IAAI,CAAA;IACxD,kBAAC,GAAD;KAAO,MAAK;KAAQ,SAAS,kBAAC,GAAD,CAAY,CAAA;IAAI,CAAA;IAG7C,kBAAC,GAAD;KAAO,MAAK;KAAI,SAAS,kBAAC,GAAD;MAAU,IAAG;MAAG,SAAA;KAAS,CAAA;IAAI,CAAA;GAChD,EAAA,CAAA;EACA,CAAA;CACP,CAAA;AAET"}
@@ -1,6 +1,6 @@
1
1
  import { joinPath as e } from "../utils/navigation.js";
2
2
  import { createContext as t, useCallback as n, useContext as r, useMemo as i } from "react";
3
- import { MemoryRouter as a, useNavigate as o } from "react-router-dom";
3
+ import { MemoryRouter as a, useNavigate as o } from "react-router";
4
4
  import { jsx as s } from "react/jsx-runtime";
5
5
  //#region src/adaptercloud/context/AdapterCloudContext.tsx
6
6
  var c = t(null);
@@ -1 +1 @@
1
- {"version":3,"file":"AdapterCloudContext.js","names":[],"sources":["../../../src/adaptercloud/context/AdapterCloudContext.tsx"],"sourcesContent":["/**\n * AdapterCloud Context Provider\n * @module adaptercloud/context\n *\n * Provides the host-passed integration props (basePath / currentUser /\n * apiGatewayUrl / tenantId / workspaceId / authToken) plus navigation helpers to\n * the AdapterCloud pages. Standalone mode wraps a MemoryRouter; integrated mode\n * uses the shell-provided `navigate`.\n */\n\nimport type { FC, PropsWithChildren } from 'react';\nimport { createContext, useContext, useMemo, useCallback } from 'react';\nimport { MemoryRouter, useNavigate as useRouterNavigate } from 'react-router-dom';\nimport type { AdapterCloudRootProps } from '../types';\nimport { joinPath } from '../utils/navigation';\n\n// ============================================================================\n// Context\n// ============================================================================\n\ninterface AdapterCloudContextValue extends Omit<\n AdapterCloudRootProps,\n 'registerNavItems' | 'registerFooterItems' | 'navigate'\n> {\n isStandalone: boolean;\n /** Shell's navigate function (only available in integrated mode) */\n navigate?: (path: string) => void;\n /** Navigate to a path relative to basePath */\n navigateTo: (relativePath: string) => void;\n /** Get the full path for a relative path */\n getPath: (relativePath: string) => string;\n}\n\nconst AdapterCloudContext = createContext<AdapterCloudContextValue | null>(null);\n\n// ============================================================================\n// Hook\n// ============================================================================\n\nexport function useAdapterCloud(): AdapterCloudContextValue {\n const context = useContext(AdapterCloudContext);\n if (!context) {\n throw new Error('useAdapterCloud must be used within a AdapterCloudProvider');\n }\n return context;\n}\n\n// ============================================================================\n// Provider Component\n// ============================================================================\n\ntype ProviderProps = Omit<AdapterCloudRootProps, 'registerNavItems' | 'registerFooterItems'> & {\n isStandalone: boolean;\n};\n\n/** Provider for standalone mode (has access to MemoryRouter) */\nconst StandaloneProviderInner: FC<PropsWithChildren<ProviderProps>> = ({\n children,\n basePath,\n currentUser,\n tenantId,\n workspaceId,\n apiGatewayUrl,\n authToken,\n}) => {\n const routerNavigate = useRouterNavigate();\n const effectiveBasePath = basePath || '/';\n\n const getPath = useCallback(\n (relativePath: string) => joinPath(effectiveBasePath, relativePath),\n [effectiveBasePath]\n );\n\n const navigateTo = useCallback(\n (relativePath: string) => {\n const fullPath = joinPath(effectiveBasePath, relativePath);\n routerNavigate(fullPath);\n },\n [effectiveBasePath, routerNavigate]\n );\n\n const contextValue = useMemo<AdapterCloudContextValue>(\n () => ({\n basePath: effectiveBasePath,\n navigate: undefined,\n currentUser,\n tenantId,\n workspaceId,\n apiGatewayUrl,\n authToken,\n isStandalone: true,\n navigateTo,\n getPath,\n }),\n [\n effectiveBasePath,\n currentUser,\n tenantId,\n workspaceId,\n apiGatewayUrl,\n authToken,\n navigateTo,\n getPath,\n ]\n );\n\n return (\n <AdapterCloudContext.Provider value={contextValue}>{children}</AdapterCloudContext.Provider>\n );\n};\n\n/** Provider for integrated mode (shell provides navigate) */\nconst IntegratedProviderInner: FC<\n PropsWithChildren<ProviderProps & { navigate: (path: string) => void }>\n> = ({\n children,\n basePath,\n navigate,\n currentUser,\n tenantId,\n workspaceId,\n apiGatewayUrl,\n authToken,\n}) => {\n const effectiveBasePath = basePath || '/';\n\n const getPath = useCallback(\n (relativePath: string) => joinPath(effectiveBasePath, relativePath),\n [effectiveBasePath]\n );\n\n const navigateTo = useCallback(\n (relativePath: string) => {\n const fullPath = joinPath(effectiveBasePath, relativePath);\n navigate(fullPath);\n },\n [effectiveBasePath, navigate]\n );\n\n const contextValue = useMemo<AdapterCloudContextValue>(\n () => ({\n basePath: effectiveBasePath,\n navigate,\n currentUser,\n tenantId,\n workspaceId,\n apiGatewayUrl,\n authToken,\n isStandalone: false,\n navigateTo,\n getPath,\n }),\n [\n effectiveBasePath,\n navigate,\n currentUser,\n tenantId,\n workspaceId,\n apiGatewayUrl,\n authToken,\n navigateTo,\n getPath,\n ]\n );\n\n return (\n <AdapterCloudContext.Provider value={contextValue}>{children}</AdapterCloudContext.Provider>\n );\n};\n\nexport const AdapterCloudProvider: FC<PropsWithChildren<AdapterCloudRootProps>> = (props) => {\n const { children, navigate } = props;\n // Standalone mode: no navigate function provided (MFE manages its own router)\n // Integrated mode: navigate function provided by shell (shell provides router)\n const isStandalone = !navigate;\n\n // Standalone mode: wrap in MemoryRouter\n if (isStandalone) {\n return (\n <MemoryRouter>\n <StandaloneProviderInner {...props} isStandalone={true}>\n {children}\n </StandaloneProviderInner>\n </MemoryRouter>\n );\n }\n\n // Integrated mode: shell provides router\n return (\n <IntegratedProviderInner {...props} navigate={navigate} isStandalone={false}>\n {children}\n </IntegratedProviderInner>\n );\n};\n"],"mappings":";;;;;AAiCA,IAAM,IAAsB,EAA+C,IAAI;AAM/E,SAAgB,IAA4C;CAC1D,IAAM,IAAU,EAAW,CAAmB;CAC9C,IAAI,CAAC,GACH,MAAU,MAAM,4DAA4D;CAE9E,OAAO;AACT;AAWA,IAAM,KAAiE,EACrE,aACA,aACA,gBACA,aACA,gBACA,kBACA,mBACI;CACJ,IAAM,IAAiB,EAAkB,GACnC,IAAoB,KAAY,KAEhC,IAAU,GACb,MAAyB,EAAS,GAAmB,CAAY,GAClE,CAAC,CAAiB,CACpB,GAEM,IAAa,GAChB,MAAyB;EAExB,EADiB,EAAS,GAAmB,CAC9B,CAAQ;CACzB,GACA,CAAC,GAAmB,CAAc,CACpC,GAEM,IAAe,SACZ;EACL,UAAU;EACV,UAAU,KAAA;EACV;EACA;EACA;EACA;EACA;EACA,cAAc;EACd;EACA;CACF,IACA;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;CACF,CACF;CAEA,OACE,kBAAC,EAAoB,UAArB;EAA8B,OAAO;EAAe;CAAuC,CAAA;AAE/F,GAGM,KAED,EACH,aACA,aACA,aACA,gBACA,aACA,gBACA,kBACA,mBACI;CACJ,IAAM,IAAoB,KAAY,KAEhC,IAAU,GACb,MAAyB,EAAS,GAAmB,CAAY,GAClE,CAAC,CAAiB,CACpB,GAEM,IAAa,GAChB,MAAyB;EAExB,EADiB,EAAS,GAAmB,CACpC,CAAQ;CACnB,GACA,CAAC,GAAmB,CAAQ,CAC9B,GAEM,IAAe,SACZ;EACL,UAAU;EACV;EACA;EACA;EACA;EACA;EACA;EACA,cAAc;EACd;EACA;CACF,IACA;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;CACF,CACF;CAEA,OACE,kBAAC,EAAoB,UAArB;EAA8B,OAAO;EAAe;CAAuC,CAAA;AAE/F,GAEa,KAAsE,MAAU;CAC3F,IAAM,EAAE,aAAU,gBAAa;CAiB/B,OAdsB,IAepB,kBAAC,GAAD;EAAyB,GAAI;EAAiB;EAAU,cAAc;EACnE;CACsB,CAAA,IAZvB,kBAAC,GAAD,EAAA,UACE,kBAAC,GAAD;EAAyB,GAAI;EAAO,cAAc;EAC/C;CACsB,CAAA,EACb,CAAA;AAUpB"}
1
+ {"version":3,"file":"AdapterCloudContext.js","names":[],"sources":["../../../src/adaptercloud/context/AdapterCloudContext.tsx"],"sourcesContent":["/**\n * AdapterCloud Context Provider\n * @module adaptercloud/context\n *\n * Provides the host-passed integration props (basePath / currentUser /\n * apiGatewayUrl / tenantId / workspaceId / authToken) plus navigation helpers to\n * the AdapterCloud pages. Standalone mode wraps a MemoryRouter; integrated mode\n * uses the shell-provided `navigate`.\n */\n\nimport type { FC, PropsWithChildren } from 'react';\nimport { createContext, useContext, useMemo, useCallback } from 'react';\nimport { MemoryRouter, useNavigate as useRouterNavigate } from 'react-router';\nimport type { AdapterCloudRootProps } from '../types';\nimport { joinPath } from '../utils/navigation';\n\n// ============================================================================\n// Context\n// ============================================================================\n\ninterface AdapterCloudContextValue extends Omit<\n AdapterCloudRootProps,\n 'registerNavItems' | 'registerFooterItems' | 'navigate'\n> {\n isStandalone: boolean;\n /** Shell's navigate function (only available in integrated mode) */\n navigate?: (path: string) => void;\n /** Navigate to a path relative to basePath */\n navigateTo: (relativePath: string) => void;\n /** Get the full path for a relative path */\n getPath: (relativePath: string) => string;\n}\n\nconst AdapterCloudContext = createContext<AdapterCloudContextValue | null>(null);\n\n// ============================================================================\n// Hook\n// ============================================================================\n\nexport function useAdapterCloud(): AdapterCloudContextValue {\n const context = useContext(AdapterCloudContext);\n if (!context) {\n throw new Error('useAdapterCloud must be used within a AdapterCloudProvider');\n }\n return context;\n}\n\n// ============================================================================\n// Provider Component\n// ============================================================================\n\ntype ProviderProps = Omit<AdapterCloudRootProps, 'registerNavItems' | 'registerFooterItems'> & {\n isStandalone: boolean;\n};\n\n/** Provider for standalone mode (has access to MemoryRouter) */\nconst StandaloneProviderInner: FC<PropsWithChildren<ProviderProps>> = ({\n children,\n basePath,\n currentUser,\n tenantId,\n workspaceId,\n apiGatewayUrl,\n authToken,\n}) => {\n const routerNavigate = useRouterNavigate();\n const effectiveBasePath = basePath || '/';\n\n const getPath = useCallback(\n (relativePath: string) => joinPath(effectiveBasePath, relativePath),\n [effectiveBasePath]\n );\n\n const navigateTo = useCallback(\n (relativePath: string) => {\n const fullPath = joinPath(effectiveBasePath, relativePath);\n routerNavigate(fullPath);\n },\n [effectiveBasePath, routerNavigate]\n );\n\n const contextValue = useMemo<AdapterCloudContextValue>(\n () => ({\n basePath: effectiveBasePath,\n navigate: undefined,\n currentUser,\n tenantId,\n workspaceId,\n apiGatewayUrl,\n authToken,\n isStandalone: true,\n navigateTo,\n getPath,\n }),\n [\n effectiveBasePath,\n currentUser,\n tenantId,\n workspaceId,\n apiGatewayUrl,\n authToken,\n navigateTo,\n getPath,\n ]\n );\n\n return (\n <AdapterCloudContext.Provider value={contextValue}>{children}</AdapterCloudContext.Provider>\n );\n};\n\n/** Provider for integrated mode (shell provides navigate) */\nconst IntegratedProviderInner: FC<\n PropsWithChildren<ProviderProps & { navigate: (path: string) => void }>\n> = ({\n children,\n basePath,\n navigate,\n currentUser,\n tenantId,\n workspaceId,\n apiGatewayUrl,\n authToken,\n}) => {\n const effectiveBasePath = basePath || '/';\n\n const getPath = useCallback(\n (relativePath: string) => joinPath(effectiveBasePath, relativePath),\n [effectiveBasePath]\n );\n\n const navigateTo = useCallback(\n (relativePath: string) => {\n const fullPath = joinPath(effectiveBasePath, relativePath);\n navigate(fullPath);\n },\n [effectiveBasePath, navigate]\n );\n\n const contextValue = useMemo<AdapterCloudContextValue>(\n () => ({\n basePath: effectiveBasePath,\n navigate,\n currentUser,\n tenantId,\n workspaceId,\n apiGatewayUrl,\n authToken,\n isStandalone: false,\n navigateTo,\n getPath,\n }),\n [\n effectiveBasePath,\n navigate,\n currentUser,\n tenantId,\n workspaceId,\n apiGatewayUrl,\n authToken,\n navigateTo,\n getPath,\n ]\n );\n\n return (\n <AdapterCloudContext.Provider value={contextValue}>{children}</AdapterCloudContext.Provider>\n );\n};\n\nexport const AdapterCloudProvider: FC<PropsWithChildren<AdapterCloudRootProps>> = (props) => {\n const { children, navigate } = props;\n // Standalone mode: no navigate function provided (MFE manages its own router)\n // Integrated mode: navigate function provided by shell (shell provides router)\n const isStandalone = !navigate;\n\n // Standalone mode: wrap in MemoryRouter\n if (isStandalone) {\n return (\n <MemoryRouter>\n <StandaloneProviderInner {...props} isStandalone={true}>\n {children}\n </StandaloneProviderInner>\n </MemoryRouter>\n );\n }\n\n // Integrated mode: shell provides router\n return (\n <IntegratedProviderInner {...props} navigate={navigate} isStandalone={false}>\n {children}\n </IntegratedProviderInner>\n );\n};\n"],"mappings":";;;;;AAiCA,IAAM,IAAsB,EAA+C,IAAI;AAM/E,SAAgB,IAA4C;CAC1D,IAAM,IAAU,EAAW,CAAmB;CAC9C,IAAI,CAAC,GACH,MAAU,MAAM,4DAA4D;CAE9E,OAAO;AACT;AAWA,IAAM,KAAiE,EACrE,aACA,aACA,gBACA,aACA,gBACA,kBACA,mBACI;CACJ,IAAM,IAAiB,EAAkB,GACnC,IAAoB,KAAY,KAEhC,IAAU,GACb,MAAyB,EAAS,GAAmB,CAAY,GAClE,CAAC,CAAiB,CACpB,GAEM,IAAa,GAChB,MAAyB;EAExB,EADiB,EAAS,GAAmB,CAC9B,CAAQ;CACzB,GACA,CAAC,GAAmB,CAAc,CACpC,GAEM,IAAe,SACZ;EACL,UAAU;EACV,UAAU,KAAA;EACV;EACA;EACA;EACA;EACA;EACA,cAAc;EACd;EACA;CACF,IACA;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;CACF,CACF;CAEA,OACE,kBAAC,EAAoB,UAArB;EAA8B,OAAO;EAAe;CAAuC,CAAA;AAE/F,GAGM,KAED,EACH,aACA,aACA,aACA,gBACA,aACA,gBACA,kBACA,mBACI;CACJ,IAAM,IAAoB,KAAY,KAEhC,IAAU,GACb,MAAyB,EAAS,GAAmB,CAAY,GAClE,CAAC,CAAiB,CACpB,GAEM,IAAa,GAChB,MAAyB;EAExB,EADiB,EAAS,GAAmB,CACpC,CAAQ;CACnB,GACA,CAAC,GAAmB,CAAQ,CAC9B,GAEM,IAAe,SACZ;EACL,UAAU;EACV;EACA;EACA;EACA;EACA;EACA;EACA,cAAc;EACd;EACA;CACF,IACA;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;CACF,CACF;CAEA,OACE,kBAAC,EAAoB,UAArB;EAA8B,OAAO;EAAe;CAAuC,CAAA;AAE/F,GAEa,KAAsE,MAAU;CAC3F,IAAM,EAAE,aAAU,gBAAa;CAiB/B,OAdsB,IAepB,kBAAC,GAAD;EAAyB,GAAI;EAAiB;EAAU,cAAc;EACnE;CACsB,CAAA,IAZvB,kBAAC,GAAD,EAAA,UACE,kBAAC,GAAD;EAAyB,GAAI;EAAO,cAAc;EAC/C;CACsB,CAAA,EACb,CAAA;AAUpB"}
@@ -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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"}
@@ -377,12 +377,16 @@ var s = {
377
377
  let { apiGatewayUrl: n } = e();
378
378
  return r({
379
379
  queryKey: s.drift(t),
380
- queryFn: async () => (await c(`query AdaListDriftRecords($resourceId: ID, $status: AdaDriftStatus) {
381
- adaListDriftRecords(resourceId: $resourceId, status: $status) { ${h} }
380
+ queryFn: async () => (await c(`query AdaListDriftRecords($resourceId: ID, $status: AdaDriftStatus, $pagination: PaginationInput) {
381
+ adaListDriftRecords(resourceId: $resourceId, status: $status, pagination: $pagination) {
382
+ items { ${h} }
383
+ pageInfo { ${_} }
384
+ }
382
385
  }`, {
383
386
  resourceId: t.resourceId,
384
- status: t.status
385
- }, n)).adaListDriftRecords,
387
+ status: t.status,
388
+ pagination: { limit: 100 }
389
+ }, n)).adaListDriftRecords.items,
386
390
  staleTime: l
387
391
  });
388
392
  }, z = () => {
@@ -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 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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"}
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};\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 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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"}
@@ -9,7 +9,7 @@ import { ConfirmDialog as c } from "../../components/ConfirmDialog.js";
9
9
  import { useCallback as l, useState as u } from "react";
10
10
  import { useI18n as d } from "@burdenoff/fe-libs/shared/providers/shell/I18nProvider";
11
11
  import { Archive as f, ArrowLeft as p, Cable as m, Check as h, Copy as g, Pencil as _ } from "lucide-react";
12
- import { useParams as v } from "react-router-dom";
12
+ import { useParams as v } from "react-router";
13
13
  import { Fragment as y, jsx as b, jsxs as x } from "react/jsx-runtime";
14
14
  import { GlassCard as S } from "@burdenoff/fe-libs/ui";
15
15
  //#region src/adaptercloud/pages/adapters/AdapterDetailPage.tsx
@@ -1 +1 @@
1
- {"version":3,"file":"AdapterDetailPage.js","names":[],"sources":["../../../../src/adaptercloud/pages/adapters/AdapterDetailPage.tsx"],"sourcesContent":["/**\n * Adapter Detail Page\n * @module adaptercloud/pages/adapters\n *\n * Full view of one adapter (`adaAdapter`) — metadata, capabilities, config\n * schema and its connections. Supports archiving via `adaArchiveAdapter`.\n */\n\nimport { useCallback, useState } from 'react';\nimport { useParams } from 'react-router-dom';\nimport { useI18n } from '@burdenoff/fe-libs/shared/providers/shell/I18nProvider';\nimport { ArrowLeft, Archive, Cable, Check, Copy, Pencil } from 'lucide-react';\nimport { GlassCard } from '@burdenoff/fe-libs/ui';\nimport { PageLayout } from '../../components/PageLayout';\nimport { StatusBadge } from '../../components/StatusBadge';\nimport { DataState } from '../../components/DataState';\nimport { ConfirmDialog } from '../../components/ConfirmDialog';\nimport { useAdapterCloud } from '../../context/AdapterCloudContext';\nimport { useAdapter, useArchiveAdapter } from '../../hooks/useAdapterCloudApi';\nimport { adapterKindLabels } from '../../utils/domain';\nimport { formatDate } from '../../utils/formatters';\n\nexport function AdapterDetailPage() {\n const { id } = useParams<{ id: string }>();\n const { navigateTo } = useAdapterCloud();\n const { t: translate } = useI18n();\n const t = useCallback(\n (key: string, fallback: string): string => {\n const value = translate(key);\n return value === key ? fallback : value;\n },\n [translate]\n );\n\n const query = useAdapter(id);\n const archive = useArchiveAdapter();\n const adapter = query.data;\n\n const [confirmArchiveOpen, setConfirmArchiveOpen] = useState(false);\n const [copied, setCopied] = useState(false);\n\n const handleCopyConfig = useCallback(() => {\n if (adapter?.configSchema == null) return;\n const text = JSON.stringify(adapter.configSchema, null, 2);\n void navigator.clipboard\n ?.writeText(text)\n .then(() => {\n setCopied(true);\n setTimeout(() => setCopied(false), 1500);\n })\n .catch(() => {\n /* clipboard unavailable — no-op */\n });\n }, [adapter?.configSchema]);\n\n const handleArchive = useCallback(() => {\n if (!id) return;\n archive.mutate(id, {\n onSuccess: () => {\n setConfirmArchiveOpen(false);\n navigateTo('/adapters');\n },\n });\n }, [archive, id, navigateTo]);\n\n return (\n <PageLayout\n title={adapter?.name ?? t('adaptercloud.adapters.detailTitle', 'Adapter')}\n description={adapter?.slug}\n actions={\n <div className=\"flex items-center gap-2\">\n <button\n type=\"button\"\n onClick={() => navigateTo('/adapters')}\n className=\"inline-flex items-center gap-2 rounded-lg border border-border-subtle bg-bg-surface px-3 py-2 text-sm font-medium text-text-primary transition-colors hover:bg-accent\"\n >\n <ArrowLeft className=\"h-4 w-4\" />\n {t('adaptercloud.common.back', 'Back')}\n </button>\n {adapter && (\n <>\n <button\n type=\"button\"\n onClick={() => navigateTo(`/adapters/${adapter.id}/edit`)}\n className=\"inline-flex items-center gap-2 rounded-lg border border-border-subtle bg-bg-surface px-3 py-2 text-sm font-medium text-text-primary transition-colors hover:bg-accent\"\n >\n <Pencil className=\"h-4 w-4\" />\n {t('adaptercloud.common.edit', 'Edit')}\n </button>\n {adapter.status !== 'ARCHIVED' && (\n <button\n type=\"button\"\n onClick={() => setConfirmArchiveOpen(true)}\n disabled={archive.isPending}\n className=\"inline-flex items-center gap-2 rounded-lg border border-border-subtle bg-bg-surface px-3 py-2 text-sm font-medium text-status-error-text transition-colors hover:bg-status-error-bg-subtle disabled:opacity-50\"\n >\n <Archive className=\"h-4 w-4\" />\n {t('adaptercloud.common.archive', 'Archive')}\n </button>\n )}\n </>\n )}\n </div>\n }\n >\n <DataState\n isLoading={query.isLoading}\n isError={query.isError}\n isEmpty={!query.isLoading && !adapter}\n error={query.error}\n onRetry={() => void query.refetch()}\n emptyTitle={t('adaptercloud.adapters.notFound', 'Adapter not found')}\n emptyDescription={t(\n 'adaptercloud.adapters.notFoundDescription',\n 'This adapter does not exist or belongs to another workspace.'\n )}\n >\n {adapter && (\n <div className=\"space-y-6\">\n {/* Metadata */}\n <GlassCard className=\"p-6\">\n <div className=\"mb-4 flex items-center gap-3\">\n <StatusBadge status={adapter.status} />\n <span className=\"inline-flex items-center rounded-full bg-bg-sunken px-2.5 py-0.5 text-xs font-medium text-text-secondary\">\n {adapterKindLabels[adapter.kind]}\n </span>\n <span className=\"text-xs text-text-secondary\">v{adapter.version}</span>\n </div>\n\n {adapter.description && (\n <p className=\"mb-4 text-sm text-text-secondary\">{adapter.description}</p>\n )}\n\n <dl className=\"grid grid-cols-2 gap-4 text-sm sm:grid-cols-3\">\n <div>\n <dt className=\"text-text-secondary\">\n {t('adaptercloud.adapters.vendor', 'Vendor')}\n </dt>\n <dd className=\"mt-0.5 font-medium text-text-primary\">{adapter.vendor ?? '—'}</dd>\n </div>\n <div>\n <dt className=\"text-text-secondary\">\n {t('adaptercloud.common.created', 'Created')}\n </dt>\n <dd className=\"mt-0.5 font-medium text-text-primary\">\n {formatDate(adapter.createdAt)}\n </dd>\n </div>\n <div>\n <dt className=\"text-text-secondary\">\n {t('adaptercloud.common.updated', 'Updated')}\n </dt>\n <dd className=\"mt-0.5 font-medium text-text-primary\">\n {formatDate(adapter.updatedAt)}\n </dd>\n </div>\n </dl>\n\n {adapter.capabilities.length > 0 && (\n <div className=\"mt-5\">\n <h3 className=\"mb-2 text-sm font-semibold text-text-primary\">\n {t('adaptercloud.adapters.capabilities', 'Capabilities')}\n </h3>\n <div className=\"flex flex-wrap gap-1.5\">\n {adapter.capabilities.map((cap) => (\n <span\n key={cap}\n className=\"inline-flex items-center rounded-full bg-accent-blue-subtle px-2.5 py-0.5 text-xs text-accent-blue\"\n >\n {cap}\n </span>\n ))}\n </div>\n </div>\n )}\n\n {adapter.tags.length > 0 && (\n <div className=\"mt-4\">\n <h3 className=\"mb-2 text-sm font-semibold text-text-primary\">\n {t('adaptercloud.common.tags', 'Tags')}\n </h3>\n <div className=\"flex flex-wrap gap-1.5\">\n {adapter.tags.map((tag) => (\n <span\n key={tag}\n className=\"inline-flex items-center rounded-full bg-bg-sunken px-2.5 py-0.5 text-xs text-text-secondary\"\n >\n {tag}\n </span>\n ))}\n </div>\n </div>\n )}\n </GlassCard>\n\n {/* Config schema */}\n {adapter.configSchema != null && (\n <GlassCard className=\"p-6\">\n <div className=\"mb-3 flex items-center justify-between gap-3\">\n <h3 className=\"text-sm font-semibold text-text-primary\">\n {t('adaptercloud.adapters.configSchema', 'Config Schema')}\n </h3>\n <button\n type=\"button\"\n onClick={handleCopyConfig}\n aria-label={t('adaptercloud.common.copy', 'Copy')}\n className=\"inline-flex items-center gap-1.5 rounded-lg border border-border-subtle bg-bg-surface px-2.5 py-1 text-xs font-medium text-text-secondary transition-colors hover:bg-accent hover:text-text-primary\"\n >\n {copied ? (\n <>\n <Check className=\"h-3.5 w-3.5 text-status-success-text\" />\n {t('adaptercloud.common.copied', 'Copied')}\n </>\n ) : (\n <>\n <Copy className=\"h-3.5 w-3.5\" />\n {t('adaptercloud.common.copy', 'Copy')}\n </>\n )}\n </button>\n </div>\n <pre className=\"overflow-auto rounded-lg bg-bg-sunken p-4 text-xs text-text-secondary\">\n {JSON.stringify(adapter.configSchema, null, 2)}\n </pre>\n </GlassCard>\n )}\n\n {/* Connections */}\n <section>\n <h3 className=\"mb-3 text-base font-semibold text-text-primary\">\n {t('adaptercloud.adapters.connections', 'Connections')}\n </h3>\n {adapter.connections && adapter.connections.length > 0 ? (\n <div className=\"overflow-x-auto rounded-xl border border-border-subtle bg-bg-surface\">\n <table className=\"w-full min-w-[32rem] text-sm\">\n <thead>\n <tr className=\"border-b border-border-subtle text-left text-xs uppercase tracking-wide text-text-secondary\">\n <th scope=\"col\" className=\"px-4 py-2.5 font-medium\">\n {t('adaptercloud.adapters.connName', 'Name')}\n </th>\n <th scope=\"col\" className=\"px-4 py-2.5 font-medium\">\n {t('adaptercloud.resources.region', 'Region')}\n </th>\n <th scope=\"col\" className=\"px-4 py-2.5 font-medium\">\n {t('adaptercloud.adapters.status', 'Status')}\n </th>\n <th scope=\"col\" className=\"px-4 py-2.5 text-right font-medium\">\n {t('adaptercloud.adapters.resources', 'Resources')}\n </th>\n </tr>\n </thead>\n <tbody className=\"divide-y divide-border\">\n {adapter.connections.map((conn) => (\n <tr\n key={conn.id}\n role=\"link\"\n tabIndex={0}\n onClick={() => navigateTo(`/connections/${conn.id}`)}\n onKeyDown={(e) => {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault();\n navigateTo(`/connections/${conn.id}`);\n }\n }}\n className=\"cursor-pointer transition-colors hover:bg-accent/50 focus:bg-accent/50 focus:outline-none\"\n >\n <td className=\"px-4 py-3\">\n <span className=\"flex items-center gap-2\">\n <Cable className=\"h-4 w-4 shrink-0 text-text-secondary\" />\n <span className=\"truncate font-medium text-text-primary\">\n {conn.name}\n </span>\n </span>\n </td>\n <td className=\"px-4 py-3 text-text-secondary\">{conn.region ?? '—'}</td>\n <td className=\"px-4 py-3\">\n <StatusBadge status={conn.status} />\n </td>\n <td className=\"px-4 py-3 text-right tabular-nums text-text-secondary\">\n {conn.resourceCount}\n </td>\n </tr>\n ))}\n </tbody>\n </table>\n </div>\n ) : (\n <p className=\"rounded-xl border border-border-subtle bg-bg-surface px-4 py-6 text-center text-sm text-text-secondary\">\n {t('adaptercloud.adapters.noConnections', 'No connections use this adapter yet.')}\n </p>\n )}\n </section>\n </div>\n )}\n </DataState>\n\n <ConfirmDialog\n open={confirmArchiveOpen}\n onOpenChange={setConfirmArchiveOpen}\n title={t('adaptercloud.adapters.archiveTitle', 'Archive this adapter?')}\n description={t(\n 'adaptercloud.adapters.archivePrompt',\n 'The adapter will be archived and hidden from the catalog. Existing connections keep working, but no new connections can select it.'\n )}\n confirmLabel={t('adaptercloud.common.archive', 'Archive')}\n cancelLabel={t('adaptercloud.common.cancel', 'Cancel')}\n onConfirm={handleArchive}\n isPending={archive.isPending}\n tone=\"danger\"\n />\n </PageLayout>\n );\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"AdapterDetailPage.js","names":[],"sources":["../../../../src/adaptercloud/pages/adapters/AdapterDetailPage.tsx"],"sourcesContent":["/**\n * Adapter Detail Page\n * @module adaptercloud/pages/adapters\n *\n * Full view of one adapter (`adaAdapter`) — metadata, capabilities, config\n * schema and its connections. Supports archiving via `adaArchiveAdapter`.\n */\n\nimport { useCallback, useState } from 'react';\nimport { useParams } from 'react-router';\nimport { useI18n } from '@burdenoff/fe-libs/shared/providers/shell/I18nProvider';\nimport { ArrowLeft, Archive, Cable, Check, Copy, Pencil } from 'lucide-react';\nimport { GlassCard } from '@burdenoff/fe-libs/ui';\nimport { PageLayout } from '../../components/PageLayout';\nimport { StatusBadge } from '../../components/StatusBadge';\nimport { DataState } from '../../components/DataState';\nimport { ConfirmDialog } from '../../components/ConfirmDialog';\nimport { useAdapterCloud } from '../../context/AdapterCloudContext';\nimport { useAdapter, useArchiveAdapter } from '../../hooks/useAdapterCloudApi';\nimport { adapterKindLabels } from '../../utils/domain';\nimport { formatDate } from '../../utils/formatters';\n\nexport function AdapterDetailPage() {\n const { id } = useParams<{ id: string }>();\n const { navigateTo } = useAdapterCloud();\n const { t: translate } = useI18n();\n const t = useCallback(\n (key: string, fallback: string): string => {\n const value = translate(key);\n return value === key ? fallback : value;\n },\n [translate]\n );\n\n const query = useAdapter(id);\n const archive = useArchiveAdapter();\n const adapter = query.data;\n\n const [confirmArchiveOpen, setConfirmArchiveOpen] = useState(false);\n const [copied, setCopied] = useState(false);\n\n const handleCopyConfig = useCallback(() => {\n if (adapter?.configSchema == null) return;\n const text = JSON.stringify(adapter.configSchema, null, 2);\n void navigator.clipboard\n ?.writeText(text)\n .then(() => {\n setCopied(true);\n setTimeout(() => setCopied(false), 1500);\n })\n .catch(() => {\n /* clipboard unavailable — no-op */\n });\n }, [adapter?.configSchema]);\n\n const handleArchive = useCallback(() => {\n if (!id) return;\n archive.mutate(id, {\n onSuccess: () => {\n setConfirmArchiveOpen(false);\n navigateTo('/adapters');\n },\n });\n }, [archive, id, navigateTo]);\n\n return (\n <PageLayout\n title={adapter?.name ?? t('adaptercloud.adapters.detailTitle', 'Adapter')}\n description={adapter?.slug}\n actions={\n <div className=\"flex items-center gap-2\">\n <button\n type=\"button\"\n onClick={() => navigateTo('/adapters')}\n className=\"inline-flex items-center gap-2 rounded-lg border border-border-subtle bg-bg-surface px-3 py-2 text-sm font-medium text-text-primary transition-colors hover:bg-accent\"\n >\n <ArrowLeft className=\"h-4 w-4\" />\n {t('adaptercloud.common.back', 'Back')}\n </button>\n {adapter && (\n <>\n <button\n type=\"button\"\n onClick={() => navigateTo(`/adapters/${adapter.id}/edit`)}\n className=\"inline-flex items-center gap-2 rounded-lg border border-border-subtle bg-bg-surface px-3 py-2 text-sm font-medium text-text-primary transition-colors hover:bg-accent\"\n >\n <Pencil className=\"h-4 w-4\" />\n {t('adaptercloud.common.edit', 'Edit')}\n </button>\n {adapter.status !== 'ARCHIVED' && (\n <button\n type=\"button\"\n onClick={() => setConfirmArchiveOpen(true)}\n disabled={archive.isPending}\n className=\"inline-flex items-center gap-2 rounded-lg border border-border-subtle bg-bg-surface px-3 py-2 text-sm font-medium text-status-error-text transition-colors hover:bg-status-error-bg-subtle disabled:opacity-50\"\n >\n <Archive className=\"h-4 w-4\" />\n {t('adaptercloud.common.archive', 'Archive')}\n </button>\n )}\n </>\n )}\n </div>\n }\n >\n <DataState\n isLoading={query.isLoading}\n isError={query.isError}\n isEmpty={!query.isLoading && !adapter}\n error={query.error}\n onRetry={() => void query.refetch()}\n emptyTitle={t('adaptercloud.adapters.notFound', 'Adapter not found')}\n emptyDescription={t(\n 'adaptercloud.adapters.notFoundDescription',\n 'This adapter does not exist or belongs to another workspace.'\n )}\n >\n {adapter && (\n <div className=\"space-y-6\">\n {/* Metadata */}\n <GlassCard className=\"p-6\">\n <div className=\"mb-4 flex items-center gap-3\">\n <StatusBadge status={adapter.status} />\n <span className=\"inline-flex items-center rounded-full bg-bg-sunken px-2.5 py-0.5 text-xs font-medium text-text-secondary\">\n {adapterKindLabels[adapter.kind]}\n </span>\n <span className=\"text-xs text-text-secondary\">v{adapter.version}</span>\n </div>\n\n {adapter.description && (\n <p className=\"mb-4 text-sm text-text-secondary\">{adapter.description}</p>\n )}\n\n <dl className=\"grid grid-cols-2 gap-4 text-sm sm:grid-cols-3\">\n <div>\n <dt className=\"text-text-secondary\">\n {t('adaptercloud.adapters.vendor', 'Vendor')}\n </dt>\n <dd className=\"mt-0.5 font-medium text-text-primary\">{adapter.vendor ?? '—'}</dd>\n </div>\n <div>\n <dt className=\"text-text-secondary\">\n {t('adaptercloud.common.created', 'Created')}\n </dt>\n <dd className=\"mt-0.5 font-medium text-text-primary\">\n {formatDate(adapter.createdAt)}\n </dd>\n </div>\n <div>\n <dt className=\"text-text-secondary\">\n {t('adaptercloud.common.updated', 'Updated')}\n </dt>\n <dd className=\"mt-0.5 font-medium text-text-primary\">\n {formatDate(adapter.updatedAt)}\n </dd>\n </div>\n </dl>\n\n {adapter.capabilities.length > 0 && (\n <div className=\"mt-5\">\n <h3 className=\"mb-2 text-sm font-semibold text-text-primary\">\n {t('adaptercloud.adapters.capabilities', 'Capabilities')}\n </h3>\n <div className=\"flex flex-wrap gap-1.5\">\n {adapter.capabilities.map((cap) => (\n <span\n key={cap}\n className=\"inline-flex items-center rounded-full bg-accent-blue-subtle px-2.5 py-0.5 text-xs text-accent-blue\"\n >\n {cap}\n </span>\n ))}\n </div>\n </div>\n )}\n\n {adapter.tags.length > 0 && (\n <div className=\"mt-4\">\n <h3 className=\"mb-2 text-sm font-semibold text-text-primary\">\n {t('adaptercloud.common.tags', 'Tags')}\n </h3>\n <div className=\"flex flex-wrap gap-1.5\">\n {adapter.tags.map((tag) => (\n <span\n key={tag}\n className=\"inline-flex items-center rounded-full bg-bg-sunken px-2.5 py-0.5 text-xs text-text-secondary\"\n >\n {tag}\n </span>\n ))}\n </div>\n </div>\n )}\n </GlassCard>\n\n {/* Config schema */}\n {adapter.configSchema != null && (\n <GlassCard className=\"p-6\">\n <div className=\"mb-3 flex items-center justify-between gap-3\">\n <h3 className=\"text-sm font-semibold text-text-primary\">\n {t('adaptercloud.adapters.configSchema', 'Config Schema')}\n </h3>\n <button\n type=\"button\"\n onClick={handleCopyConfig}\n aria-label={t('adaptercloud.common.copy', 'Copy')}\n className=\"inline-flex items-center gap-1.5 rounded-lg border border-border-subtle bg-bg-surface px-2.5 py-1 text-xs font-medium text-text-secondary transition-colors hover:bg-accent hover:text-text-primary\"\n >\n {copied ? (\n <>\n <Check className=\"h-3.5 w-3.5 text-status-success-text\" />\n {t('adaptercloud.common.copied', 'Copied')}\n </>\n ) : (\n <>\n <Copy className=\"h-3.5 w-3.5\" />\n {t('adaptercloud.common.copy', 'Copy')}\n </>\n )}\n </button>\n </div>\n <pre className=\"overflow-auto rounded-lg bg-bg-sunken p-4 text-xs text-text-secondary\">\n {JSON.stringify(adapter.configSchema, null, 2)}\n </pre>\n </GlassCard>\n )}\n\n {/* Connections */}\n <section>\n <h3 className=\"mb-3 text-base font-semibold text-text-primary\">\n {t('adaptercloud.adapters.connections', 'Connections')}\n </h3>\n {adapter.connections && adapter.connections.length > 0 ? (\n <div className=\"overflow-x-auto rounded-xl border border-border-subtle bg-bg-surface\">\n <table className=\"w-full min-w-[32rem] text-sm\">\n <thead>\n <tr className=\"border-b border-border-subtle text-left text-xs uppercase tracking-wide text-text-secondary\">\n <th scope=\"col\" className=\"px-4 py-2.5 font-medium\">\n {t('adaptercloud.adapters.connName', 'Name')}\n </th>\n <th scope=\"col\" className=\"px-4 py-2.5 font-medium\">\n {t('adaptercloud.resources.region', 'Region')}\n </th>\n <th scope=\"col\" className=\"px-4 py-2.5 font-medium\">\n {t('adaptercloud.adapters.status', 'Status')}\n </th>\n <th scope=\"col\" className=\"px-4 py-2.5 text-right font-medium\">\n {t('adaptercloud.adapters.resources', 'Resources')}\n </th>\n </tr>\n </thead>\n <tbody className=\"divide-y divide-border\">\n {adapter.connections.map((conn) => (\n <tr\n key={conn.id}\n role=\"link\"\n tabIndex={0}\n onClick={() => navigateTo(`/connections/${conn.id}`)}\n onKeyDown={(e) => {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault();\n navigateTo(`/connections/${conn.id}`);\n }\n }}\n className=\"cursor-pointer transition-colors hover:bg-accent/50 focus:bg-accent/50 focus:outline-none\"\n >\n <td className=\"px-4 py-3\">\n <span className=\"flex items-center gap-2\">\n <Cable className=\"h-4 w-4 shrink-0 text-text-secondary\" />\n <span className=\"truncate font-medium text-text-primary\">\n {conn.name}\n </span>\n </span>\n </td>\n <td className=\"px-4 py-3 text-text-secondary\">{conn.region ?? '—'}</td>\n <td className=\"px-4 py-3\">\n <StatusBadge status={conn.status} />\n </td>\n <td className=\"px-4 py-3 text-right tabular-nums text-text-secondary\">\n {conn.resourceCount}\n </td>\n </tr>\n ))}\n </tbody>\n </table>\n </div>\n ) : (\n <p className=\"rounded-xl border border-border-subtle bg-bg-surface px-4 py-6 text-center text-sm text-text-secondary\">\n {t('adaptercloud.adapters.noConnections', 'No connections use this adapter yet.')}\n </p>\n )}\n </section>\n </div>\n )}\n </DataState>\n\n <ConfirmDialog\n open={confirmArchiveOpen}\n onOpenChange={setConfirmArchiveOpen}\n title={t('adaptercloud.adapters.archiveTitle', 'Archive this adapter?')}\n description={t(\n 'adaptercloud.adapters.archivePrompt',\n 'The adapter will be archived and hidden from the catalog. Existing connections keep working, but no new connections can select it.'\n )}\n confirmLabel={t('adaptercloud.common.archive', 'Archive')}\n cancelLabel={t('adaptercloud.common.cancel', 'Cancel')}\n onConfirm={handleArchive}\n isPending={archive.isPending}\n tone=\"danger\"\n />\n </PageLayout>\n );\n}\n"],"mappings":"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"}
@@ -6,7 +6,7 @@ import { useAdapter as a, useCreateAdapter as o, useUpdateAdapter as s } from ".
6
6
  import { useCallback as c, useEffect as l, useState as u } from "react";
7
7
  import { useI18n as d } from "@burdenoff/fe-libs/shared/providers/shell/I18nProvider";
8
8
  import { ArrowLeft as f, Loader2 as p, Save as m, X as h } from "lucide-react";
9
- import { useParams as g } from "react-router-dom";
9
+ import { useParams as g } from "react-router";
10
10
  import { jsx as _, jsxs as v } from "react/jsx-runtime";
11
11
  import { GlassCard as y } from "@burdenoff/fe-libs/ui";
12
12
  //#region src/adaptercloud/pages/adapters/AdapterFormPage.tsx