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.
@@ -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;AA4F/G;;GAEG;AACH,wBAAsB,sBAAsB,CAC1C,GAAG,EAAE,WAAW,EAChB,eAAe,GAAE,OAAO,CAAC,cAAc,CAAM,GAC5C,OAAO,CAAC,KAAK,CAAC,CAwKhB;AAwlBD,eAAe,sBAAsB,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"}
@@ -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;AAsBzD,QAAA,MAAM,UAAU,EAAE,MAyGjB,CAAC;AAEF,eAAe,UAAU,CAAC;AAG1B,YAAY,EAAE,cAAc,EAAE,UAAU,EAAE,oBAAoB,EAAE,MAAM,YAAY,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
- const similarMemories = await this.vectorSearch(summary, features.projectScope ?? undefined, 1);
544
- if (similarMemories.length > 0) {
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
- /\bremember this\b:?\s*/gi,
1127
- /\bricordati che\b:?\s*/gi,
1128
- /\bricorda che\b:?\s*/gi,
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 che\b:?\s*/gi,
1133
- /\bricordiamoci di\b:?\s*/gi,
1134
- /\btieni a mente\b:?\s*/gi,
1135
- /\bkeep in mind\b:?\s*/gi,
1136
- /\bnota che\b:?\s*/gi,
1137
- /\bnote that\b:?\s*/gi
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 worktree = !ctx.worktree || ctx.worktree === "/" || ctx.worktree === "\\" ? ctx.directory : ctx.worktree;
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 startupMessage = `\uD83E\uDDE0 True-Mem: Plugin loaded successfully | v2.0.1 [${BUILD_TIME}] | Mode: Jaccard Similarity | Project: ${projectName}`;
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 extractionSucceeded = false;
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
- if (!extractionAttempted || extractionSucceeded) {
2781
- state.db.updateMessageWatermark(effectiveSessionId, messages.length);
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.initPromise = (async () => {
3067
- log("Phase 1: Initializing plugin (lightweight)...");
3068
- if (!state.ctx) {
3069
- log("ERROR: No ctx available");
3070
- return;
3071
- }
3072
- try {
3073
- const { createTrueMemoryPlugin: createTrueMemoryPlugin2 } = await Promise.resolve().then(() => (init_opencode(), exports_opencode));
3074
- state.realHooks = await createTrueMemoryPlugin2(state.ctx);
3075
- state.initialized = true;
3076
- log("Phase 1 complete - Plugin ready");
3077
- } catch (error) {
3078
- log(`Init failed: ${error}`);
3079
- state.initPromise = null;
3080
- state.realHooks = null;
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,CA0FhF;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"}
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,CAoBpF;AAED;;GAEG;AACH,wBAAgB,2BAA2B,CAAC,IAAI,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM,GAAG,MAAM,EAAE,CA4B1F"}
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;IAmJtB,SAAS,CAAC,QAAQ,EAAE,MAAM,GAAG,UAAU,GAAG,IAAI;IAO9C,kBAAkB,CAAC,cAAc,CAAC,EAAE,MAAM,EAAE,KAAK,GAAE,MAAW,EAAE,KAAK,CAAC,EAAE,WAAW,GAAG,UAAU,EAAE;IA+ClG;;;;;;;OAOG;IACG,YAAY,CAAC,oBAAoB,EAAE,YAAY,GAAG,MAAM,EAAE,cAAc,CAAC,EAAE,MAAM,EAAE,KAAK,GAAE,MAAW,GAAG,OAAO,CAAC,UAAU,EAAE,CAAC;IAmCnI;;;OAGG;IACH,OAAO,CAAC,iBAAiB;IAuBzB,oBAAoB,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,IAAI;IAK9D,kBAAkB,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,YAAY,GAAG,IAAI;IAKhE,kBAAkB,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI;IAM1C,YAAY,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI;IAMpC,iBAAiB,CAAC,QAAQ,EAAE;QAC1B,OAAO,EAAE,MAAM,CAAC;QAChB,SAAS,EAAE,MAAM,CAAC;QAClB,UAAU,EAAE,MAAM,CAAC;QACnB,OAAO,EAAE,MAAM,CAAC;QAChB,OAAO,EAAE,MAAM,CAAC;QAChB,UAAU,EAAE,MAAM,CAAC;QACnB,YAAY,EAAE,MAAM,CAAC;KACtB,GAAG,MAAM;IAmBV,UAAU,IAAI,MAAM;IA+BpB,gBAAgB,IAAI,MAAM;IAsB1B,OAAO,CAAC,YAAY;IAcpB,OAAO,CAAC,UAAU;IAclB,OAAO,CAAC,eAAe;IA8BvB,KAAK,IAAI,IAAI;CAkBd;AAED,wBAAsB,oBAAoB,CAAC,MAAM,GAAE,OAAO,CAAC,cAAc,CAAM,GAAG,OAAO,CAAC,cAAc,CAAC,CAIxG"}
1
+ {"version":3,"file":"database.d.ts","sourceRoot":"","sources":["../../src/storage/database.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "true-mem",
3
- "version": "1.0.10",
3
+ "version": "1.0.12",
4
4
  "description": "Persistent memory plugin for OpenCode with cognitive psychology-based memory management",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",