@nanogpt/mcp 1.0.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/activeRequests.d.ts +26 -0
- package/dist/activeRequests.d.ts.map +1 -0
- package/dist/activeRequests.js +39 -0
- package/dist/activeRequests.js.map +1 -0
- package/dist/config.d.ts +35 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +136 -0
- package/dist/config.js.map +1 -0
- package/dist/httpClient.d.ts +36 -0
- package/dist/httpClient.d.ts.map +1 -0
- package/dist/httpClient.js +211 -0
- package/dist/httpClient.js.map +1 -0
- package/dist/index.d.ts +18 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +168 -0
- package/dist/index.js.map +1 -0
- package/dist/resources.d.ts +68 -0
- package/dist/resources.d.ts.map +1 -0
- package/dist/resources.js +198 -0
- package/dist/resources.js.map +1 -0
- package/dist/toolUtils.d.ts +115 -0
- package/dist/toolUtils.d.ts.map +1 -0
- package/dist/toolUtils.js +369 -0
- package/dist/toolUtils.js.map +1 -0
- package/dist/tools/balance.d.ts +48 -0
- package/dist/tools/balance.d.ts.map +1 -0
- package/dist/tools/balance.js +78 -0
- package/dist/tools/balance.js.map +1 -0
- package/dist/tools/chat.d.ts +89 -0
- package/dist/tools/chat.d.ts.map +1 -0
- package/dist/tools/chat.js +125 -0
- package/dist/tools/chat.js.map +1 -0
- package/dist/tools/imageGenerate.d.ts +116 -0
- package/dist/tools/imageGenerate.d.ts.map +1 -0
- package/dist/tools/imageGenerate.js +220 -0
- package/dist/tools/imageGenerate.js.map +1 -0
- package/dist/tools/index.d.ts +11 -0
- package/dist/tools/index.d.ts.map +1 -0
- package/dist/tools/index.js +11 -0
- package/dist/tools/index.js.map +1 -0
- package/dist/tools/listModels.d.ts +149 -0
- package/dist/tools/listModels.d.ts.map +1 -0
- package/dist/tools/listModels.js +224 -0
- package/dist/tools/listModels.js.map +1 -0
- package/dist/tools/scrapeUrls.d.ts +51 -0
- package/dist/tools/scrapeUrls.d.ts.map +1 -0
- package/dist/tools/scrapeUrls.js +100 -0
- package/dist/tools/scrapeUrls.js.map +1 -0
- package/dist/tools/webSearch.d.ts +69 -0
- package/dist/tools/webSearch.d.ts.map +1 -0
- package/dist/tools/webSearch.js +120 -0
- package/dist/tools/webSearch.js.map +1 -0
- package/dist/tools/youtubeTranscribe.d.ts +45 -0
- package/dist/tools/youtubeTranscribe.d.ts.map +1 -0
- package/dist/tools/youtubeTranscribe.js +88 -0
- package/dist/tools/youtubeTranscribe.js.map +1 -0
- package/package.json +48 -0
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Global registry for active HTTP requests
|
|
3
|
+
*
|
|
4
|
+
* Tracks AbortControllers for all in-flight HTTP requests to enable
|
|
5
|
+
* graceful shutdown - aborting pending requests when the server stops.
|
|
6
|
+
*/
|
|
7
|
+
/**
|
|
8
|
+
* Register an AbortController for tracking.
|
|
9
|
+
* Call this before starting an HTTP request.
|
|
10
|
+
*/
|
|
11
|
+
export declare function registerRequest(controller: AbortController): void;
|
|
12
|
+
/**
|
|
13
|
+
* Unregister an AbortController after request completes.
|
|
14
|
+
* Call this in a finally block after the HTTP request.
|
|
15
|
+
*/
|
|
16
|
+
export declare function unregisterRequest(controller: AbortController): void;
|
|
17
|
+
/**
|
|
18
|
+
* Abort all active requests and clear the registry.
|
|
19
|
+
* Call this during graceful shutdown.
|
|
20
|
+
*/
|
|
21
|
+
export declare function abortAllRequests(): void;
|
|
22
|
+
/**
|
|
23
|
+
* Get the count of active requests (for debugging/logging).
|
|
24
|
+
*/
|
|
25
|
+
export declare function getActiveRequestCount(): number;
|
|
26
|
+
//# sourceMappingURL=activeRequests.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"activeRequests.d.ts","sourceRoot":"","sources":["../src/activeRequests.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAKH;;;GAGG;AACH,wBAAgB,eAAe,CAAC,UAAU,EAAE,eAAe,GAAG,IAAI,CAEjE;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,UAAU,EAAE,eAAe,GAAG,IAAI,CAEnE;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,IAAI,IAAI,CAKvC;AAED;;GAEG;AACH,wBAAgB,qBAAqB,IAAI,MAAM,CAE9C"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Global registry for active HTTP requests
|
|
3
|
+
*
|
|
4
|
+
* Tracks AbortControllers for all in-flight HTTP requests to enable
|
|
5
|
+
* graceful shutdown - aborting pending requests when the server stops.
|
|
6
|
+
*/
|
|
7
|
+
/** Set of active AbortControllers for in-flight HTTP requests */
|
|
8
|
+
const activeRequests = new Set();
|
|
9
|
+
/**
|
|
10
|
+
* Register an AbortController for tracking.
|
|
11
|
+
* Call this before starting an HTTP request.
|
|
12
|
+
*/
|
|
13
|
+
export function registerRequest(controller) {
|
|
14
|
+
activeRequests.add(controller);
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Unregister an AbortController after request completes.
|
|
18
|
+
* Call this in a finally block after the HTTP request.
|
|
19
|
+
*/
|
|
20
|
+
export function unregisterRequest(controller) {
|
|
21
|
+
activeRequests.delete(controller);
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Abort all active requests and clear the registry.
|
|
25
|
+
* Call this during graceful shutdown.
|
|
26
|
+
*/
|
|
27
|
+
export function abortAllRequests() {
|
|
28
|
+
for (const controller of activeRequests) {
|
|
29
|
+
controller.abort();
|
|
30
|
+
}
|
|
31
|
+
activeRequests.clear();
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Get the count of active requests (for debugging/logging).
|
|
35
|
+
*/
|
|
36
|
+
export function getActiveRequestCount() {
|
|
37
|
+
return activeRequests.size;
|
|
38
|
+
}
|
|
39
|
+
//# sourceMappingURL=activeRequests.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"activeRequests.js","sourceRoot":"","sources":["../src/activeRequests.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,iEAAiE;AACjE,MAAM,cAAc,GAAG,IAAI,GAAG,EAAmB,CAAC;AAElD;;;GAGG;AACH,MAAM,UAAU,eAAe,CAAC,UAA2B;IACzD,cAAc,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;AACjC,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,iBAAiB,CAAC,UAA2B;IAC3D,cAAc,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;AACpC,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,gBAAgB;IAC9B,KAAK,MAAM,UAAU,IAAI,cAAc,EAAE,CAAC;QACxC,UAAU,CAAC,KAAK,EAAE,CAAC;IACrB,CAAC;IACD,cAAc,CAAC,KAAK,EAAE,CAAC;AACzB,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,qBAAqB;IACnC,OAAO,cAAc,CAAC,IAAI,CAAC;AAC7B,CAAC"}
|
package/dist/config.d.ts
ADDED
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Configuration management for NanoGPT MCP server
|
|
3
|
+
*
|
|
4
|
+
* All configuration is read from environment variables.
|
|
5
|
+
* API keys are never logged or exposed.
|
|
6
|
+
*/
|
|
7
|
+
export type AuthMode = 'bearer' | 'x-api-key' | 'both';
|
|
8
|
+
export type LogLevel = 'debug' | 'info' | 'warn' | 'error';
|
|
9
|
+
export interface Config {
|
|
10
|
+
baseUrl: string;
|
|
11
|
+
apiKey: string;
|
|
12
|
+
authMode: AuthMode;
|
|
13
|
+
timeoutMs: number;
|
|
14
|
+
maxRetries: number;
|
|
15
|
+
defaultModel?: string;
|
|
16
|
+
logLevel: LogLevel;
|
|
17
|
+
maxInlineJsonChars: number;
|
|
18
|
+
maxResourceCacheItems: number;
|
|
19
|
+
maxResourceBytes: number;
|
|
20
|
+
scrapeMaxUrls: number;
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Validate and load configuration from environment variables.
|
|
24
|
+
* Fails fast with clear error messages (never prints API key).
|
|
25
|
+
*/
|
|
26
|
+
export declare function loadConfig(): Config;
|
|
27
|
+
/**
|
|
28
|
+
* Get the current configuration. Throws if not loaded.
|
|
29
|
+
*/
|
|
30
|
+
export declare function getConfig(): Config;
|
|
31
|
+
/**
|
|
32
|
+
* Safe logging that never exposes API keys
|
|
33
|
+
*/
|
|
34
|
+
export declare function log(level: LogLevel, message: string, data?: Record<string, unknown>): void;
|
|
35
|
+
//# sourceMappingURL=config.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,MAAM,MAAM,QAAQ,GAAG,QAAQ,GAAG,WAAW,GAAG,MAAM,CAAC;AACvD,MAAM,MAAM,QAAQ,GAAG,OAAO,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC;AAE3D,MAAM,WAAW,MAAM;IACrB,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,QAAQ,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,QAAQ,EAAE,QAAQ,CAAC;IACnB,kBAAkB,EAAE,MAAM,CAAC;IAC3B,qBAAqB,EAAE,MAAM,CAAC;IAC9B,gBAAgB,EAAE,MAAM,CAAC;IACzB,aAAa,EAAE,MAAM,CAAC;CACvB;AAID;;;GAGG;AACH,wBAAgB,UAAU,IAAI,MAAM,CAyEnC;AAED;;GAEG;AACH,wBAAgB,SAAS,IAAI,MAAM,CAKlC;AAWD;;GAEG;AACH,wBAAgB,GAAG,CAAC,KAAK,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAsB1F"}
|
package/dist/config.js
ADDED
|
@@ -0,0 +1,136 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Configuration management for NanoGPT MCP server
|
|
3
|
+
*
|
|
4
|
+
* All configuration is read from environment variables.
|
|
5
|
+
* API keys are never logged or exposed.
|
|
6
|
+
*/
|
|
7
|
+
let config = null;
|
|
8
|
+
/**
|
|
9
|
+
* Validate and load configuration from environment variables.
|
|
10
|
+
* Fails fast with clear error messages (never prints API key).
|
|
11
|
+
*/
|
|
12
|
+
export function loadConfig() {
|
|
13
|
+
const baseUrl = process.env.NANOGPT_BASE_URL;
|
|
14
|
+
const apiKey = process.env.NANOGPT_API_KEY;
|
|
15
|
+
// Required variables
|
|
16
|
+
const missing = [];
|
|
17
|
+
if (!baseUrl)
|
|
18
|
+
missing.push('NANOGPT_BASE_URL');
|
|
19
|
+
if (!apiKey)
|
|
20
|
+
missing.push('NANOGPT_API_KEY');
|
|
21
|
+
if (missing.length > 0) {
|
|
22
|
+
throw new Error(`Missing required environment variables: ${missing.join(', ')}`);
|
|
23
|
+
}
|
|
24
|
+
// Validate auth mode
|
|
25
|
+
const authModeRaw = process.env.NANOGPT_AUTH_MODE || 'bearer';
|
|
26
|
+
if (!['bearer', 'x-api-key', 'both'].includes(authModeRaw)) {
|
|
27
|
+
throw new Error(`Invalid NANOGPT_AUTH_MODE: ${authModeRaw}. Must be: bearer, x-api-key, or both`);
|
|
28
|
+
}
|
|
29
|
+
const authMode = authModeRaw;
|
|
30
|
+
// Validate log level
|
|
31
|
+
const logLevelRaw = process.env.NANOGPT_LOG_LEVEL || 'info';
|
|
32
|
+
if (!['debug', 'info', 'warn', 'error'].includes(logLevelRaw)) {
|
|
33
|
+
throw new Error(`Invalid NANOGPT_LOG_LEVEL: ${logLevelRaw}. Must be: debug, info, warn, or error`);
|
|
34
|
+
}
|
|
35
|
+
const logLevel = logLevelRaw;
|
|
36
|
+
// Parse numeric values with defaults
|
|
37
|
+
const timeoutMs = parseIntWithDefault(process.env.NANOGPT_TIMEOUT_MS, 120000);
|
|
38
|
+
if (timeoutMs <= 0) {
|
|
39
|
+
throw new Error(`NANOGPT_TIMEOUT_MS must be positive, got: ${timeoutMs}`);
|
|
40
|
+
}
|
|
41
|
+
const maxRetries = parseIntWithDefault(process.env.NANOGPT_MAX_RETRIES, 0);
|
|
42
|
+
if (maxRetries < 0) {
|
|
43
|
+
throw new Error(`NANOGPT_MAX_RETRIES must be non-negative, got: ${maxRetries}`);
|
|
44
|
+
}
|
|
45
|
+
const maxInlineJsonChars = parseIntWithDefault(process.env.NANOGPT_MAX_INLINE_JSON_CHARS, 10000);
|
|
46
|
+
if (maxInlineJsonChars <= 0) {
|
|
47
|
+
throw new Error(`NANOGPT_MAX_INLINE_JSON_CHARS must be positive, got: ${maxInlineJsonChars}`);
|
|
48
|
+
}
|
|
49
|
+
const maxResourceCacheItems = parseIntWithDefault(process.env.NANOGPT_MAX_RESOURCE_CACHE_ITEMS, 100);
|
|
50
|
+
if (maxResourceCacheItems <= 0) {
|
|
51
|
+
throw new Error(`NANOGPT_MAX_RESOURCE_CACHE_ITEMS must be positive, got: ${maxResourceCacheItems}`);
|
|
52
|
+
}
|
|
53
|
+
const maxResourceBytes = parseIntWithDefault(process.env.NANOGPT_MAX_RESOURCE_BYTES, 10485760);
|
|
54
|
+
if (maxResourceBytes <= 0) {
|
|
55
|
+
throw new Error(`NANOGPT_MAX_RESOURCE_BYTES must be positive, got: ${maxResourceBytes}`);
|
|
56
|
+
}
|
|
57
|
+
const scrapeMaxUrls = parseIntWithDefault(process.env.NANOGPT_SCRAPE_MAX_URLS, 5);
|
|
58
|
+
if (scrapeMaxUrls <= 0) {
|
|
59
|
+
throw new Error(`NANOGPT_SCRAPE_MAX_URLS must be positive, got: ${scrapeMaxUrls}`);
|
|
60
|
+
}
|
|
61
|
+
config = {
|
|
62
|
+
baseUrl: baseUrl.replace(/\/$/, ''), // Remove trailing slash
|
|
63
|
+
apiKey: apiKey,
|
|
64
|
+
authMode,
|
|
65
|
+
timeoutMs,
|
|
66
|
+
maxRetries,
|
|
67
|
+
defaultModel: process.env.NANOGPT_DEFAULT_MODEL,
|
|
68
|
+
logLevel,
|
|
69
|
+
maxInlineJsonChars,
|
|
70
|
+
maxResourceCacheItems,
|
|
71
|
+
maxResourceBytes,
|
|
72
|
+
scrapeMaxUrls,
|
|
73
|
+
};
|
|
74
|
+
return config;
|
|
75
|
+
}
|
|
76
|
+
/**
|
|
77
|
+
* Get the current configuration. Throws if not loaded.
|
|
78
|
+
*/
|
|
79
|
+
export function getConfig() {
|
|
80
|
+
if (!config) {
|
|
81
|
+
throw new Error('Configuration not loaded. Call loadConfig() first.');
|
|
82
|
+
}
|
|
83
|
+
return config;
|
|
84
|
+
}
|
|
85
|
+
/**
|
|
86
|
+
* Parse an integer with a default value
|
|
87
|
+
*/
|
|
88
|
+
function parseIntWithDefault(value, defaultValue) {
|
|
89
|
+
if (!value)
|
|
90
|
+
return defaultValue;
|
|
91
|
+
const parsed = parseInt(value, 10);
|
|
92
|
+
return isNaN(parsed) ? defaultValue : parsed;
|
|
93
|
+
}
|
|
94
|
+
/**
|
|
95
|
+
* Safe logging that never exposes API keys
|
|
96
|
+
*/
|
|
97
|
+
export function log(level, message, data) {
|
|
98
|
+
const cfg = config || { logLevel: 'info' };
|
|
99
|
+
const levels = ['debug', 'info', 'warn', 'error'];
|
|
100
|
+
const currentLevel = levels.indexOf(cfg.logLevel);
|
|
101
|
+
const msgLevel = levels.indexOf(level);
|
|
102
|
+
// Skip if message level is below configured level
|
|
103
|
+
if (msgLevel < currentLevel) {
|
|
104
|
+
return;
|
|
105
|
+
}
|
|
106
|
+
// Sanitize data to remove any potential API key leaks
|
|
107
|
+
const sanitized = data ? sanitizeForLogging(data) : undefined;
|
|
108
|
+
const timestamp = new Date().toISOString();
|
|
109
|
+
const prefix = `[${timestamp}] [${level.toUpperCase()}]`;
|
|
110
|
+
if (sanitized) {
|
|
111
|
+
console.error(`${prefix} ${message}`, JSON.stringify(sanitized));
|
|
112
|
+
}
|
|
113
|
+
else {
|
|
114
|
+
console.error(`${prefix} ${message}`);
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
/**
|
|
118
|
+
* Remove sensitive data from objects before logging
|
|
119
|
+
*/
|
|
120
|
+
function sanitizeForLogging(data) {
|
|
121
|
+
const sensitive = ['apiKey', 'api_key', 'authorization', 'x-api-key', 'password', 'secret', 'token'];
|
|
122
|
+
const result = {};
|
|
123
|
+
for (const [key, value] of Object.entries(data)) {
|
|
124
|
+
if (sensitive.some((s) => key.toLowerCase().includes(s.toLowerCase()))) {
|
|
125
|
+
result[key] = '[REDACTED]';
|
|
126
|
+
}
|
|
127
|
+
else if (typeof value === 'object' && value !== null && !Array.isArray(value)) {
|
|
128
|
+
result[key] = sanitizeForLogging(value);
|
|
129
|
+
}
|
|
130
|
+
else {
|
|
131
|
+
result[key] = value;
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
return result;
|
|
135
|
+
}
|
|
136
|
+
//# 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,36 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* HTTP client for NanoGPT API requests
|
|
3
|
+
*
|
|
4
|
+
* Handles authentication, timeouts, and error normalization.
|
|
5
|
+
* Never logs or exposes API keys.
|
|
6
|
+
*/
|
|
7
|
+
export interface HttpError {
|
|
8
|
+
status: number;
|
|
9
|
+
message: string;
|
|
10
|
+
code?: string;
|
|
11
|
+
}
|
|
12
|
+
export interface HttpResponse<T = unknown> {
|
|
13
|
+
status: number;
|
|
14
|
+
headers: Record<string, string>;
|
|
15
|
+
json: T;
|
|
16
|
+
}
|
|
17
|
+
export interface RequestOptions {
|
|
18
|
+
method: 'GET' | 'POST' | 'PUT' | 'DELETE';
|
|
19
|
+
path: string;
|
|
20
|
+
body?: unknown;
|
|
21
|
+
query?: Record<string, string>;
|
|
22
|
+
timeoutMs?: number;
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Make an HTTP request to NanoGPT
|
|
26
|
+
*/
|
|
27
|
+
export declare function requestJson<T = unknown>({ method, path, body, query, timeoutMs, }: RequestOptions): Promise<HttpResponse<T>>;
|
|
28
|
+
/**
|
|
29
|
+
* Type guard for HttpError
|
|
30
|
+
*/
|
|
31
|
+
export declare function isHttpError(err: unknown): err is HttpError;
|
|
32
|
+
/**
|
|
33
|
+
* Format error for user display (never includes secrets)
|
|
34
|
+
*/
|
|
35
|
+
export declare function formatErrorMessage(err: HttpError): string;
|
|
36
|
+
//# sourceMappingURL=httpClient.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"httpClient.d.ts","sourceRoot":"","sources":["../src/httpClient.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAcH,MAAM,WAAW,SAAS;IACxB,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,YAAY,CAAC,CAAC,GAAG,OAAO;IACvC,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAChC,IAAI,EAAE,CAAC,CAAC;CACT;AAED,MAAM,WAAW,cAAc;IAC7B,MAAM,EAAE,KAAK,GAAG,MAAM,GAAG,KAAK,GAAG,QAAQ,CAAC;IAC1C,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC/B,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAgDD;;GAEG;AACH,wBAAsB,WAAW,CAAC,CAAC,GAAG,OAAO,EAAE,EAC7C,MAAM,EACN,IAAI,EACJ,IAAI,EACJ,KAAK,EACL,SAAS,GACV,EAAE,cAAc,GAAG,OAAO,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,CAqH3C;AAED;;GAEG;AACH,wBAAgB,WAAW,CAAC,GAAG,EAAE,OAAO,GAAG,GAAG,IAAI,SAAS,CAS1D;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,SAAS,GAAG,MAAM,CA6BzD"}
|
|
@@ -0,0 +1,211 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* HTTP client for NanoGPT API requests
|
|
3
|
+
*
|
|
4
|
+
* Handles authentication, timeouts, and error normalization.
|
|
5
|
+
* Never logs or exposes API keys.
|
|
6
|
+
*/
|
|
7
|
+
import { getConfig } from './config.js';
|
|
8
|
+
import { registerRequest, unregisterRequest } from './activeRequests.js';
|
|
9
|
+
// Safe headers to expose in raw responses
|
|
10
|
+
const SAFE_RESPONSE_HEADERS = [
|
|
11
|
+
'x-request-id',
|
|
12
|
+
'x-vercel-id',
|
|
13
|
+
'x-payment-response', // Exposed for payment flow observability per spec
|
|
14
|
+
'content-type',
|
|
15
|
+
'content-length',
|
|
16
|
+
];
|
|
17
|
+
/**
|
|
18
|
+
* Extract a safe subset of headers for debugging
|
|
19
|
+
*/
|
|
20
|
+
function extractSafeHeaders(headers) {
|
|
21
|
+
const safe = {};
|
|
22
|
+
for (const key of SAFE_RESPONSE_HEADERS) {
|
|
23
|
+
const value = headers.get(key);
|
|
24
|
+
if (value) {
|
|
25
|
+
safe[key] = value;
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
return safe;
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Extract error message from upstream response.
|
|
32
|
+
* Handles JSON error objects and plain text responses wrapped as { text }.
|
|
33
|
+
*/
|
|
34
|
+
function extractErrorMessage(json) {
|
|
35
|
+
if (typeof json === 'object' && json !== null) {
|
|
36
|
+
const obj = json;
|
|
37
|
+
if (typeof obj.error === 'string') {
|
|
38
|
+
return obj.error;
|
|
39
|
+
}
|
|
40
|
+
if (typeof obj.error === 'object' && obj.error !== null) {
|
|
41
|
+
const errorObj = obj.error;
|
|
42
|
+
if (typeof errorObj.message === 'string') {
|
|
43
|
+
return errorObj.message;
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
if (typeof obj.message === 'string') {
|
|
47
|
+
return obj.message;
|
|
48
|
+
}
|
|
49
|
+
// Handle non-JSON responses wrapped as { text } (e.g., HTML error pages, plain text)
|
|
50
|
+
if (typeof obj.text === 'string') {
|
|
51
|
+
// Truncate long HTML/text responses to a reasonable length
|
|
52
|
+
const text = obj.text.trim();
|
|
53
|
+
if (text.length > 200) {
|
|
54
|
+
return text.slice(0, 200) + '...';
|
|
55
|
+
}
|
|
56
|
+
return text || 'Unknown error';
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
return 'Unknown error';
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* Make an HTTP request to NanoGPT
|
|
63
|
+
*/
|
|
64
|
+
export async function requestJson({ method, path, body, query, timeoutMs, }) {
|
|
65
|
+
const config = getConfig();
|
|
66
|
+
const timeout = timeoutMs ?? config.timeoutMs;
|
|
67
|
+
// Build URL
|
|
68
|
+
const url = new URL(path, config.baseUrl);
|
|
69
|
+
if (query) {
|
|
70
|
+
for (const [key, value] of Object.entries(query)) {
|
|
71
|
+
url.searchParams.set(key, value);
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
// Build headers
|
|
75
|
+
const headers = {
|
|
76
|
+
'Content-Type': 'application/json',
|
|
77
|
+
'User-Agent': `nanogpt-mcp/1.0.0`,
|
|
78
|
+
};
|
|
79
|
+
// Add auth headers based on mode
|
|
80
|
+
const authMode = config.authMode;
|
|
81
|
+
if (authMode === 'bearer' || authMode === 'both') {
|
|
82
|
+
headers['Authorization'] = `Bearer ${config.apiKey}`;
|
|
83
|
+
}
|
|
84
|
+
if (authMode === 'x-api-key' || authMode === 'both') {
|
|
85
|
+
headers['x-api-key'] = config.apiKey;
|
|
86
|
+
}
|
|
87
|
+
// Setup abort controller for timeout and graceful shutdown
|
|
88
|
+
const controller = new AbortController();
|
|
89
|
+
const timeoutId = setTimeout(() => controller.abort(), timeout);
|
|
90
|
+
// Register controller for graceful shutdown support
|
|
91
|
+
registerRequest(controller);
|
|
92
|
+
try {
|
|
93
|
+
const response = await fetch(url.toString(), {
|
|
94
|
+
method,
|
|
95
|
+
headers,
|
|
96
|
+
body: body ? JSON.stringify(body) : undefined,
|
|
97
|
+
signal: controller.signal,
|
|
98
|
+
});
|
|
99
|
+
clearTimeout(timeoutId);
|
|
100
|
+
// Extract safe headers
|
|
101
|
+
const safeHeaders = extractSafeHeaders(response.headers);
|
|
102
|
+
// Parse JSON response
|
|
103
|
+
let json;
|
|
104
|
+
const contentType = response.headers.get('content-type') || '';
|
|
105
|
+
if (contentType.includes('application/json')) {
|
|
106
|
+
try {
|
|
107
|
+
json = await response.json();
|
|
108
|
+
}
|
|
109
|
+
catch {
|
|
110
|
+
json = null;
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
else {
|
|
114
|
+
const text = await response.text();
|
|
115
|
+
json = { text };
|
|
116
|
+
}
|
|
117
|
+
// Handle non-2xx responses
|
|
118
|
+
if (!response.ok) {
|
|
119
|
+
const errorMessage = extractErrorMessage(json);
|
|
120
|
+
const error = {
|
|
121
|
+
status: response.status,
|
|
122
|
+
message: errorMessage,
|
|
123
|
+
};
|
|
124
|
+
// Extract error code if present
|
|
125
|
+
if (typeof json === 'object' && json !== null) {
|
|
126
|
+
const obj = json;
|
|
127
|
+
if (typeof obj.code === 'string') {
|
|
128
|
+
error.code = obj.code;
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
throw error;
|
|
132
|
+
}
|
|
133
|
+
return {
|
|
134
|
+
status: response.status,
|
|
135
|
+
headers: safeHeaders,
|
|
136
|
+
json: json,
|
|
137
|
+
};
|
|
138
|
+
}
|
|
139
|
+
catch (err) {
|
|
140
|
+
clearTimeout(timeoutId);
|
|
141
|
+
// Handle abort/timeout
|
|
142
|
+
if (err instanceof Error && err.name === 'AbortError') {
|
|
143
|
+
throw {
|
|
144
|
+
status: 408,
|
|
145
|
+
message: 'Request timed out',
|
|
146
|
+
};
|
|
147
|
+
}
|
|
148
|
+
// Re-throw HttpError
|
|
149
|
+
if (isHttpError(err)) {
|
|
150
|
+
throw err;
|
|
151
|
+
}
|
|
152
|
+
// Handle network errors
|
|
153
|
+
if (err instanceof Error) {
|
|
154
|
+
throw {
|
|
155
|
+
status: 0,
|
|
156
|
+
message: `Network error: ${err.message}`,
|
|
157
|
+
};
|
|
158
|
+
}
|
|
159
|
+
throw {
|
|
160
|
+
status: 0,
|
|
161
|
+
message: 'Unknown error occurred',
|
|
162
|
+
};
|
|
163
|
+
}
|
|
164
|
+
finally {
|
|
165
|
+
// Always unregister the controller when request completes
|
|
166
|
+
unregisterRequest(controller);
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
/**
|
|
170
|
+
* Type guard for HttpError
|
|
171
|
+
*/
|
|
172
|
+
export function isHttpError(err) {
|
|
173
|
+
return (typeof err === 'object' &&
|
|
174
|
+
err !== null &&
|
|
175
|
+
'status' in err &&
|
|
176
|
+
'message' in err &&
|
|
177
|
+
typeof err.status === 'number' &&
|
|
178
|
+
typeof err.message === 'string');
|
|
179
|
+
}
|
|
180
|
+
/**
|
|
181
|
+
* Format error for user display (never includes secrets)
|
|
182
|
+
*/
|
|
183
|
+
export function formatErrorMessage(err) {
|
|
184
|
+
const { status, message, code } = err;
|
|
185
|
+
if (status === 401) {
|
|
186
|
+
return 'Authentication failed. Check your NANOGPT_API_KEY.';
|
|
187
|
+
}
|
|
188
|
+
if (status === 402) {
|
|
189
|
+
return `Insufficient balance: ${message}. Please top up your NanoGPT account.`;
|
|
190
|
+
}
|
|
191
|
+
if (status === 403) {
|
|
192
|
+
if (code === 'paid_features_disabled') {
|
|
193
|
+
return 'Paid features are disabled. Enable paid models in your NanoGPT settings.';
|
|
194
|
+
}
|
|
195
|
+
return `Access denied: ${message}`;
|
|
196
|
+
}
|
|
197
|
+
if (status === 408 || status === 499 || status === 504) {
|
|
198
|
+
return `Request timed out or was aborted: ${message}`;
|
|
199
|
+
}
|
|
200
|
+
if (status === 429) {
|
|
201
|
+
return `Rate limited: ${message}. Please wait and try again.`;
|
|
202
|
+
}
|
|
203
|
+
if (status >= 500) {
|
|
204
|
+
return `Server error (${status}): ${message}. Please try again later.`;
|
|
205
|
+
}
|
|
206
|
+
if (status === 400) {
|
|
207
|
+
return `Invalid request: ${message}`;
|
|
208
|
+
}
|
|
209
|
+
return `Error (${status}): ${message}`;
|
|
210
|
+
}
|
|
211
|
+
//# sourceMappingURL=httpClient.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"httpClient.js","sourceRoot":"","sources":["../src/httpClient.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACxC,OAAO,EAAE,eAAe,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AAEzE,0CAA0C;AAC1C,MAAM,qBAAqB,GAAG;IAC5B,cAAc;IACd,aAAa;IACb,oBAAoB,EAAE,kDAAkD;IACxE,cAAc;IACd,gBAAgB;CACjB,CAAC;AAsBF;;GAEG;AACH,SAAS,kBAAkB,CAAC,OAAgB;IAC1C,MAAM,IAAI,GAA2B,EAAE,CAAC;IACxC,KAAK,MAAM,GAAG,IAAI,qBAAqB,EAAE,CAAC;QACxC,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QAC/B,IAAI,KAAK,EAAE,CAAC;YACV,IAAI,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;QACpB,CAAC;IACH,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;;GAGG;AACH,SAAS,mBAAmB,CAAC,IAAa;IACxC,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,IAAI,KAAK,IAAI,EAAE,CAAC;QAC9C,MAAM,GAAG,GAAG,IAA+B,CAAC;QAC5C,IAAI,OAAO,GAAG,CAAC,KAAK,KAAK,QAAQ,EAAE,CAAC;YAClC,OAAO,GAAG,CAAC,KAAK,CAAC;QACnB,CAAC;QACD,IAAI,OAAO,GAAG,CAAC,KAAK,KAAK,QAAQ,IAAI,GAAG,CAAC,KAAK,KAAK,IAAI,EAAE,CAAC;YACxD,MAAM,QAAQ,GAAG,GAAG,CAAC,KAAgC,CAAC;YACtD,IAAI,OAAO,QAAQ,CAAC,OAAO,KAAK,QAAQ,EAAE,CAAC;gBACzC,OAAO,QAAQ,CAAC,OAAO,CAAC;YAC1B,CAAC;QACH,CAAC;QACD,IAAI,OAAO,GAAG,CAAC,OAAO,KAAK,QAAQ,EAAE,CAAC;YACpC,OAAO,GAAG,CAAC,OAAO,CAAC;QACrB,CAAC;QACD,qFAAqF;QACrF,IAAI,OAAO,GAAG,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;YACjC,2DAA2D;YAC3D,MAAM,IAAI,GAAG,GAAG,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;YAC7B,IAAI,IAAI,CAAC,MAAM,GAAG,GAAG,EAAE,CAAC;gBACtB,OAAO,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,GAAG,KAAK,CAAC;YACpC,CAAC;YACD,OAAO,IAAI,IAAI,eAAe,CAAC;QACjC,CAAC;IACH,CAAC;IACD,OAAO,eAAe,CAAC;AACzB,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,WAAW,CAAc,EAC7C,MAAM,EACN,IAAI,EACJ,IAAI,EACJ,KAAK,EACL,SAAS,GACM;IACf,MAAM,MAAM,GAAG,SAAS,EAAE,CAAC;IAC3B,MAAM,OAAO,GAAG,SAAS,IAAI,MAAM,CAAC,SAAS,CAAC;IAE9C,YAAY;IACZ,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,IAAI,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC;IAC1C,IAAI,KAAK,EAAE,CAAC;QACV,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;YACjD,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;QACnC,CAAC;IACH,CAAC;IAED,gBAAgB;IAChB,MAAM,OAAO,GAA2B;QACtC,cAAc,EAAE,kBAAkB;QAClC,YAAY,EAAE,mBAAmB;KAClC,CAAC;IAEF,iCAAiC;IACjC,MAAM,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC;IACjC,IAAI,QAAQ,KAAK,QAAQ,IAAI,QAAQ,KAAK,MAAM,EAAE,CAAC;QACjD,OAAO,CAAC,eAAe,CAAC,GAAG,UAAU,MAAM,CAAC,MAAM,EAAE,CAAC;IACvD,CAAC;IACD,IAAI,QAAQ,KAAK,WAAW,IAAI,QAAQ,KAAK,MAAM,EAAE,CAAC;QACpD,OAAO,CAAC,WAAW,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC;IACvC,CAAC;IAED,2DAA2D;IAC3D,MAAM,UAAU,GAAG,IAAI,eAAe,EAAE,CAAC;IACzC,MAAM,SAAS,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,UAAU,CAAC,KAAK,EAAE,EAAE,OAAO,CAAC,CAAC;IAEhE,oDAAoD;IACpD,eAAe,CAAC,UAAU,CAAC,CAAC;IAE5B,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,CAAC,QAAQ,EAAE,EAAE;YAC3C,MAAM;YACN,OAAO;YACP,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS;YAC7C,MAAM,EAAE,UAAU,CAAC,MAAM;SAC1B,CAAC,CAAC;QAEH,YAAY,CAAC,SAAS,CAAC,CAAC;QAExB,uBAAuB;QACvB,MAAM,WAAW,GAAG,kBAAkB,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;QAEzD,sBAAsB;QACtB,IAAI,IAAa,CAAC;QAClB,MAAM,WAAW,GAAG,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC,IAAI,EAAE,CAAC;QAC/D,IAAI,WAAW,CAAC,QAAQ,CAAC,kBAAkB,CAAC,EAAE,CAAC;YAC7C,IAAI,CAAC;gBACH,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;YAC/B,CAAC;YAAC,MAAM,CAAC;gBACP,IAAI,GAAG,IAAI,CAAC;YACd,CAAC;QACH,CAAC;aAAM,CAAC;YACN,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;YACnC,IAAI,GAAG,EAAE,IAAI,EAAE,CAAC;QAClB,CAAC;QAED,2BAA2B;QAC3B,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;YACjB,MAAM,YAAY,GAAG,mBAAmB,CAAC,IAAI,CAAC,CAAC;YAC/C,MAAM,KAAK,GAAc;gBACvB,MAAM,EAAE,QAAQ,CAAC,MAAM;gBACvB,OAAO,EAAE,YAAY;aACtB,CAAC;YAEF,gCAAgC;YAChC,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,IAAI,KAAK,IAAI,EAAE,CAAC;gBAC9C,MAAM,GAAG,GAAG,IAA+B,CAAC;gBAC5C,IAAI,OAAO,GAAG,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;oBACjC,KAAK,CAAC,IAAI,GAAG,GAAG,CAAC,IAAI,CAAC;gBACxB,CAAC;YACH,CAAC;YAED,MAAM,KAAK,CAAC;QACd,CAAC;QAED,OAAO;YACL,MAAM,EAAE,QAAQ,CAAC,MAAM;YACvB,OAAO,EAAE,WAAW;YACpB,IAAI,EAAE,IAAS;SAChB,CAAC;IACJ,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,YAAY,CAAC,SAAS,CAAC,CAAC;QAExB,uBAAuB;QACvB,IAAI,GAAG,YAAY,KAAK,IAAI,GAAG,CAAC,IAAI,KAAK,YAAY,EAAE,CAAC;YACtD,MAAM;gBACJ,MAAM,EAAE,GAAG;gBACX,OAAO,EAAE,mBAAmB;aAChB,CAAC;QACjB,CAAC;QAED,qBAAqB;QACrB,IAAI,WAAW,CAAC,GAAG,CAAC,EAAE,CAAC;YACrB,MAAM,GAAG,CAAC;QACZ,CAAC;QAED,wBAAwB;QACxB,IAAI,GAAG,YAAY,KAAK,EAAE,CAAC;YACzB,MAAM;gBACJ,MAAM,EAAE,CAAC;gBACT,OAAO,EAAE,kBAAkB,GAAG,CAAC,OAAO,EAAE;aAC5B,CAAC;QACjB,CAAC;QAED,MAAM;YACJ,MAAM,EAAE,CAAC;YACT,OAAO,EAAE,wBAAwB;SACrB,CAAC;IACjB,CAAC;YAAS,CAAC;QACT,0DAA0D;QAC1D,iBAAiB,CAAC,UAAU,CAAC,CAAC;IAChC,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,WAAW,CAAC,GAAY;IACtC,OAAO,CACL,OAAO,GAAG,KAAK,QAAQ;QACvB,GAAG,KAAK,IAAI;QACZ,QAAQ,IAAI,GAAG;QACf,SAAS,IAAI,GAAG;QAChB,OAAQ,GAAiB,CAAC,MAAM,KAAK,QAAQ;QAC7C,OAAQ,GAAiB,CAAC,OAAO,KAAK,QAAQ,CAC/C,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,kBAAkB,CAAC,GAAc;IAC/C,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,GAAG,GAAG,CAAC;IAEtC,IAAI,MAAM,KAAK,GAAG,EAAE,CAAC;QACnB,OAAO,oDAAoD,CAAC;IAC9D,CAAC;IACD,IAAI,MAAM,KAAK,GAAG,EAAE,CAAC;QACnB,OAAO,yBAAyB,OAAO,uCAAuC,CAAC;IACjF,CAAC;IACD,IAAI,MAAM,KAAK,GAAG,EAAE,CAAC;QACnB,IAAI,IAAI,KAAK,wBAAwB,EAAE,CAAC;YACtC,OAAO,0EAA0E,CAAC;QACpF,CAAC;QACD,OAAO,kBAAkB,OAAO,EAAE,CAAC;IACrC,CAAC;IACD,IAAI,MAAM,KAAK,GAAG,IAAI,MAAM,KAAK,GAAG,IAAI,MAAM,KAAK,GAAG,EAAE,CAAC;QACvD,OAAO,qCAAqC,OAAO,EAAE,CAAC;IACxD,CAAC;IACD,IAAI,MAAM,KAAK,GAAG,EAAE,CAAC;QACnB,OAAO,iBAAiB,OAAO,8BAA8B,CAAC;IAChE,CAAC;IACD,IAAI,MAAM,IAAI,GAAG,EAAE,CAAC;QAClB,OAAO,iBAAiB,MAAM,MAAM,OAAO,2BAA2B,CAAC;IACzE,CAAC;IACD,IAAI,MAAM,KAAK,GAAG,EAAE,CAAC;QACnB,OAAO,oBAAoB,OAAO,EAAE,CAAC;IACvC,CAAC;IAED,OAAO,UAAU,MAAM,MAAM,OAAO,EAAE,CAAC;AACzC,CAAC"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* NanoGPT MCP Server
|
|
4
|
+
*
|
|
5
|
+
* An MCP server that provides access to NanoGPT's API capabilities:
|
|
6
|
+
* - Chat completion
|
|
7
|
+
* - Image generation
|
|
8
|
+
* - Web search
|
|
9
|
+
* - URL scraping
|
|
10
|
+
* - YouTube transcription
|
|
11
|
+
* - Model listing
|
|
12
|
+
*
|
|
13
|
+
* Uses stdio transport for communication with MCP clients.
|
|
14
|
+
*
|
|
15
|
+
* Pinned MCP SDK version: @modelcontextprotocol/sdk@^1.23.0
|
|
16
|
+
*/
|
|
17
|
+
export {};
|
|
18
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AACA;;;;;;;;;;;;;;GAcG"}
|