@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.
- package/dashboard/dist/assets/{index-C5oRjtKB.js → index-DqyMbv89.js} +20 -20
- package/dashboard/dist/assets/index-UBCddFo_.css +1 -0
- package/dashboard/dist/index.html +2 -2
- package/dist/cli/index.js +448 -23
- package/dist/db/memories.d.ts +1 -0
- package/dist/db/memories.d.ts.map +1 -1
- package/dist/index.d.ts +2 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +148 -17
- package/dist/lib/config.d.ts.map +1 -1
- package/dist/lib/injector.d.ts +1 -1
- package/dist/lib/injector.d.ts.map +1 -1
- package/dist/lib/project-detect.d.ts +18 -0
- package/dist/lib/project-detect.d.ts.map +1 -0
- package/dist/lib/redact.d.ts +10 -0
- package/dist/lib/redact.d.ts.map +1 -0
- package/dist/lib/retention.d.ts +4 -0
- package/dist/lib/retention.d.ts.map +1 -1
- package/dist/mcp/index.js +270 -20
- package/dist/server/index.d.ts.map +1 -1
- package/dist/server/index.js +69 -3
- package/dist/types/index.d.ts +2 -0
- package/dist/types/index.d.ts.map +1 -1
- package/package.json +1 -1
- package/dashboard/dist/assets/index-C8vbNL_5.css +0 -1
package/dist/db/memories.d.ts
CHANGED
|
@@ -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;
|
|
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
|
package/dist/index.d.ts.map
CHANGED
|
@@ -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;
|
|
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
|
-
|
|
334
|
+
safeValue,
|
|
297
335
|
input.category || "knowledge",
|
|
298
|
-
|
|
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.
|
|
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
|
|
962
|
-
const
|
|
963
|
-
let
|
|
964
|
-
for (const m of
|
|
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 (
|
|
1016
|
+
if (keyChars + line.length > keyBudget)
|
|
969
1017
|
break;
|
|
970
|
-
|
|
971
|
-
|
|
972
|
-
|
|
973
|
-
touchMemory(m.id, db);
|
|
1018
|
+
keyLines.push(line);
|
|
1019
|
+
keyIds.add(m.id);
|
|
1020
|
+
keyChars += line.length;
|
|
974
1021
|
}
|
|
975
|
-
|
|
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
|
-
${
|
|
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
|
-
|
|
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,
|
package/dist/lib/config.d.ts.map
CHANGED
|
@@ -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,
|
|
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"}
|
package/dist/lib/injector.d.ts
CHANGED
|
@@ -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
|
-
*
|
|
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;
|
|
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"}
|
package/dist/lib/retention.d.ts
CHANGED
|
@@ -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,
|
|
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"}
|