@frontmcp/plugin-remember 1.8.5 → 1.8.7
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/esm/index.mjs +295 -215
- package/esm/package.json +4 -4
- package/index.d.ts +1 -1
- package/index.d.ts.map +1 -1
- package/index.js +320 -239
- package/package.json +4 -4
- package/providers/remember-accessor.provider.d.ts.map +1 -1
- package/remember.errors.d.ts +13 -2
- package/remember.errors.d.ts.map +1 -1
- package/remember.plugin.d.ts +6 -1
- package/remember.plugin.d.ts.map +1 -1
- package/tools/forget.tool.d.ts +24 -0
- package/tools/forget.tool.d.ts.map +1 -1
- package/tools/index.d.ts +2 -0
- package/tools/index.d.ts.map +1 -1
- package/tools/list-memories.tool.d.ts +25 -0
- package/tools/list-memories.tool.d.ts.map +1 -1
- package/tools/recall.tool.d.ts +26 -0
- package/tools/recall.tool.d.ts.map +1 -1
- package/tools/remember-scope.description.d.ts +10 -0
- package/tools/remember-scope.description.d.ts.map +1 -0
- package/tools/remember-this.tool.d.ts +33 -0
- package/tools/remember-this.tool.d.ts.map +1 -1
- package/tools/remember-tool-names.d.ts +9 -0
- package/tools/remember-tool-names.d.ts.map +1 -0
- package/tools/remember-tools.factory.d.ts +8 -0
- package/tools/remember-tools.factory.d.ts.map +1 -0
package/index.js
CHANGED
|
@@ -50,6 +50,7 @@ __export(index_exports, {
|
|
|
50
50
|
RememberMemoryProvider: () => RememberMemoryProvider,
|
|
51
51
|
RememberPlugin: () => RememberPlugin,
|
|
52
52
|
RememberRedisProvider: () => RememberRedisProvider,
|
|
53
|
+
RememberScopeNotAllowedError: () => RememberScopeNotAllowedError,
|
|
53
54
|
RememberStoreToken: () => RememberStoreToken,
|
|
54
55
|
RememberThisTool: () => RememberThisTool,
|
|
55
56
|
RememberVercelKvProvider: () => RememberVercelKvProvider,
|
|
@@ -61,10 +62,10 @@ __export(index_exports, {
|
|
|
61
62
|
module.exports = __toCommonJS(index_exports);
|
|
62
63
|
|
|
63
64
|
// plugins/plugin-remember/src/remember.plugin.ts
|
|
64
|
-
var
|
|
65
|
+
var import_sdk11 = require("@frontmcp/sdk");
|
|
65
66
|
|
|
66
67
|
// plugins/plugin-remember/src/providers/remember-accessor.provider.ts
|
|
67
|
-
var
|
|
68
|
+
var import_sdk2 = require("@frontmcp/sdk");
|
|
68
69
|
|
|
69
70
|
// plugins/plugin-remember/src/remember.crypto.ts
|
|
70
71
|
var import_utils2 = require("@frontmcp/utils");
|
|
@@ -303,10 +304,21 @@ async function deserializeAndDecrypt(str, keySource) {
|
|
|
303
304
|
}
|
|
304
305
|
|
|
305
306
|
// plugins/plugin-remember/src/remember.errors.ts
|
|
306
|
-
var
|
|
307
|
+
var import_sdk = require("@frontmcp/sdk");
|
|
308
|
+
var RememberIdentityError = class extends import_sdk.PublicMcpError {
|
|
307
309
|
name = "RememberIdentityError";
|
|
308
310
|
constructor(message) {
|
|
309
|
-
super(message);
|
|
311
|
+
super(message, "REMEMBER_IDENTITY_REQUIRED", 403);
|
|
312
|
+
}
|
|
313
|
+
};
|
|
314
|
+
var RememberScopeNotAllowedError = class extends import_sdk.PublicMcpError {
|
|
315
|
+
name = "RememberScopeNotAllowedError";
|
|
316
|
+
constructor(scope, allowedScopes) {
|
|
317
|
+
super(
|
|
318
|
+
`Scope '${scope}' is not allowed. Allowed scopes: ${allowedScopes.join(", ")}`,
|
|
319
|
+
"REMEMBER_SCOPE_NOT_ALLOWED",
|
|
320
|
+
400
|
|
321
|
+
);
|
|
310
322
|
}
|
|
311
323
|
};
|
|
312
324
|
|
|
@@ -593,7 +605,7 @@ var RememberAccessor = class {
|
|
|
593
605
|
get verifiedSessionId() {
|
|
594
606
|
const authInfo = this.ctx.authInfo;
|
|
595
607
|
return [authInfo?.sessionId, authInfo?.extra?.["sessionId"]].find(
|
|
596
|
-
(candidate) => typeof candidate === "string" && candidate.length > 0 && candidate !==
|
|
608
|
+
(candidate) => typeof candidate === "string" && candidate.length > 0 && candidate !== import_sdk2.STATELESS_SESSION_ID
|
|
597
609
|
);
|
|
598
610
|
}
|
|
599
611
|
/**
|
|
@@ -614,11 +626,11 @@ var RememberAccessor = class {
|
|
|
614
626
|
return sessionId;
|
|
615
627
|
}
|
|
616
628
|
const userId = this.userId;
|
|
617
|
-
if (userId && !(0,
|
|
629
|
+
if (userId && !(0, import_sdk2.isAnonymousSubject)(userId)) {
|
|
618
630
|
return `stateless-user:${userId}`;
|
|
619
631
|
}
|
|
620
632
|
throw new RememberIdentityError(
|
|
621
|
-
`Remember cannot use session or tool scope for an unauthenticated request without a verified session: a stateless request shares the session id "${
|
|
633
|
+
`Remember cannot use session or tool scope for an unauthenticated request without a verified session: a stateless request shares the session id "${import_sdk2.STATELESS_SESSION_ID}", and an mcp-session-id the server did not verify could belong to any caller, so the data would be shared across clients. Authenticate the request, use a stateful transport, or choose the 'global' scope if the data really is shared.`
|
|
622
634
|
);
|
|
623
635
|
}
|
|
624
636
|
/**
|
|
@@ -628,7 +640,7 @@ var RememberAccessor = class {
|
|
|
628
640
|
* `'unknown'`.
|
|
629
641
|
*/
|
|
630
642
|
get toolName() {
|
|
631
|
-
return (0,
|
|
643
|
+
return (0, import_sdk2.getRunningTool)()?.fullName ?? this.ctx.flow?.name ?? "unknown";
|
|
632
644
|
}
|
|
633
645
|
/**
|
|
634
646
|
* Build the scope-specific prefix.
|
|
@@ -644,7 +656,7 @@ var RememberAccessor = class {
|
|
|
644
656
|
return `${this.keyPrefix}${STORAGE_LAYOUT_VERSION}:session:${encodeKeyPart(this.resolveSessionIdentity())}:`;
|
|
645
657
|
case "user": {
|
|
646
658
|
const userId = this.userId;
|
|
647
|
-
if (!userId) {
|
|
659
|
+
if (!userId || (0, import_sdk2.isAnonymousSubject)(userId)) {
|
|
648
660
|
throw new RememberIdentityError(
|
|
649
661
|
"Remember cannot use user scope without an authenticated user: all unauthenticated callers would share one namespace. Authenticate the request or use the 'global' scope."
|
|
650
662
|
);
|
|
@@ -680,10 +692,10 @@ var RememberAccessor = class {
|
|
|
680
692
|
}
|
|
681
693
|
};
|
|
682
694
|
RememberAccessor = __decorateClass([
|
|
683
|
-
(0,
|
|
695
|
+
(0, import_sdk2.Provider)({
|
|
684
696
|
name: "provider:remember:accessor",
|
|
685
697
|
description: "Context-scoped accessor for RememberPlugin storage",
|
|
686
|
-
scope:
|
|
698
|
+
scope: import_sdk2.ProviderScope.CONTEXT
|
|
687
699
|
})
|
|
688
700
|
], RememberAccessor);
|
|
689
701
|
function createRememberAccessor(store, ctx, config, logger) {
|
|
@@ -691,7 +703,7 @@ function createRememberAccessor(store, ctx, config, logger) {
|
|
|
691
703
|
}
|
|
692
704
|
|
|
693
705
|
// plugins/plugin-remember/src/providers/remember-memory.provider.ts
|
|
694
|
-
var
|
|
706
|
+
var import_sdk3 = require("@frontmcp/sdk");
|
|
695
707
|
var MAX_TIMEOUT_MS = 2 ** 31 - 1;
|
|
696
708
|
var RememberMemoryProvider = class {
|
|
697
709
|
memory = /* @__PURE__ */ new Map();
|
|
@@ -852,16 +864,16 @@ var RememberMemoryProvider = class {
|
|
|
852
864
|
__publicField(RememberMemoryProvider, "MAX_PATTERN_LENGTH", 500);
|
|
853
865
|
__publicField(RememberMemoryProvider, "MAX_WILDCARDS", 20);
|
|
854
866
|
RememberMemoryProvider = __decorateClass([
|
|
855
|
-
(0,
|
|
867
|
+
(0, import_sdk3.Provider)({
|
|
856
868
|
name: "provider:remember:memory",
|
|
857
869
|
description: "In-memory storage provider for RememberPlugin",
|
|
858
|
-
scope:
|
|
870
|
+
scope: import_sdk3.ProviderScope.GLOBAL
|
|
859
871
|
})
|
|
860
872
|
], RememberMemoryProvider);
|
|
861
873
|
|
|
862
874
|
// plugins/plugin-remember/src/providers/remember-redis.provider.ts
|
|
863
875
|
var import_ioredis = __toESM(require("ioredis"));
|
|
864
|
-
var
|
|
876
|
+
var import_sdk4 = require("@frontmcp/sdk");
|
|
865
877
|
var RememberRedisProvider = class {
|
|
866
878
|
client;
|
|
867
879
|
/**
|
|
@@ -1000,15 +1012,15 @@ var RememberRedisProvider = class {
|
|
|
1000
1012
|
}
|
|
1001
1013
|
};
|
|
1002
1014
|
RememberRedisProvider = __decorateClass([
|
|
1003
|
-
(0,
|
|
1015
|
+
(0, import_sdk4.Provider)({
|
|
1004
1016
|
name: "provider:remember:redis",
|
|
1005
1017
|
description: "Redis-based storage provider for RememberPlugin",
|
|
1006
|
-
scope:
|
|
1018
|
+
scope: import_sdk4.ProviderScope.GLOBAL
|
|
1007
1019
|
})
|
|
1008
1020
|
], RememberRedisProvider);
|
|
1009
1021
|
|
|
1010
1022
|
// plugins/plugin-remember/src/providers/remember-vercel-kv.provider.ts
|
|
1011
|
-
var
|
|
1023
|
+
var import_sdk5 = require("@frontmcp/sdk");
|
|
1012
1024
|
var RememberVercelKvProvider = class {
|
|
1013
1025
|
kv;
|
|
1014
1026
|
keyPrefix;
|
|
@@ -1131,10 +1143,10 @@ var RememberVercelKvProvider = class {
|
|
|
1131
1143
|
}
|
|
1132
1144
|
};
|
|
1133
1145
|
RememberVercelKvProvider = __decorateClass([
|
|
1134
|
-
(0,
|
|
1146
|
+
(0, import_sdk5.Provider)({
|
|
1135
1147
|
name: "provider:remember:vercel-kv",
|
|
1136
1148
|
description: "Vercel KV-based storage provider for RememberPlugin",
|
|
1137
|
-
scope:
|
|
1149
|
+
scope: import_sdk5.ProviderScope.GLOBAL
|
|
1138
1150
|
})
|
|
1139
1151
|
], RememberVercelKvProvider);
|
|
1140
1152
|
|
|
@@ -1149,8 +1161,267 @@ var RememberAccessorToken = /* @__PURE__ */ Symbol(
|
|
|
1149
1161
|
"plugin:remember:accessor"
|
|
1150
1162
|
);
|
|
1151
1163
|
|
|
1164
|
+
// plugins/plugin-remember/src/tools/remember-tools.factory.ts
|
|
1165
|
+
var import_sdk10 = require("@frontmcp/sdk");
|
|
1166
|
+
|
|
1167
|
+
// plugins/plugin-remember/src/tools/forget.tool.ts
|
|
1168
|
+
var import_lazy_zod2 = require("@frontmcp/lazy-zod");
|
|
1169
|
+
var import_sdk6 = require("@frontmcp/sdk");
|
|
1170
|
+
|
|
1171
|
+
// plugins/plugin-remember/src/tools/remember-scope.description.ts
|
|
1172
|
+
var REMEMBER_SCOPE_DESCRIPTION = "Whose memory to use (default: session). session: this session; without one (stateless HTTP, MCP 2026-07-28), the signed-in caller across its requests. user: the signed-in caller, across all of its sessions. tool: the tool running the call, for the same caller as session; each memory tool has its own, so the other memory tools do not see what one of them stores in tool scope. global: shared by every caller. An anonymous caller cannot use user scope, nor session or tool scope without a session.";
|
|
1173
|
+
|
|
1174
|
+
// plugins/plugin-remember/src/tools/remember-tool-names.ts
|
|
1175
|
+
function rememberToolNames(prefix = "") {
|
|
1176
|
+
return {
|
|
1177
|
+
rememberThis: `${prefix}remember_this`,
|
|
1178
|
+
recall: `${prefix}recall`,
|
|
1179
|
+
forget: `${prefix}forget`,
|
|
1180
|
+
listMemories: `${prefix}list_memories`
|
|
1181
|
+
};
|
|
1182
|
+
}
|
|
1183
|
+
|
|
1184
|
+
// plugins/plugin-remember/src/tools/forget.tool.ts
|
|
1185
|
+
var forgetInputSchema = {
|
|
1186
|
+
key: import_lazy_zod2.z.string().min(1).describe("What memory to forget"),
|
|
1187
|
+
scope: import_lazy_zod2.z.enum(["session", "user", "tool", "global"]).optional().describe(REMEMBER_SCOPE_DESCRIPTION)
|
|
1188
|
+
};
|
|
1189
|
+
var forgetOutputSchema = import_lazy_zod2.z.object({
|
|
1190
|
+
success: import_lazy_zod2.z.boolean(),
|
|
1191
|
+
key: import_lazy_zod2.z.string(),
|
|
1192
|
+
scope: import_lazy_zod2.z.string(),
|
|
1193
|
+
existed: import_lazy_zod2.z.boolean()
|
|
1194
|
+
});
|
|
1195
|
+
function forgetDescription() {
|
|
1196
|
+
return "Forget a previously remembered value. Use this when the user wants to delete stored preferences or information.";
|
|
1197
|
+
}
|
|
1198
|
+
function forgetToolMetadata(names = rememberToolNames()) {
|
|
1199
|
+
return {
|
|
1200
|
+
name: names.forget,
|
|
1201
|
+
description: forgetDescription(),
|
|
1202
|
+
inputSchema: forgetInputSchema,
|
|
1203
|
+
outputSchema: forgetOutputSchema,
|
|
1204
|
+
annotations: { readOnlyHint: false }
|
|
1205
|
+
};
|
|
1206
|
+
}
|
|
1207
|
+
var ForgetTool = class extends import_sdk6.ToolContext {
|
|
1208
|
+
async execute(input) {
|
|
1209
|
+
const remember = this.get(RememberAccessorToken);
|
|
1210
|
+
const config = this.get(RememberConfigToken);
|
|
1211
|
+
const scope = input.scope ?? "session";
|
|
1212
|
+
const allowedScopes = config.tools?.allowedScopes ?? ["session", "user", "tool", "global"];
|
|
1213
|
+
if (!allowedScopes.includes(scope)) {
|
|
1214
|
+
throw this.fail(new RememberScopeNotAllowedError(scope, allowedScopes));
|
|
1215
|
+
}
|
|
1216
|
+
const existed = await remember.knows(input.key, { scope });
|
|
1217
|
+
await remember.forget(input.key, { scope });
|
|
1218
|
+
return {
|
|
1219
|
+
success: true,
|
|
1220
|
+
key: input.key,
|
|
1221
|
+
scope,
|
|
1222
|
+
existed
|
|
1223
|
+
};
|
|
1224
|
+
}
|
|
1225
|
+
};
|
|
1226
|
+
ForgetTool = __decorateClass([
|
|
1227
|
+
(0, import_sdk6.Tool)(forgetToolMetadata())
|
|
1228
|
+
], ForgetTool);
|
|
1229
|
+
|
|
1230
|
+
// plugins/plugin-remember/src/tools/list-memories.tool.ts
|
|
1231
|
+
var import_lazy_zod3 = require("@frontmcp/lazy-zod");
|
|
1232
|
+
var import_sdk7 = require("@frontmcp/sdk");
|
|
1233
|
+
var listMemoriesInputSchema = {
|
|
1234
|
+
scope: import_lazy_zod3.z.enum(["session", "user", "tool", "global"]).optional().describe(REMEMBER_SCOPE_DESCRIPTION),
|
|
1235
|
+
pattern: import_lazy_zod3.z.string().optional().describe('Pattern to filter keys (e.g., "user_*")'),
|
|
1236
|
+
limit: import_lazy_zod3.z.number().positive().max(100).optional().describe("Maximum number of keys to return (default: 50)")
|
|
1237
|
+
};
|
|
1238
|
+
var listMemoriesOutputSchema = import_lazy_zod3.z.object({
|
|
1239
|
+
keys: import_lazy_zod3.z.array(import_lazy_zod3.z.string()),
|
|
1240
|
+
scope: import_lazy_zod3.z.string(),
|
|
1241
|
+
count: import_lazy_zod3.z.number(),
|
|
1242
|
+
truncated: import_lazy_zod3.z.boolean()
|
|
1243
|
+
});
|
|
1244
|
+
function listMemoriesDescription(names = rememberToolNames()) {
|
|
1245
|
+
return `List the remembered keys in one scope (default: session). Use this to see what memories are stored before you ${names.recall} or ${names.forget} one.`;
|
|
1246
|
+
}
|
|
1247
|
+
function listMemoriesToolMetadata(names = rememberToolNames()) {
|
|
1248
|
+
return {
|
|
1249
|
+
name: names.listMemories,
|
|
1250
|
+
description: listMemoriesDescription(names),
|
|
1251
|
+
inputSchema: listMemoriesInputSchema,
|
|
1252
|
+
outputSchema: listMemoriesOutputSchema,
|
|
1253
|
+
annotations: { readOnlyHint: true }
|
|
1254
|
+
};
|
|
1255
|
+
}
|
|
1256
|
+
var ListMemoriesTool = class extends import_sdk7.ToolContext {
|
|
1257
|
+
async execute(input) {
|
|
1258
|
+
const remember = this.get(RememberAccessorToken);
|
|
1259
|
+
const config = this.get(RememberConfigToken);
|
|
1260
|
+
const scope = input.scope ?? "session";
|
|
1261
|
+
const allowedScopes = config.tools?.allowedScopes ?? ["session", "user", "tool", "global"];
|
|
1262
|
+
if (!allowedScopes.includes(scope)) {
|
|
1263
|
+
throw this.fail(new RememberScopeNotAllowedError(scope, allowedScopes));
|
|
1264
|
+
}
|
|
1265
|
+
const limit = input.limit ?? 50;
|
|
1266
|
+
let keys = await remember.list({ scope, pattern: input.pattern });
|
|
1267
|
+
const truncated = keys.length > limit;
|
|
1268
|
+
if (truncated) {
|
|
1269
|
+
keys = keys.slice(0, limit);
|
|
1270
|
+
}
|
|
1271
|
+
return {
|
|
1272
|
+
keys,
|
|
1273
|
+
scope,
|
|
1274
|
+
count: keys.length,
|
|
1275
|
+
truncated
|
|
1276
|
+
};
|
|
1277
|
+
}
|
|
1278
|
+
};
|
|
1279
|
+
ListMemoriesTool = __decorateClass([
|
|
1280
|
+
(0, import_sdk7.Tool)(listMemoriesToolMetadata())
|
|
1281
|
+
], ListMemoriesTool);
|
|
1282
|
+
|
|
1283
|
+
// plugins/plugin-remember/src/tools/recall.tool.ts
|
|
1284
|
+
var import_lazy_zod4 = require("@frontmcp/lazy-zod");
|
|
1285
|
+
var import_sdk8 = require("@frontmcp/sdk");
|
|
1286
|
+
var recallInputSchema = {
|
|
1287
|
+
key: import_lazy_zod4.z.string().min(1).describe("What memory to recall"),
|
|
1288
|
+
scope: import_lazy_zod4.z.enum(["session", "user", "tool", "global"]).optional().describe(REMEMBER_SCOPE_DESCRIPTION)
|
|
1289
|
+
};
|
|
1290
|
+
var recallOutputSchema = import_lazy_zod4.z.object({
|
|
1291
|
+
found: import_lazy_zod4.z.boolean(),
|
|
1292
|
+
key: import_lazy_zod4.z.string(),
|
|
1293
|
+
value: import_lazy_zod4.z.unknown().optional(),
|
|
1294
|
+
scope: import_lazy_zod4.z.string(),
|
|
1295
|
+
createdAt: import_lazy_zod4.z.number().optional(),
|
|
1296
|
+
expiresAt: import_lazy_zod4.z.number().optional()
|
|
1297
|
+
});
|
|
1298
|
+
function recallDescription(names = rememberToolNames()) {
|
|
1299
|
+
return `Recall something that was previously remembered. Use this to retrieve stored preferences, settings, or any information that was saved with ${names.rememberThis}.`;
|
|
1300
|
+
}
|
|
1301
|
+
function recallToolMetadata(names = rememberToolNames()) {
|
|
1302
|
+
return {
|
|
1303
|
+
name: names.recall,
|
|
1304
|
+
description: recallDescription(names),
|
|
1305
|
+
inputSchema: recallInputSchema,
|
|
1306
|
+
outputSchema: recallOutputSchema,
|
|
1307
|
+
annotations: { readOnlyHint: true }
|
|
1308
|
+
};
|
|
1309
|
+
}
|
|
1310
|
+
var RecallTool = class extends import_sdk8.ToolContext {
|
|
1311
|
+
async execute(input) {
|
|
1312
|
+
const remember = this.get(RememberAccessorToken);
|
|
1313
|
+
const config = this.get(RememberConfigToken);
|
|
1314
|
+
const scope = input.scope ?? "session";
|
|
1315
|
+
const allowedScopes = config.tools?.allowedScopes ?? ["session", "user", "tool", "global"];
|
|
1316
|
+
if (!allowedScopes.includes(scope)) {
|
|
1317
|
+
throw this.fail(new RememberScopeNotAllowedError(scope, allowedScopes));
|
|
1318
|
+
}
|
|
1319
|
+
const entry = await remember.getEntry(input.key, { scope });
|
|
1320
|
+
if (!entry) {
|
|
1321
|
+
return {
|
|
1322
|
+
found: false,
|
|
1323
|
+
key: input.key,
|
|
1324
|
+
scope
|
|
1325
|
+
};
|
|
1326
|
+
}
|
|
1327
|
+
return {
|
|
1328
|
+
found: true,
|
|
1329
|
+
key: input.key,
|
|
1330
|
+
value: entry.value,
|
|
1331
|
+
scope,
|
|
1332
|
+
createdAt: entry.createdAt,
|
|
1333
|
+
expiresAt: entry.expiresAt
|
|
1334
|
+
};
|
|
1335
|
+
}
|
|
1336
|
+
};
|
|
1337
|
+
RecallTool = __decorateClass([
|
|
1338
|
+
(0, import_sdk8.Tool)(recallToolMetadata())
|
|
1339
|
+
], RecallTool);
|
|
1340
|
+
|
|
1341
|
+
// plugins/plugin-remember/src/tools/remember-this.tool.ts
|
|
1342
|
+
var import_lazy_zod5 = require("@frontmcp/lazy-zod");
|
|
1343
|
+
var import_sdk9 = require("@frontmcp/sdk");
|
|
1344
|
+
var rememberThisInputSchema = {
|
|
1345
|
+
key: import_lazy_zod5.z.string().min(1).describe('What to call this memory (e.g., "user_preference", "last_action")'),
|
|
1346
|
+
value: import_lazy_zod5.z.unknown().describe("The value to remember (any JSON-serializable data)"),
|
|
1347
|
+
scope: import_lazy_zod5.z.enum(["session", "user", "tool", "global"]).optional().describe(REMEMBER_SCOPE_DESCRIPTION),
|
|
1348
|
+
ttl: import_lazy_zod5.z.number().positive().optional().describe("Forget after this many seconds"),
|
|
1349
|
+
brand: import_lazy_zod5.z.enum(["preference", "cache", "state", "conversation", "custom"]).optional().describe("Type hint for the stored value")
|
|
1350
|
+
};
|
|
1351
|
+
var rememberThisOutputSchema = import_lazy_zod5.z.object({
|
|
1352
|
+
success: import_lazy_zod5.z.boolean(),
|
|
1353
|
+
key: import_lazy_zod5.z.string(),
|
|
1354
|
+
scope: import_lazy_zod5.z.string(),
|
|
1355
|
+
expiresAt: import_lazy_zod5.z.number().optional()
|
|
1356
|
+
});
|
|
1357
|
+
function rememberThisDescription(names = rememberToolNames()) {
|
|
1358
|
+
return `Remember something for later: store a value under a key that ${names.recall} can read back, in the scope you choose (this session by default; user scope for the signed-in user across sessions). It lasts until it is forgotten or its ttl runs out. Use this when the user asks you to remember preferences, settings, or any information they want to persist.`;
|
|
1359
|
+
}
|
|
1360
|
+
function rememberThisToolMetadata(names = rememberToolNames()) {
|
|
1361
|
+
return {
|
|
1362
|
+
name: names.rememberThis,
|
|
1363
|
+
description: rememberThisDescription(names),
|
|
1364
|
+
inputSchema: rememberThisInputSchema,
|
|
1365
|
+
outputSchema: rememberThisOutputSchema,
|
|
1366
|
+
annotations: { readOnlyHint: false }
|
|
1367
|
+
};
|
|
1368
|
+
}
|
|
1369
|
+
var RememberThisTool = class extends import_sdk9.ToolContext {
|
|
1370
|
+
async execute(input) {
|
|
1371
|
+
const remember = this.get(RememberAccessorToken);
|
|
1372
|
+
const config = this.get(RememberConfigToken);
|
|
1373
|
+
const scope = input.scope ?? "session";
|
|
1374
|
+
const allowedScopes = config.tools?.allowedScopes ?? ["session", "user", "tool", "global"];
|
|
1375
|
+
if (!allowedScopes.includes(scope)) {
|
|
1376
|
+
throw this.fail(new RememberScopeNotAllowedError(scope, allowedScopes));
|
|
1377
|
+
}
|
|
1378
|
+
await remember.set(input.key, input.value, {
|
|
1379
|
+
scope,
|
|
1380
|
+
ttl: input.ttl,
|
|
1381
|
+
brand: input.brand
|
|
1382
|
+
});
|
|
1383
|
+
const expiresAt = input.ttl ? Date.now() + input.ttl * 1e3 : void 0;
|
|
1384
|
+
return {
|
|
1385
|
+
success: true,
|
|
1386
|
+
key: input.key,
|
|
1387
|
+
scope,
|
|
1388
|
+
expiresAt
|
|
1389
|
+
};
|
|
1390
|
+
}
|
|
1391
|
+
};
|
|
1392
|
+
RememberThisTool = __decorateClass([
|
|
1393
|
+
(0, import_sdk9.Tool)(rememberThisToolMetadata())
|
|
1394
|
+
], RememberThisTool);
|
|
1395
|
+
|
|
1396
|
+
// plugins/plugin-remember/src/tools/remember-tools.factory.ts
|
|
1397
|
+
function createRememberTools(prefix = "") {
|
|
1398
|
+
if (!prefix) return [RememberThisTool, RecallTool, ForgetTool, ListMemoriesTool];
|
|
1399
|
+
const names = rememberToolNames(prefix);
|
|
1400
|
+
let PrefixedRememberThisTool = class extends RememberThisTool {
|
|
1401
|
+
};
|
|
1402
|
+
PrefixedRememberThisTool = __decorateClass([
|
|
1403
|
+
(0, import_sdk10.Tool)(rememberThisToolMetadata(names))
|
|
1404
|
+
], PrefixedRememberThisTool);
|
|
1405
|
+
let PrefixedRecallTool = class extends RecallTool {
|
|
1406
|
+
};
|
|
1407
|
+
PrefixedRecallTool = __decorateClass([
|
|
1408
|
+
(0, import_sdk10.Tool)(recallToolMetadata(names))
|
|
1409
|
+
], PrefixedRecallTool);
|
|
1410
|
+
let PrefixedForgetTool = class extends ForgetTool {
|
|
1411
|
+
};
|
|
1412
|
+
PrefixedForgetTool = __decorateClass([
|
|
1413
|
+
(0, import_sdk10.Tool)(forgetToolMetadata(names))
|
|
1414
|
+
], PrefixedForgetTool);
|
|
1415
|
+
let PrefixedListMemoriesTool = class extends ListMemoriesTool {
|
|
1416
|
+
};
|
|
1417
|
+
PrefixedListMemoriesTool = __decorateClass([
|
|
1418
|
+
(0, import_sdk10.Tool)(listMemoriesToolMetadata(names))
|
|
1419
|
+
], PrefixedListMemoriesTool);
|
|
1420
|
+
return [PrefixedRememberThisTool, PrefixedRecallTool, PrefixedForgetTool, PrefixedListMemoriesTool];
|
|
1421
|
+
}
|
|
1422
|
+
|
|
1152
1423
|
// plugins/plugin-remember/src/remember.plugin.ts
|
|
1153
|
-
var RememberPlugin = class extends
|
|
1424
|
+
var RememberPlugin = class extends import_sdk11.DynamicPlugin {
|
|
1154
1425
|
options;
|
|
1155
1426
|
constructor(options = {}) {
|
|
1156
1427
|
super();
|
|
@@ -1165,6 +1436,11 @@ __publicField(RememberPlugin, "defaultOptions", {
|
|
|
1165
1436
|
keyPrefix: "remember:",
|
|
1166
1437
|
encryption: { enabled: true }
|
|
1167
1438
|
});
|
|
1439
|
+
/**
|
|
1440
|
+
* The memory tools, when `tools.enabled` is set: `remember_this`, `recall`, `forget` and
|
|
1441
|
+
* `list_memories`, under `tools.prefix`.
|
|
1442
|
+
*/
|
|
1443
|
+
__publicField(RememberPlugin, "dynamicTools", (options) => options.tools?.enabled ? createRememberTools(options.tools.prefix) : []);
|
|
1168
1444
|
/**
|
|
1169
1445
|
* Dynamic providers based on plugin options.
|
|
1170
1446
|
*/
|
|
@@ -1179,10 +1455,10 @@ __publicField(RememberPlugin, "dynamicProviders", (options) => {
|
|
|
1179
1455
|
providers.push({
|
|
1180
1456
|
name: "remember:store:global",
|
|
1181
1457
|
provide: RememberStoreToken,
|
|
1182
|
-
inject: () => [
|
|
1458
|
+
inject: () => [import_sdk11.FrontMcpConfig],
|
|
1183
1459
|
useFactory: (frontmcpConfig) => {
|
|
1184
|
-
const storeConfig = (0,
|
|
1185
|
-
if ((0,
|
|
1460
|
+
const storeConfig = (0, import_sdk11.getGlobalStoreConfig)("RememberPlugin", frontmcpConfig);
|
|
1461
|
+
if ((0, import_sdk11.isVercelKvProvider)(storeConfig)) {
|
|
1186
1462
|
return new RememberVercelKvProvider({
|
|
1187
1463
|
url: storeConfig.url,
|
|
1188
1464
|
token: storeConfig.token,
|
|
@@ -1249,7 +1525,9 @@ __publicField(RememberPlugin, "dynamicProviders", (options) => {
|
|
|
1249
1525
|
providers.push({
|
|
1250
1526
|
name: "remember:store:memory",
|
|
1251
1527
|
provide: RememberStoreToken,
|
|
1252
|
-
|
|
1528
|
+
// Built per server: `init()` runs once, so a value here would be shared by every server using it.
|
|
1529
|
+
inject: () => [],
|
|
1530
|
+
useFactory: () => new RememberMemoryProvider()
|
|
1253
1531
|
});
|
|
1254
1532
|
break;
|
|
1255
1533
|
}
|
|
@@ -1261,22 +1539,24 @@ __publicField(RememberPlugin, "dynamicProviders", (options) => {
|
|
|
1261
1539
|
providers.push({
|
|
1262
1540
|
name: "remember:accessor",
|
|
1263
1541
|
provide: RememberAccessorToken,
|
|
1264
|
-
scope:
|
|
1265
|
-
inject: () => [RememberStoreToken,
|
|
1542
|
+
scope: import_sdk11.ProviderScope.CONTEXT,
|
|
1543
|
+
inject: () => [RememberStoreToken, import_sdk11.FRONTMCP_CONTEXT, RememberConfigToken, import_sdk11.FrontMcpLogger],
|
|
1266
1544
|
useFactory: (store, ctx, cfg, logger) => createRememberAccessor(store, ctx, cfg, logger)
|
|
1267
1545
|
});
|
|
1268
1546
|
return providers;
|
|
1269
1547
|
});
|
|
1270
1548
|
RememberPlugin = __decorateClass([
|
|
1271
|
-
(0,
|
|
1549
|
+
(0, import_sdk11.Plugin)({
|
|
1272
1550
|
name: "remember",
|
|
1273
1551
|
description: "Help your LLM remember things across sessions",
|
|
1274
1552
|
providers: [
|
|
1275
|
-
// Default in-memory provider (overridden by dynamicProviders if configured)
|
|
1553
|
+
// Default in-memory provider (overridden by dynamicProviders if configured). A factory, so each
|
|
1554
|
+
// server gets its own store: a value built here is one store for every server in the process.
|
|
1276
1555
|
{
|
|
1277
1556
|
name: "remember:store:memory",
|
|
1278
1557
|
provide: RememberStoreToken,
|
|
1279
|
-
|
|
1558
|
+
inject: () => [],
|
|
1559
|
+
useFactory: () => new RememberMemoryProvider()
|
|
1280
1560
|
}
|
|
1281
1561
|
],
|
|
1282
1562
|
// Context extensions - SDK handles runtime installation
|
|
@@ -1292,219 +1572,19 @@ RememberPlugin = __decorateClass([
|
|
|
1292
1572
|
], RememberPlugin);
|
|
1293
1573
|
|
|
1294
1574
|
// plugins/plugin-remember/src/remember.types.ts
|
|
1295
|
-
var
|
|
1296
|
-
var rememberScopeSchema =
|
|
1575
|
+
var import_lazy_zod6 = require("@frontmcp/lazy-zod");
|
|
1576
|
+
var rememberScopeSchema = import_lazy_zod6.z.enum(["session", "user", "tool", "global"]);
|
|
1297
1577
|
function brand(data, _brand) {
|
|
1298
1578
|
return data;
|
|
1299
1579
|
}
|
|
1300
|
-
var rememberEntrySchema =
|
|
1301
|
-
value:
|
|
1302
|
-
brand:
|
|
1303
|
-
createdAt:
|
|
1304
|
-
updatedAt:
|
|
1305
|
-
expiresAt:
|
|
1306
|
-
metadata:
|
|
1307
|
-
});
|
|
1308
|
-
|
|
1309
|
-
// plugins/plugin-remember/src/tools/remember-this.tool.ts
|
|
1310
|
-
var import_lazy_zod3 = require("@frontmcp/lazy-zod");
|
|
1311
|
-
var import_sdk6 = require("@frontmcp/sdk");
|
|
1312
|
-
var rememberThisInputSchema = {
|
|
1313
|
-
key: import_lazy_zod3.z.string().min(1).describe('What to call this memory (e.g., "user_preference", "last_action")'),
|
|
1314
|
-
value: import_lazy_zod3.z.unknown().describe("The value to remember (any JSON-serializable data)"),
|
|
1315
|
-
scope: import_lazy_zod3.z.enum(["session", "user", "tool", "global"]).optional().describe(
|
|
1316
|
-
"How long to remember: session (until disconnect), user (forever), tool (for this tool), global (shared)"
|
|
1317
|
-
),
|
|
1318
|
-
ttl: import_lazy_zod3.z.number().positive().optional().describe("Forget after this many seconds"),
|
|
1319
|
-
brand: import_lazy_zod3.z.enum(["preference", "cache", "state", "conversation", "custom"]).optional().describe("Type hint for the stored value")
|
|
1320
|
-
};
|
|
1321
|
-
var rememberThisOutputSchema = import_lazy_zod3.z.object({
|
|
1322
|
-
success: import_lazy_zod3.z.boolean(),
|
|
1323
|
-
key: import_lazy_zod3.z.string(),
|
|
1324
|
-
scope: import_lazy_zod3.z.string(),
|
|
1325
|
-
expiresAt: import_lazy_zod3.z.number().optional()
|
|
1326
|
-
});
|
|
1327
|
-
var RememberThisTool = class extends import_sdk6.ToolContext {
|
|
1328
|
-
async execute(input) {
|
|
1329
|
-
const remember = this.get(RememberAccessorToken);
|
|
1330
|
-
const config = this.get(RememberConfigToken);
|
|
1331
|
-
const scope = input.scope ?? "session";
|
|
1332
|
-
const allowedScopes = config.tools?.allowedScopes ?? ["session", "user", "tool", "global"];
|
|
1333
|
-
if (!allowedScopes.includes(scope)) {
|
|
1334
|
-
throw this.fail(new Error(`Scope '${scope}' is not allowed. Allowed scopes: ${allowedScopes.join(", ")}`));
|
|
1335
|
-
}
|
|
1336
|
-
await remember.set(input.key, input.value, {
|
|
1337
|
-
scope,
|
|
1338
|
-
ttl: input.ttl,
|
|
1339
|
-
brand: input.brand
|
|
1340
|
-
});
|
|
1341
|
-
const expiresAt = input.ttl ? Date.now() + input.ttl * 1e3 : void 0;
|
|
1342
|
-
return {
|
|
1343
|
-
success: true,
|
|
1344
|
-
key: input.key,
|
|
1345
|
-
scope,
|
|
1346
|
-
expiresAt
|
|
1347
|
-
};
|
|
1348
|
-
}
|
|
1349
|
-
};
|
|
1350
|
-
RememberThisTool = __decorateClass([
|
|
1351
|
-
(0, import_sdk6.Tool)({
|
|
1352
|
-
name: "remember_this",
|
|
1353
|
-
description: "Remember something for later. Store a value that can be recalled in future conversations. Use this when the user asks you to remember preferences, settings, or any information they want to persist.",
|
|
1354
|
-
inputSchema: rememberThisInputSchema,
|
|
1355
|
-
outputSchema: rememberThisOutputSchema,
|
|
1356
|
-
annotations: {
|
|
1357
|
-
readOnlyHint: false
|
|
1358
|
-
}
|
|
1359
|
-
})
|
|
1360
|
-
], RememberThisTool);
|
|
1361
|
-
|
|
1362
|
-
// plugins/plugin-remember/src/tools/recall.tool.ts
|
|
1363
|
-
var import_lazy_zod4 = require("@frontmcp/lazy-zod");
|
|
1364
|
-
var import_sdk7 = require("@frontmcp/sdk");
|
|
1365
|
-
var recallInputSchema = {
|
|
1366
|
-
key: import_lazy_zod4.z.string().min(1).describe("What memory to recall"),
|
|
1367
|
-
scope: import_lazy_zod4.z.enum(["session", "user", "tool", "global"]).optional().describe("Which scope to look in (default: session)")
|
|
1368
|
-
};
|
|
1369
|
-
var recallOutputSchema = import_lazy_zod4.z.object({
|
|
1370
|
-
found: import_lazy_zod4.z.boolean(),
|
|
1371
|
-
key: import_lazy_zod4.z.string(),
|
|
1372
|
-
value: import_lazy_zod4.z.unknown().optional(),
|
|
1373
|
-
scope: import_lazy_zod4.z.string(),
|
|
1374
|
-
createdAt: import_lazy_zod4.z.number().optional(),
|
|
1375
|
-
expiresAt: import_lazy_zod4.z.number().optional()
|
|
1376
|
-
});
|
|
1377
|
-
var RecallTool = class extends import_sdk7.ToolContext {
|
|
1378
|
-
async execute(input) {
|
|
1379
|
-
const remember = this.get(RememberAccessorToken);
|
|
1380
|
-
const config = this.get(RememberConfigToken);
|
|
1381
|
-
const scope = input.scope ?? "session";
|
|
1382
|
-
const allowedScopes = config.tools?.allowedScopes ?? ["session", "user", "tool", "global"];
|
|
1383
|
-
if (!allowedScopes.includes(scope)) {
|
|
1384
|
-
this.fail(new Error(`Scope '${scope}' is not allowed. Allowed scopes: ${allowedScopes.join(", ")}`));
|
|
1385
|
-
}
|
|
1386
|
-
const entry = await remember.getEntry(input.key, { scope });
|
|
1387
|
-
if (!entry) {
|
|
1388
|
-
return {
|
|
1389
|
-
found: false,
|
|
1390
|
-
key: input.key,
|
|
1391
|
-
scope
|
|
1392
|
-
};
|
|
1393
|
-
}
|
|
1394
|
-
return {
|
|
1395
|
-
found: true,
|
|
1396
|
-
key: input.key,
|
|
1397
|
-
value: entry.value,
|
|
1398
|
-
scope,
|
|
1399
|
-
createdAt: entry.createdAt,
|
|
1400
|
-
expiresAt: entry.expiresAt
|
|
1401
|
-
};
|
|
1402
|
-
}
|
|
1403
|
-
};
|
|
1404
|
-
RecallTool = __decorateClass([
|
|
1405
|
-
(0, import_sdk7.Tool)({
|
|
1406
|
-
name: "recall",
|
|
1407
|
-
description: "Recall something that was previously remembered. Use this to retrieve stored preferences, settings, or any information that was saved with remember_this.",
|
|
1408
|
-
inputSchema: recallInputSchema,
|
|
1409
|
-
outputSchema: recallOutputSchema,
|
|
1410
|
-
annotations: {
|
|
1411
|
-
readOnlyHint: true
|
|
1412
|
-
}
|
|
1413
|
-
})
|
|
1414
|
-
], RecallTool);
|
|
1415
|
-
|
|
1416
|
-
// plugins/plugin-remember/src/tools/forget.tool.ts
|
|
1417
|
-
var import_lazy_zod5 = require("@frontmcp/lazy-zod");
|
|
1418
|
-
var import_sdk8 = require("@frontmcp/sdk");
|
|
1419
|
-
var forgetInputSchema = {
|
|
1420
|
-
key: import_lazy_zod5.z.string().min(1).describe("What memory to forget"),
|
|
1421
|
-
scope: import_lazy_zod5.z.enum(["session", "user", "tool", "global"]).optional().describe("Which scope to forget from (default: session)")
|
|
1422
|
-
};
|
|
1423
|
-
var forgetOutputSchema = import_lazy_zod5.z.object({
|
|
1424
|
-
success: import_lazy_zod5.z.boolean(),
|
|
1425
|
-
key: import_lazy_zod5.z.string(),
|
|
1426
|
-
scope: import_lazy_zod5.z.string(),
|
|
1427
|
-
existed: import_lazy_zod5.z.boolean()
|
|
1428
|
-
});
|
|
1429
|
-
var ForgetTool = class extends import_sdk8.ToolContext {
|
|
1430
|
-
async execute(input) {
|
|
1431
|
-
const remember = this.get(RememberAccessorToken);
|
|
1432
|
-
const config = this.get(RememberConfigToken);
|
|
1433
|
-
const scope = input.scope ?? "session";
|
|
1434
|
-
const allowedScopes = config.tools?.allowedScopes ?? ["session", "user", "tool", "global"];
|
|
1435
|
-
if (!allowedScopes.includes(scope)) {
|
|
1436
|
-
throw this.fail(new Error(`Scope '${scope}' is not allowed. Allowed scopes: ${allowedScopes.join(", ")}`));
|
|
1437
|
-
}
|
|
1438
|
-
const existed = await remember.knows(input.key, { scope });
|
|
1439
|
-
await remember.forget(input.key, { scope });
|
|
1440
|
-
return {
|
|
1441
|
-
success: true,
|
|
1442
|
-
key: input.key,
|
|
1443
|
-
scope,
|
|
1444
|
-
existed
|
|
1445
|
-
};
|
|
1446
|
-
}
|
|
1447
|
-
};
|
|
1448
|
-
ForgetTool = __decorateClass([
|
|
1449
|
-
(0, import_sdk8.Tool)({
|
|
1450
|
-
name: "forget",
|
|
1451
|
-
description: "Forget a previously remembered value. Use this when the user wants to delete stored preferences or information.",
|
|
1452
|
-
inputSchema: forgetInputSchema,
|
|
1453
|
-
outputSchema: forgetOutputSchema,
|
|
1454
|
-
annotations: {
|
|
1455
|
-
readOnlyHint: false
|
|
1456
|
-
}
|
|
1457
|
-
})
|
|
1458
|
-
], ForgetTool);
|
|
1459
|
-
|
|
1460
|
-
// plugins/plugin-remember/src/tools/list-memories.tool.ts
|
|
1461
|
-
var import_lazy_zod6 = require("@frontmcp/lazy-zod");
|
|
1462
|
-
var import_sdk9 = require("@frontmcp/sdk");
|
|
1463
|
-
var listMemoriesInputSchema = {
|
|
1464
|
-
scope: import_lazy_zod6.z.enum(["session", "user", "tool", "global"]).optional().describe("Which scope to list from (default: session)"),
|
|
1465
|
-
pattern: import_lazy_zod6.z.string().optional().describe('Pattern to filter keys (e.g., "user_*")'),
|
|
1466
|
-
limit: import_lazy_zod6.z.number().positive().max(100).optional().describe("Maximum number of keys to return (default: 50)")
|
|
1467
|
-
};
|
|
1468
|
-
var listMemoriesOutputSchema = import_lazy_zod6.z.object({
|
|
1469
|
-
keys: import_lazy_zod6.z.array(import_lazy_zod6.z.string()),
|
|
1470
|
-
scope: import_lazy_zod6.z.string(),
|
|
1471
|
-
count: import_lazy_zod6.z.number(),
|
|
1472
|
-
truncated: import_lazy_zod6.z.boolean()
|
|
1580
|
+
var rememberEntrySchema = import_lazy_zod6.z.object({
|
|
1581
|
+
value: import_lazy_zod6.z.unknown(),
|
|
1582
|
+
brand: import_lazy_zod6.z.enum(["approval", "preference", "cache", "state", "conversation", "custom"]).optional(),
|
|
1583
|
+
createdAt: import_lazy_zod6.z.number(),
|
|
1584
|
+
updatedAt: import_lazy_zod6.z.number(),
|
|
1585
|
+
expiresAt: import_lazy_zod6.z.number().optional(),
|
|
1586
|
+
metadata: import_lazy_zod6.z.record(import_lazy_zod6.z.string(), import_lazy_zod6.z.unknown()).optional()
|
|
1473
1587
|
});
|
|
1474
|
-
var ListMemoriesTool = class extends import_sdk9.ToolContext {
|
|
1475
|
-
async execute(input) {
|
|
1476
|
-
const remember = this.get(RememberAccessorToken);
|
|
1477
|
-
const config = this.get(RememberConfigToken);
|
|
1478
|
-
const scope = input.scope ?? "session";
|
|
1479
|
-
const allowedScopes = config.tools?.allowedScopes ?? ["session", "user", "tool", "global"];
|
|
1480
|
-
if (!allowedScopes.includes(scope)) {
|
|
1481
|
-
throw this.fail(new Error(`Scope '${scope}' is not allowed. Allowed scopes: ${allowedScopes.join(", ")}`));
|
|
1482
|
-
}
|
|
1483
|
-
const limit = input.limit ?? 50;
|
|
1484
|
-
let keys = await remember.list({ scope, pattern: input.pattern });
|
|
1485
|
-
const truncated = keys.length > limit;
|
|
1486
|
-
if (truncated) {
|
|
1487
|
-
keys = keys.slice(0, limit);
|
|
1488
|
-
}
|
|
1489
|
-
return {
|
|
1490
|
-
keys,
|
|
1491
|
-
scope,
|
|
1492
|
-
count: keys.length,
|
|
1493
|
-
truncated
|
|
1494
|
-
};
|
|
1495
|
-
}
|
|
1496
|
-
};
|
|
1497
|
-
ListMemoriesTool = __decorateClass([
|
|
1498
|
-
(0, import_sdk9.Tool)({
|
|
1499
|
-
name: "list_memories",
|
|
1500
|
-
description: "List all remembered keys in a scope. Use this to see what memories are stored for the current session or user.",
|
|
1501
|
-
inputSchema: listMemoriesInputSchema,
|
|
1502
|
-
outputSchema: listMemoriesOutputSchema,
|
|
1503
|
-
annotations: {
|
|
1504
|
-
readOnlyHint: true
|
|
1505
|
-
}
|
|
1506
|
-
})
|
|
1507
|
-
], ListMemoriesTool);
|
|
1508
1588
|
|
|
1509
1589
|
// plugins/plugin-remember/src/remember.context-extension.ts
|
|
1510
1590
|
function getRemember(ctx) {
|
|
@@ -1528,6 +1608,7 @@ function tryGetRemember(ctx) {
|
|
|
1528
1608
|
RememberMemoryProvider,
|
|
1529
1609
|
RememberPlugin,
|
|
1530
1610
|
RememberRedisProvider,
|
|
1611
|
+
RememberScopeNotAllowedError,
|
|
1531
1612
|
RememberStoreToken,
|
|
1532
1613
|
RememberThisTool,
|
|
1533
1614
|
RememberVercelKvProvider,
|