@hasna/mementos 0.1.2 → 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,5 +1,6 @@
1
1
  import { Database } from "bun:sqlite";
2
2
  import type { CreateMemoryInput, DedupeMode, Memory, MemoryFilter, UpdateMemoryInput } from "../types/index.js";
3
+ export declare function parseMemoryRow(row: Record<string, unknown>): Memory;
3
4
  export declare function createMemory(input: CreateMemoryInput, dedupeMode?: DedupeMode, db?: Database): Memory;
4
5
  export declare function getMemory(id: string, db?: Database): Memory | null;
5
6
  export declare function getMemoryByKey(key: string, scope?: string, agentId?: string, projectId?: string, sessionId?: string, db?: Database): Memory | null;
@@ -1 +1 @@
1
- {"version":3,"file":"memories.d.ts","sourceRoot":"","sources":["../../src/db/memories.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAyB,MAAM,YAAY,CAAC;AAC7D,OAAO,KAAK,EACV,iBAAiB,EACjB,UAAU,EACV,MAAM,EACN,YAAY,EACZ,iBAAiB,EAClB,MAAM,mBAAmB,CAAC;AAyC3B,wBAAgB,YAAY,CAC1B,KAAK,EAAE,iBAAiB,EACxB,UAAU,GAAE,UAAoB,EAChC,EAAE,CAAC,EAAE,QAAQ,GACZ,MAAM,CAoGR;AAMD,wBAAgB,SAAS,CAAC,EAAE,EAAE,MAAM,EAAE,EAAE,CAAC,EAAE,QAAQ,GAAG,MAAM,GAAG,IAAI,CAOlE;AAED,wBAAgB,cAAc,CAC5B,GAAG,EAAE,MAAM,EACX,KAAK,CAAC,EAAE,MAAM,EACd,OAAO,CAAC,EAAE,MAAM,EAChB,SAAS,CAAC,EAAE,MAAM,EAClB,SAAS,CAAC,EAAE,MAAM,EAClB,EAAE,CAAC,EAAE,QAAQ,GACZ,MAAM,GAAG,IAAI,CA4Bf;AAMD,wBAAgB,YAAY,CAAC,MAAM,CAAC,EAAE,YAAY,EAAE,EAAE,CAAC,EAAE,QAAQ,GAAG,MAAM,EAAE,CA4G3E;AAMD,wBAAgB,YAAY,CAC1B,EAAE,EAAE,MAAM,EACV,KAAK,EAAE,iBAAiB,EACxB,EAAE,CAAC,EAAE,QAAQ,GACZ,MAAM,CAiER;AAMD,wBAAgB,YAAY,CAAC,EAAE,EAAE,MAAM,EAAE,EAAE,CAAC,EAAE,QAAQ,GAAG,OAAO,CAI/D;AAED,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC,EAAE,QAAQ,GAAG,MAAM,CAUvE;AAMD,wBAAgB,WAAW,CAAC,EAAE,EAAE,MAAM,EAAE,EAAE,CAAC,EAAE,QAAQ,GAAG,IAAI,CAM3D;AAMD,wBAAgB,oBAAoB,CAAC,EAAE,CAAC,EAAE,QAAQ,GAAG,MAAM,CAQ1D"}
1
+ {"version":3,"file":"memories.d.ts","sourceRoot":"","sources":["../../src/db/memories.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAyB,MAAM,YAAY,CAAC;AAC7D,OAAO,KAAK,EACV,iBAAiB,EACjB,UAAU,EACV,MAAM,EACN,YAAY,EACZ,iBAAiB,EAClB,MAAM,mBAAmB,CAAC;AAY3B,wBAAgB,cAAc,CAAC,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,CAwBnE;AAMD,wBAAgB,YAAY,CAC1B,KAAK,EAAE,iBAAiB,EACxB,UAAU,GAAE,UAAoB,EAChC,EAAE,CAAC,EAAE,QAAQ,GACZ,MAAM,CAwGR;AAMD,wBAAgB,SAAS,CAAC,EAAE,EAAE,MAAM,EAAE,EAAE,CAAC,EAAE,QAAQ,GAAG,MAAM,GAAG,IAAI,CAOlE;AAED,wBAAgB,cAAc,CAC5B,GAAG,EAAE,MAAM,EACX,KAAK,CAAC,EAAE,MAAM,EACd,OAAO,CAAC,EAAE,MAAM,EAChB,SAAS,CAAC,EAAE,MAAM,EAClB,SAAS,CAAC,EAAE,MAAM,EAClB,EAAE,CAAC,EAAE,QAAQ,GACZ,MAAM,GAAG,IAAI,CA4Bf;AAMD,wBAAgB,YAAY,CAAC,MAAM,CAAC,EAAE,YAAY,EAAE,EAAE,CAAC,EAAE,QAAQ,GAAG,MAAM,EAAE,CA4G3E;AAMD,wBAAgB,YAAY,CAC1B,EAAE,EAAE,MAAM,EACV,KAAK,EAAE,iBAAiB,EACxB,EAAE,CAAC,EAAE,QAAQ,GACZ,MAAM,CAiER;AAMD,wBAAgB,YAAY,CAAC,EAAE,EAAE,MAAM,EAAE,EAAE,CAAC,EAAE,QAAQ,GAAG,OAAO,CAI/D;AAED,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC,EAAE,QAAQ,GAAG,MAAM,CAUvE;AAMD,wBAAgB,WAAW,CAAC,EAAE,EAAE,MAAM,EAAE,EAAE,CAAC,EAAE,QAAQ,GAAG,IAAI,CAM3D;AAMD,wBAAgB,oBAAoB,CAAC,EAAE,CAAC,EAAE,QAAQ,GAAG,MAAM,CAQ1D"}
package/dist/index.d.ts CHANGED
@@ -8,6 +8,7 @@ export { searchMemories } from "./lib/search.js";
8
8
  export { loadConfig, DEFAULT_CONFIG } from "./lib/config.js";
9
9
  export { MemoryInjector } from "./lib/injector.js";
10
10
  export type { InjectionOptions } from "./lib/injector.js";
11
- export { enforceQuotas, archiveStale, runCleanup } from "./lib/retention.js";
11
+ export { enforceQuotas, archiveStale, archiveUnused, deprioritizeStale, runCleanup } from "./lib/retention.js";
12
12
  export { syncMemories, defaultSyncAgents } from "./lib/sync.js";
13
+ export { redactSecrets, containsSecrets } from "./lib/redact.js";
13
14
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAGA,YAAY,EACV,MAAM,EACN,mBAAmB,EACnB,WAAW,EACX,cAAc,EACd,YAAY,EACZ,YAAY,EACZ,YAAY,EACZ,kBAAkB,EAClB,WAAW,EACX,iBAAiB,EACjB,iBAAiB,EACjB,UAAU,EACV,KAAK,EACL,OAAO,EACP,cAAc,EACd,aAAa,EACb,WAAW,EACX,UAAU,EACV,kBAAkB,GACnB,MAAM,kBAAkB,CAAC;AAG1B,OAAO,EACL,mBAAmB,EACnB,oBAAoB,EACpB,kBAAkB,EAClB,iBAAiB,EACjB,oBAAoB,GACrB,MAAM,kBAAkB,CAAC;AAG1B,OAAO,EACL,WAAW,EACX,aAAa,EACb,aAAa,EACb,SAAS,EACT,gBAAgB,EAChB,GAAG,EACH,IAAI,EACJ,SAAS,GACV,MAAM,kBAAkB,CAAC;AAG1B,OAAO,EACL,YAAY,EACZ,SAAS,EACT,cAAc,EACd,YAAY,EACZ,YAAY,EACZ,YAAY,EACZ,kBAAkB,EAClB,WAAW,EACX,oBAAoB,GACrB,MAAM,kBAAkB,CAAC;AAG1B,OAAO,EACL,aAAa,EACb,QAAQ,EACR,UAAU,EACV,WAAW,GACZ,MAAM,gBAAgB,CAAC;AAGxB,OAAO,EACL,eAAe,EACf,UAAU,EACV,YAAY,GACb,MAAM,kBAAkB,CAAC;AAG1B,OAAO,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAGjD,OAAO,EAAE,UAAU,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAG7D,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AACnD,YAAY,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAG1D,OAAO,EAAE,aAAa,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAG7E,OAAO,EAAE,YAAY,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAGA,YAAY,EACV,MAAM,EACN,mBAAmB,EACnB,WAAW,EACX,cAAc,EACd,YAAY,EACZ,YAAY,EACZ,YAAY,EACZ,kBAAkB,EAClB,WAAW,EACX,iBAAiB,EACjB,iBAAiB,EACjB,UAAU,EACV,KAAK,EACL,OAAO,EACP,cAAc,EACd,aAAa,EACb,WAAW,EACX,UAAU,EACV,kBAAkB,GACnB,MAAM,kBAAkB,CAAC;AAG1B,OAAO,EACL,mBAAmB,EACnB,oBAAoB,EACpB,kBAAkB,EAClB,iBAAiB,EACjB,oBAAoB,GACrB,MAAM,kBAAkB,CAAC;AAG1B,OAAO,EACL,WAAW,EACX,aAAa,EACb,aAAa,EACb,SAAS,EACT,gBAAgB,EAChB,GAAG,EACH,IAAI,EACJ,SAAS,GACV,MAAM,kBAAkB,CAAC;AAG1B,OAAO,EACL,YAAY,EACZ,SAAS,EACT,cAAc,EACd,YAAY,EACZ,YAAY,EACZ,YAAY,EACZ,kBAAkB,EAClB,WAAW,EACX,oBAAoB,GACrB,MAAM,kBAAkB,CAAC;AAG1B,OAAO,EACL,aAAa,EACb,QAAQ,EACR,UAAU,EACV,WAAW,GACZ,MAAM,gBAAgB,CAAC;AAGxB,OAAO,EACL,eAAe,EACf,UAAU,EACV,YAAY,GACb,MAAM,kBAAkB,CAAC;AAG1B,OAAO,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAGjD,OAAO,EAAE,UAAU,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAG7D,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AACnD,YAAY,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAG1D,OAAO,EAAE,aAAa,EAAE,YAAY,EAAE,aAAa,EAAE,iBAAiB,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAG/G,OAAO,EAAE,YAAY,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AAGhE,OAAO,EAAE,aAAa,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC"}
package/dist/index.js CHANGED
@@ -243,6 +243,42 @@ function resolvePartialId(db, table, partialId) {
243
243
  }
244
244
  return null;
245
245
  }
246
+ // src/lib/redact.ts
247
+ var REDACTED = "[REDACTED]";
248
+ var SECRET_PATTERNS = [
249
+ { name: "openai_key", pattern: /sk-[a-zA-Z0-9_-]{20,}/g },
250
+ { name: "anthropic_key", pattern: /sk-ant-[a-zA-Z0-9_-]{20,}/g },
251
+ { name: "generic_key", pattern: /(?:pk|tok|key|token|api[_-]?key)[_-][a-zA-Z0-9_-]{16,}/gi },
252
+ { name: "aws_key", pattern: /AKIA[A-Z0-9]{16}/g },
253
+ { name: "aws_secret", pattern: /(?<=AWS_SECRET_ACCESS_KEY\s*=\s*)[A-Za-z0-9/+=]{40}/g },
254
+ { name: "github_token", pattern: /gh[ps]_[a-zA-Z0-9]{36,}/g },
255
+ { name: "github_oauth", pattern: /gho_[a-zA-Z0-9]{36,}/g },
256
+ { name: "npm_token", pattern: /npm_[a-zA-Z0-9]{36,}/g },
257
+ { name: "bearer", pattern: /Bearer\s+[a-zA-Z0-9_\-.]{20,}/g },
258
+ { name: "conn_string", pattern: /(?:postgres|postgresql|mysql|mongodb|redis|amqp|mqtt):\/\/[^\s"'`]+@[^\s"'`]+/gi },
259
+ { name: "env_secret", pattern: /(?:SECRET|TOKEN|PASSWORD|PASSPHRASE|API_KEY|PRIVATE_KEY|AUTH|CREDENTIAL)[_A-Z]*\s*=\s*["']?[^\s"'\n]{8,}["']?/gi },
260
+ { name: "stripe_key", pattern: /(?:sk|pk|rk)_(?:test|live)_[a-zA-Z0-9]{20,}/g },
261
+ { name: "slack_token", pattern: /xox[bpras]-[a-zA-Z0-9-]{20,}/g },
262
+ { name: "jwt", pattern: /eyJ[a-zA-Z0-9_-]{10,}\.eyJ[a-zA-Z0-9_-]{10,}\.[a-zA-Z0-9_-]{10,}/g },
263
+ { name: "hex_secret", pattern: /(?<=(?:key|token|secret|password|hash)\s*[:=]\s*["']?)[0-9a-f]{32,}(?=["']?)/gi }
264
+ ];
265
+ function redactSecrets(text) {
266
+ let result = text;
267
+ for (const { pattern } of SECRET_PATTERNS) {
268
+ pattern.lastIndex = 0;
269
+ result = result.replace(pattern, REDACTED);
270
+ }
271
+ return result;
272
+ }
273
+ function containsSecrets(text) {
274
+ for (const { pattern } of SECRET_PATTERNS) {
275
+ pattern.lastIndex = 0;
276
+ if (pattern.test(text))
277
+ return true;
278
+ }
279
+ return false;
280
+ }
281
+
246
282
  // src/db/memories.ts
247
283
  function parseMemoryRow(row) {
248
284
  return {
@@ -280,6 +316,8 @@ function createMemory(input, dedupeMode = "merge", db) {
280
316
  const tags = input.tags || [];
281
317
  const tagsJson = JSON.stringify(tags);
282
318
  const metadataJson = JSON.stringify(input.metadata || {});
319
+ const safeValue = redactSecrets(input.value);
320
+ const safeSummary = input.summary ? redactSecrets(input.summary) : null;
283
321
  if (dedupeMode === "merge") {
284
322
  const existing = d.query(`SELECT id, version FROM memories
285
323
  WHERE key = ? AND scope = ?
@@ -293,9 +331,9 @@ function createMemory(input, dedupeMode = "merge", db) {
293
331
  pinned = COALESCE(pinned, 0),
294
332
  version = version + 1, updated_at = ?
295
333
  WHERE id = ?`, [
296
- input.value,
334
+ safeValue,
297
335
  input.category || "knowledge",
298
- input.summary || null,
336
+ safeSummary,
299
337
  tagsJson,
300
338
  input.importance ?? 5,
301
339
  metadataJson,
@@ -474,7 +512,7 @@ function updateMemory(id, input, db) {
474
512
  const params = [now()];
475
513
  if (input.value !== undefined) {
476
514
  sets.push("value = ?");
477
- params.push(input.value);
515
+ params.push(redactSecrets(input.value));
478
516
  }
479
517
  if (input.category !== undefined) {
480
518
  sets.push("category = ?");
@@ -845,7 +883,9 @@ var DEFAULT_CONFIG = {
845
883
  sync_agents: ["claude", "codex", "gemini"],
846
884
  auto_cleanup: {
847
885
  enabled: true,
848
- expired_check_interval: 3600
886
+ expired_check_interval: 3600,
887
+ unused_archive_days: 7,
888
+ stale_deprioritize_days: 14
849
889
  }
850
890
  };
851
891
  function deepMerge(target, source) {
@@ -951,32 +991,91 @@ class MemoryInjector {
951
991
  seen.add(m.id);
952
992
  return true;
953
993
  });
954
- unique.sort((a, b) => {
994
+ if (unique.length === 0) {
995
+ return "";
996
+ }
997
+ const totalCharBudget = maxTokens * 4;
998
+ const footer = "Tip: Use memory_search for deeper lookup on specific topics.";
999
+ const footerChars = footer.length;
1000
+ const keyBudget = Math.floor((totalCharBudget - footerChars) * 0.67);
1001
+ const recentBudget = Math.floor((totalCharBudget - footerChars) * 0.33);
1002
+ const keyRanked = [...unique].sort((a, b) => {
955
1003
  if (a.pinned !== b.pinned)
956
1004
  return a.pinned ? -1 : 1;
957
1005
  if (b.importance !== a.importance)
958
1006
  return b.importance - a.importance;
959
1007
  return new Date(b.updated_at).getTime() - new Date(a.updated_at).getTime();
960
1008
  });
961
- const charBudget = maxTokens * 4;
962
- const lines = [];
963
- let totalChars = 0;
964
- for (const m of unique) {
1009
+ const keyLines = [];
1010
+ const keyIds = new Set;
1011
+ let keyChars = 0;
1012
+ for (const m of keyRanked) {
965
1013
  if (this.injectedIds.has(m.id))
966
1014
  continue;
967
1015
  const line = `- [${m.scope}/${m.category}] ${m.key}: ${m.value}`;
968
- if (totalChars + line.length > charBudget)
1016
+ if (keyChars + line.length > keyBudget)
969
1017
  break;
970
- lines.push(line);
971
- totalChars += line.length;
972
- this.injectedIds.add(m.id);
973
- touchMemory(m.id, db);
1018
+ keyLines.push(line);
1019
+ keyIds.add(m.id);
1020
+ keyChars += line.length;
974
1021
  }
975
- if (lines.length === 0) {
1022
+ const recentRanked = [...unique].sort((a, b) => {
1023
+ const aTime = a.accessed_at ? new Date(a.accessed_at).getTime() : 0;
1024
+ const bTime = b.accessed_at ? new Date(b.accessed_at).getTime() : 0;
1025
+ return bTime - aTime;
1026
+ });
1027
+ const recentLines = [];
1028
+ let recentChars = 0;
1029
+ const maxRecent = 5;
1030
+ for (const m of recentRanked) {
1031
+ if (recentLines.length >= maxRecent)
1032
+ break;
1033
+ if (keyIds.has(m.id))
1034
+ continue;
1035
+ if (this.injectedIds.has(m.id))
1036
+ continue;
1037
+ const line = `- [${m.scope}/${m.category}] ${m.key}: ${m.value}`;
1038
+ if (recentChars + line.length > recentBudget)
1039
+ break;
1040
+ recentLines.push(line);
1041
+ recentChars += line.length;
1042
+ }
1043
+ if (keyLines.length === 0 && recentLines.length === 0) {
976
1044
  return "";
977
1045
  }
1046
+ const allInjectedMemoryIds = [
1047
+ ...keyIds,
1048
+ ...recentLines.map((_, i) => {
1049
+ let idx = 0;
1050
+ for (const m of recentRanked) {
1051
+ if (keyIds.has(m.id) || this.injectedIds.has(m.id))
1052
+ continue;
1053
+ if (idx === i)
1054
+ return m.id;
1055
+ idx++;
1056
+ }
1057
+ return "";
1058
+ })
1059
+ ].filter(Boolean);
1060
+ for (const id of allInjectedMemoryIds) {
1061
+ this.injectedIds.add(id);
1062
+ touchMemory(id, db);
1063
+ }
1064
+ const sections = [];
1065
+ if (keyLines.length > 0) {
1066
+ sections.push(`## Key Memories
1067
+ ${keyLines.join(`
1068
+ `)}`);
1069
+ }
1070
+ if (recentLines.length > 0) {
1071
+ sections.push(`## Recent Context
1072
+ ${recentLines.join(`
1073
+ `)}`);
1074
+ }
1075
+ sections.push(footer);
978
1076
  return `<agent-memories>
979
- ${lines.join(`
1077
+ ${sections.join(`
1078
+
980
1079
  `)}
981
1080
  </agent-memories>`;
982
1081
  }
@@ -1022,12 +1121,40 @@ function archiveStale(staleDays, db) {
1022
1121
  AND COALESCE(accessed_at, created_at) < ?`, [timestamp, cutoff]);
1023
1122
  return result.changes;
1024
1123
  }
1124
+ function archiveUnused(days, db) {
1125
+ const d = db || getDatabase();
1126
+ const timestamp = now();
1127
+ const cutoff = new Date(Date.now() - days * 24 * 60 * 60 * 1000).toISOString();
1128
+ const result = d.run(`UPDATE memories
1129
+ SET status = 'archived', updated_at = ?
1130
+ WHERE status = 'active'
1131
+ AND pinned = 0
1132
+ AND access_count = 0
1133
+ AND created_at < ?`, [timestamp, cutoff]);
1134
+ return result.changes;
1135
+ }
1136
+ function deprioritizeStale(days, db) {
1137
+ const d = db || getDatabase();
1138
+ const timestamp = now();
1139
+ const cutoff = new Date(Date.now() - days * 24 * 60 * 60 * 1000).toISOString();
1140
+ const result = d.run(`UPDATE memories
1141
+ SET importance = MAX(importance - 1, 1),
1142
+ version = version + 1,
1143
+ updated_at = ?
1144
+ WHERE status = 'active'
1145
+ AND pinned = 0
1146
+ AND importance > 1
1147
+ AND COALESCE(accessed_at, updated_at) < ?`, [timestamp, cutoff]);
1148
+ return result.changes;
1149
+ }
1025
1150
  function runCleanup(config, db) {
1026
1151
  const d = db || getDatabase();
1027
1152
  const expired = cleanExpiredMemories(d);
1028
1153
  const evicted = enforceQuotas(config, d);
1029
1154
  const archived = archiveStale(90, d);
1030
- return { expired, evicted, archived };
1155
+ const unused_archived = archiveUnused(config.auto_cleanup.unused_archive_days ?? 7, d);
1156
+ const deprioritized = deprioritizeStale(config.auto_cleanup.stale_deprioritize_days ?? 14, d);
1157
+ return { expired, evicted, archived, unused_archived, deprioritized };
1031
1158
  }
1032
1159
  // src/lib/sync.ts
1033
1160
  import { existsSync as existsSync3, mkdirSync as mkdirSync3, readFileSync as readFileSync2, writeFileSync } from "fs";
@@ -1171,6 +1298,7 @@ export {
1171
1298
  resetDatabase,
1172
1299
  registerProject,
1173
1300
  registerAgent,
1301
+ redactSecrets,
1174
1302
  now,
1175
1303
  loadConfig,
1176
1304
  listProjects,
@@ -1183,12 +1311,15 @@ export {
1183
1311
  getDatabase,
1184
1312
  getAgent,
1185
1313
  enforceQuotas,
1314
+ deprioritizeStale,
1186
1315
  deleteMemory,
1187
1316
  defaultSyncAgents,
1188
1317
  createMemory,
1318
+ containsSecrets,
1189
1319
  closeDatabase,
1190
1320
  cleanExpiredMemories,
1191
1321
  bulkDeleteMemories,
1322
+ archiveUnused,
1192
1323
  archiveStale,
1193
1324
  VersionConflictError,
1194
1325
  MemoryNotFoundError,
@@ -1 +1 @@
1
- {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/lib/config.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,cAAc,EAA+B,MAAM,UAAU,CAAC;AAM5E,eAAO,MAAM,cAAc,EAAE,cAqB5B,CAAC;AA4DF,wBAAgB,UAAU,IAAI,cAAc,CAwC3C;AAgDD,wBAAgB,SAAS,IAAI,MAAM,CA+BlC"}
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/lib/config.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,cAAc,EAA+B,MAAM,UAAU,CAAC;AAM5E,eAAO,MAAM,cAAc,EAAE,cAuB5B,CAAC;AA4DF,wBAAgB,UAAU,IAAI,cAAc,CAwC3C;AAgDD,wBAAgB,SAAS,IAAI,MAAM,CA+BlC"}
@@ -15,7 +15,7 @@ export declare class MemoryInjector {
15
15
  constructor(config?: MementosConfig);
16
16
  /**
17
17
  * Get formatted injection context suitable for system prompt insertion.
18
- * Selects memories by scope visibility, importance, and category.
18
+ * Produces structured output with Key Memories and Recent Context sections.
19
19
  * Token-budget aware.
20
20
  */
21
21
  getInjectionContext(options?: InjectionOptions): string;
@@ -1 +1 @@
1
- {"version":3,"file":"injector.d.ts","sourceRoot":"","sources":["../../src/lib/injector.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AACtC,OAAO,KAAK,EAAU,cAAc,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAQhF,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,UAAU,CAAC,EAAE,cAAc,EAAE,CAAC;IAC9B,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,EAAE,CAAC,EAAE,QAAQ,CAAC;CACf;AAED,qBAAa,cAAc;IACzB,OAAO,CAAC,MAAM,CAAiB;IAC/B,OAAO,CAAC,WAAW,CAA0B;gBAEjC,MAAM,CAAC,EAAE,cAAc;IAInC;;;;OAIG;IACH,mBAAmB,CAAC,OAAO,GAAE,gBAAqB,GAAG,MAAM;IAkG3D;;OAEG;IACH,UAAU,IAAI,IAAI;IAIlB;;OAEG;IACH,gBAAgB,IAAI,MAAM;CAG3B"}
1
+ {"version":3,"file":"injector.d.ts","sourceRoot":"","sources":["../../src/lib/injector.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AACtC,OAAO,KAAK,EAAU,cAAc,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAQhF,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,UAAU,CAAC,EAAE,cAAc,EAAE,CAAC;IAC9B,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,EAAE,CAAC,EAAE,QAAQ,CAAC;CACf;AAED,qBAAa,cAAc;IACzB,OAAO,CAAC,MAAM,CAAiB;IAC/B,OAAO,CAAC,WAAW,CAA0B;gBAEjC,MAAM,CAAC,EAAE,cAAc;IAInC;;;;OAIG;IACH,mBAAmB,CAAC,OAAO,GAAE,gBAAqB,GAAG,MAAM;IA0K3D;;OAEG;IACH,UAAU,IAAI,IAAI;IAIlB;;OAEG;IACH,gBAAgB,IAAI,MAAM;CAG3B"}
@@ -0,0 +1,18 @@
1
+ import { Database } from "bun:sqlite";
2
+ import type { Project } from "../types/index.js";
3
+ /**
4
+ * Auto-detect the current project from cwd's git root.
5
+ * - Finds the git root directory
6
+ * - Extracts the repo name from the directory basename
7
+ * - Checks if a project is already registered by path
8
+ * - If not, registers it automatically
9
+ * - Returns the Project object, or null if not in a git repo
10
+ *
11
+ * Results are cached for the lifetime of the process.
12
+ */
13
+ export declare function detectProject(db?: Database): Project | null;
14
+ /**
15
+ * Reset the cached project (useful for tests).
16
+ */
17
+ export declare function resetProjectCache(): void;
18
+ //# sourceMappingURL=project-detect.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"project-detect.d.ts","sourceRoot":"","sources":["../../src/lib/project-detect.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAGtC,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAC;AAkBjD;;;;;;;;;GASG;AACH,wBAAgB,aAAa,CAAC,EAAE,CAAC,EAAE,QAAQ,GAAG,OAAO,GAAG,IAAI,CA0B3D;AAED;;GAEG;AACH,wBAAgB,iBAAiB,IAAI,IAAI,CAExC"}
@@ -0,0 +1,10 @@
1
+ /**
2
+ * Detect and redact secrets from text.
3
+ * Returns the text with secrets replaced by [REDACTED].
4
+ */
5
+ export declare function redactSecrets(text: string): string;
6
+ /**
7
+ * Check if text contains any detectable secrets.
8
+ */
9
+ export declare function containsSecrets(text: string): boolean;
10
+ //# sourceMappingURL=redact.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"redact.d.ts","sourceRoot":"","sources":["../../src/lib/redact.ts"],"names":[],"mappings":"AAsCA;;;GAGG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAQlD;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAMrD"}
@@ -2,9 +2,13 @@ import type { Database } from "bun:sqlite";
2
2
  import type { MementosConfig } from "../types/index.js";
3
3
  export declare function enforceQuotas(config: MementosConfig, db?: Database): number;
4
4
  export declare function archiveStale(staleDays: number, db?: Database): number;
5
+ export declare function archiveUnused(days: number, db?: Database): number;
6
+ export declare function deprioritizeStale(days: number, db?: Database): number;
5
7
  export declare function runCleanup(config: MementosConfig, db?: Database): {
6
8
  expired: number;
7
9
  evicted: number;
8
10
  archived: number;
11
+ unused_archived: number;
12
+ deprioritized: number;
9
13
  };
10
14
  //# sourceMappingURL=retention.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"retention.d.ts","sourceRoot":"","sources":["../../src/lib/retention.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAC3C,OAAO,KAAK,EAAE,cAAc,EAAe,MAAM,mBAAmB,CAAC;AAQrE,wBAAgB,aAAa,CAAC,MAAM,EAAE,cAAc,EAAE,EAAE,CAAC,EAAE,QAAQ,GAAG,MAAM,CAuC3E;AAMD,wBAAgB,YAAY,CAAC,SAAS,EAAE,MAAM,EAAE,EAAE,CAAC,EAAE,QAAQ,GAAG,MAAM,CAsBrE;AAMD,wBAAgB,UAAU,CACxB,MAAM,EAAE,cAAc,EACtB,EAAE,CAAC,EAAE,QAAQ,GACZ;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,CAQxD"}
1
+ {"version":3,"file":"retention.d.ts","sourceRoot":"","sources":["../../src/lib/retention.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAC3C,OAAO,KAAK,EAAE,cAAc,EAAe,MAAM,mBAAmB,CAAC;AAQrE,wBAAgB,aAAa,CAAC,MAAM,EAAE,cAAc,EAAE,EAAE,CAAC,EAAE,QAAQ,GAAG,MAAM,CAuC3E;AAMD,wBAAgB,YAAY,CAAC,SAAS,EAAE,MAAM,EAAE,EAAE,CAAC,EAAE,QAAQ,GAAG,MAAM,CAsBrE;AAMD,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,CAAC,EAAE,QAAQ,GAAG,MAAM,CAmBjE;AAMD,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,CAAC,EAAE,QAAQ,GAAG,MAAM,CAwBrE;AAMD,wBAAgB,UAAU,CACxB,MAAM,EAAE,cAAc,EACtB,EAAE,CAAC,EAAE,QAAQ,GACZ;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,eAAe,EAAE,MAAM,CAAC;IAAC,aAAa,EAAE,MAAM,CAAA;CAAE,CAgBxG"}