@geenius/adapters 0.1.0 → 0.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +79 -42
- package/package.json +23 -4
- package/packages/convex/README.md +1 -1
- package/packages/convex/dist/index.cjs +300 -0
- package/packages/convex/dist/index.cjs.map +1 -0
- package/packages/convex/dist/index.d.cts +231 -0
- package/packages/convex/dist/index.d.ts +231 -0
- package/packages/convex/dist/index.js +263 -0
- package/packages/convex/dist/index.js.map +1 -0
- package/packages/react/README.md +1 -1
- package/packages/react/dist/index.d.mts +106 -0
- package/packages/react/dist/index.d.ts +106 -0
- package/packages/react/dist/index.js +611 -0
- package/packages/react/dist/index.js.map +1 -0
- package/packages/react/dist/index.mjs +570 -0
- package/packages/react/dist/index.mjs.map +1 -0
- package/packages/react-css/README.md +1 -1
- package/packages/react-css/dist/index.cjs +515 -0
- package/packages/react-css/dist/index.cjs.map +1 -0
- package/packages/react-css/dist/index.d.cts +105 -0
- package/packages/react-css/dist/index.d.ts +105 -0
- package/packages/react-css/dist/index.js +467 -0
- package/packages/react-css/dist/index.js.map +1 -0
- package/packages/shared/README.md +1 -1
- package/packages/shared/dist/index.d.mts +625 -0
- package/packages/shared/dist/index.d.ts +625 -0
- package/packages/shared/dist/index.js +1567 -0
- package/packages/shared/dist/index.js.map +1 -0
- package/packages/shared/dist/index.mjs +1489 -0
- package/packages/shared/dist/index.mjs.map +1 -0
- package/packages/solidjs/README.md +1 -1
- package/packages/solidjs/dist/index.d.mts +97 -0
- package/packages/solidjs/dist/index.d.ts +97 -0
- package/packages/solidjs/dist/index.js +250 -0
- package/packages/solidjs/dist/index.js.map +1 -0
- package/packages/solidjs/dist/index.mjs +202 -0
- package/packages/solidjs/dist/index.mjs.map +1 -0
- package/packages/solidjs-css/README.md +1 -1
- package/packages/solidjs-css/dist/index.cjs +343 -0
- package/packages/solidjs-css/dist/index.cjs.map +1 -0
- package/packages/solidjs-css/dist/index.d.cts +67 -0
- package/packages/solidjs-css/dist/index.d.ts +67 -0
- package/packages/solidjs-css/dist/index.js +326 -0
- package/packages/solidjs-css/dist/index.js.map +1 -0
- package/.changeset/config.json +0 -11
- package/.github/CODEOWNERS +0 -1
- package/.github/ISSUE_TEMPLATE/bug_report.md +0 -16
- package/.github/ISSUE_TEMPLATE/feature_request.md +0 -11
- package/.github/PULL_REQUEST_TEMPLATE.md +0 -10
- package/.github/dependabot.yml +0 -11
- package/.github/workflows/ci.yml +0 -23
- package/.github/workflows/release.yml +0 -29
- package/.nvmrc +0 -1
- package/.project/ACCOUNT.yaml +0 -4
- package/.project/IDEAS.yaml +0 -7
- package/.project/PROJECT.yaml +0 -11
- package/.project/ROADMAP.yaml +0 -15
- package/CODE_OF_CONDUCT.md +0 -16
- package/CONTRIBUTING.md +0 -26
- package/SECURITY.md +0 -15
- package/SUPPORT.md +0 -8
- package/packages/convex/package.json +0 -42
- package/packages/convex/src/adapter.ts +0 -39
- package/packages/convex/src/index.ts +0 -19
- package/packages/convex/src/mutations.ts +0 -142
- package/packages/convex/src/queries.ts +0 -106
- package/packages/convex/src/schema.ts +0 -54
- package/packages/convex/src/types.ts +0 -20
- package/packages/convex/tsconfig.json +0 -11
- package/packages/convex/tsup.config.ts +0 -10
- package/packages/react/package.json +0 -45
- package/packages/react/src/components/AdapterCard.tsx +0 -49
- package/packages/react/src/components/AdapterConfigForm.tsx +0 -118
- package/packages/react/src/components/AdapterList.tsx +0 -84
- package/packages/react/src/components/AdapterStatusBadge.tsx +0 -30
- package/packages/react/src/components/index.ts +0 -4
- package/packages/react/src/hooks/index.ts +0 -75
- package/packages/react/src/index.tsx +0 -44
- package/packages/react/src/pages/AdapterDetailPage.tsx +0 -133
- package/packages/react/src/pages/AdaptersPage.tsx +0 -111
- package/packages/react/src/pages/index.ts +0 -2
- package/packages/react/src/provider/AdapterProvider.tsx +0 -115
- package/packages/react/src/provider/index.ts +0 -2
- package/packages/react/tsconfig.json +0 -18
- package/packages/react/tsup.config.ts +0 -10
- package/packages/react-css/package.json +0 -44
- package/packages/react-css/src/adapters.css +0 -1576
- package/packages/react-css/src/components/AdapterCard.tsx +0 -34
- package/packages/react-css/src/components/AdapterConfigForm.tsx +0 -63
- package/packages/react-css/src/components/AdapterList.tsx +0 -40
- package/packages/react-css/src/components/AdapterStatusBadge.tsx +0 -21
- package/packages/react-css/src/components/index.ts +0 -4
- package/packages/react-css/src/hooks/index.ts +0 -75
- package/packages/react-css/src/index.tsx +0 -25
- package/packages/react-css/src/pages/AdapterDetailPage.tsx +0 -133
- package/packages/react-css/src/pages/AdaptersPage.tsx +0 -111
- package/packages/react-css/src/pages/index.ts +0 -2
- package/packages/react-css/src/provider/AdapterProvider.tsx +0 -115
- package/packages/react-css/src/provider/index.ts +0 -2
- package/packages/react-css/src/styles.css +0 -494
- package/packages/react-css/tsconfig.json +0 -19
- package/packages/react-css/tsup.config.ts +0 -2
- package/packages/shared/package.json +0 -39
- package/packages/shared/src/__tests__/adapters.test.ts +0 -545
- package/packages/shared/src/admin/index.ts +0 -2
- package/packages/shared/src/admin/interface.ts +0 -34
- package/packages/shared/src/admin/localStorage.ts +0 -109
- package/packages/shared/src/ai/anthropic.ts +0 -123
- package/packages/shared/src/ai/cloudflare-gateway.ts +0 -130
- package/packages/shared/src/ai/gemini.ts +0 -181
- package/packages/shared/src/ai/index.ts +0 -14
- package/packages/shared/src/ai/interface.ts +0 -11
- package/packages/shared/src/ai/localStorage.ts +0 -78
- package/packages/shared/src/ai/ollama.ts +0 -143
- package/packages/shared/src/ai/openai.ts +0 -120
- package/packages/shared/src/ai/vercel-ai.ts +0 -101
- package/packages/shared/src/auth/better-auth.ts +0 -118
- package/packages/shared/src/auth/clerk.ts +0 -151
- package/packages/shared/src/auth/convex-auth.ts +0 -125
- package/packages/shared/src/auth/index.ts +0 -10
- package/packages/shared/src/auth/interface.ts +0 -17
- package/packages/shared/src/auth/localStorage.ts +0 -125
- package/packages/shared/src/auth/supabase-auth.ts +0 -136
- package/packages/shared/src/config.ts +0 -57
- package/packages/shared/src/constants.ts +0 -122
- package/packages/shared/src/db/convex.ts +0 -146
- package/packages/shared/src/db/index.ts +0 -10
- package/packages/shared/src/db/interface.ts +0 -13
- package/packages/shared/src/db/localStorage.ts +0 -91
- package/packages/shared/src/db/mongodb.ts +0 -125
- package/packages/shared/src/db/neon.ts +0 -171
- package/packages/shared/src/db/supabase.ts +0 -158
- package/packages/shared/src/index.ts +0 -117
- package/packages/shared/src/payments/index.ts +0 -4
- package/packages/shared/src/payments/interface.ts +0 -11
- package/packages/shared/src/payments/localStorage.ts +0 -81
- package/packages/shared/src/payments/stripe.ts +0 -177
- package/packages/shared/src/storage/convex.ts +0 -113
- package/packages/shared/src/storage/index.ts +0 -14
- package/packages/shared/src/storage/interface.ts +0 -11
- package/packages/shared/src/storage/localStorage.ts +0 -95
- package/packages/shared/src/storage/minio.ts +0 -47
- package/packages/shared/src/storage/r2.ts +0 -123
- package/packages/shared/src/storage/s3.ts +0 -128
- package/packages/shared/src/storage/supabase-storage.ts +0 -116
- package/packages/shared/src/storage/uploadthing.ts +0 -126
- package/packages/shared/src/styles/adapters.css +0 -494
- package/packages/shared/src/tier-gate.ts +0 -119
- package/packages/shared/src/types.ts +0 -162
- package/packages/shared/tsconfig.json +0 -18
- package/packages/shared/tsup.config.ts +0 -9
- package/packages/shared/vitest.config.ts +0 -14
- package/packages/solidjs/package.json +0 -44
- package/packages/solidjs/src/components/AdapterCard.tsx +0 -24
- package/packages/solidjs/src/components/AdapterConfigForm.tsx +0 -54
- package/packages/solidjs/src/components/AdapterList.tsx +0 -28
- package/packages/solidjs/src/components/AdapterStatusBadge.tsx +0 -20
- package/packages/solidjs/src/components/index.ts +0 -4
- package/packages/solidjs/src/index.tsx +0 -17
- package/packages/solidjs/src/pages/AdapterDetailPage.tsx +0 -38
- package/packages/solidjs/src/pages/AdaptersPage.tsx +0 -39
- package/packages/solidjs/src/pages/index.ts +0 -2
- package/packages/solidjs/src/primitives/index.ts +0 -78
- package/packages/solidjs/src/provider/AdapterProvider.tsx +0 -62
- package/packages/solidjs/src/provider/index.ts +0 -2
- package/packages/solidjs/tsconfig.json +0 -20
- package/packages/solidjs/tsup.config.ts +0 -10
- package/packages/solidjs-css/package.json +0 -43
- package/packages/solidjs-css/src/adapters.css +0 -1576
- package/packages/solidjs-css/src/components/AdapterCard.tsx +0 -43
- package/packages/solidjs-css/src/components/AdapterConfigForm.tsx +0 -119
- package/packages/solidjs-css/src/components/AdapterList.tsx +0 -68
- package/packages/solidjs-css/src/components/AdapterStatusBadge.tsx +0 -24
- package/packages/solidjs-css/src/components/index.ts +0 -8
- package/packages/solidjs-css/src/index.tsx +0 -30
- package/packages/solidjs-css/src/pages/AdapterDetailPage.tsx +0 -107
- package/packages/solidjs-css/src/pages/AdaptersPage.tsx +0 -94
- package/packages/solidjs-css/src/pages/index.ts +0 -4
- package/packages/solidjs-css/src/primitives/index.ts +0 -1
- package/packages/solidjs-css/src/provider/AdapterProvider.tsx +0 -61
- package/packages/solidjs-css/src/provider/index.ts +0 -2
- package/packages/solidjs-css/tsconfig.json +0 -20
- package/packages/solidjs-css/tsup.config.ts +0 -2
- package/pnpm-workspace.yaml +0 -2
- package/tsconfig.json +0 -17
|
@@ -0,0 +1,611 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __defProp = Object.defineProperty;
|
|
3
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
4
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
5
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
6
|
+
var __export = (target, all) => {
|
|
7
|
+
for (var name in all)
|
|
8
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
9
|
+
};
|
|
10
|
+
var __copyProps = (to, from, except, desc) => {
|
|
11
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
12
|
+
for (let key of __getOwnPropNames(from))
|
|
13
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
14
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
15
|
+
}
|
|
16
|
+
return to;
|
|
17
|
+
};
|
|
18
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
19
|
+
|
|
20
|
+
// src/index.tsx
|
|
21
|
+
var index_exports = {};
|
|
22
|
+
__export(index_exports, {
|
|
23
|
+
ADAPTER_DOMAINS: () => import_adapters_shared7.ADAPTER_DOMAINS,
|
|
24
|
+
AdapterCard: () => AdapterCard,
|
|
25
|
+
AdapterConfigForm: () => AdapterConfigForm,
|
|
26
|
+
AdapterDetailPage: () => AdapterDetailPage,
|
|
27
|
+
AdapterList: () => AdapterList,
|
|
28
|
+
AdapterProvider: () => AdapterProvider,
|
|
29
|
+
AdapterStatusBadge: () => AdapterStatusBadge,
|
|
30
|
+
AdaptersPage: () => AdaptersPage,
|
|
31
|
+
DOMAIN_DESCRIPTIONS: () => import_adapters_shared7.DOMAIN_DESCRIPTIONS,
|
|
32
|
+
DOMAIN_ICONS: () => import_adapters_shared7.DOMAIN_ICONS,
|
|
33
|
+
DOMAIN_LABELS: () => import_adapters_shared7.DOMAIN_LABELS,
|
|
34
|
+
configureAdapters: () => import_adapters_shared7.configureAdapters,
|
|
35
|
+
getAdapterConfig: () => import_adapters_shared7.getAdapterConfig,
|
|
36
|
+
getProviderMeta: () => import_adapters_shared7.getProviderMeta,
|
|
37
|
+
getProvidersForDomain: () => import_adapters_shared7.getProvidersForDomain,
|
|
38
|
+
isAdaptersConfigured: () => import_adapters_shared7.isAdaptersConfigured,
|
|
39
|
+
useAdapterContext: () => useAdapterContext,
|
|
40
|
+
useAdapterStatus: () => useAdapterStatus,
|
|
41
|
+
useAdapterStatuses: () => useAdapterStatuses,
|
|
42
|
+
useAdapters: () => useAdapters,
|
|
43
|
+
useAdmin: () => useAdmin,
|
|
44
|
+
useAi: () => useAi,
|
|
45
|
+
useAuth: () => useAuth,
|
|
46
|
+
useDb: () => useDb,
|
|
47
|
+
useIsAdapterReady: () => useIsAdapterReady,
|
|
48
|
+
usePayments: () => usePayments,
|
|
49
|
+
useStorage: () => useStorage
|
|
50
|
+
});
|
|
51
|
+
module.exports = __toCommonJS(index_exports);
|
|
52
|
+
var import_adapters_shared7 = require("@geenius/adapters-shared");
|
|
53
|
+
|
|
54
|
+
// src/provider/AdapterProvider.tsx
|
|
55
|
+
var import_react = require("react");
|
|
56
|
+
var import_adapters_shared = require("@geenius/adapters-shared");
|
|
57
|
+
var import_jsx_runtime = require("react/jsx-runtime");
|
|
58
|
+
var AdapterContext = (0, import_react.createContext)(null);
|
|
59
|
+
function AdapterProvider({ adapters, children, healthCheck = false }) {
|
|
60
|
+
const [isLoading, setIsLoading] = (0, import_react.useState)(healthCheck);
|
|
61
|
+
const [statuses, setStatuses] = (0, import_react.useState)(() => {
|
|
62
|
+
const initial = {};
|
|
63
|
+
for (const domain of import_adapters_shared.ADAPTER_DOMAINS) {
|
|
64
|
+
const adapter = adapters[domain];
|
|
65
|
+
initial[domain] = {
|
|
66
|
+
domain,
|
|
67
|
+
provider: adapter ? "configured" : "none",
|
|
68
|
+
status: adapter ? "connected" : "disconnected",
|
|
69
|
+
lastCheckedAt: Date.now()
|
|
70
|
+
};
|
|
71
|
+
}
|
|
72
|
+
return initial;
|
|
73
|
+
});
|
|
74
|
+
(0, import_react.useEffect)(() => {
|
|
75
|
+
if (!healthCheck) return;
|
|
76
|
+
setIsLoading(true);
|
|
77
|
+
const checks = import_adapters_shared.ADAPTER_DOMAINS.map(async (domain) => {
|
|
78
|
+
const adapter = adapters[domain];
|
|
79
|
+
if (!adapter) return;
|
|
80
|
+
try {
|
|
81
|
+
setStatuses((prev) => ({ ...prev, [domain]: { ...prev[domain], status: "initializing" } }));
|
|
82
|
+
if (domain === "auth" && adapter.getSession) {
|
|
83
|
+
await adapter.getSession();
|
|
84
|
+
}
|
|
85
|
+
setStatuses((prev) => ({
|
|
86
|
+
...prev,
|
|
87
|
+
[domain]: { ...prev[domain], status: "connected", lastCheckedAt: Date.now() }
|
|
88
|
+
}));
|
|
89
|
+
} catch (e) {
|
|
90
|
+
setStatuses((prev) => ({
|
|
91
|
+
...prev,
|
|
92
|
+
[domain]: {
|
|
93
|
+
...prev[domain],
|
|
94
|
+
status: "error",
|
|
95
|
+
error: e instanceof Error ? e.message : "Health check failed",
|
|
96
|
+
lastCheckedAt: Date.now()
|
|
97
|
+
}
|
|
98
|
+
}));
|
|
99
|
+
}
|
|
100
|
+
});
|
|
101
|
+
Promise.allSettled(checks).finally(() => setIsLoading(false));
|
|
102
|
+
}, [adapters, healthCheck]);
|
|
103
|
+
const getAdapter = (0, import_react.useCallback)((domain) => {
|
|
104
|
+
const adapter = adapters[domain];
|
|
105
|
+
if (!adapter) throw new Error(`${import_adapters_shared.DOMAIN_LABELS[domain] ?? domain} adapter not configured in <AdapterProvider>`);
|
|
106
|
+
return adapter;
|
|
107
|
+
}, [adapters]);
|
|
108
|
+
const isReady = (0, import_react.useCallback)((domain) => {
|
|
109
|
+
return !!adapters[domain] && statuses[domain]?.status === "connected";
|
|
110
|
+
}, [adapters, statuses]);
|
|
111
|
+
const value = (0, import_react.useMemo)(() => ({
|
|
112
|
+
adapters,
|
|
113
|
+
statuses,
|
|
114
|
+
getAdapter,
|
|
115
|
+
isReady,
|
|
116
|
+
isLoading
|
|
117
|
+
}), [adapters, statuses, getAdapter, isReady, isLoading]);
|
|
118
|
+
return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(AdapterContext.Provider, { value, children });
|
|
119
|
+
}
|
|
120
|
+
function useAdapterContext() {
|
|
121
|
+
const ctx = (0, import_react.useContext)(AdapterContext);
|
|
122
|
+
if (!ctx) throw new Error("useAdapterContext must be used within <AdapterProvider>");
|
|
123
|
+
return ctx;
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
// src/hooks/index.ts
|
|
127
|
+
var import_react2 = require("react");
|
|
128
|
+
function useDb() {
|
|
129
|
+
return useAdapterContext().getAdapter("db");
|
|
130
|
+
}
|
|
131
|
+
function useAuth() {
|
|
132
|
+
return useAdapterContext().getAdapter("auth");
|
|
133
|
+
}
|
|
134
|
+
function usePayments() {
|
|
135
|
+
return useAdapterContext().getAdapter("payments");
|
|
136
|
+
}
|
|
137
|
+
function useAi() {
|
|
138
|
+
return useAdapterContext().getAdapter("ai");
|
|
139
|
+
}
|
|
140
|
+
function useStorage() {
|
|
141
|
+
return useAdapterContext().getAdapter("storage");
|
|
142
|
+
}
|
|
143
|
+
function useAdmin() {
|
|
144
|
+
return useAdapterContext().getAdapter("admin");
|
|
145
|
+
}
|
|
146
|
+
function useAdapterStatuses() {
|
|
147
|
+
return useAdapterContext().statuses;
|
|
148
|
+
}
|
|
149
|
+
function useAdapterStatus(domain) {
|
|
150
|
+
return useAdapterContext().statuses[domain];
|
|
151
|
+
}
|
|
152
|
+
function useIsAdapterReady(domain) {
|
|
153
|
+
return useAdapterContext().isReady(domain);
|
|
154
|
+
}
|
|
155
|
+
function useAdapters() {
|
|
156
|
+
const ctx = useAdapterContext();
|
|
157
|
+
return (0, import_react2.useMemo)(() => ({
|
|
158
|
+
db: ctx.adapters.db,
|
|
159
|
+
auth: ctx.adapters.auth,
|
|
160
|
+
payments: ctx.adapters.payments,
|
|
161
|
+
ai: ctx.adapters.ai,
|
|
162
|
+
storage: ctx.adapters.storage,
|
|
163
|
+
admin: ctx.adapters.admin,
|
|
164
|
+
statuses: ctx.statuses,
|
|
165
|
+
isLoading: ctx.isLoading,
|
|
166
|
+
isReady: ctx.isReady
|
|
167
|
+
}), [ctx]);
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
// src/components/AdapterStatusBadge.tsx
|
|
171
|
+
var import_jsx_runtime2 = require("react/jsx-runtime");
|
|
172
|
+
var STATUS_STYLES = {
|
|
173
|
+
connected: { bg: "bg-emerald-500/10", text: "text-emerald-400", dot: "bg-emerald-400", label: "Connected" },
|
|
174
|
+
disconnected: { bg: "bg-white/5", text: "text-white/40", dot: "bg-white/30", label: "Disconnected" },
|
|
175
|
+
error: { bg: "bg-red-500/10", text: "text-red-400", dot: "bg-red-400", label: "Error" },
|
|
176
|
+
initializing: { bg: "bg-amber-500/10", text: "text-amber-400", dot: "bg-amber-400", label: "Initializing" }
|
|
177
|
+
};
|
|
178
|
+
function AdapterStatusBadge({ status, showLabel = true, size = "sm", className = "" }) {
|
|
179
|
+
const s = STATUS_STYLES[status];
|
|
180
|
+
const dotSize = size === "sm" ? "h-1.5 w-1.5" : "h-2 w-2";
|
|
181
|
+
const textSize = size === "sm" ? "text-[0.625rem]" : "text-xs";
|
|
182
|
+
return /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("span", { className: `inline-flex items-center gap-1.5 rounded-full px-2 py-0.5 ${s.bg} ${className}`, children: [
|
|
183
|
+
/* @__PURE__ */ (0, import_jsx_runtime2.jsx)("span", { className: `${dotSize} rounded-full ${s.dot} ${status === "initializing" ? "animate-pulse" : ""}` }),
|
|
184
|
+
showLabel && /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("span", { className: `${textSize} font-semibold uppercase tracking-wider ${s.text}`, children: s.label })
|
|
185
|
+
] });
|
|
186
|
+
}
|
|
187
|
+
|
|
188
|
+
// src/components/AdapterCard.tsx
|
|
189
|
+
var import_adapters_shared2 = require("@geenius/adapters-shared");
|
|
190
|
+
var import_jsx_runtime3 = require("react/jsx-runtime");
|
|
191
|
+
function AdapterCard({ domain, status, onClick, className = "" }) {
|
|
192
|
+
const label = import_adapters_shared2.DOMAIN_LABELS[domain];
|
|
193
|
+
const icon = import_adapters_shared2.DOMAIN_ICONS[domain];
|
|
194
|
+
const desc = import_adapters_shared2.DOMAIN_DESCRIPTIONS[domain];
|
|
195
|
+
return /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)(
|
|
196
|
+
"button",
|
|
197
|
+
{
|
|
198
|
+
type: "button",
|
|
199
|
+
onClick,
|
|
200
|
+
className: `group flex w-full items-start gap-4 rounded-2xl border border-white/10 bg-white/[0.03] p-5 text-left backdrop-blur-sm transition-all hover:border-white/15 hover:bg-white/[0.05] ${className}`,
|
|
201
|
+
"aria-label": `${label} adapter \u2014 ${status.status}`,
|
|
202
|
+
children: [
|
|
203
|
+
/* @__PURE__ */ (0, import_jsx_runtime3.jsx)("div", { className: "flex h-12 w-12 flex-shrink-0 items-center justify-center rounded-xl bg-white/5 text-2xl transition-transform group-hover:scale-105", children: icon }),
|
|
204
|
+
/* @__PURE__ */ (0, import_jsx_runtime3.jsxs)("div", { className: "min-w-0 flex-1", children: [
|
|
205
|
+
/* @__PURE__ */ (0, import_jsx_runtime3.jsxs)("div", { className: "flex items-center justify-between gap-2", children: [
|
|
206
|
+
/* @__PURE__ */ (0, import_jsx_runtime3.jsx)("h3", { className: "truncate text-sm font-bold text-white/90", children: label }),
|
|
207
|
+
/* @__PURE__ */ (0, import_jsx_runtime3.jsx)(AdapterStatusBadge, { status: status.status })
|
|
208
|
+
] }),
|
|
209
|
+
/* @__PURE__ */ (0, import_jsx_runtime3.jsx)("p", { className: "mt-0.5 text-xs text-white/40 line-clamp-2", children: desc }),
|
|
210
|
+
status.provider && status.provider !== "none" && /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)("div", { className: "mt-2 flex items-center gap-2", children: [
|
|
211
|
+
/* @__PURE__ */ (0, import_jsx_runtime3.jsx)("span", { className: "rounded-md bg-white/5 px-2 py-0.5 text-[0.625rem] font-semibold text-white/50", children: status.provider }),
|
|
212
|
+
status.latency && /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)("span", { className: "text-[0.625rem] text-white/30", children: [
|
|
213
|
+
status.latency,
|
|
214
|
+
"ms"
|
|
215
|
+
] })
|
|
216
|
+
] }),
|
|
217
|
+
status.error && /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("p", { className: "mt-1.5 truncate text-[0.625rem] text-red-400/80", children: status.error })
|
|
218
|
+
] })
|
|
219
|
+
]
|
|
220
|
+
}
|
|
221
|
+
);
|
|
222
|
+
}
|
|
223
|
+
|
|
224
|
+
// src/components/AdapterList.tsx
|
|
225
|
+
var import_react3 = require("react");
|
|
226
|
+
var import_adapters_shared3 = require("@geenius/adapters-shared");
|
|
227
|
+
var import_jsx_runtime4 = require("react/jsx-runtime");
|
|
228
|
+
function AdapterList({ onSelect, filterStatus, className = "" }) {
|
|
229
|
+
const { statuses, isLoading } = useAdapters();
|
|
230
|
+
const [search, setSearch] = (0, import_react3.useState)("");
|
|
231
|
+
const filteredDomains = (0, import_react3.useMemo)(() => {
|
|
232
|
+
let domains = [...import_adapters_shared3.ADAPTER_DOMAINS];
|
|
233
|
+
if (search) {
|
|
234
|
+
const q = search.toLowerCase();
|
|
235
|
+
domains = domains.filter((d) => {
|
|
236
|
+
const label = import_adapters_shared3.DOMAIN_LABELS[d].toLowerCase();
|
|
237
|
+
const provider = statuses[d]?.provider?.toLowerCase() ?? "";
|
|
238
|
+
return label.includes(q) || provider.includes(q) || d.includes(q);
|
|
239
|
+
});
|
|
240
|
+
}
|
|
241
|
+
if (filterStatus) {
|
|
242
|
+
domains = domains.filter((d) => statuses[d]?.status === filterStatus);
|
|
243
|
+
}
|
|
244
|
+
return domains;
|
|
245
|
+
}, [search, filterStatus, statuses]);
|
|
246
|
+
if (isLoading) {
|
|
247
|
+
return /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("div", { className: `space-y-3 ${className}`, role: "status", "aria-label": "Loading adapters", children: [1, 2, 3, 4].map((i) => /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("div", { className: "animate-pulse rounded-2xl border border-white/5 bg-white/[0.02] p-5", children: /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)("div", { className: "flex items-start gap-4", children: [
|
|
248
|
+
/* @__PURE__ */ (0, import_jsx_runtime4.jsx)("div", { className: "h-12 w-12 rounded-xl bg-white/10" }),
|
|
249
|
+
/* @__PURE__ */ (0, import_jsx_runtime4.jsxs)("div", { className: "flex-1 space-y-2", children: [
|
|
250
|
+
/* @__PURE__ */ (0, import_jsx_runtime4.jsx)("div", { className: "h-3 w-24 rounded bg-white/10" }),
|
|
251
|
+
/* @__PURE__ */ (0, import_jsx_runtime4.jsx)("div", { className: "h-2 w-48 rounded bg-white/5" })
|
|
252
|
+
] })
|
|
253
|
+
] }) }, i)) });
|
|
254
|
+
}
|
|
255
|
+
return /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)("div", { className, children: [
|
|
256
|
+
/* @__PURE__ */ (0, import_jsx_runtime4.jsx)("div", { className: "mb-4", children: /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(
|
|
257
|
+
"input",
|
|
258
|
+
{
|
|
259
|
+
type: "text",
|
|
260
|
+
value: search,
|
|
261
|
+
onChange: (e) => setSearch(e.target.value),
|
|
262
|
+
placeholder: "Search adapters...",
|
|
263
|
+
"aria-label": "Search adapters",
|
|
264
|
+
className: "w-full rounded-xl border border-white/10 bg-white/[0.02] px-4 py-2.5 text-sm text-white/90 placeholder:text-white/20 focus:border-indigo-500/50 focus:outline-none focus:ring-2 focus:ring-indigo-500/20"
|
|
265
|
+
}
|
|
266
|
+
) }),
|
|
267
|
+
filteredDomains.length === 0 ? /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("div", { className: "rounded-xl border border-white/5 bg-white/[0.01] p-8 text-center", children: /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("p", { className: "text-sm text-white/40", children: search ? "No adapters match your search" : "No adapters configured" }) }) : /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("div", { className: "grid gap-3 sm:grid-cols-2", role: "list", "aria-label": "Adapter list", children: filteredDomains.map((domain) => /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(
|
|
268
|
+
AdapterCard,
|
|
269
|
+
{
|
|
270
|
+
domain,
|
|
271
|
+
status: statuses[domain],
|
|
272
|
+
onClick: () => onSelect?.(domain)
|
|
273
|
+
},
|
|
274
|
+
domain
|
|
275
|
+
)) })
|
|
276
|
+
] });
|
|
277
|
+
}
|
|
278
|
+
|
|
279
|
+
// src/components/AdapterConfigForm.tsx
|
|
280
|
+
var import_react4 = require("react");
|
|
281
|
+
var import_adapters_shared4 = require("@geenius/adapters-shared");
|
|
282
|
+
var import_jsx_runtime5 = require("react/jsx-runtime");
|
|
283
|
+
function AdapterConfigForm({ domain, initialConfig, onSave, onCancel, className = "" }) {
|
|
284
|
+
const providers = (0, import_adapters_shared4.getProvidersForDomain)(domain);
|
|
285
|
+
const [provider, setProvider] = (0, import_react4.useState)(initialConfig?.provider ?? providers[0]?.id ?? "");
|
|
286
|
+
const [apiKey, setApiKey] = (0, import_react4.useState)(initialConfig?.apiKey ?? "");
|
|
287
|
+
const [baseUrl, setBaseUrl] = (0, import_react4.useState)(initialConfig?.baseUrl ?? "");
|
|
288
|
+
const [isSaving, setIsSaving] = (0, import_react4.useState)(false);
|
|
289
|
+
const [error, setError] = (0, import_react4.useState)(null);
|
|
290
|
+
const selectedMeta = providers.find((p) => p.id === provider);
|
|
291
|
+
const needsApiKey = !["localStorage", "noop"].includes(provider);
|
|
292
|
+
const needsBaseUrl = ["ollama", "minio", "neon", "supabase"].includes(provider);
|
|
293
|
+
const handleSubmit = async (e) => {
|
|
294
|
+
e.preventDefault();
|
|
295
|
+
setError(null);
|
|
296
|
+
if (!provider) {
|
|
297
|
+
setError("Select a provider");
|
|
298
|
+
return;
|
|
299
|
+
}
|
|
300
|
+
if (needsApiKey && !apiKey.trim()) {
|
|
301
|
+
setError("API key is required");
|
|
302
|
+
return;
|
|
303
|
+
}
|
|
304
|
+
setIsSaving(true);
|
|
305
|
+
try {
|
|
306
|
+
await onSave({ provider, apiKey: apiKey || void 0, baseUrl: baseUrl || void 0 });
|
|
307
|
+
} catch (e2) {
|
|
308
|
+
setError(e2 instanceof Error ? e2.message : "Failed to save");
|
|
309
|
+
} finally {
|
|
310
|
+
setIsSaving(false);
|
|
311
|
+
}
|
|
312
|
+
};
|
|
313
|
+
return /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)("form", { onSubmit: handleSubmit, className: `space-y-5 rounded-2xl border border-white/10 bg-white/[0.03] p-6 backdrop-blur-sm ${className}`, noValidate: true, children: [
|
|
314
|
+
/* @__PURE__ */ (0, import_jsx_runtime5.jsxs)("div", { children: [
|
|
315
|
+
/* @__PURE__ */ (0, import_jsx_runtime5.jsxs)("h3", { className: "text-lg font-bold text-white/90", children: [
|
|
316
|
+
"Configure ",
|
|
317
|
+
import_adapters_shared4.DOMAIN_LABELS[domain]
|
|
318
|
+
] }),
|
|
319
|
+
/* @__PURE__ */ (0, import_jsx_runtime5.jsx)("p", { className: "mt-1 text-xs text-white/40", children: "Select and configure your preferred provider." })
|
|
320
|
+
] }),
|
|
321
|
+
error && /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("div", { className: "rounded-lg border border-red-500/20 bg-red-500/10 px-4 py-3 text-sm text-red-400", role: "alert", children: error }),
|
|
322
|
+
/* @__PURE__ */ (0, import_jsx_runtime5.jsxs)("div", { children: [
|
|
323
|
+
/* @__PURE__ */ (0, import_jsx_runtime5.jsx)("label", { htmlFor: `adapter-${domain}-provider`, className: "mb-1.5 block text-xs font-semibold uppercase tracking-wider text-white/40", children: "Provider" }),
|
|
324
|
+
/* @__PURE__ */ (0, import_jsx_runtime5.jsx)("div", { className: "grid gap-2 sm:grid-cols-2", children: providers.map((p) => /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)(
|
|
325
|
+
"button",
|
|
326
|
+
{
|
|
327
|
+
type: "button",
|
|
328
|
+
onClick: () => setProvider(p.id),
|
|
329
|
+
className: `flex flex-col rounded-xl border p-3 text-left transition-all ${provider === p.id ? "border-indigo-500/30 bg-indigo-500/10" : "border-white/10 bg-white/[0.02] hover:bg-white/[0.04]"}`,
|
|
330
|
+
children: [
|
|
331
|
+
/* @__PURE__ */ (0, import_jsx_runtime5.jsx)("span", { className: "text-xs font-semibold text-white/80", children: p.name }),
|
|
332
|
+
/* @__PURE__ */ (0, import_jsx_runtime5.jsx)("span", { className: "mt-0.5 text-[0.625rem] text-white/40", children: p.description }),
|
|
333
|
+
/* @__PURE__ */ (0, import_jsx_runtime5.jsx)("span", { className: `mt-1 self-start rounded px-1.5 py-0.5 text-[0.5625rem] font-bold uppercase ${p.tier === "pronto" ? "bg-emerald-500/10 text-emerald-400" : p.tier === "lancio" ? "bg-blue-500/10 text-blue-400" : "bg-purple-500/10 text-purple-400"}`, children: p.tier })
|
|
334
|
+
]
|
|
335
|
+
},
|
|
336
|
+
p.id
|
|
337
|
+
)) })
|
|
338
|
+
] }),
|
|
339
|
+
needsApiKey && /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)("div", { children: [
|
|
340
|
+
/* @__PURE__ */ (0, import_jsx_runtime5.jsx)("label", { htmlFor: `adapter-${domain}-apiKey`, className: "mb-1.5 block text-xs font-semibold uppercase tracking-wider text-white/40", children: "API Key" }),
|
|
341
|
+
/* @__PURE__ */ (0, import_jsx_runtime5.jsx)(
|
|
342
|
+
"input",
|
|
343
|
+
{
|
|
344
|
+
id: `adapter-${domain}-apiKey`,
|
|
345
|
+
type: "password",
|
|
346
|
+
value: apiKey,
|
|
347
|
+
onChange: (e) => setApiKey(e.target.value),
|
|
348
|
+
placeholder: `Enter ${selectedMeta?.name ?? provider} API key`,
|
|
349
|
+
autoComplete: "off",
|
|
350
|
+
className: "w-full rounded-xl border border-white/10 bg-white/[0.02] px-4 py-3 text-sm text-white/90 placeholder:text-white/20 focus:border-indigo-500/50 focus:outline-none focus:ring-2 focus:ring-indigo-500/20"
|
|
351
|
+
}
|
|
352
|
+
)
|
|
353
|
+
] }),
|
|
354
|
+
needsBaseUrl && /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)("div", { children: [
|
|
355
|
+
/* @__PURE__ */ (0, import_jsx_runtime5.jsx)("label", { htmlFor: `adapter-${domain}-url`, className: "mb-1.5 block text-xs font-semibold uppercase tracking-wider text-white/40", children: "Base URL" }),
|
|
356
|
+
/* @__PURE__ */ (0, import_jsx_runtime5.jsx)(
|
|
357
|
+
"input",
|
|
358
|
+
{
|
|
359
|
+
id: `adapter-${domain}-url`,
|
|
360
|
+
type: "url",
|
|
361
|
+
value: baseUrl,
|
|
362
|
+
onChange: (e) => setBaseUrl(e.target.value),
|
|
363
|
+
placeholder: `https://...`,
|
|
364
|
+
className: "w-full rounded-xl border border-white/10 bg-white/[0.02] px-4 py-3 text-sm text-white/90 placeholder:text-white/20 focus:border-indigo-500/50 focus:outline-none focus:ring-2 focus:ring-indigo-500/20"
|
|
365
|
+
}
|
|
366
|
+
)
|
|
367
|
+
] }),
|
|
368
|
+
/* @__PURE__ */ (0, import_jsx_runtime5.jsxs)("div", { className: "flex items-center justify-end gap-3 pt-2", children: [
|
|
369
|
+
onCancel && /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("button", { type: "button", onClick: onCancel, className: "rounded-xl px-5 py-2.5 text-sm font-semibold text-white/50 hover:text-white/70", children: "Cancel" }),
|
|
370
|
+
/* @__PURE__ */ (0, import_jsx_runtime5.jsx)(
|
|
371
|
+
"button",
|
|
372
|
+
{
|
|
373
|
+
type: "submit",
|
|
374
|
+
disabled: isSaving || !provider,
|
|
375
|
+
className: "flex items-center gap-2 rounded-xl bg-indigo-500 px-6 py-2.5 text-sm font-semibold text-white hover:bg-indigo-400 disabled:opacity-50",
|
|
376
|
+
children: isSaving ? "Saving\u2026" : "Save Configuration"
|
|
377
|
+
}
|
|
378
|
+
)
|
|
379
|
+
] })
|
|
380
|
+
] });
|
|
381
|
+
}
|
|
382
|
+
|
|
383
|
+
// src/pages/AdaptersPage.tsx
|
|
384
|
+
var import_react5 = require("react");
|
|
385
|
+
var import_adapters_shared5 = require("@geenius/adapters-shared");
|
|
386
|
+
var import_jsx_runtime6 = require("react/jsx-runtime");
|
|
387
|
+
function AdaptersPage({ onNavigateDetail, className = "" }) {
|
|
388
|
+
const { statuses, isLoading } = useAdapters();
|
|
389
|
+
const [selectedDomain, setSelectedDomain] = (0, import_react5.useState)(null);
|
|
390
|
+
const [filterStatus, setFilterStatus] = (0, import_react5.useState)();
|
|
391
|
+
const counts = {
|
|
392
|
+
connected: import_adapters_shared5.ADAPTER_DOMAINS.filter((d) => statuses[d]?.status === "connected").length,
|
|
393
|
+
error: import_adapters_shared5.ADAPTER_DOMAINS.filter((d) => statuses[d]?.status === "error").length,
|
|
394
|
+
total: import_adapters_shared5.ADAPTER_DOMAINS.length
|
|
395
|
+
};
|
|
396
|
+
if (isLoading) {
|
|
397
|
+
return /* @__PURE__ */ (0, import_jsx_runtime6.jsx)("div", { className: `max-w-4xl mx-auto space-y-6 ${className}`, children: /* @__PURE__ */ (0, import_jsx_runtime6.jsxs)("div", { className: "animate-pulse space-y-4", children: [
|
|
398
|
+
/* @__PURE__ */ (0, import_jsx_runtime6.jsx)("div", { className: "h-8 w-48 rounded bg-white/10" }),
|
|
399
|
+
/* @__PURE__ */ (0, import_jsx_runtime6.jsx)("div", { className: "h-4 w-72 rounded bg-white/5" }),
|
|
400
|
+
/* @__PURE__ */ (0, import_jsx_runtime6.jsx)("div", { className: "grid gap-3 sm:grid-cols-3", children: [1, 2, 3].map((i) => /* @__PURE__ */ (0, import_jsx_runtime6.jsx)("div", { className: "h-20 rounded-2xl bg-white/[0.03]" }, i)) }),
|
|
401
|
+
/* @__PURE__ */ (0, import_jsx_runtime6.jsx)("div", { className: "grid gap-3 sm:grid-cols-2", children: [1, 2, 3, 4].map((i) => /* @__PURE__ */ (0, import_jsx_runtime6.jsx)("div", { className: "h-28 rounded-2xl bg-white/[0.03]" }, i)) })
|
|
402
|
+
] }) });
|
|
403
|
+
}
|
|
404
|
+
return /* @__PURE__ */ (0, import_jsx_runtime6.jsxs)("div", { className: `max-w-4xl mx-auto space-y-8 ${className}`, children: [
|
|
405
|
+
/* @__PURE__ */ (0, import_jsx_runtime6.jsxs)("div", { children: [
|
|
406
|
+
/* @__PURE__ */ (0, import_jsx_runtime6.jsx)("h1", { className: "text-2xl font-extrabold text-white/95 tracking-tight", children: "Adapters" }),
|
|
407
|
+
/* @__PURE__ */ (0, import_jsx_runtime6.jsx)("p", { className: "mt-1 text-sm text-white/40", children: "Manage your infrastructure adapters \u2014 database, auth, AI, storage, payments, and admin." })
|
|
408
|
+
] }),
|
|
409
|
+
/* @__PURE__ */ (0, import_jsx_runtime6.jsxs)("div", { className: "grid gap-3 sm:grid-cols-3", children: [
|
|
410
|
+
/* @__PURE__ */ (0, import_jsx_runtime6.jsxs)("div", { className: "rounded-2xl border border-white/10 bg-white/[0.03] p-4 backdrop-blur-sm", children: [
|
|
411
|
+
/* @__PURE__ */ (0, import_jsx_runtime6.jsx)("p", { className: "text-xs font-semibold uppercase tracking-wider text-white/30", children: "Total" }),
|
|
412
|
+
/* @__PURE__ */ (0, import_jsx_runtime6.jsx)("p", { className: "mt-1 text-2xl font-extrabold text-white/90", children: counts.total }),
|
|
413
|
+
/* @__PURE__ */ (0, import_jsx_runtime6.jsx)("p", { className: "text-[0.625rem] text-white/30", children: "adapter domains" })
|
|
414
|
+
] }),
|
|
415
|
+
/* @__PURE__ */ (0, import_jsx_runtime6.jsxs)("div", { className: "rounded-2xl border border-emerald-500/10 bg-emerald-500/[0.03] p-4 backdrop-blur-sm", children: [
|
|
416
|
+
/* @__PURE__ */ (0, import_jsx_runtime6.jsx)("p", { className: "text-xs font-semibold uppercase tracking-wider text-emerald-400/60", children: "Connected" }),
|
|
417
|
+
/* @__PURE__ */ (0, import_jsx_runtime6.jsx)("p", { className: "mt-1 text-2xl font-extrabold text-emerald-400", children: counts.connected }),
|
|
418
|
+
/* @__PURE__ */ (0, import_jsx_runtime6.jsx)("p", { className: "text-[0.625rem] text-emerald-400/40", children: "active adapters" })
|
|
419
|
+
] }),
|
|
420
|
+
counts.error > 0 && /* @__PURE__ */ (0, import_jsx_runtime6.jsxs)("div", { className: "rounded-2xl border border-red-500/10 bg-red-500/[0.03] p-4 backdrop-blur-sm", children: [
|
|
421
|
+
/* @__PURE__ */ (0, import_jsx_runtime6.jsx)("p", { className: "text-xs font-semibold uppercase tracking-wider text-red-400/60", children: "Errors" }),
|
|
422
|
+
/* @__PURE__ */ (0, import_jsx_runtime6.jsx)("p", { className: "mt-1 text-2xl font-extrabold text-red-400", children: counts.error }),
|
|
423
|
+
/* @__PURE__ */ (0, import_jsx_runtime6.jsx)("p", { className: "text-[0.625rem] text-red-400/40", children: "need attention" })
|
|
424
|
+
] })
|
|
425
|
+
] }),
|
|
426
|
+
/* @__PURE__ */ (0, import_jsx_runtime6.jsxs)("div", { className: "flex items-center gap-2", children: [
|
|
427
|
+
/* @__PURE__ */ (0, import_jsx_runtime6.jsx)(
|
|
428
|
+
"button",
|
|
429
|
+
{
|
|
430
|
+
onClick: () => setFilterStatus(void 0),
|
|
431
|
+
className: `rounded-lg px-3 py-1.5 text-xs font-semibold transition-all ${!filterStatus ? "bg-white/10 text-white/80" : "text-white/30 hover:text-white/50"}`,
|
|
432
|
+
children: "All"
|
|
433
|
+
}
|
|
434
|
+
),
|
|
435
|
+
import_adapters_shared5.ADAPTER_STATUSES.map((s) => /* @__PURE__ */ (0, import_jsx_runtime6.jsxs)(
|
|
436
|
+
"button",
|
|
437
|
+
{
|
|
438
|
+
onClick: () => setFilterStatus(s),
|
|
439
|
+
className: `flex items-center gap-1.5 rounded-lg px-3 py-1.5 text-xs font-semibold transition-all ${filterStatus === s ? "bg-white/10 text-white/80" : "text-white/30 hover:text-white/50"}`,
|
|
440
|
+
children: [
|
|
441
|
+
/* @__PURE__ */ (0, import_jsx_runtime6.jsx)(AdapterStatusBadge, { status: s, showLabel: false, size: "sm" }),
|
|
442
|
+
s
|
|
443
|
+
]
|
|
444
|
+
},
|
|
445
|
+
s
|
|
446
|
+
))
|
|
447
|
+
] }),
|
|
448
|
+
/* @__PURE__ */ (0, import_jsx_runtime6.jsx)(
|
|
449
|
+
AdapterList,
|
|
450
|
+
{
|
|
451
|
+
onSelect: (domain) => {
|
|
452
|
+
if (onNavigateDetail) {
|
|
453
|
+
onNavigateDetail(domain);
|
|
454
|
+
} else {
|
|
455
|
+
setSelectedDomain(domain);
|
|
456
|
+
}
|
|
457
|
+
},
|
|
458
|
+
filterStatus
|
|
459
|
+
}
|
|
460
|
+
),
|
|
461
|
+
selectedDomain && /* @__PURE__ */ (0, import_jsx_runtime6.jsx)("div", { className: "fixed inset-0 z-50 flex items-center justify-center bg-black/60 backdrop-blur-sm", onClick: () => setSelectedDomain(null), children: /* @__PURE__ */ (0, import_jsx_runtime6.jsx)("div", { className: "max-w-lg w-full mx-4", onClick: (e) => e.stopPropagation(), children: /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(
|
|
462
|
+
AdapterConfigForm,
|
|
463
|
+
{
|
|
464
|
+
domain: selectedDomain,
|
|
465
|
+
onSave: async () => {
|
|
466
|
+
setSelectedDomain(null);
|
|
467
|
+
},
|
|
468
|
+
onCancel: () => setSelectedDomain(null)
|
|
469
|
+
}
|
|
470
|
+
) }) })
|
|
471
|
+
] });
|
|
472
|
+
}
|
|
473
|
+
|
|
474
|
+
// src/pages/AdapterDetailPage.tsx
|
|
475
|
+
var import_react6 = require("react");
|
|
476
|
+
var import_adapters_shared6 = require("@geenius/adapters-shared");
|
|
477
|
+
var import_jsx_runtime7 = require("react/jsx-runtime");
|
|
478
|
+
function AdapterDetailPage({ domain, onBack, className = "" }) {
|
|
479
|
+
const { isLoading } = useAdapters();
|
|
480
|
+
const status = useAdapterStatus(domain);
|
|
481
|
+
const [isEditing, setIsEditing] = (0, import_react6.useState)(false);
|
|
482
|
+
const providers = (0, import_adapters_shared6.getProvidersForDomain)(domain);
|
|
483
|
+
const label = import_adapters_shared6.DOMAIN_LABELS[domain];
|
|
484
|
+
const icon = import_adapters_shared6.DOMAIN_ICONS[domain];
|
|
485
|
+
const desc = import_adapters_shared6.DOMAIN_DESCRIPTIONS[domain];
|
|
486
|
+
if (isLoading) {
|
|
487
|
+
return /* @__PURE__ */ (0, import_jsx_runtime7.jsx)("div", { className: `max-w-3xl mx-auto space-y-6 ${className}`, children: /* @__PURE__ */ (0, import_jsx_runtime7.jsxs)("div", { className: "animate-pulse space-y-4", children: [
|
|
488
|
+
/* @__PURE__ */ (0, import_jsx_runtime7.jsx)("div", { className: "h-6 w-32 rounded bg-white/10" }),
|
|
489
|
+
/* @__PURE__ */ (0, import_jsx_runtime7.jsx)("div", { className: "h-40 rounded-2xl bg-white/[0.03]" }),
|
|
490
|
+
/* @__PURE__ */ (0, import_jsx_runtime7.jsx)("div", { className: "h-60 rounded-2xl bg-white/[0.03]" })
|
|
491
|
+
] }) });
|
|
492
|
+
}
|
|
493
|
+
return /* @__PURE__ */ (0, import_jsx_runtime7.jsxs)("div", { className: `max-w-3xl mx-auto space-y-8 ${className}`, children: [
|
|
494
|
+
onBack && /* @__PURE__ */ (0, import_jsx_runtime7.jsxs)("button", { onClick: onBack, className: "flex items-center gap-1.5 text-sm text-white/30 hover:text-white/60 transition-colors", children: [
|
|
495
|
+
/* @__PURE__ */ (0, import_jsx_runtime7.jsx)("span", { children: "\u2190" }),
|
|
496
|
+
" Back to Adapters"
|
|
497
|
+
] }),
|
|
498
|
+
/* @__PURE__ */ (0, import_jsx_runtime7.jsxs)("div", { className: "flex items-start gap-5", children: [
|
|
499
|
+
/* @__PURE__ */ (0, import_jsx_runtime7.jsx)("div", { className: "flex h-16 w-16 items-center justify-center rounded-2xl bg-white/5 text-3xl", children: icon }),
|
|
500
|
+
/* @__PURE__ */ (0, import_jsx_runtime7.jsxs)("div", { className: "flex-1", children: [
|
|
501
|
+
/* @__PURE__ */ (0, import_jsx_runtime7.jsxs)("div", { className: "flex items-center gap-3", children: [
|
|
502
|
+
/* @__PURE__ */ (0, import_jsx_runtime7.jsx)("h1", { className: "text-2xl font-extrabold text-white/95 tracking-tight", children: label }),
|
|
503
|
+
/* @__PURE__ */ (0, import_jsx_runtime7.jsx)(AdapterStatusBadge, { status: status.status, size: "md" })
|
|
504
|
+
] }),
|
|
505
|
+
/* @__PURE__ */ (0, import_jsx_runtime7.jsx)("p", { className: "mt-1 text-sm text-white/40", children: desc })
|
|
506
|
+
] })
|
|
507
|
+
] }),
|
|
508
|
+
/* @__PURE__ */ (0, import_jsx_runtime7.jsxs)("div", { className: "rounded-2xl border border-white/10 bg-white/[0.03] p-6 backdrop-blur-sm", children: [
|
|
509
|
+
/* @__PURE__ */ (0, import_jsx_runtime7.jsx)("h2", { className: "text-xs font-semibold uppercase tracking-wider text-white/30 mb-4", children: "Current Status" }),
|
|
510
|
+
/* @__PURE__ */ (0, import_jsx_runtime7.jsxs)("div", { className: "grid gap-4 sm:grid-cols-3", children: [
|
|
511
|
+
/* @__PURE__ */ (0, import_jsx_runtime7.jsxs)("div", { children: [
|
|
512
|
+
/* @__PURE__ */ (0, import_jsx_runtime7.jsx)("p", { className: "text-[0.625rem] text-white/30 uppercase", children: "Provider" }),
|
|
513
|
+
/* @__PURE__ */ (0, import_jsx_runtime7.jsx)("p", { className: "mt-0.5 text-sm font-semibold text-white/80", children: status.provider !== "none" ? status.provider : "\u2014" })
|
|
514
|
+
] }),
|
|
515
|
+
/* @__PURE__ */ (0, import_jsx_runtime7.jsxs)("div", { children: [
|
|
516
|
+
/* @__PURE__ */ (0, import_jsx_runtime7.jsx)("p", { className: "text-[0.625rem] text-white/30 uppercase", children: "Status" }),
|
|
517
|
+
/* @__PURE__ */ (0, import_jsx_runtime7.jsx)("p", { className: "mt-0.5", children: /* @__PURE__ */ (0, import_jsx_runtime7.jsx)(AdapterStatusBadge, { status: status.status }) })
|
|
518
|
+
] }),
|
|
519
|
+
/* @__PURE__ */ (0, import_jsx_runtime7.jsxs)("div", { children: [
|
|
520
|
+
/* @__PURE__ */ (0, import_jsx_runtime7.jsx)("p", { className: "text-[0.625rem] text-white/30 uppercase", children: "Last Checked" }),
|
|
521
|
+
/* @__PURE__ */ (0, import_jsx_runtime7.jsx)("p", { className: "mt-0.5 text-sm text-white/60", children: status.lastCheckedAt ? new Date(status.lastCheckedAt).toLocaleTimeString() : "\u2014" })
|
|
522
|
+
] })
|
|
523
|
+
] }),
|
|
524
|
+
status.error && /* @__PURE__ */ (0, import_jsx_runtime7.jsxs)("div", { className: "mt-4 rounded-lg border border-red-500/20 bg-red-500/10 px-4 py-3 text-sm text-red-400", children: [
|
|
525
|
+
/* @__PURE__ */ (0, import_jsx_runtime7.jsx)("span", { className: "font-semibold", children: "Error:" }),
|
|
526
|
+
" ",
|
|
527
|
+
status.error
|
|
528
|
+
] }),
|
|
529
|
+
status.latency && /* @__PURE__ */ (0, import_jsx_runtime7.jsxs)("div", { className: "mt-4", children: [
|
|
530
|
+
/* @__PURE__ */ (0, import_jsx_runtime7.jsx)("p", { className: "text-[0.625rem] text-white/30 uppercase mb-1", children: "Latency" }),
|
|
531
|
+
/* @__PURE__ */ (0, import_jsx_runtime7.jsx)("div", { className: "h-2 w-full rounded-full bg-white/5 overflow-hidden", children: /* @__PURE__ */ (0, import_jsx_runtime7.jsx)(
|
|
532
|
+
"div",
|
|
533
|
+
{
|
|
534
|
+
className: `h-full rounded-full transition-all ${status.latency < 100 ? "bg-emerald-400" : status.latency < 500 ? "bg-amber-400" : "bg-red-400"}`,
|
|
535
|
+
style: { width: `${Math.min(100, status.latency / 1e3 * 100)}%` }
|
|
536
|
+
}
|
|
537
|
+
) }),
|
|
538
|
+
/* @__PURE__ */ (0, import_jsx_runtime7.jsxs)("p", { className: "mt-1 text-xs text-white/40", children: [
|
|
539
|
+
status.latency,
|
|
540
|
+
"ms"
|
|
541
|
+
] })
|
|
542
|
+
] })
|
|
543
|
+
] }),
|
|
544
|
+
/* @__PURE__ */ (0, import_jsx_runtime7.jsxs)("div", { className: "rounded-2xl border border-white/10 bg-white/[0.03] p-6 backdrop-blur-sm", children: [
|
|
545
|
+
/* @__PURE__ */ (0, import_jsx_runtime7.jsxs)("div", { className: "flex items-center justify-between mb-4", children: [
|
|
546
|
+
/* @__PURE__ */ (0, import_jsx_runtime7.jsx)("h2", { className: "text-xs font-semibold uppercase tracking-wider text-white/30", children: "Available Providers" }),
|
|
547
|
+
/* @__PURE__ */ (0, import_jsx_runtime7.jsxs)("span", { className: "text-xs text-white/20", children: [
|
|
548
|
+
providers.length,
|
|
549
|
+
" providers"
|
|
550
|
+
] })
|
|
551
|
+
] }),
|
|
552
|
+
/* @__PURE__ */ (0, import_jsx_runtime7.jsx)("div", { className: "divide-y divide-white/5", children: providers.map((p) => /* @__PURE__ */ (0, import_jsx_runtime7.jsxs)("div", { className: "flex items-center justify-between py-3 first:pt-0 last:pb-0", children: [
|
|
553
|
+
/* @__PURE__ */ (0, import_jsx_runtime7.jsxs)("div", { children: [
|
|
554
|
+
/* @__PURE__ */ (0, import_jsx_runtime7.jsx)("p", { className: "text-sm font-semibold text-white/80", children: p.name }),
|
|
555
|
+
/* @__PURE__ */ (0, import_jsx_runtime7.jsx)("p", { className: "text-xs text-white/30", children: p.description })
|
|
556
|
+
] }),
|
|
557
|
+
/* @__PURE__ */ (0, import_jsx_runtime7.jsx)("span", { className: `self-start rounded px-2 py-0.5 text-[0.625rem] font-bold uppercase ${p.tier === "pronto" ? "bg-emerald-500/10 text-emerald-400" : p.tier === "lancio" ? "bg-blue-500/10 text-blue-400" : "bg-purple-500/10 text-purple-400"}`, children: p.tier })
|
|
558
|
+
] }, p.id)) })
|
|
559
|
+
] }),
|
|
560
|
+
/* @__PURE__ */ (0, import_jsx_runtime7.jsx)("div", { children: isEditing ? /* @__PURE__ */ (0, import_jsx_runtime7.jsx)(
|
|
561
|
+
AdapterConfigForm,
|
|
562
|
+
{
|
|
563
|
+
domain,
|
|
564
|
+
onSave: async () => setIsEditing(false),
|
|
565
|
+
onCancel: () => setIsEditing(false)
|
|
566
|
+
}
|
|
567
|
+
) : /* @__PURE__ */ (0, import_jsx_runtime7.jsxs)(
|
|
568
|
+
"button",
|
|
569
|
+
{
|
|
570
|
+
onClick: () => setIsEditing(true),
|
|
571
|
+
className: "w-full rounded-2xl border border-dashed border-white/10 bg-white/[0.01] p-6 text-center text-sm text-white/30 hover:border-white/20 hover:text-white/50 transition-all",
|
|
572
|
+
children: [
|
|
573
|
+
"\u2699\uFE0F Configure ",
|
|
574
|
+
label,
|
|
575
|
+
" Adapter"
|
|
576
|
+
]
|
|
577
|
+
}
|
|
578
|
+
) })
|
|
579
|
+
] });
|
|
580
|
+
}
|
|
581
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
582
|
+
0 && (module.exports = {
|
|
583
|
+
ADAPTER_DOMAINS,
|
|
584
|
+
AdapterCard,
|
|
585
|
+
AdapterConfigForm,
|
|
586
|
+
AdapterDetailPage,
|
|
587
|
+
AdapterList,
|
|
588
|
+
AdapterProvider,
|
|
589
|
+
AdapterStatusBadge,
|
|
590
|
+
AdaptersPage,
|
|
591
|
+
DOMAIN_DESCRIPTIONS,
|
|
592
|
+
DOMAIN_ICONS,
|
|
593
|
+
DOMAIN_LABELS,
|
|
594
|
+
configureAdapters,
|
|
595
|
+
getAdapterConfig,
|
|
596
|
+
getProviderMeta,
|
|
597
|
+
getProvidersForDomain,
|
|
598
|
+
isAdaptersConfigured,
|
|
599
|
+
useAdapterContext,
|
|
600
|
+
useAdapterStatus,
|
|
601
|
+
useAdapterStatuses,
|
|
602
|
+
useAdapters,
|
|
603
|
+
useAdmin,
|
|
604
|
+
useAi,
|
|
605
|
+
useAuth,
|
|
606
|
+
useDb,
|
|
607
|
+
useIsAdapterReady,
|
|
608
|
+
usePayments,
|
|
609
|
+
useStorage
|
|
610
|
+
});
|
|
611
|
+
//# sourceMappingURL=index.js.map
|