@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/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 import_sdk5 = require("@frontmcp/sdk");
65
+ var import_sdk11 = require("@frontmcp/sdk");
65
66
 
66
67
  // plugins/plugin-remember/src/providers/remember-accessor.provider.ts
67
- var import_sdk = require("@frontmcp/sdk");
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 RememberIdentityError = class extends Error {
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 !== import_sdk.STATELESS_SESSION_ID
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, import_sdk.isAnonymousSubject)(userId)) {
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 "${import_sdk.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.`
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, import_sdk.getRunningTool)()?.fullName ?? this.ctx.flow?.name ?? "unknown";
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, import_sdk.Provider)({
695
+ (0, import_sdk2.Provider)({
684
696
  name: "provider:remember:accessor",
685
697
  description: "Context-scoped accessor for RememberPlugin storage",
686
- scope: import_sdk.ProviderScope.CONTEXT
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 import_sdk2 = require("@frontmcp/sdk");
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, import_sdk2.Provider)({
867
+ (0, import_sdk3.Provider)({
856
868
  name: "provider:remember:memory",
857
869
  description: "In-memory storage provider for RememberPlugin",
858
- scope: import_sdk2.ProviderScope.GLOBAL
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 import_sdk3 = require("@frontmcp/sdk");
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, import_sdk3.Provider)({
1015
+ (0, import_sdk4.Provider)({
1004
1016
  name: "provider:remember:redis",
1005
1017
  description: "Redis-based storage provider for RememberPlugin",
1006
- scope: import_sdk3.ProviderScope.GLOBAL
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 import_sdk4 = require("@frontmcp/sdk");
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, import_sdk4.Provider)({
1146
+ (0, import_sdk5.Provider)({
1135
1147
  name: "provider:remember:vercel-kv",
1136
1148
  description: "Vercel KV-based storage provider for RememberPlugin",
1137
- scope: import_sdk4.ProviderScope.GLOBAL
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 import_sdk5.DynamicPlugin {
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: () => [import_sdk5.FrontMcpConfig],
1458
+ inject: () => [import_sdk11.FrontMcpConfig],
1183
1459
  useFactory: (frontmcpConfig) => {
1184
- const storeConfig = (0, import_sdk5.getGlobalStoreConfig)("RememberPlugin", frontmcpConfig);
1185
- if ((0, import_sdk5.isVercelKvProvider)(storeConfig)) {
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
- useValue: new RememberMemoryProvider()
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: import_sdk5.ProviderScope.CONTEXT,
1265
- inject: () => [RememberStoreToken, import_sdk5.FRONTMCP_CONTEXT, RememberConfigToken, import_sdk5.FrontMcpLogger],
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, import_sdk5.Plugin)({
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
- useValue: new RememberMemoryProvider()
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 import_lazy_zod2 = require("@frontmcp/lazy-zod");
1296
- var rememberScopeSchema = import_lazy_zod2.z.enum(["session", "user", "tool", "global"]);
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 = import_lazy_zod2.z.object({
1301
- value: import_lazy_zod2.z.unknown(),
1302
- brand: import_lazy_zod2.z.enum(["approval", "preference", "cache", "state", "conversation", "custom"]).optional(),
1303
- createdAt: import_lazy_zod2.z.number(),
1304
- updatedAt: import_lazy_zod2.z.number(),
1305
- expiresAt: import_lazy_zod2.z.number().optional(),
1306
- metadata: import_lazy_zod2.z.record(import_lazy_zod2.z.string(), import_lazy_zod2.z.unknown()).optional()
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,