@frontmcp/plugins 0.6.1 → 0.6.2
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/cache/index.js +412 -0
- package/codecall/index.js +2988 -0
- package/esm/cache/index.mjs +395 -0
- package/esm/codecall/index.mjs +2959 -0
- package/esm/index.mjs +2951 -0
- package/esm/package.json +85 -0
- package/index.js +2973 -0
- package/package.json +38 -10
- package/src/cache/README.md +0 -186
- package/src/cache/cache.plugin.js +0 -167
- package/src/cache/cache.plugin.js.map +0 -1
- package/src/cache/cache.symbol.js +0 -5
- package/src/cache/cache.symbol.js.map +0 -1
- package/src/cache/cache.types.js +0 -3
- package/src/cache/cache.types.js.map +0 -1
- package/src/cache/index.js +0 -8
- package/src/cache/index.js.map +0 -1
- package/src/cache/providers/cache-memory.provider.js +0 -110
- package/src/cache/providers/cache-memory.provider.js.map +0 -1
- package/src/cache/providers/cache-redis.provider.js +0 -69
- package/src/cache/providers/cache-redis.provider.js.map +0 -1
- package/src/cache/providers/cache-vercel-kv.provider.js +0 -85
- package/src/cache/providers/cache-vercel-kv.provider.js.map +0 -1
- package/src/codecall/README.md +0 -999
- package/src/codecall/codecall.plugin.js +0 -152
- package/src/codecall/codecall.plugin.js.map +0 -1
- package/src/codecall/codecall.symbol.js +0 -4
- package/src/codecall/codecall.symbol.js.map +0 -1
- package/src/codecall/codecall.types.js +0 -262
- package/src/codecall/codecall.types.js.map +0 -1
- package/src/codecall/errors/index.js +0 -6
- package/src/codecall/errors/index.js.map +0 -1
- package/src/codecall/errors/tool-call.errors.js +0 -119
- package/src/codecall/errors/tool-call.errors.js.map +0 -1
- package/src/codecall/index.js +0 -8
- package/src/codecall/index.js.map +0 -1
- package/src/codecall/providers/code-call.config.js +0 -120
- package/src/codecall/providers/code-call.config.js.map +0 -1
- package/src/codecall/security/index.js +0 -7
- package/src/codecall/security/index.js.map +0 -1
- package/src/codecall/security/self-reference-guard.js +0 -70
- package/src/codecall/security/self-reference-guard.js.map +0 -1
- package/src/codecall/security/tool-access-control.service.js +0 -170
- package/src/codecall/security/tool-access-control.service.js.map +0 -1
- package/src/codecall/services/audit-logger.service.js +0 -322
- package/src/codecall/services/audit-logger.service.js.map +0 -1
- package/src/codecall/services/enclave.service.js +0 -214
- package/src/codecall/services/enclave.service.js.map +0 -1
- package/src/codecall/services/error-enrichment.service.js +0 -387
- package/src/codecall/services/error-enrichment.service.js.map +0 -1
- package/src/codecall/services/index.js +0 -13
- package/src/codecall/services/index.js.map +0 -1
- package/src/codecall/services/output-sanitizer.js +0 -260
- package/src/codecall/services/output-sanitizer.js.map +0 -1
- package/src/codecall/services/synonym-expansion.service.js +0 -374
- package/src/codecall/services/synonym-expansion.service.js.map +0 -1
- package/src/codecall/services/tool-search.service.js +0 -587
- package/src/codecall/services/tool-search.service.js.map +0 -1
- package/src/codecall/tools/describe.schema.js +0 -67
- package/src/codecall/tools/describe.schema.js.map +0 -1
- package/src/codecall/tools/describe.tool.js +0 -207
- package/src/codecall/tools/describe.tool.js.map +0 -1
- package/src/codecall/tools/execute.schema.js +0 -116
- package/src/codecall/tools/execute.schema.js.map +0 -1
- package/src/codecall/tools/execute.tool.js +0 -238
- package/src/codecall/tools/execute.tool.js.map +0 -1
- package/src/codecall/tools/index.js +0 -13
- package/src/codecall/tools/index.js.map +0 -1
- package/src/codecall/tools/invoke.schema.js +0 -27
- package/src/codecall/tools/invoke.schema.js.map +0 -1
- package/src/codecall/tools/invoke.tool.js +0 -70
- package/src/codecall/tools/invoke.tool.js.map +0 -1
- package/src/codecall/tools/search.schema.js +0 -60
- package/src/codecall/tools/search.schema.js.map +0 -1
- package/src/codecall/tools/search.tool.js +0 -108
- package/src/codecall/tools/search.tool.js.map +0 -1
- package/src/codecall/utils/describe.utils.js +0 -531
- package/src/codecall/utils/describe.utils.js.map +0 -1
- package/src/codecall/utils/index.js +0 -7
- package/src/codecall/utils/index.js.map +0 -1
- package/src/codecall/utils/mcp-result.js +0 -36
- package/src/codecall/utils/mcp-result.js.map +0 -1
- package/src/index.js +0 -9
- package/src/index.js.map +0 -1
- /package/{src/cache → cache}/cache.plugin.d.ts +0 -0
- /package/{src/cache → cache}/cache.symbol.d.ts +0 -0
- /package/{src/cache → cache}/cache.types.d.ts +0 -0
- /package/{src/cache → cache}/index.d.ts +0 -0
- /package/{src/cache → cache}/providers/cache-memory.provider.d.ts +0 -0
- /package/{src/cache → cache}/providers/cache-redis.provider.d.ts +0 -0
- /package/{src/cache → cache}/providers/cache-vercel-kv.provider.d.ts +0 -0
- /package/{src/codecall → codecall}/codecall.plugin.d.ts +0 -0
- /package/{src/codecall → codecall}/codecall.symbol.d.ts +0 -0
- /package/{src/codecall → codecall}/codecall.types.d.ts +0 -0
- /package/{src/codecall → codecall}/errors/index.d.ts +0 -0
- /package/{src/codecall → codecall}/errors/tool-call.errors.d.ts +0 -0
- /package/{src/codecall → codecall}/index.d.ts +0 -0
- /package/{src/codecall → codecall}/providers/code-call.config.d.ts +0 -0
- /package/{src/codecall → codecall}/security/index.d.ts +0 -0
- /package/{src/codecall → codecall}/security/self-reference-guard.d.ts +0 -0
- /package/{src/codecall → codecall}/security/tool-access-control.service.d.ts +0 -0
- /package/{src/codecall → codecall}/services/audit-logger.service.d.ts +0 -0
- /package/{src/codecall → codecall}/services/enclave.service.d.ts +0 -0
- /package/{src/codecall → codecall}/services/error-enrichment.service.d.ts +0 -0
- /package/{src/codecall → codecall}/services/index.d.ts +0 -0
- /package/{src/codecall → codecall}/services/output-sanitizer.d.ts +0 -0
- /package/{src/codecall → codecall}/services/synonym-expansion.service.d.ts +0 -0
- /package/{src/codecall → codecall}/services/tool-search.service.d.ts +0 -0
- /package/{src/codecall → codecall}/tools/describe.schema.d.ts +0 -0
- /package/{src/codecall → codecall}/tools/describe.tool.d.ts +0 -0
- /package/{src/codecall → codecall}/tools/execute.schema.d.ts +0 -0
- /package/{src/codecall → codecall}/tools/execute.tool.d.ts +0 -0
- /package/{src/codecall → codecall}/tools/index.d.ts +0 -0
- /package/{src/codecall → codecall}/tools/invoke.schema.d.ts +0 -0
- /package/{src/codecall → codecall}/tools/invoke.tool.d.ts +0 -0
- /package/{src/codecall → codecall}/tools/search.schema.d.ts +0 -0
- /package/{src/codecall → codecall}/tools/search.tool.d.ts +0 -0
- /package/{src/codecall → codecall}/utils/describe.utils.d.ts +0 -0
- /package/{src/codecall → codecall}/utils/index.d.ts +0 -0
- /package/{src/codecall → codecall}/utils/mcp-result.d.ts +0 -0
- /package/{src/index.d.ts → index.d.ts} +0 -0
|
@@ -1,69 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
const tslib_1 = require("tslib");
|
|
4
|
-
const ioredis_1 = tslib_1.__importDefault(require("ioredis"));
|
|
5
|
-
const sdk_1 = require("@frontmcp/sdk");
|
|
6
|
-
let CacheRedisProvider = class CacheRedisProvider {
|
|
7
|
-
client;
|
|
8
|
-
constructor(options) {
|
|
9
|
-
if (options.type !== 'redis' && options.type !== 'redis-client') {
|
|
10
|
-
throw new Error('Invalid cache provider type');
|
|
11
|
-
}
|
|
12
|
-
if (options.type === 'redis-client') {
|
|
13
|
-
this.client = options.client;
|
|
14
|
-
return;
|
|
15
|
-
}
|
|
16
|
-
this.client = new ioredis_1.default({
|
|
17
|
-
lazyConnect: false,
|
|
18
|
-
maxRetriesPerRequest: 3,
|
|
19
|
-
...options.config,
|
|
20
|
-
});
|
|
21
|
-
this.client.on('connect', () => console.log('[Redis] Connected'));
|
|
22
|
-
this.client.on('error', (err) => console.error('[Redis] Error:', err));
|
|
23
|
-
}
|
|
24
|
-
/** Set a value (auto-stringifies objects) */
|
|
25
|
-
async setValue(key, value, ttlSeconds) {
|
|
26
|
-
const strValue = typeof value === 'string' ? value : JSON.stringify(value);
|
|
27
|
-
if (ttlSeconds && ttlSeconds > 0) {
|
|
28
|
-
await this.client.set(key, strValue, 'EX', ttlSeconds);
|
|
29
|
-
}
|
|
30
|
-
else {
|
|
31
|
-
await this.client.set(key, strValue);
|
|
32
|
-
}
|
|
33
|
-
}
|
|
34
|
-
/** Get a value and automatically parse JSON if possible */
|
|
35
|
-
async getValue(key, defaultValue) {
|
|
36
|
-
const raw = await this.client.get(key);
|
|
37
|
-
if (raw === null)
|
|
38
|
-
return defaultValue;
|
|
39
|
-
try {
|
|
40
|
-
return JSON.parse(raw);
|
|
41
|
-
}
|
|
42
|
-
catch {
|
|
43
|
-
// fallback for plain string values
|
|
44
|
-
return raw;
|
|
45
|
-
}
|
|
46
|
-
}
|
|
47
|
-
/** Delete a key */
|
|
48
|
-
async delete(key) {
|
|
49
|
-
await this.client.del(key);
|
|
50
|
-
}
|
|
51
|
-
/** Check if a key exists */
|
|
52
|
-
async exists(key) {
|
|
53
|
-
return (await this.client.exists(key)) === 1;
|
|
54
|
-
}
|
|
55
|
-
/** Gracefully close the Redis connection */
|
|
56
|
-
async close() {
|
|
57
|
-
await this.client.quit();
|
|
58
|
-
}
|
|
59
|
-
};
|
|
60
|
-
CacheRedisProvider = tslib_1.__decorate([
|
|
61
|
-
(0, sdk_1.Provider)({
|
|
62
|
-
name: 'provider:cache:redis',
|
|
63
|
-
description: 'Redis-based cache provider',
|
|
64
|
-
scope: sdk_1.ProviderScope.GLOBAL,
|
|
65
|
-
}),
|
|
66
|
-
tslib_1.__metadata("design:paramtypes", [Object])
|
|
67
|
-
], CacheRedisProvider);
|
|
68
|
-
exports.default = CacheRedisProvider;
|
|
69
|
-
//# sourceMappingURL=cache-redis.provider.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"cache-redis.provider.js","sourceRoot":"","sources":["../../../../src/cache/providers/cache-redis.provider.ts"],"names":[],"mappings":";;;AAAA,8DAAsD;AACtD,uCAAwD;AAQzC,IAAM,kBAAkB,GAAxB,MAAM,kBAAkB;IACpB,MAAM,CAAc;IAErC,YAAY,OAA0B;QACpC,IAAI,OAAO,CAAC,IAAI,KAAK,OAAO,IAAI,OAAO,CAAC,IAAI,KAAK,cAAc,EAAE,CAAC;YAChE,MAAM,IAAI,KAAK,CAAC,6BAA6B,CAAC,CAAC;QACjD,CAAC;QAED,IAAI,OAAO,CAAC,IAAI,KAAK,cAAc,EAAE,CAAC;YACpC,IAAI,CAAC,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;YAC7B,OAAO;QACT,CAAC;QACD,IAAI,CAAC,MAAM,GAAG,IAAI,iBAAK,CAAC;YACtB,WAAW,EAAE,KAAK;YAClB,oBAAoB,EAAE,CAAC;YACvB,GAAG,OAAO,CAAC,MAAM;SAClB,CAAC,CAAC;QAEH,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,SAAS,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,mBAAmB,CAAC,CAAC,CAAC;QAClE,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,gBAAgB,EAAE,GAAG,CAAC,CAAC,CAAC;IACzE,CAAC;IAED,6CAA6C;IAC7C,KAAK,CAAC,QAAQ,CAAC,GAAW,EAAE,KAAc,EAAE,UAAmB;QAC7D,MAAM,QAAQ,GAAG,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;QAC3E,IAAI,UAAU,IAAI,UAAU,GAAG,CAAC,EAAE,CAAC;YACjC,MAAM,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,EAAE,QAAQ,EAAE,IAAI,EAAE,UAAU,CAAC,CAAC;QACzD,CAAC;aAAM,CAAC;YACN,MAAM,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;QACvC,CAAC;IACH,CAAC;IAED,2DAA2D;IAC3D,KAAK,CAAC,QAAQ,CAAc,GAAW,EAAE,YAAgB;QACvD,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QACvC,IAAI,GAAG,KAAK,IAAI;YAAE,OAAO,YAAY,CAAC;QAEtC,IAAI,CAAC;YACH,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAM,CAAC;QAC9B,CAAC;QAAC,MAAM,CAAC;YACP,mCAAmC;YACnC,OAAO,GAAmB,CAAC;QAC7B,CAAC;IACH,CAAC;IAED,mBAAmB;IACnB,KAAK,CAAC,MAAM,CAAC,GAAW;QACtB,MAAM,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IAC7B,CAAC;IAED,4BAA4B;IAC5B,KAAK,CAAC,MAAM,CAAC,GAAW;QACtB,OAAO,CAAC,MAAM,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC;IAC/C,CAAC;IAED,4CAA4C;IAC5C,KAAK,CAAC,KAAK;QACT,MAAM,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;IAC3B,CAAC;CACF,CAAA;AA3DoB,kBAAkB;IALtC,IAAA,cAAQ,EAAC;QACR,IAAI,EAAE,sBAAsB;QAC5B,WAAW,EAAE,4BAA4B;QACzC,KAAK,EAAE,mBAAa,CAAC,MAAM;KAC5B,CAAC;;GACmB,kBAAkB,CA2DtC;kBA3DoB,kBAAkB","sourcesContent":["import Redis, { Redis as RedisClient } from 'ioredis';\nimport { Provider, ProviderScope } from '@frontmcp/sdk';\nimport { CacheStoreInterface, RedisCacheOptions } from '../cache.types';\n\n@Provider({\n name: 'provider:cache:redis',\n description: 'Redis-based cache provider',\n scope: ProviderScope.GLOBAL,\n})\nexport default class CacheRedisProvider implements CacheStoreInterface {\n private readonly client: RedisClient;\n\n constructor(options: RedisCacheOptions) {\n if (options.type !== 'redis' && options.type !== 'redis-client') {\n throw new Error('Invalid cache provider type');\n }\n\n if (options.type === 'redis-client') {\n this.client = options.client;\n return;\n }\n this.client = new Redis({\n lazyConnect: false,\n maxRetriesPerRequest: 3,\n ...options.config,\n });\n\n this.client.on('connect', () => console.log('[Redis] Connected'));\n this.client.on('error', (err) => console.error('[Redis] Error:', err));\n }\n\n /** Set a value (auto-stringifies objects) */\n async setValue(key: string, value: unknown, ttlSeconds?: number): Promise<void> {\n const strValue = typeof value === 'string' ? value : JSON.stringify(value);\n if (ttlSeconds && ttlSeconds > 0) {\n await this.client.set(key, strValue, 'EX', ttlSeconds);\n } else {\n await this.client.set(key, strValue);\n }\n }\n\n /** Get a value and automatically parse JSON if possible */\n async getValue<T = unknown>(key: string, defaultValue?: T): Promise<T | undefined> {\n const raw = await this.client.get(key);\n if (raw === null) return defaultValue;\n\n try {\n return JSON.parse(raw) as T;\n } catch {\n // fallback for plain string values\n return raw as unknown as T;\n }\n }\n\n /** Delete a key */\n async delete(key: string): Promise<void> {\n await this.client.del(key);\n }\n\n /** Check if a key exists */\n async exists(key: string): Promise<boolean> {\n return (await this.client.exists(key)) === 1;\n }\n\n /** Gracefully close the Redis connection */\n async close(): Promise<void> {\n await this.client.quit();\n }\n}\n"]}
|
|
@@ -1,85 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
const tslib_1 = require("tslib");
|
|
4
|
-
const sdk_1 = require("@frontmcp/sdk");
|
|
5
|
-
let CacheVercelKvProvider = class CacheVercelKvProvider {
|
|
6
|
-
kv;
|
|
7
|
-
keyPrefix;
|
|
8
|
-
defaultTTL;
|
|
9
|
-
constructor(options = {}) {
|
|
10
|
-
// Lazy import @vercel/kv to avoid bundling when not used
|
|
11
|
-
const vercelKv = require('@vercel/kv');
|
|
12
|
-
// Validate partial configuration - both url and token must be provided together, or neither
|
|
13
|
-
const hasUrl = options.url !== undefined;
|
|
14
|
-
const hasToken = options.token !== undefined;
|
|
15
|
-
if (hasUrl !== hasToken) {
|
|
16
|
-
throw new Error(`CacheVercelKvProvider: Both 'url' and 'token' must be provided together, or neither. ` +
|
|
17
|
-
`Received: url=${hasUrl ? 'provided' : 'missing'}, token=${hasToken ? 'provided' : 'missing'}`);
|
|
18
|
-
}
|
|
19
|
-
// Use the kv instance with custom config if url/token provided
|
|
20
|
-
if (options.url && options.token) {
|
|
21
|
-
this.kv = vercelKv.createClient({
|
|
22
|
-
url: options.url,
|
|
23
|
-
token: options.token,
|
|
24
|
-
});
|
|
25
|
-
}
|
|
26
|
-
else {
|
|
27
|
-
// Use default kv instance (reads from KV_REST_API_URL and KV_REST_API_TOKEN env vars)
|
|
28
|
-
this.kv = vercelKv.kv;
|
|
29
|
-
}
|
|
30
|
-
this.keyPrefix = options.keyPrefix ?? 'cache:';
|
|
31
|
-
this.defaultTTL = options.defaultTTL ?? 60 * 60 * 24; // 1 day default
|
|
32
|
-
}
|
|
33
|
-
prefixKey(key) {
|
|
34
|
-
return `${this.keyPrefix}${key}`;
|
|
35
|
-
}
|
|
36
|
-
/** Set a value (auto-stringifies objects) */
|
|
37
|
-
async setValue(key, value, ttlSeconds) {
|
|
38
|
-
const strValue = typeof value === 'string' ? value : JSON.stringify(value);
|
|
39
|
-
const ttl = ttlSeconds ?? this.defaultTTL;
|
|
40
|
-
if (ttl > 0) {
|
|
41
|
-
await this.kv.set(this.prefixKey(key), strValue, { ex: ttl });
|
|
42
|
-
}
|
|
43
|
-
else {
|
|
44
|
-
await this.kv.set(this.prefixKey(key), strValue);
|
|
45
|
-
}
|
|
46
|
-
}
|
|
47
|
-
/** Get a value and automatically parse JSON if possible */
|
|
48
|
-
async getValue(key, defaultValue) {
|
|
49
|
-
const raw = await this.kv.get(this.prefixKey(key));
|
|
50
|
-
if (raw === null || raw === undefined)
|
|
51
|
-
return defaultValue;
|
|
52
|
-
// Vercel KV auto-parses JSON, but we handle string fallback
|
|
53
|
-
if (typeof raw === 'string') {
|
|
54
|
-
try {
|
|
55
|
-
return JSON.parse(raw);
|
|
56
|
-
}
|
|
57
|
-
catch {
|
|
58
|
-
return raw;
|
|
59
|
-
}
|
|
60
|
-
}
|
|
61
|
-
return raw;
|
|
62
|
-
}
|
|
63
|
-
/** Delete a key */
|
|
64
|
-
async delete(key) {
|
|
65
|
-
await this.kv.del(this.prefixKey(key));
|
|
66
|
-
}
|
|
67
|
-
/** Check if a key exists */
|
|
68
|
-
async exists(key) {
|
|
69
|
-
return (await this.kv.exists(this.prefixKey(key))) === 1;
|
|
70
|
-
}
|
|
71
|
-
/** Gracefully close the provider (no-op for Vercel KV - stateless REST API) */
|
|
72
|
-
async close() {
|
|
73
|
-
// No-op: Vercel KV uses stateless REST API, no connection to close
|
|
74
|
-
}
|
|
75
|
-
};
|
|
76
|
-
CacheVercelKvProvider = tslib_1.__decorate([
|
|
77
|
-
(0, sdk_1.Provider)({
|
|
78
|
-
name: 'provider:cache:vercel-kv',
|
|
79
|
-
description: 'Vercel KV-based cache provider',
|
|
80
|
-
scope: sdk_1.ProviderScope.GLOBAL,
|
|
81
|
-
}),
|
|
82
|
-
tslib_1.__metadata("design:paramtypes", [Object])
|
|
83
|
-
], CacheVercelKvProvider);
|
|
84
|
-
exports.default = CacheVercelKvProvider;
|
|
85
|
-
//# sourceMappingURL=cache-vercel-kv.provider.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"cache-vercel-kv.provider.js","sourceRoot":"","sources":["../../../../src/cache/providers/cache-vercel-kv.provider.ts"],"names":[],"mappings":"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","sourcesContent":["import { Provider, ProviderScope } from '@frontmcp/sdk';\nimport { CacheStoreInterface } from '../cache.types';\n\nexport interface CacheVercelKvProviderOptions {\n url?: string;\n token?: string;\n keyPrefix?: string;\n defaultTTL?: number;\n}\n\n/** Minimal interface for Vercel KV client operations used by the cache provider */\ninterface VercelKvClient {\n set(key: string, value: string, options?: { ex?: number }): Promise<void>;\n get(key: string): Promise<unknown>;\n del(key: string): Promise<void>;\n exists(key: string): Promise<number>;\n}\n\n@Provider({\n name: 'provider:cache:vercel-kv',\n description: 'Vercel KV-based cache provider',\n scope: ProviderScope.GLOBAL,\n})\nexport default class CacheVercelKvProvider implements CacheStoreInterface {\n private kv: VercelKvClient;\n private readonly keyPrefix: string;\n private readonly defaultTTL: number;\n\n constructor(options: CacheVercelKvProviderOptions = {}) {\n // Lazy import @vercel/kv to avoid bundling when not used\n const vercelKv = require('@vercel/kv');\n\n // Validate partial configuration - both url and token must be provided together, or neither\n const hasUrl = options.url !== undefined;\n const hasToken = options.token !== undefined;\n if (hasUrl !== hasToken) {\n throw new Error(\n `CacheVercelKvProvider: Both 'url' and 'token' must be provided together, or neither. ` +\n `Received: url=${hasUrl ? 'provided' : 'missing'}, token=${hasToken ? 'provided' : 'missing'}`,\n );\n }\n\n // Use the kv instance with custom config if url/token provided\n if (options.url && options.token) {\n this.kv = vercelKv.createClient({\n url: options.url,\n token: options.token,\n });\n } else {\n // Use default kv instance (reads from KV_REST_API_URL and KV_REST_API_TOKEN env vars)\n this.kv = vercelKv.kv;\n }\n\n this.keyPrefix = options.keyPrefix ?? 'cache:';\n this.defaultTTL = options.defaultTTL ?? 60 * 60 * 24; // 1 day default\n }\n\n private prefixKey(key: string): string {\n return `${this.keyPrefix}${key}`;\n }\n\n /** Set a value (auto-stringifies objects) */\n async setValue(key: string, value: unknown, ttlSeconds?: number): Promise<void> {\n const strValue = typeof value === 'string' ? value : JSON.stringify(value);\n const ttl = ttlSeconds ?? this.defaultTTL;\n\n if (ttl > 0) {\n await this.kv.set(this.prefixKey(key), strValue, { ex: ttl });\n } else {\n await this.kv.set(this.prefixKey(key), strValue);\n }\n }\n\n /** Get a value and automatically parse JSON if possible */\n async getValue<T = unknown>(key: string, defaultValue?: T): Promise<T | undefined> {\n const raw = await this.kv.get(this.prefixKey(key));\n if (raw === null || raw === undefined) return defaultValue;\n\n // Vercel KV auto-parses JSON, but we handle string fallback\n if (typeof raw === 'string') {\n try {\n return JSON.parse(raw) as T;\n } catch {\n return raw as unknown as T;\n }\n }\n\n return raw as T;\n }\n\n /** Delete a key */\n async delete(key: string): Promise<void> {\n await this.kv.del(this.prefixKey(key));\n }\n\n /** Check if a key exists */\n async exists(key: string): Promise<boolean> {\n return (await this.kv.exists(this.prefixKey(key))) === 1;\n }\n\n /** Gracefully close the provider (no-op for Vercel KV - stateless REST API) */\n async close(): Promise<void> {\n // No-op: Vercel KV uses stateless REST API, no connection to close\n }\n}\n"]}
|