@frontmcp/plugins 0.6.1 → 0.6.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (121) hide show
  1. package/cache/index.js +412 -0
  2. package/codecall/index.js +2988 -0
  3. package/esm/cache/index.mjs +395 -0
  4. package/esm/codecall/index.mjs +2959 -0
  5. package/esm/index.mjs +2951 -0
  6. package/esm/package.json +82 -0
  7. package/index.js +2973 -0
  8. package/package.json +38 -10
  9. package/src/cache/README.md +0 -186
  10. package/src/cache/cache.plugin.js +0 -167
  11. package/src/cache/cache.plugin.js.map +0 -1
  12. package/src/cache/cache.symbol.js +0 -5
  13. package/src/cache/cache.symbol.js.map +0 -1
  14. package/src/cache/cache.types.js +0 -3
  15. package/src/cache/cache.types.js.map +0 -1
  16. package/src/cache/index.js +0 -8
  17. package/src/cache/index.js.map +0 -1
  18. package/src/cache/providers/cache-memory.provider.js +0 -110
  19. package/src/cache/providers/cache-memory.provider.js.map +0 -1
  20. package/src/cache/providers/cache-redis.provider.js +0 -69
  21. package/src/cache/providers/cache-redis.provider.js.map +0 -1
  22. package/src/cache/providers/cache-vercel-kv.provider.js +0 -85
  23. package/src/cache/providers/cache-vercel-kv.provider.js.map +0 -1
  24. package/src/codecall/README.md +0 -999
  25. package/src/codecall/codecall.plugin.js +0 -152
  26. package/src/codecall/codecall.plugin.js.map +0 -1
  27. package/src/codecall/codecall.symbol.js +0 -4
  28. package/src/codecall/codecall.symbol.js.map +0 -1
  29. package/src/codecall/codecall.types.js +0 -262
  30. package/src/codecall/codecall.types.js.map +0 -1
  31. package/src/codecall/errors/index.js +0 -6
  32. package/src/codecall/errors/index.js.map +0 -1
  33. package/src/codecall/errors/tool-call.errors.js +0 -119
  34. package/src/codecall/errors/tool-call.errors.js.map +0 -1
  35. package/src/codecall/index.js +0 -8
  36. package/src/codecall/index.js.map +0 -1
  37. package/src/codecall/providers/code-call.config.js +0 -120
  38. package/src/codecall/providers/code-call.config.js.map +0 -1
  39. package/src/codecall/security/index.js +0 -7
  40. package/src/codecall/security/index.js.map +0 -1
  41. package/src/codecall/security/self-reference-guard.js +0 -70
  42. package/src/codecall/security/self-reference-guard.js.map +0 -1
  43. package/src/codecall/security/tool-access-control.service.js +0 -170
  44. package/src/codecall/security/tool-access-control.service.js.map +0 -1
  45. package/src/codecall/services/audit-logger.service.js +0 -322
  46. package/src/codecall/services/audit-logger.service.js.map +0 -1
  47. package/src/codecall/services/enclave.service.js +0 -214
  48. package/src/codecall/services/enclave.service.js.map +0 -1
  49. package/src/codecall/services/error-enrichment.service.js +0 -387
  50. package/src/codecall/services/error-enrichment.service.js.map +0 -1
  51. package/src/codecall/services/index.js +0 -13
  52. package/src/codecall/services/index.js.map +0 -1
  53. package/src/codecall/services/output-sanitizer.js +0 -260
  54. package/src/codecall/services/output-sanitizer.js.map +0 -1
  55. package/src/codecall/services/synonym-expansion.service.js +0 -374
  56. package/src/codecall/services/synonym-expansion.service.js.map +0 -1
  57. package/src/codecall/services/tool-search.service.js +0 -587
  58. package/src/codecall/services/tool-search.service.js.map +0 -1
  59. package/src/codecall/tools/describe.schema.js +0 -67
  60. package/src/codecall/tools/describe.schema.js.map +0 -1
  61. package/src/codecall/tools/describe.tool.js +0 -207
  62. package/src/codecall/tools/describe.tool.js.map +0 -1
  63. package/src/codecall/tools/execute.schema.js +0 -116
  64. package/src/codecall/tools/execute.schema.js.map +0 -1
  65. package/src/codecall/tools/execute.tool.js +0 -238
  66. package/src/codecall/tools/execute.tool.js.map +0 -1
  67. package/src/codecall/tools/index.js +0 -13
  68. package/src/codecall/tools/index.js.map +0 -1
  69. package/src/codecall/tools/invoke.schema.js +0 -27
  70. package/src/codecall/tools/invoke.schema.js.map +0 -1
  71. package/src/codecall/tools/invoke.tool.js +0 -70
  72. package/src/codecall/tools/invoke.tool.js.map +0 -1
  73. package/src/codecall/tools/search.schema.js +0 -60
  74. package/src/codecall/tools/search.schema.js.map +0 -1
  75. package/src/codecall/tools/search.tool.js +0 -108
  76. package/src/codecall/tools/search.tool.js.map +0 -1
  77. package/src/codecall/utils/describe.utils.js +0 -531
  78. package/src/codecall/utils/describe.utils.js.map +0 -1
  79. package/src/codecall/utils/index.js +0 -7
  80. package/src/codecall/utils/index.js.map +0 -1
  81. package/src/codecall/utils/mcp-result.js +0 -36
  82. package/src/codecall/utils/mcp-result.js.map +0 -1
  83. package/src/index.js +0 -9
  84. package/src/index.js.map +0 -1
  85. /package/{src/cache → cache}/cache.plugin.d.ts +0 -0
  86. /package/{src/cache → cache}/cache.symbol.d.ts +0 -0
  87. /package/{src/cache → cache}/cache.types.d.ts +0 -0
  88. /package/{src/cache → cache}/index.d.ts +0 -0
  89. /package/{src/cache → cache}/providers/cache-memory.provider.d.ts +0 -0
  90. /package/{src/cache → cache}/providers/cache-redis.provider.d.ts +0 -0
  91. /package/{src/cache → cache}/providers/cache-vercel-kv.provider.d.ts +0 -0
  92. /package/{src/codecall → codecall}/codecall.plugin.d.ts +0 -0
  93. /package/{src/codecall → codecall}/codecall.symbol.d.ts +0 -0
  94. /package/{src/codecall → codecall}/codecall.types.d.ts +0 -0
  95. /package/{src/codecall → codecall}/errors/index.d.ts +0 -0
  96. /package/{src/codecall → codecall}/errors/tool-call.errors.d.ts +0 -0
  97. /package/{src/codecall → codecall}/index.d.ts +0 -0
  98. /package/{src/codecall → codecall}/providers/code-call.config.d.ts +0 -0
  99. /package/{src/codecall → codecall}/security/index.d.ts +0 -0
  100. /package/{src/codecall → codecall}/security/self-reference-guard.d.ts +0 -0
  101. /package/{src/codecall → codecall}/security/tool-access-control.service.d.ts +0 -0
  102. /package/{src/codecall → codecall}/services/audit-logger.service.d.ts +0 -0
  103. /package/{src/codecall → codecall}/services/enclave.service.d.ts +0 -0
  104. /package/{src/codecall → codecall}/services/error-enrichment.service.d.ts +0 -0
  105. /package/{src/codecall → codecall}/services/index.d.ts +0 -0
  106. /package/{src/codecall → codecall}/services/output-sanitizer.d.ts +0 -0
  107. /package/{src/codecall → codecall}/services/synonym-expansion.service.d.ts +0 -0
  108. /package/{src/codecall → codecall}/services/tool-search.service.d.ts +0 -0
  109. /package/{src/codecall → codecall}/tools/describe.schema.d.ts +0 -0
  110. /package/{src/codecall → codecall}/tools/describe.tool.d.ts +0 -0
  111. /package/{src/codecall → codecall}/tools/execute.schema.d.ts +0 -0
  112. /package/{src/codecall → codecall}/tools/execute.tool.d.ts +0 -0
  113. /package/{src/codecall → codecall}/tools/index.d.ts +0 -0
  114. /package/{src/codecall → codecall}/tools/invoke.schema.d.ts +0 -0
  115. /package/{src/codecall → codecall}/tools/invoke.tool.d.ts +0 -0
  116. /package/{src/codecall → codecall}/tools/search.schema.d.ts +0 -0
  117. /package/{src/codecall → codecall}/tools/search.tool.d.ts +0 -0
  118. /package/{src/codecall → codecall}/utils/describe.utils.d.ts +0 -0
  119. /package/{src/codecall → codecall}/utils/index.d.ts +0 -0
  120. /package/{src/codecall → codecall}/utils/mcp-result.d.ts +0 -0
  121. /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"]}