agent-gateway-mcp 0.1.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/dist/caller.js ADDED
@@ -0,0 +1,110 @@
1
+ import { fetchManifest, fetchCapabilityDetail } from "./discovery.js";
2
+ import { authenticate, storeApiKey } from "./auth.js";
3
+ import { getToken } from "./config.js";
4
+ export async function callCapability(domain, capabilityName, params, apiKey) {
5
+ // Step 1: Ensure we have a token
6
+ let token = getToken(domain);
7
+ if (!token || !token.access_token) {
8
+ // If caller provided an API key, store it
9
+ if (apiKey) {
10
+ const authResult = await storeApiKey(domain, apiKey);
11
+ if (!authResult.success) {
12
+ return { success: false, error: authResult.message, auth_required: true };
13
+ }
14
+ token = authResult.token;
15
+ }
16
+ else {
17
+ // Try to authenticate
18
+ const authResult = await authenticate(domain);
19
+ if (!authResult.success) {
20
+ return { success: false, error: authResult.message, auth_required: true };
21
+ }
22
+ token = authResult.token;
23
+ }
24
+ }
25
+ if (!token) {
26
+ return { success: false, error: "No authentication token available.", auth_required: true };
27
+ }
28
+ // Step 2: Fetch capability detail
29
+ let detail;
30
+ let manifest;
31
+ try {
32
+ manifest = await fetchManifest(domain);
33
+ detail = await fetchCapabilityDetail(domain, capabilityName);
34
+ }
35
+ catch (err) {
36
+ return {
37
+ success: false,
38
+ error: `Failed to fetch capability detail: ${err instanceof Error ? err.message : "unknown"}`,
39
+ };
40
+ }
41
+ // Step 3: Build the request
42
+ const url = detail.endpoint.startsWith("http")
43
+ ? detail.endpoint
44
+ : `${manifest.base_url}${detail.endpoint}`;
45
+ const headers = {
46
+ "Content-Type": "application/json",
47
+ Accept: "application/json",
48
+ };
49
+ // Inject auth
50
+ if (token.access_token !== "none") {
51
+ if (token.type === "api_key") {
52
+ const authHeader = manifest.auth.header ?? "Authorization";
53
+ const prefix = manifest.auth.prefix ?? "Bearer";
54
+ headers[authHeader] = `${prefix} ${token.access_token}`;
55
+ }
56
+ else {
57
+ headers["Authorization"] = `Bearer ${token.access_token}`;
58
+ }
59
+ }
60
+ // Step 4: Make the call
61
+ const method = detail.method.toUpperCase();
62
+ const fetchOpts = {
63
+ method,
64
+ headers,
65
+ signal: AbortSignal.timeout(30000),
66
+ };
67
+ if (method !== "GET" && method !== "HEAD") {
68
+ fetchOpts.body = JSON.stringify(params);
69
+ }
70
+ // For GET, append params as query string
71
+ let finalUrl = url;
72
+ if (method === "GET" && Object.keys(params).length > 0) {
73
+ const qs = new URLSearchParams();
74
+ for (const [key, value] of Object.entries(params)) {
75
+ qs.set(key, String(value));
76
+ }
77
+ finalUrl = `${url}?${qs.toString()}`;
78
+ }
79
+ try {
80
+ const res = await fetch(finalUrl, fetchOpts);
81
+ let body;
82
+ const contentType = res.headers.get("content-type") ?? "";
83
+ if (contentType.includes("application/json")) {
84
+ body = await res.json();
85
+ }
86
+ else {
87
+ body = await res.text();
88
+ }
89
+ if (!res.ok) {
90
+ return {
91
+ success: false,
92
+ status: res.status,
93
+ data: body,
94
+ error: `Service returned HTTP ${res.status}`,
95
+ };
96
+ }
97
+ return {
98
+ success: true,
99
+ status: res.status,
100
+ data: body,
101
+ };
102
+ }
103
+ catch (err) {
104
+ return {
105
+ success: false,
106
+ error: `Request failed: ${err instanceof Error ? err.message : "unknown"}`,
107
+ };
108
+ }
109
+ }
110
+ //# sourceMappingURL=caller.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"caller.js","sourceRoot":"","sources":["../src/caller.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,32 @@
1
+ import type { GatewayConfig, StoredToken, Connection, UserIdentity, Manifest, CapabilityDetail, RegistryDiscoverResponse } from "./types.js";
2
+ export declare function setRegistryUrl(url: string): void;
3
+ export declare function loadConfig(): GatewayConfig;
4
+ export declare function saveConfig(config: GatewayConfig): void;
5
+ export declare function getIdentity(): UserIdentity | undefined;
6
+ export declare function storeIdentity(identity: UserIdentity): void;
7
+ export declare function clearIdentity(): void;
8
+ export declare function isInitialized(): boolean;
9
+ export declare function getToken(domain: string): StoredToken | undefined;
10
+ export declare function storeToken(token: StoredToken): void;
11
+ export declare function removeToken(domain: string): void;
12
+ export declare function getConnection(domain: string): Connection | undefined;
13
+ export declare function storeConnection(connection: Connection): void;
14
+ export declare function getAllConnections(): Connection[];
15
+ export declare function getAllTokens(): StoredToken[];
16
+ export declare function syncTokensToCloud(): Promise<{
17
+ success: boolean;
18
+ error?: string;
19
+ }>;
20
+ export declare function syncTokensFromCloud(): Promise<{
21
+ success: boolean;
22
+ count: number;
23
+ error?: string;
24
+ }>;
25
+ export declare function getCachedManifest(domain: string): Manifest | undefined;
26
+ export declare function setCachedManifest(domain: string, manifest: Manifest): void;
27
+ export declare function getCachedDetail(domain: string, capability: string): CapabilityDetail | undefined;
28
+ export declare function setCachedDetail(domain: string, capability: string, detail: CapabilityDetail): void;
29
+ export declare function getCachedDiscovery(query: string): RegistryDiscoverResponse | undefined;
30
+ export declare function setCachedDiscovery(query: string, results: RegistryDiscoverResponse): void;
31
+ export declare function clearAllCaches(): void;
32
+ //# sourceMappingURL=config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EACV,aAAa,EACb,WAAW,EACX,UAAU,EACV,YAAY,EAIZ,QAAQ,EACR,gBAAgB,EAChB,wBAAwB,EACzB,MAAM,YAAY,CAAC;AAqBpB,wBAAgB,cAAc,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAEhD;AAoBD,wBAAgB,UAAU,IAAI,aAAa,CAkB1C;AAED,wBAAgB,UAAU,CAAC,MAAM,EAAE,aAAa,GAAG,IAAI,CAGtD;AAID,wBAAgB,WAAW,IAAI,YAAY,GAAG,SAAS,CAGtD;AAED,wBAAgB,aAAa,CAAC,QAAQ,EAAE,YAAY,GAAG,IAAI,CAI1D;AAED,wBAAgB,aAAa,IAAI,IAAI,CAKpC;AAED,wBAAgB,aAAa,IAAI,OAAO,CAGvC;AA2BD,wBAAgB,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,WAAW,GAAG,SAAS,CAQhE;AAED,wBAAgB,UAAU,CAAC,KAAK,EAAE,WAAW,GAAG,IAAI,CAInD;AAED,wBAAgB,WAAW,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAKhD;AAED,wBAAgB,aAAa,CAAC,MAAM,EAAE,MAAM,GAAG,UAAU,GAAG,SAAS,CAGpE;AAED,wBAAgB,eAAe,CAAC,UAAU,EAAE,UAAU,GAAG,IAAI,CAI5D;AAED,wBAAgB,iBAAiB,IAAI,UAAU,EAAE,CAGhD;AAED,wBAAgB,YAAY,IAAI,WAAW,EAAE,CAG5C;AAID,wBAAsB,iBAAiB,IAAI,OAAO,CAAC;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,CAwCvF;AAED,wBAAsB,mBAAmB,IAAI,OAAO,CAAC;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,CA+CxG;AAmCD,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,MAAM,GAAG,QAAQ,GAAG,SAAS,CAEtE;AAED,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,QAAQ,GAAG,IAAI,CAE1E;AAGD,wBAAgB,eAAe,CAAC,MAAM,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,gBAAgB,GAAG,SAAS,CAGhG;AAED,wBAAgB,eAAe,CAAC,MAAM,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,EAAE,gBAAgB,GAAG,IAAI,CAGlG;AAGD,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,MAAM,GAAG,wBAAwB,GAAG,SAAS,CAEtF;AAED,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,wBAAwB,GAAG,IAAI,CAEzF;AAGD,wBAAgB,cAAc,IAAI,IAAI,CAQrC"}
package/dist/config.js ADDED
@@ -0,0 +1,288 @@
1
+ import fs from "fs";
2
+ import path from "path";
3
+ import os from "os";
4
+ import { CACHE_TTLS } from "./types.js";
5
+ // ─── Paths ───────────────────────────────────────────────────────
6
+ const CONFIG_DIR = path.join(os.homedir(), ".agent-gateway");
7
+ const CACHE_DIR = path.join(CONFIG_DIR, "cache");
8
+ const CONFIG_FILE = path.join(CONFIG_DIR, "config.json");
9
+ const TOKENS_FILE = path.join(CONFIG_DIR, "tokens.json");
10
+ const MANIFEST_CACHE_DIR = path.join(CACHE_DIR, "manifests");
11
+ const DETAIL_CACHE_DIR = path.join(CACHE_DIR, "details");
12
+ const DISCOVERY_CACHE_DIR = path.join(CACHE_DIR, "discovery");
13
+ const DEFAULT_CONFIG = {
14
+ registry_url: "https://agentdns.dev",
15
+ auth_callback_port: 9876,
16
+ };
17
+ // Override from CLI args
18
+ let registryUrlOverride;
19
+ export function setRegistryUrl(url) {
20
+ registryUrlOverride = url;
21
+ }
22
+ // ─── Directory setup ─────────────────────────────────────────────
23
+ function ensureDir(dir) {
24
+ if (!fs.existsSync(dir)) {
25
+ fs.mkdirSync(dir, { recursive: true });
26
+ }
27
+ }
28
+ function ensureDirs() {
29
+ ensureDir(CONFIG_DIR);
30
+ ensureDir(CACHE_DIR);
31
+ ensureDir(MANIFEST_CACHE_DIR);
32
+ ensureDir(DETAIL_CACHE_DIR);
33
+ ensureDir(DISCOVERY_CACHE_DIR);
34
+ }
35
+ // ─── Config ──────────────────────────────────────────────────────
36
+ export function loadConfig() {
37
+ ensureDirs();
38
+ let config;
39
+ if (!fs.existsSync(CONFIG_FILE)) {
40
+ fs.writeFileSync(CONFIG_FILE, JSON.stringify(DEFAULT_CONFIG, null, 2));
41
+ config = { ...DEFAULT_CONFIG };
42
+ }
43
+ else {
44
+ try {
45
+ const raw = fs.readFileSync(CONFIG_FILE, "utf-8");
46
+ config = { ...DEFAULT_CONFIG, ...JSON.parse(raw) };
47
+ }
48
+ catch {
49
+ config = { ...DEFAULT_CONFIG };
50
+ }
51
+ }
52
+ if (registryUrlOverride) {
53
+ config.registry_url = registryUrlOverride;
54
+ }
55
+ return config;
56
+ }
57
+ export function saveConfig(config) {
58
+ ensureDirs();
59
+ fs.writeFileSync(CONFIG_FILE, JSON.stringify(config, null, 2));
60
+ }
61
+ // ─── Identity ────────────────────────────────────────────────────
62
+ export function getIdentity() {
63
+ const config = loadConfig();
64
+ return config.identity;
65
+ }
66
+ export function storeIdentity(identity) {
67
+ const config = loadConfig();
68
+ config.identity = identity;
69
+ saveConfig(config);
70
+ }
71
+ export function clearIdentity() {
72
+ const config = loadConfig();
73
+ delete config.identity;
74
+ delete config.cloud_sync;
75
+ saveConfig(config);
76
+ }
77
+ export function isInitialized() {
78
+ const config = loadConfig();
79
+ return !!config.identity;
80
+ }
81
+ function loadTokenStore() {
82
+ ensureDirs();
83
+ if (!fs.existsSync(TOKENS_FILE)) {
84
+ return { tokens: {}, connections: {} };
85
+ }
86
+ try {
87
+ const raw = fs.readFileSync(TOKENS_FILE, "utf-8");
88
+ return JSON.parse(raw);
89
+ }
90
+ catch {
91
+ return { tokens: {}, connections: {} };
92
+ }
93
+ }
94
+ function saveTokenStore(store) {
95
+ ensureDirs();
96
+ fs.writeFileSync(TOKENS_FILE, JSON.stringify(store, null, 2));
97
+ }
98
+ export function getToken(domain) {
99
+ const store = loadTokenStore();
100
+ const token = store.tokens[domain];
101
+ if (!token)
102
+ return undefined;
103
+ if (token.expires_at && Date.now() > token.expires_at) {
104
+ return { ...token, access_token: "" }; // Mark as expired
105
+ }
106
+ return token;
107
+ }
108
+ export function storeToken(token) {
109
+ const store = loadTokenStore();
110
+ store.tokens[token.domain] = token;
111
+ saveTokenStore(store);
112
+ }
113
+ export function removeToken(domain) {
114
+ const store = loadTokenStore();
115
+ delete store.tokens[domain];
116
+ delete store.connections[domain];
117
+ saveTokenStore(store);
118
+ }
119
+ export function getConnection(domain) {
120
+ const store = loadTokenStore();
121
+ return store.connections[domain];
122
+ }
123
+ export function storeConnection(connection) {
124
+ const store = loadTokenStore();
125
+ store.connections[connection.domain] = connection;
126
+ saveTokenStore(store);
127
+ }
128
+ export function getAllConnections() {
129
+ const store = loadTokenStore();
130
+ return Object.values(store.connections);
131
+ }
132
+ export function getAllTokens() {
133
+ const store = loadTokenStore();
134
+ return Object.values(store.tokens);
135
+ }
136
+ // ─── Cloud sync ──────────────────────────────────────────────────
137
+ export async function syncTokensToCloud() {
138
+ const config = loadConfig();
139
+ if (!config.identity) {
140
+ return { success: false, error: "Not signed in. Run `agent-gateway init` first." };
141
+ }
142
+ const store = loadTokenStore();
143
+ const bundle = {
144
+ tokens: store.tokens,
145
+ connections: store.connections,
146
+ synced_at: new Date().toISOString(),
147
+ };
148
+ try {
149
+ const res = await fetch(`${config.registry_url}/api/gateway/sync`, {
150
+ method: "PUT",
151
+ headers: {
152
+ "Content-Type": "application/json",
153
+ Authorization: `Bearer ${config.identity.registry_token}`,
154
+ },
155
+ body: JSON.stringify(bundle),
156
+ signal: AbortSignal.timeout(10000),
157
+ });
158
+ if (!res.ok) {
159
+ return { success: false, error: `Sync failed: HTTP ${res.status}` };
160
+ }
161
+ // Update sync state
162
+ config.cloud_sync = {
163
+ last_synced_at: bundle.synced_at,
164
+ };
165
+ saveConfig(config);
166
+ return { success: true };
167
+ }
168
+ catch (err) {
169
+ return {
170
+ success: false,
171
+ error: `Sync failed: ${err instanceof Error ? err.message : "unknown"}`,
172
+ };
173
+ }
174
+ }
175
+ export async function syncTokensFromCloud() {
176
+ const config = loadConfig();
177
+ if (!config.identity) {
178
+ return { success: false, count: 0, error: "Not signed in. Run `agent-gateway init` first." };
179
+ }
180
+ try {
181
+ const res = await fetch(`${config.registry_url}/api/gateway/sync`, {
182
+ method: "GET",
183
+ headers: {
184
+ Authorization: `Bearer ${config.identity.registry_token}`,
185
+ },
186
+ signal: AbortSignal.timeout(10000),
187
+ });
188
+ if (!res.ok) {
189
+ return { success: false, count: 0, error: `Sync failed: HTTP ${res.status}` };
190
+ }
191
+ const bundle = (await res.json());
192
+ const store = loadTokenStore();
193
+ // Merge: cloud data wins for any conflicts
194
+ let count = 0;
195
+ for (const [domain, token] of Object.entries(bundle.tokens)) {
196
+ if (!store.tokens[domain])
197
+ count++;
198
+ store.tokens[domain] = token;
199
+ }
200
+ for (const [domain, conn] of Object.entries(bundle.connections)) {
201
+ store.connections[domain] = conn;
202
+ }
203
+ saveTokenStore(store);
204
+ config.cloud_sync = {
205
+ last_synced_at: bundle.synced_at,
206
+ };
207
+ saveConfig(config);
208
+ return { success: true, count };
209
+ }
210
+ catch (err) {
211
+ return {
212
+ success: false,
213
+ count: 0,
214
+ error: `Sync failed: ${err instanceof Error ? err.message : "unknown"}`,
215
+ };
216
+ }
217
+ }
218
+ // ─── Disk cache ──────────────────────────────────────────────────
219
+ function safeName(key) {
220
+ return key.replace(/[^a-zA-Z0-9._-]/g, "_");
221
+ }
222
+ function readCacheEntry(dir, key, ttl) {
223
+ const filePath = path.join(dir, `${safeName(key)}.json`);
224
+ if (!fs.existsSync(filePath))
225
+ return undefined;
226
+ try {
227
+ const raw = fs.readFileSync(filePath, "utf-8");
228
+ const entry = JSON.parse(raw);
229
+ if (Date.now() - entry.cached_at > ttl) {
230
+ // Expired — delete and return undefined
231
+ try {
232
+ fs.unlinkSync(filePath);
233
+ }
234
+ catch { /* ignore */ }
235
+ return undefined;
236
+ }
237
+ return entry.data;
238
+ }
239
+ catch {
240
+ return undefined;
241
+ }
242
+ }
243
+ function writeCacheEntry(dir, key, data, ttl) {
244
+ ensureDir(dir);
245
+ const filePath = path.join(dir, `${safeName(key)}.json`);
246
+ const entry = { data, cached_at: Date.now(), ttl };
247
+ try {
248
+ fs.writeFileSync(filePath, JSON.stringify(entry));
249
+ }
250
+ catch { /* ignore write failures */ }
251
+ }
252
+ // Manifest cache (24h)
253
+ export function getCachedManifest(domain) {
254
+ return readCacheEntry(MANIFEST_CACHE_DIR, domain, CACHE_TTLS.manifest);
255
+ }
256
+ export function setCachedManifest(domain, manifest) {
257
+ writeCacheEntry(MANIFEST_CACHE_DIR, domain, manifest, CACHE_TTLS.manifest);
258
+ }
259
+ // Capability detail cache (1h)
260
+ export function getCachedDetail(domain, capability) {
261
+ const key = `${domain}__${capability}`;
262
+ return readCacheEntry(DETAIL_CACHE_DIR, key, CACHE_TTLS.capability);
263
+ }
264
+ export function setCachedDetail(domain, capability, detail) {
265
+ const key = `${domain}__${capability}`;
266
+ writeCacheEntry(DETAIL_CACHE_DIR, key, detail, CACHE_TTLS.capability);
267
+ }
268
+ // Discovery cache (15min)
269
+ export function getCachedDiscovery(query) {
270
+ return readCacheEntry(DISCOVERY_CACHE_DIR, query, CACHE_TTLS.discovery);
271
+ }
272
+ export function setCachedDiscovery(query, results) {
273
+ writeCacheEntry(DISCOVERY_CACHE_DIR, query, results, CACHE_TTLS.discovery);
274
+ }
275
+ // Clear all caches
276
+ export function clearAllCaches() {
277
+ for (const dir of [MANIFEST_CACHE_DIR, DETAIL_CACHE_DIR, DISCOVERY_CACHE_DIR]) {
278
+ if (fs.existsSync(dir)) {
279
+ for (const file of fs.readdirSync(dir)) {
280
+ try {
281
+ fs.unlinkSync(path.join(dir, file));
282
+ }
283
+ catch { /* ignore */ }
284
+ }
285
+ }
286
+ }
287
+ }
288
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ import type { Manifest, CapabilityDetail, RegistryDiscoverResponse } from "./types.js";
2
+ export declare function discoverByQuery(query: string): Promise<RegistryDiscoverResponse>;
3
+ export declare function fetchManifest(domain: string): Promise<Manifest>;
4
+ export declare function fetchCapabilityDetail(domain: string, capabilityName: string): Promise<CapabilityDetail>;
5
+ export declare function clearCache(): void;
6
+ //# sourceMappingURL=discovery.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"discovery.d.ts","sourceRoot":"","sources":["../src/discovery.ts"],"names":[],"mappings":"AAUA,OAAO,KAAK,EACV,QAAQ,EACR,gBAAgB,EAChB,wBAAwB,EACzB,MAAM,YAAY,CAAC;AAwBpB,wBAAsB,eAAe,CACnC,KAAK,EAAE,MAAM,GACZ,OAAO,CAAC,wBAAwB,CAAC,CAwBnC;AAID,wBAAsB,aAAa,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,CAAC,CAuBrE;AAID,wBAAsB,qBAAqB,CACzC,MAAM,EAAE,MAAM,EACd,cAAc,EAAE,MAAM,GACrB,OAAO,CAAC,gBAAgB,CAAC,CAoC3B;AAID,wBAAgB,UAAU,IAAI,IAAI,CAKjC"}
@@ -0,0 +1,97 @@
1
+ import { loadConfig, getCachedManifest, setCachedManifest, getCachedDetail, setCachedDetail, getCachedDiscovery, setCachedDiscovery, clearAllCaches, } from "./config.js";
2
+ import { CACHE_TTLS } from "./types.js";
3
+ // ─── In-memory hot cache (backed by disk) ────────────────────────
4
+ const memManifestCache = new Map();
5
+ const memDetailCache = new Map();
6
+ const memDiscoveryCache = new Map();
7
+ // ─── Fetch helper ────────────────────────────────────────────────
8
+ async function fetchJson(url) {
9
+ const res = await fetch(url, {
10
+ headers: { Accept: "application/json" },
11
+ signal: AbortSignal.timeout(10000),
12
+ });
13
+ if (!res.ok) {
14
+ throw new Error(`HTTP ${res.status} ${res.statusText} from ${url}`);
15
+ }
16
+ return res.json();
17
+ }
18
+ // ─── Discovery (15min cache) ─────────────────────────────────────
19
+ export async function discoverByQuery(query) {
20
+ // Check in-memory hot cache
21
+ const mem = memDiscoveryCache.get(query);
22
+ if (mem && Date.now() - mem.at < CACHE_TTLS.discovery) {
23
+ return mem.result;
24
+ }
25
+ // Check disk cache
26
+ const disk = getCachedDiscovery(query);
27
+ if (disk) {
28
+ memDiscoveryCache.set(query, { result: disk, at: Date.now() });
29
+ return disk;
30
+ }
31
+ // Fetch from registry
32
+ const config = loadConfig();
33
+ const url = `${config.registry_url}/api/discover?q=${encodeURIComponent(query)}`;
34
+ const result = await fetchJson(url);
35
+ // Store in both caches
36
+ memDiscoveryCache.set(query, { result, at: Date.now() });
37
+ setCachedDiscovery(query, result);
38
+ return result;
39
+ }
40
+ // ─── Manifest (24h cache) ────────────────────────────────────────
41
+ export async function fetchManifest(domain) {
42
+ // Check in-memory hot cache
43
+ const mem = memManifestCache.get(domain);
44
+ if (mem && Date.now() - mem.at < CACHE_TTLS.manifest) {
45
+ return mem.manifest;
46
+ }
47
+ // Check disk cache
48
+ const disk = getCachedManifest(domain);
49
+ if (disk) {
50
+ memManifestCache.set(domain, { manifest: disk, at: Date.now() });
51
+ return disk;
52
+ }
53
+ // Fetch live
54
+ const url = `https://${domain}/.well-known/agent`;
55
+ const manifest = await fetchJson(url);
56
+ // Store in both caches
57
+ memManifestCache.set(domain, { manifest, at: Date.now() });
58
+ setCachedManifest(domain, manifest);
59
+ return manifest;
60
+ }
61
+ // ─── Capability detail (1h cache) ────────────────────────────────
62
+ export async function fetchCapabilityDetail(domain, capabilityName) {
63
+ const cacheKey = `${domain}:${capabilityName}`;
64
+ // Check in-memory hot cache
65
+ const mem = memDetailCache.get(cacheKey);
66
+ if (mem && Date.now() - mem.at < CACHE_TTLS.capability) {
67
+ return mem.detail;
68
+ }
69
+ // Check disk cache
70
+ const disk = getCachedDetail(domain, capabilityName);
71
+ if (disk) {
72
+ memDetailCache.set(cacheKey, { detail: disk, at: Date.now() });
73
+ return disk;
74
+ }
75
+ // Fetch live
76
+ const manifest = await fetchManifest(domain);
77
+ const cap = manifest.capabilities.find((c) => c.name === capabilityName);
78
+ if (!cap) {
79
+ throw new Error(`Capability '${capabilityName}' not found on ${domain}. Available: ${manifest.capabilities.map((c) => c.name).join(", ")}`);
80
+ }
81
+ const detailUrl = cap.detail_url.startsWith("http")
82
+ ? cap.detail_url
83
+ : `${manifest.base_url}${cap.detail_url}`;
84
+ const detail = await fetchJson(detailUrl);
85
+ // Store in both caches
86
+ memDetailCache.set(cacheKey, { detail, at: Date.now() });
87
+ setCachedDetail(domain, capabilityName, detail);
88
+ return detail;
89
+ }
90
+ // ─── Cache management ────────────────────────────────────────────
91
+ export function clearCache() {
92
+ memManifestCache.clear();
93
+ memDetailCache.clear();
94
+ memDiscoveryCache.clear();
95
+ clearAllCaches();
96
+ }
97
+ //# sourceMappingURL=discovery.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"discovery.js","sourceRoot":"","sources":["../src/discovery.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ export {};
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":""}