true-mem 1.0.10 → 1.0.12
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/dist/adapters/opencode/index.d.ts.map +1 -1
- package/dist/extraction/queue.d.ts +4 -0
- package/dist/extraction/queue.d.ts.map +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +197 -96
- package/dist/memory/classifier.d.ts.map +1 -1
- package/dist/memory/negative-patterns.d.ts +14 -0
- package/dist/memory/negative-patterns.d.ts.map +1 -1
- package/dist/storage/database.d.ts.map +1 -1
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/adapters/opencode/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH,OAAO,KAAK,EAAE,WAAW,EAAE,KAAK,EAAwB,MAAM,gBAAgB,CAAC;AAC/E,OAAO,KAAK,EAAE,cAAc,EAA4D,MAAM,gBAAgB,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/adapters/opencode/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH,OAAO,KAAK,EAAE,WAAW,EAAE,KAAK,EAAwB,MAAM,gBAAgB,CAAC;AAC/E,OAAO,KAAK,EAAE,cAAc,EAA4D,MAAM,gBAAgB,CAAC;AA2F/G;;GAEG;AACH,wBAAsB,sBAAsB,CAC1C,GAAG,EAAE,WAAW,EAChB,eAAe,GAAE,OAAO,CAAC,cAAc,CAAM,GAC5C,OAAO,CAAC,KAAK,CAAC,CA6KhB;AA2lBD,eAAe,sBAAsB,CAAC"}
|
|
@@ -32,4 +32,8 @@ export declare class ExtractionQueue {
|
|
|
32
32
|
get processing(): boolean;
|
|
33
33
|
}
|
|
34
34
|
export declare function getExtractionQueue(): ExtractionQueue;
|
|
35
|
+
/**
|
|
36
|
+
* Reset the extraction queue singleton (for testing/cleanup)
|
|
37
|
+
*/
|
|
38
|
+
export declare function resetExtractionQueue(): void;
|
|
35
39
|
//# sourceMappingURL=queue.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"queue.d.ts","sourceRoot":"","sources":["../../src/extraction/queue.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH,MAAM,WAAW,aAAa;IAC5B,OAAO,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAC7B,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,qBAAa,eAAe;IAC1B,OAAO,CAAC,KAAK,CAAuB;IACpC,OAAO,CAAC,YAAY,CAAkB;IAEtC;;;OAGG;IACH,GAAG,CAAC,GAAG,EAAE,aAAa,GAAG,IAAI;IAM7B;;;OAGG;IACH,OAAO,CAAC,YAAY;IAQpB;;OAEG;YACW,UAAU;IA2BxB;;OAEG;IACH,IAAI,IAAI,IAAI,MAAM,CAEjB;IAED;;OAEG;IACH,IAAI,UAAU,IAAI,OAAO,CAExB;CACF;AAKD,wBAAgB,kBAAkB,IAAI,eAAe,CAMpD"}
|
|
1
|
+
{"version":3,"file":"queue.d.ts","sourceRoot":"","sources":["../../src/extraction/queue.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH,MAAM,WAAW,aAAa;IAC5B,OAAO,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAC7B,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,qBAAa,eAAe;IAC1B,OAAO,CAAC,KAAK,CAAuB;IACpC,OAAO,CAAC,YAAY,CAAkB;IAEtC;;;OAGG;IACH,GAAG,CAAC,GAAG,EAAE,aAAa,GAAG,IAAI;IAM7B;;;OAGG;IACH,OAAO,CAAC,YAAY;IAQpB;;OAEG;YACW,UAAU;IA2BxB;;OAEG;IACH,IAAI,IAAI,IAAI,MAAM,CAEjB;IAED;;OAEG;IACH,IAAI,UAAU,IAAI,OAAO,CAExB;CACF;AAKD,wBAAgB,kBAAkB,IAAI,eAAe,CAMpD;AAED;;GAEG;AACH,wBAAgB,oBAAoB,IAAI,IAAI,CAG3C"}
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAE,MAAM,EAAS,MAAM,qBAAqB,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAE,MAAM,EAAS,MAAM,qBAAqB,CAAC;AAwBzD,QAAA,MAAM,UAAU,EAAE,MAiHjB,CAAC;AAEF,eAAe,UAAU,CAAC;AAG1B,YAAY,EAAE,cAAc,EAAE,UAAU,EAAE,oBAAoB,EAAE,MAAM,YAAY,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -38,6 +38,38 @@ var init_logger = __esm(() => {
|
|
|
38
38
|
LOG_MAX_BYTES = 10 * 1024 * 1024;
|
|
39
39
|
});
|
|
40
40
|
|
|
41
|
+
// src/utils/version.ts
|
|
42
|
+
import fs from "fs";
|
|
43
|
+
import path from "path";
|
|
44
|
+
import { fileURLToPath } from "url";
|
|
45
|
+
function findPackageJsonUp(startDir) {
|
|
46
|
+
let currentDir = startDir;
|
|
47
|
+
while (currentDir !== path.dirname(currentDir)) {
|
|
48
|
+
const pkgPath = path.join(currentDir, "package.json");
|
|
49
|
+
if (fs.existsSync(pkgPath)) {
|
|
50
|
+
return pkgPath;
|
|
51
|
+
}
|
|
52
|
+
currentDir = path.dirname(currentDir);
|
|
53
|
+
}
|
|
54
|
+
return null;
|
|
55
|
+
}
|
|
56
|
+
function getVersion() {
|
|
57
|
+
try {
|
|
58
|
+
const currentDir = path.dirname(fileURLToPath(import.meta.url));
|
|
59
|
+
const pkgPath = findPackageJsonUp(currentDir);
|
|
60
|
+
if (pkgPath) {
|
|
61
|
+
const content = fs.readFileSync(pkgPath, "utf-8");
|
|
62
|
+
const pkg = JSON.parse(content);
|
|
63
|
+
return pkg.version ?? "unknown";
|
|
64
|
+
}
|
|
65
|
+
return "unknown";
|
|
66
|
+
} catch (error) {
|
|
67
|
+
console.error("[True-Mem] Version detection error:", error);
|
|
68
|
+
return "unknown";
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
var init_version = () => {};
|
|
72
|
+
|
|
41
73
|
// src/config.ts
|
|
42
74
|
var DEFAULT_SWEEP_CONFIG, DEFAULT_SCORING_WEIGHTS, DEFAULT_OPENCODE_CONFIG, DEFAULT_CONFIG;
|
|
43
75
|
var init_config = __esm(() => {
|
|
@@ -530,6 +562,39 @@ class MemoryDatabase {
|
|
|
530
562
|
async createMemory(store, classification, summary, sourceEventIds, features = {}) {
|
|
531
563
|
this.ensureInit();
|
|
532
564
|
const contentHash = generateContentHash(summary);
|
|
565
|
+
const similarMemories = await this.vectorSearch(summary, features.projectScope ?? undefined, 1);
|
|
566
|
+
let reconsolidationAction = null;
|
|
567
|
+
if (similarMemories.length > 0) {
|
|
568
|
+
const existingMemory = similarMemories[0];
|
|
569
|
+
if (existingMemory) {
|
|
570
|
+
const similarity = this.jaccardSimilarity(summary, existingMemory.summary);
|
|
571
|
+
if (isRelevant(similarity)) {
|
|
572
|
+
const newMemoryData = {
|
|
573
|
+
store,
|
|
574
|
+
classification,
|
|
575
|
+
summary,
|
|
576
|
+
sourceEventIds,
|
|
577
|
+
projectScope: features.projectScope ?? undefined,
|
|
578
|
+
sessionId: features.sessionId
|
|
579
|
+
};
|
|
580
|
+
const action = await handleReconsolidation(this, newMemoryData, existingMemory, similarity);
|
|
581
|
+
switch (action.type) {
|
|
582
|
+
case "duplicate":
|
|
583
|
+
const existingMemoryRow = this.db.prepare(`SELECT * FROM memory_units WHERE id = ?`).get(action.updatedMemory.id);
|
|
584
|
+
if (existingMemoryRow) {
|
|
585
|
+
this.incrementFrequency(existingMemoryRow.id);
|
|
586
|
+
}
|
|
587
|
+
return action.updatedMemory;
|
|
588
|
+
case "conflict":
|
|
589
|
+
reconsolidationAction = { type: "conflict", existingMemoryId: action.existingMemoryId };
|
|
590
|
+
break;
|
|
591
|
+
case "complement":
|
|
592
|
+
reconsolidationAction = { type: "complement" };
|
|
593
|
+
break;
|
|
594
|
+
}
|
|
595
|
+
}
|
|
596
|
+
}
|
|
597
|
+
}
|
|
533
598
|
this.db.exec("BEGIN TRANSACTION");
|
|
534
599
|
try {
|
|
535
600
|
const exactDuplicate = this.db.prepare(`SELECT * FROM memory_units WHERE content_hash = ? AND status = 'active' LIMIT 1`).get(contentHash);
|
|
@@ -538,35 +603,13 @@ class MemoryDatabase {
|
|
|
538
603
|
this.incrementFrequency(exactDuplicate.id);
|
|
539
604
|
const updatedMemory = this.getMemory(exactDuplicate.id);
|
|
540
605
|
this.db.exec("COMMIT");
|
|
606
|
+
if (!updatedMemory) {
|
|
607
|
+
throw new Error(`Memory ${exactDuplicate.id} not found after increment - likely deleted by another process`);
|
|
608
|
+
}
|
|
541
609
|
return updatedMemory;
|
|
542
610
|
}
|
|
543
|
-
|
|
544
|
-
|
|
545
|
-
const existingMemory = similarMemories[0];
|
|
546
|
-
if (existingMemory) {
|
|
547
|
-
const similarity = this.jaccardSimilarity(summary, existingMemory.summary);
|
|
548
|
-
if (isRelevant(similarity)) {
|
|
549
|
-
const newMemoryData = {
|
|
550
|
-
store,
|
|
551
|
-
classification,
|
|
552
|
-
summary,
|
|
553
|
-
sourceEventIds,
|
|
554
|
-
projectScope: features.projectScope ?? undefined,
|
|
555
|
-
sessionId: features.sessionId
|
|
556
|
-
};
|
|
557
|
-
const action = await handleReconsolidation(this, newMemoryData, existingMemory, similarity);
|
|
558
|
-
switch (action.type) {
|
|
559
|
-
case "duplicate":
|
|
560
|
-
this.db.exec("COMMIT");
|
|
561
|
-
return action.updatedMemory;
|
|
562
|
-
case "conflict":
|
|
563
|
-
this.db.prepare(`DELETE FROM memory_units WHERE id = ?`).run(action.existingMemoryId);
|
|
564
|
-
break;
|
|
565
|
-
case "complement":
|
|
566
|
-
break;
|
|
567
|
-
}
|
|
568
|
-
}
|
|
569
|
-
}
|
|
611
|
+
if (reconsolidationAction?.type === "conflict" && reconsolidationAction.existingMemoryId) {
|
|
612
|
+
this.db.prepare(`DELETE FROM memory_units WHERE id = ?`).run(reconsolidationAction.existingMemoryId);
|
|
570
613
|
}
|
|
571
614
|
const now = new Date;
|
|
572
615
|
const decayRate = store === "stm" ? this.config.stmDecayRate : this.config.ltmDecayRate;
|
|
@@ -665,6 +708,9 @@ class MemoryDatabase {
|
|
|
665
708
|
async vectorSearch(queryTextOrEmbedding, currentProject, limit = 10) {
|
|
666
709
|
this.ensureInit();
|
|
667
710
|
const queryText = typeof queryTextOrEmbedding === "string" ? queryTextOrEmbedding : queryTextOrEmbedding.length === 0 ? "" : "";
|
|
711
|
+
if (queryText.trim().length === 0) {
|
|
712
|
+
return [];
|
|
713
|
+
}
|
|
668
714
|
const query = `
|
|
669
715
|
SELECT * FROM memory_units
|
|
670
716
|
WHERE status = 'active'
|
|
@@ -858,6 +904,9 @@ function matchesNegativePattern(text, classification) {
|
|
|
858
904
|
if (isAIMetaTalk(text)) {
|
|
859
905
|
return true;
|
|
860
906
|
}
|
|
907
|
+
if (NEGATION_PATTERNS.some((pattern) => pattern.test(text))) {
|
|
908
|
+
return true;
|
|
909
|
+
}
|
|
861
910
|
if (FIRST_PERSON_RECALL_PATTERNS.some((pattern) => pattern.test(text))) {
|
|
862
911
|
return true;
|
|
863
912
|
}
|
|
@@ -869,8 +918,75 @@ function matchesNegativePattern(text, classification) {
|
|
|
869
918
|
return false;
|
|
870
919
|
return patterns.some((pattern) => pattern.test(text));
|
|
871
920
|
}
|
|
872
|
-
var AI_META_TALK_PATTERNS, FIRST_PERSON_RECALL_PATTERNS, REMIND_RECALL_PATTERNS, NEGATIVE_PATTERNS;
|
|
921
|
+
var NEGATION_PATTERNS, AI_META_TALK_PATTERNS, FIRST_PERSON_RECALL_PATTERNS, REMIND_RECALL_PATTERNS, NEGATIVE_PATTERNS;
|
|
873
922
|
var init_negative_patterns = __esm(() => {
|
|
923
|
+
NEGATION_PATTERNS = [
|
|
924
|
+
/\bnon\s+(ho|hai|ha|abbiamo|avete|hanno)\s+(capito|capita|capisco|capisci|capisce|capiamo)\b/i,
|
|
925
|
+
/\bnon\s+(\u00E8|sono|e'|erano|eravamo|fu|fui)\b/i,
|
|
926
|
+
/\bnon\s+(posso|puoi|pu\u00F2|possiamo|potete|possono|potrei|potresti|potrebbe|potremmo)\b/i,
|
|
927
|
+
/\bnon\s+(voglio|vuoi|vuole|vogliamo|volete|vogliono|vorrei|vorresti|vorrebbe|vorremmo)\b/i,
|
|
928
|
+
/\bnon\s+(devo|devi|deve|dobbiamo|dovete|devono|dovrei|dovresti|dovrebbe|dovremmo)\b/i,
|
|
929
|
+
/\bnon\s+(so|sai|sa|sappiamo|sapete|sanno)\b/i,
|
|
930
|
+
/\bnon\s+(mi|ti|si|ci|vi)\s+(ricordo|ricordi|ricorda|ricordiamo|ricordate)\b/i,
|
|
931
|
+
/\bnon\s+(funziona|funzionano|funzionava|funzionava|funzioner[a\u00E0])\b/i,
|
|
932
|
+
/\bnon\s+(c'[e\u00E8]|ci\s+[e\u00E8]|c'\s+era|ci\s+era)\b/i,
|
|
933
|
+
/\bI\s+(don'?t|do\s+not)\s+(understand|know|think|believe|remember|recall)\b/i,
|
|
934
|
+
/\bI\s+(didn'?t|did\s+not)\s+(understand|know|think|believe|remember|recall|get|catch)\b/i,
|
|
935
|
+
/\bI\s+(haven'?t|have\s+not)\s+(understood|known|thought|believed|remembered|recalled)\b/i,
|
|
936
|
+
/\bI\s+(wouldn'?t|would\s+not)\b/i,
|
|
937
|
+
/\bI\s+(couldn'?t|could\s+not)\b/i,
|
|
938
|
+
/\bI\s+(shouldn'?t|should\s+not)\b/i,
|
|
939
|
+
/\bit\s+(doesn'?t|does\s+not)\s+(work|function|exist)\b/i,
|
|
940
|
+
/\bit\s+(didn'?t|did\s+not)\s+(work|function)\b/i,
|
|
941
|
+
/\b(not|never|no)\s+(understand|know|remember|recall|believe|think)\b/i,
|
|
942
|
+
/\bno\s+(entiendo|entiende|entend[i\u00ED]|comprendo|comprende|comprend[i\u00ED])\b/i,
|
|
943
|
+
/\bno\s+(puedo|puedes|puede|podemos|pod[e\u00E9]is|pueden|podr[i\u00ED]a|podr[i\u00ED]as)\b/i,
|
|
944
|
+
/\bno\s+(quiero|quieres|quiere|queremos|quer[e\u00E9]is|quieren|querr[i\u00ED]a|querr[i\u00ED]as)\b/i,
|
|
945
|
+
/\bno\s+(s[\u00E9e]|sabes|sabe|sabemos|sab[e\u00E9]is|saben)\b/i,
|
|
946
|
+
/\bno\s+(recuerdo|recuerdas|recuerda|recordamos|record[e\u00E1]is|recuerdan)\b/i,
|
|
947
|
+
/\bno\s+(funciona|funcionan|funcionaba|funcionab[aan]|funcionar[a\u00E1])\b/i,
|
|
948
|
+
/\bje\s+ne\s+(comprends|comprend|comprendais|compris)\b/i,
|
|
949
|
+
/\bje\s+ne\s+(sais|sais|savait|su)\b/i,
|
|
950
|
+
/\bje\s+ne\s+(veux|veux|voulais|voulus)\b/i,
|
|
951
|
+
/\bje\s+ne\s+(peux|peux|pouvais|pus)\b/i,
|
|
952
|
+
/\bje\s+ne\s+(dois|dois|devais|d[uu])\b/i,
|
|
953
|
+
/\bje\s+ne\s+(me\s+)?souviens\b/i,
|
|
954
|
+
/\bil\s+ne\s+(fonctionne|fonctionnait|fonctionnera)\b/i,
|
|
955
|
+
/\bich\s+(verstehe|verstand|verstanden)\s+nicht\b/i,
|
|
956
|
+
/\bich\s+(wei[s\u00DF]|wusste|gewusst)\s+nicht\b/i,
|
|
957
|
+
/\bich\s+(will|wollte|wollte)\s+nicht\b/i,
|
|
958
|
+
/\bich\s+(kann|konnte|gekonnt)\s+nicht\b/i,
|
|
959
|
+
/\bich\s+(muss|musste|gemusst)\s+nicht\b/i,
|
|
960
|
+
/\bich\s+erinnere\s+(mich|nicht)\b/i,
|
|
961
|
+
/\b(es|das)\s+(funktioniert|funktionierte|funktionieren)\s+nicht\b/i,
|
|
962
|
+
/\b(eu\s+)?n[\u00E3a]o\s+(entendo|entende|entend[i\u00ED])\b/i,
|
|
963
|
+
/\b(eu\s+)?n[\u00E3a]o\s+(sei|sabe|sabia|soube)\b/i,
|
|
964
|
+
/\b(eu\s+)?n[\u00E3a]o\s+(quero|quer|queria|quis)\b/i,
|
|
965
|
+
/\b(eu\s+)?n[\u00E3a]o\s+(posso|pode|podia|p[^o]de)\b/i,
|
|
966
|
+
/\b(eu\s+)?n[\u00E3a]o\s+(devo|deve|devia|deveu)\b/i,
|
|
967
|
+
/\b(eu\s+)?n[\u00E3a]o\s+me\s+lembro\b/i,
|
|
968
|
+
/\bn[\u00E3a]o\s+(funciona|funcionam|funcionava|funcionar[a\u00E1])\b/i,
|
|
969
|
+
/\bik\s+versta\s+(niet)\b/i,
|
|
970
|
+
/\bik\s+(weet|wist|geweten)\s+(niet)\b/i,
|
|
971
|
+
/\bik\s+(wil|wou|gewild)\s+(niet)\b/i,
|
|
972
|
+
/\bik\s+(kan|kon|gekund)\s+(niet)\b/i,
|
|
973
|
+
/\bik\s+(moet|moest|gemogen)\s+(niet)\b/i,
|
|
974
|
+
/\bhet\s+(werkt|werkte|gewerkt)\s+(niet)\b/i,
|
|
975
|
+
/\b(nie)\s+(rozumiem|rozumiesz|rozumie|rozumia[l\u0142]|zrozumia[l\u0142])\b/i,
|
|
976
|
+
/\b(nie)\s+(wiem|wiesz|wie|wiedzia[l\u0142])\b/i,
|
|
977
|
+
/\b(nie)\s+(chc[e\u0119]|chcia[l\u0142]em|chcia[l\u0142])\b/i,
|
|
978
|
+
/\b(nie)\s+(potraf[i\u0119]|mog[e\u0119]|mog[l\u0142]em|mog[l\u0142])\b/i,
|
|
979
|
+
/\b(nie)\s+(musz[e\u0119]|musia[l\u0142]em|musia[l\u0142])\b/i,
|
|
980
|
+
/\b(nie)\s+(dzia[l\u0142]a|dzia[l\u0142]a[l\u0142])\b/i,
|
|
981
|
+
/\banlam[i\u0131]yorum\b/i,
|
|
982
|
+
/\banlamad[i\u0131]m\b/i,
|
|
983
|
+
/\bbilmiyorum\b/i,
|
|
984
|
+
/\bbilmedim\b/i,
|
|
985
|
+
/\bistemiyorum\b/i,
|
|
986
|
+
/\bistemeden\b/i,
|
|
987
|
+
/\bisteyemem\b/i,
|
|
988
|
+
/\bcal[i\u0131][\u015Fs]m[i\u0131]yor\b/i
|
|
989
|
+
];
|
|
874
990
|
AI_META_TALK_PATTERNS = [
|
|
875
991
|
/^(Goal|Summary|Context|Analysis|Note|Overview|Background):\s+The user/i,
|
|
876
992
|
/^(Goal|Summary|Context|Analysis|Note|Overview|Background):\s+This/i,
|
|
@@ -1122,19 +1238,24 @@ function classifyWithExplicitIntent(text, signals) {
|
|
|
1122
1238
|
return { classification, confidence, isolatedContent: text };
|
|
1123
1239
|
}
|
|
1124
1240
|
const markerPatterns = [
|
|
1241
|
+
/\bricordati(?:\s+\w+){0,5}?\s+che\b:?\s*/gi,
|
|
1242
|
+
/\bricordati\b:?\s*/gi,
|
|
1243
|
+
/\bricorda(?:\s+\w+){0,5}?\s+che\b:?\s*/gi,
|
|
1125
1244
|
/\bricorda questo\b:?\s*/gi,
|
|
1126
|
-
/\
|
|
1127
|
-
/\
|
|
1128
|
-
/\
|
|
1245
|
+
/\bricordami(?:\s+\w+){0,5}?\s+che\b:?\s*/gi,
|
|
1246
|
+
/\bricordami che\b:?\s*/gi,
|
|
1247
|
+
/\bmemorizza(?:\s+\w+){0,5}?\s+che\b:?\s*/gi,
|
|
1129
1248
|
/\bmemorizza questo\b:?\s*/gi,
|
|
1130
|
-
/\bmemorizza che\b:?\s*/gi,
|
|
1131
1249
|
/\bmemorizziamo\b:?\s*/gi,
|
|
1132
|
-
/\bricordiamoci
|
|
1133
|
-
/\
|
|
1134
|
-
/\
|
|
1135
|
-
/\
|
|
1136
|
-
/\
|
|
1137
|
-
/\
|
|
1250
|
+
/\bricordiamoci(?:\s+\w+){0,5}?\s+(?:che|di)\b:?\s*/gi,
|
|
1251
|
+
/\btieni(?:\s+\w+){0,5}?\s+a mente\b:?\s*/gi,
|
|
1252
|
+
/\bnota(?:\s+\w+){0,5}?\s+che\b:?\s*/gi,
|
|
1253
|
+
/\bremember(?:\s+\w+){0,5}?\s+(?:this|that|to)\b:?\s*/gi,
|
|
1254
|
+
/\bremember this\b:?\s*/gi,
|
|
1255
|
+
/\bkeep(?:\s+\w+){0,5}?\s+in mind\b:?\s*/gi,
|
|
1256
|
+
/\bnote(?:\s+\w+){0,5}?\s+that\b:?\s*/gi,
|
|
1257
|
+
/\bdon'?t forget\b:?\s*/gi,
|
|
1258
|
+
/\bmake sure to remember\b:?\s*/gi
|
|
1138
1259
|
];
|
|
1139
1260
|
let isolatedContent = "";
|
|
1140
1261
|
let firstMatch = null;
|
|
@@ -2495,7 +2616,6 @@ function canExtract() {
|
|
|
2495
2616
|
log(`Skipping extraction: too soon after last extraction (${now - lastExtractionTime}ms < ${MIN_EXTRACTION_INTERVAL}ms)`);
|
|
2496
2617
|
return false;
|
|
2497
2618
|
}
|
|
2498
|
-
lastExtractionTime = now;
|
|
2499
2619
|
return true;
|
|
2500
2620
|
}
|
|
2501
2621
|
function getSessionIdFromEvent(properties) {
|
|
@@ -2535,18 +2655,21 @@ async function createTrueMemoryPlugin(ctx, configOverrides = {}) {
|
|
|
2535
2655
|
const db = await createMemoryDatabase(config);
|
|
2536
2656
|
log("Database initialized");
|
|
2537
2657
|
registerShutdownHandler("database", () => db.close());
|
|
2538
|
-
const
|
|
2658
|
+
const isValidPath = (path2) => {
|
|
2659
|
+
return !!(path2 && path2 !== "/" && path2 !== "\\" && path2.trim().length > 0);
|
|
2660
|
+
};
|
|
2661
|
+
const worktree = isValidPath(ctx.worktree) ? ctx.worktree : isValidPath(ctx.directory) ? ctx.directory : `unknown-project-${Date.now()}`;
|
|
2539
2662
|
const state = {
|
|
2540
2663
|
db,
|
|
2541
2664
|
config,
|
|
2542
2665
|
currentSessionId: null,
|
|
2543
|
-
injectedSessions: new Set,
|
|
2544
2666
|
worktree,
|
|
2545
2667
|
client: ctx.client
|
|
2546
2668
|
};
|
|
2547
2669
|
log(`True-Mem initialized \u2014 worktree=${worktree}`);
|
|
2548
2670
|
const projectName = worktree.split(/[/\\]/).pop() || "Unknown";
|
|
2549
|
-
const
|
|
2671
|
+
const version = getVersion();
|
|
2672
|
+
const startupMessage = `\uD83E\uDDE0 True-Mem: Plugin loaded successfully | v${version} [${BUILD_TIME}] | Mode: Jaccard Similarity | Project: ${projectName}`;
|
|
2550
2673
|
log(startupMessage);
|
|
2551
2674
|
return {
|
|
2552
2675
|
event: async ({ event }) => {
|
|
@@ -2722,7 +2845,7 @@ async function processSessionIdle(state, sessionId) {
|
|
|
2722
2845
|
const signals = matchAllPatterns(conversationText);
|
|
2723
2846
|
log("Debug: Detected signals:", JSON.stringify(signals));
|
|
2724
2847
|
let extractionAttempted = false;
|
|
2725
|
-
let
|
|
2848
|
+
let messagesProcessed = 0;
|
|
2726
2849
|
if (signals.length > 0) {
|
|
2727
2850
|
extractionAttempted = true;
|
|
2728
2851
|
try {
|
|
@@ -2764,6 +2887,7 @@ async function processSessionIdle(state, sessionId) {
|
|
|
2764
2887
|
confidence
|
|
2765
2888
|
});
|
|
2766
2889
|
log(`Stored ${classification} memory in ${store.toUpperCase()} (confidence: ${confidence.toFixed(2)}, role: ${role}, reason: ${result.reason})`);
|
|
2890
|
+
messagesProcessed++;
|
|
2767
2891
|
} else {
|
|
2768
2892
|
log(`Skipped ${classification} memory: ${result.reason}`);
|
|
2769
2893
|
}
|
|
@@ -2771,15 +2895,14 @@ async function processSessionIdle(state, sessionId) {
|
|
|
2771
2895
|
log(`Skipped ${classification} memory: ${validationReason}`);
|
|
2772
2896
|
}
|
|
2773
2897
|
}
|
|
2774
|
-
extractionSucceeded = true;
|
|
2775
2898
|
} catch (error) {
|
|
2776
2899
|
log(`Extraction failed with critical error: ${error}`);
|
|
2900
|
+
state.db.updateMessageWatermark(effectiveSessionId, messages.length);
|
|
2777
2901
|
return;
|
|
2778
2902
|
}
|
|
2779
2903
|
}
|
|
2780
|
-
|
|
2781
|
-
|
|
2782
|
-
}
|
|
2904
|
+
state.db.updateMessageWatermark(effectiveSessionId, messages.length);
|
|
2905
|
+
lastExtractionTime = Date.now();
|
|
2783
2906
|
}
|
|
2784
2907
|
async function handleSessionEnd(state, eventType, sessionId) {
|
|
2785
2908
|
const effectiveSessionId = sessionId ?? state.currentSessionId;
|
|
@@ -3002,42 +3125,13 @@ var init_opencode = __esm(() => {
|
|
|
3002
3125
|
init_queue();
|
|
3003
3126
|
init_shutdown();
|
|
3004
3127
|
init_injection();
|
|
3128
|
+
init_version();
|
|
3005
3129
|
opencode_default = createTrueMemoryPlugin;
|
|
3006
3130
|
});
|
|
3007
3131
|
|
|
3008
3132
|
// src/index.ts
|
|
3009
3133
|
init_logger();
|
|
3010
|
-
|
|
3011
|
-
// src/utils/version.ts
|
|
3012
|
-
import fs from "fs";
|
|
3013
|
-
import path from "path";
|
|
3014
|
-
import { fileURLToPath } from "url";
|
|
3015
|
-
function findPackageJsonUp(startDir) {
|
|
3016
|
-
let currentDir = startDir;
|
|
3017
|
-
while (currentDir !== path.dirname(currentDir)) {
|
|
3018
|
-
const pkgPath = path.join(currentDir, "package.json");
|
|
3019
|
-
if (fs.existsSync(pkgPath)) {
|
|
3020
|
-
return pkgPath;
|
|
3021
|
-
}
|
|
3022
|
-
currentDir = path.dirname(currentDir);
|
|
3023
|
-
}
|
|
3024
|
-
return null;
|
|
3025
|
-
}
|
|
3026
|
-
function getVersion() {
|
|
3027
|
-
try {
|
|
3028
|
-
const currentDir = path.dirname(fileURLToPath(import.meta.url));
|
|
3029
|
-
const pkgPath = findPackageJsonUp(currentDir);
|
|
3030
|
-
if (pkgPath) {
|
|
3031
|
-
const content = fs.readFileSync(pkgPath, "utf-8");
|
|
3032
|
-
const pkg = JSON.parse(content);
|
|
3033
|
-
return pkg.version ?? "unknown";
|
|
3034
|
-
}
|
|
3035
|
-
return "unknown";
|
|
3036
|
-
} catch (error) {
|
|
3037
|
-
console.error("[True-Mem] Version detection error:", error);
|
|
3038
|
-
return "unknown";
|
|
3039
|
-
}
|
|
3040
|
-
}
|
|
3134
|
+
init_version();
|
|
3041
3135
|
|
|
3042
3136
|
// src/utils/toast.ts
|
|
3043
3137
|
function showToast(ctx, title, message, variant = "info", duration = 3000) {
|
|
@@ -3051,7 +3145,8 @@ var state = {
|
|
|
3051
3145
|
initialized: false,
|
|
3052
3146
|
initPromise: null,
|
|
3053
3147
|
ctx: null,
|
|
3054
|
-
realHooks: null
|
|
3148
|
+
realHooks: null,
|
|
3149
|
+
initializingLock: false
|
|
3055
3150
|
};
|
|
3056
3151
|
var hasShownToast = false;
|
|
3057
3152
|
var TrueMemory = async (ctx) => {
|
|
@@ -3063,23 +3158,29 @@ var TrueMemory = async (ctx) => {
|
|
|
3063
3158
|
showToast(ctx, `True-Mem v${version}`, "Memory active.", "info", 4000);
|
|
3064
3159
|
}, 2000);
|
|
3065
3160
|
}
|
|
3066
|
-
state.
|
|
3067
|
-
|
|
3068
|
-
|
|
3069
|
-
log("
|
|
3070
|
-
|
|
3071
|
-
|
|
3072
|
-
|
|
3073
|
-
|
|
3074
|
-
|
|
3075
|
-
|
|
3076
|
-
|
|
3077
|
-
|
|
3078
|
-
|
|
3079
|
-
|
|
3080
|
-
|
|
3081
|
-
|
|
3082
|
-
|
|
3161
|
+
if (!state.initializingLock) {
|
|
3162
|
+
state.initializingLock = true;
|
|
3163
|
+
state.initPromise = (async () => {
|
|
3164
|
+
log("Phase 1: Initializing plugin (lightweight)...");
|
|
3165
|
+
if (!state.ctx) {
|
|
3166
|
+
log("ERROR: No ctx available");
|
|
3167
|
+
state.initializingLock = false;
|
|
3168
|
+
return;
|
|
3169
|
+
}
|
|
3170
|
+
try {
|
|
3171
|
+
const { createTrueMemoryPlugin: createTrueMemoryPlugin2 } = await Promise.resolve().then(() => (init_opencode(), exports_opencode));
|
|
3172
|
+
state.realHooks = await createTrueMemoryPlugin2(state.ctx);
|
|
3173
|
+
state.initialized = true;
|
|
3174
|
+
log("Phase 1 complete - Plugin ready");
|
|
3175
|
+
} catch (error) {
|
|
3176
|
+
log(`Init failed: ${error}`);
|
|
3177
|
+
state.initPromise = null;
|
|
3178
|
+
state.realHooks = null;
|
|
3179
|
+
} finally {
|
|
3180
|
+
state.initializingLock = false;
|
|
3181
|
+
}
|
|
3182
|
+
})();
|
|
3183
|
+
}
|
|
3083
3184
|
log("True-Mem: Plugin registered (immediate init mode)");
|
|
3084
3185
|
return {
|
|
3085
3186
|
event: async ({ event }) => {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"classifier.d.ts","sourceRoot":"","sources":["../../src/memory/classifier.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAIH,OAAO,KAAK,EAAE,WAAW,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAoCjE,eAAO,MAAM,oBAAoB,MAAM,CAAC;AAExC;;;GAGG;AACH,wBAAgB,4BAA4B,CAAC,IAAI,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM,GAAG,MAAM,CAkCzF;AAED;;;;;GAKG;AACH,wBAAgB,iBAAiB,CAC/B,IAAI,EAAE,MAAM,EACZ,cAAc,EAAE,MAAM,EACtB,eAAe,EAAE,MAAM,GACtB;IAAE,KAAK,EAAE,OAAO,CAAC;IAAC,UAAU,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CA0DxD;AAED;;;GAGG;AACH,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAc/D;AAED;;;GAGG;AACH,wBAAgB,0BAA0B,CACxC,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,GAAG,EAAE,GACb;IAAE,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;IAAC,UAAU,EAAE,MAAM,CAAC;IAAC,eAAe,EAAE,MAAM,CAAA;CAAE,
|
|
1
|
+
{"version":3,"file":"classifier.d.ts","sourceRoot":"","sources":["../../src/memory/classifier.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAIH,OAAO,KAAK,EAAE,WAAW,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAoCjE,eAAO,MAAM,oBAAoB,MAAM,CAAC;AAExC;;;GAGG;AACH,wBAAgB,4BAA4B,CAAC,IAAI,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM,GAAG,MAAM,CAkCzF;AAED;;;;;GAKG;AACH,wBAAgB,iBAAiB,CAC/B,IAAI,EAAE,MAAM,EACZ,cAAc,EAAE,MAAM,EACtB,eAAe,EAAE,MAAM,GACtB;IAAE,KAAK,EAAE,OAAO,CAAC;IAAC,UAAU,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CA0DxD;AAED;;;GAGG;AACH,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAc/D;AAED;;;GAGG;AACH,wBAAgB,0BAA0B,CACxC,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,GAAG,EAAE,GACb;IAAE,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;IAAC,UAAU,EAAE,MAAM,CAAC;IAAC,eAAe,EAAE,MAAM,CAAA;CAAE,CAoGhF;AAMD;;;;;;GAMG;AACH,wBAAgB,yBAAyB,CACvC,IAAI,EAAE,MAAM,EACZ,cAAc,EAAE,MAAM,EACtB,WAAW,EAAE,WAAW,GACvB;IAAE,KAAK,EAAE,OAAO,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CA8CpC;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAgB,yBAAyB,CACvC,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,GAAG,EAAE,EACd,gBAAgB,EAAE,gBAAgB,GAAG,IAAI,GACxC;IACD,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,UAAU,EAAE,MAAM,CAAC;IACnB,eAAe,EAAE,MAAM,CAAC;IACxB,aAAa,EAAE,OAAO,CAAC;IACvB,gBAAgB,EAAE,MAAM,CAAC;CAC1B,CAsEA;AAED;;;GAGG;AACH,wBAAgB,0BAA0B,CACxC,eAAe,EAAE,MAAM,EACvB,WAAW,EAAE,WAAW,EACxB,IAAI,EAAE,MAAM,GACX,MAAM,CAWR"}
|
|
@@ -4,6 +4,20 @@
|
|
|
4
4
|
* These patterns filter out common false positives before classification.
|
|
5
5
|
* E.g., "resolve DNS" should NOT trigger bugfix classification.
|
|
6
6
|
*/
|
|
7
|
+
/**
|
|
8
|
+
* Negation Patterns
|
|
9
|
+
*
|
|
10
|
+
* These patterns detect negations that invalidate memory statements.
|
|
11
|
+
* Sentences containing negations should NOT be stored as memories, regardless
|
|
12
|
+
* of whether they contain other memory-related keywords.
|
|
13
|
+
*
|
|
14
|
+
* Example: "non ho capito" contains "capito" but is negated → DON'T store
|
|
15
|
+
* Example: "I don't understand" contains "understand" but is negated → DON'T store
|
|
16
|
+
*
|
|
17
|
+
* Rationale: Negations reverse the meaning of statements. Learning something
|
|
18
|
+
* implies understanding, but "I don't understand" is the opposite.
|
|
19
|
+
*/
|
|
20
|
+
export declare const NEGATION_PATTERNS: RegExp[];
|
|
7
21
|
/**
|
|
8
22
|
* AI Meta-Talk Patterns
|
|
9
23
|
*
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"negative-patterns.d.ts","sourceRoot":"","sources":["../../src/memory/negative-patterns.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH;;;;;;;;;GASG;AACH,eAAO,MAAM,qBAAqB,EAAE,MAAM,EAmCzC,CAAC;AAEF;;GAEG;AACH,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAElD;AAED;;GAEG;AACH,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAahD;AAED;;;;;;;;GAQG;AACH,eAAO,MAAM,4BAA4B,EAAE,MAAM,EA0ChD,CAAC;AAEF;;;;;;;;;;GAUG;AACH,eAAO,MAAM,sBAAsB,EAAE,MAAM,EA+B1C,CAAC;AAGF,eAAO,MAAM,iBAAiB,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,CA0DtD,CAAC;AAEF;;;GAGG;AACH,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM,GAAG,OAAO,
|
|
1
|
+
{"version":3,"file":"negative-patterns.d.ts","sourceRoot":"","sources":["../../src/memory/negative-patterns.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH;;;;;;;;;;;;GAYG;AACH,eAAO,MAAM,iBAAiB,EAAE,MAAM,EAmFrC,CAAC;AAEF;;;;;;;;;GASG;AACH,eAAO,MAAM,qBAAqB,EAAE,MAAM,EAmCzC,CAAC;AAEF;;GAEG;AACH,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAElD;AAED;;GAEG;AACH,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAahD;AAED;;;;;;;;GAQG;AACH,eAAO,MAAM,4BAA4B,EAAE,MAAM,EA0ChD,CAAC;AAEF;;;;;;;;;;GAUG;AACH,eAAO,MAAM,sBAAsB,EAAE,MAAM,EA+B1C,CAAC;AAGF,eAAO,MAAM,iBAAiB,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,CA0DtD,CAAC;AAEF;;;GAGG;AACH,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM,GAAG,OAAO,CAyBpF;AAED;;GAEG;AACH,wBAAgB,2BAA2B,CAAC,IAAI,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM,GAAG,MAAM,EAAE,CAuC1F"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"database.d.ts","sourceRoot":"","sources":["../../src/storage/database.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAOH,OAAO,KAAK,EACV,OAAO,EACP,KAAK,EACL,UAAU,EACV,WAAW,EACX,oBAAoB,EACpB,YAAY,EACZ,QAAQ,EACR,cAAc,EACf,MAAM,aAAa,CAAC;AAmCrB,qBAAa,cAAc;IACzB,OAAO,CAAC,EAAE,CAAkB;IAC5B,OAAO,CAAC,MAAM,CAAiB;IAC/B,OAAO,CAAC,WAAW,CAAkB;IACrC,OAAO,CAAC,cAAc,CAAkB;gBAE5B,MAAM,GAAE,OAAO,CAAC,cAAc,CAAM;IAIhD;;OAEG;IACG,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IA2B3B,OAAO,CAAC,UAAU;IAMlB,OAAO,CAAC,gBAAgB;IA+HxB;;OAEG;IACH,OAAO,CAAC,eAAe;IAsCvB,aAAa,CAAC,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,cAAc,CAAC,EAAE,MAAM,GAAG,OAAO;IA+BhH,UAAU,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,GAAE,WAAW,GAAG,WAAyB,GAAG,IAAI;IAKpF,UAAU,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,GAAG,IAAI;IAO7C,mBAAmB,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM;IAM9C,sBAAsB,CAAC,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,IAAI;IAMlE,WAAW,CACT,SAAS,EAAE,MAAM,EACjB,QAAQ,EAAE,QAAQ,EAClB,OAAO,EAAE,MAAM,EACf,OAAO,CAAC,EAAE;QAAE,QAAQ,CAAC,EAAE,MAAM,CAAC;QAAC,SAAS,CAAC,EAAE,MAAM,CAAC;QAAC,UAAU,CAAC,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;KAAE,GAC3G,KAAK;IAiCR,gBAAgB,CAAC,SAAS,EAAE,MAAM,GAAG,KAAK,EAAE;IAOtC,YAAY,CAChB,KAAK,EAAE,WAAW,EAClB,cAAc,EAAE,oBAAoB,EACpC,OAAO,EAAE,MAAM,EACf,cAAc,EAAE,MAAM,EAAE,EACxB,QAAQ,GAAE,OAAO,CAAC;QAChB,SAAS,EAAE,MAAM,CAAC;QAClB,YAAY,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,CAAC;QACxC,UAAU,EAAE,MAAM,CAAC;QACnB,OAAO,EAAE,MAAM,CAAC;QAChB,OAAO,EAAE,MAAM,CAAC;QAChB,UAAU,EAAE,MAAM,CAAC;QACnB,IAAI,EAAE,MAAM,EAAE,CAAC;QACf,SAAS,EAAE,YAAY,CAAC;KACzB,CAAM,GACN,OAAO,CAAC,UAAU,CAAC;
|
|
1
|
+
{"version":3,"file":"database.d.ts","sourceRoot":"","sources":["../../src/storage/database.ts"],"names":[],"mappings":"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"}
|