@pencil-agent/nano-mem 0.0.2 → 1.0.2

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.
Files changed (63) hide show
  1. package/dist/cli.js +1 -1
  2. package/dist/cli.js.map +1 -1
  3. package/dist/config.d.ts +16 -0
  4. package/dist/config.d.ts.map +1 -1
  5. package/dist/config.js +10 -1
  6. package/dist/config.js.map +1 -1
  7. package/dist/consolidation.d.ts.map +1 -1
  8. package/dist/consolidation.js +25 -8
  9. package/dist/consolidation.js.map +1 -1
  10. package/dist/engine.d.ts +7 -1
  11. package/dist/engine.d.ts.map +1 -1
  12. package/dist/engine.js +181 -65
  13. package/dist/engine.js.map +1 -1
  14. package/dist/extension.d.ts.map +1 -1
  15. package/dist/extension.js +70 -1
  16. package/dist/extension.js.map +1 -1
  17. package/dist/extraction.d.ts.map +1 -1
  18. package/dist/extraction.js +19 -2
  19. package/dist/extraction.js.map +1 -1
  20. package/dist/full-insights.d.ts.map +1 -1
  21. package/dist/full-insights.js +6 -5
  22. package/dist/full-insights.js.map +1 -1
  23. package/dist/i18n.d.ts +3 -0
  24. package/dist/i18n.d.ts.map +1 -1
  25. package/dist/i18n.js +56 -24
  26. package/dist/i18n.js.map +1 -1
  27. package/dist/index.d.ts +3 -3
  28. package/dist/index.d.ts.map +1 -1
  29. package/dist/index.js +1 -1
  30. package/dist/index.js.map +1 -1
  31. package/dist/insights-html.js +1 -1
  32. package/dist/insights-html.js.map +1 -1
  33. package/dist/linking.js +1 -1
  34. package/dist/linking.js.map +1 -1
  35. package/dist/scoring.d.ts +10 -1
  36. package/dist/scoring.d.ts.map +1 -1
  37. package/dist/scoring.js +33 -0
  38. package/dist/scoring.js.map +1 -1
  39. package/dist/store.d.ts +5 -0
  40. package/dist/store.d.ts.map +1 -1
  41. package/dist/store.js +40 -2
  42. package/dist/store.js.map +1 -1
  43. package/dist/types.d.ts +22 -2
  44. package/dist/types.d.ts.map +1 -1
  45. package/dist/update.d.ts.map +1 -1
  46. package/dist/update.js +22 -10
  47. package/dist/update.js.map +1 -1
  48. package/package.json +3 -4
  49. package/src/cli.ts +1 -1
  50. package/src/config.ts +27 -1
  51. package/src/consolidation.ts +33 -9
  52. package/src/engine.ts +218 -118
  53. package/src/extension.ts +77 -1
  54. package/src/extraction.ts +19 -2
  55. package/src/full-insights.ts +6 -5
  56. package/src/i18n.ts +62 -24
  57. package/src/index.ts +4 -1
  58. package/src/insights-html.ts +1 -1
  59. package/src/linking.ts +1 -1
  60. package/src/scoring.ts +48 -1
  61. package/src/store.ts +41 -2
  62. package/src/types.ts +25 -2
  63. package/src/update.ts +22 -10
package/dist/cli.js CHANGED
@@ -44,7 +44,7 @@ Usage:
44
44
  return;
45
45
  }
46
46
  for (const e of results) {
47
- console.log(`[${e.type}] ${e.id} — ${e.content.slice(0, 100)}`);
47
+ console.log(`[${e.type}] ${e.id} — ${(e.summary || e.detail || e.content || "").slice(0, 100)}`);
48
48
  }
49
49
  return;
50
50
  }
package/dist/cli.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AACA;;;;GAIG;AAEH,OAAO,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AACxC,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,sBAAsB,EAAE,MAAM,yBAAyB,CAAC;AACjE,OAAO,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AAExD,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;AACnC,MAAM,GAAG,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;AACpB,MAAM,MAAM,GAAG,IAAI,aAAa,EAAE,CAAC;AAEnC,KAAK,UAAU,IAAI;IAClB,IAAI,CAAC,GAAG,IAAI,GAAG,KAAK,MAAM,IAAI,GAAG,KAAK,IAAI,IAAI,GAAG,KAAK,QAAQ,EAAE,CAAC;QAChE,OAAO,CAAC,GAAG,CAAC;;;;;;;;;;CAUb,CAAC,CAAC;QACD,OAAO;IACR,CAAC;IAED,IAAI,GAAG,KAAK,OAAO,EAAE,CAAC;QACrB,MAAM,CAAC,GAAG,MAAM,MAAM,CAAC,QAAQ,EAAE,CAAC;QAClC,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC,aAAa,EAAE,CAAC,CAAC;QAC5C,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC,SAAS,EAAE,CAAC,CAAC;QACzC,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC;QACrC,OAAO,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC;QAC7C,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;QAC/B,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC;QACvC,OAAO;IACR,CAAC;IAED,IAAI,GAAG,KAAK,QAAQ,EAAE,CAAC;QACtB,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,IAAI,GAAG,CAAC;QACpD,MAAM,OAAO,GAAG,MAAM,MAAM,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;QAClD,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC;YACrB,OAAO,CAAC,GAAG,CAAC,uBAAuB,CAAC,CAAC;YACrC,OAAO;QACR,CAAC;QACD,KAAK,MAAM,CAAC,IAAI,OAAO,EAAE,CAAC;YACzB,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC;QACjE,CAAC;QACD,OAAO;IACR,CAAC;IAED,IAAI,GAAG,KAAK,QAAQ,EAAE,CAAC;QACtB,MAAM,EAAE,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;QACnB,IAAI,CAAC,EAAE,EAAE,CAAC;YACT,OAAO,CAAC,KAAK,CAAC,4BAA4B,CAAC,CAAC;YAC5C,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACjB,CAAC;QACD,MAAM,EAAE,GAAG,MAAM,MAAM,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC;QACxC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,iBAAiB,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,EAAE,YAAY,CAAC,CAAC;QAClE,OAAO;IACR,CAAC;IAED,IAAI,GAAG,KAAK,QAAQ,EAAE,CAAC;QACtB,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,SAAS,EAAE,CAAC;QACtC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;QAC3C,OAAO;IACR,CAAC;IAED,IAAI,GAAG,KAAK,UAAU,EAAE,CAAC;QACxB,MAAM,MAAM,GAAG,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC;QACzC,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;QAC3C,MAAM,UAAU,GAAG,SAAS,IAAI,CAAC,IAAI,IAAI,CAAC,SAAS,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,yBAAyB,CAAC;QAE3G,IAAI,MAAM,EAAE,CAAC;YACZ,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,gBAAgB,EAAE,CAAC;YAC/C,MAAM,IAAI,GAAG,kBAAkB,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;YAC3D,aAAa,CAAC,UAAU,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC;QAC1C,CAAC;aAAM,CAAC;YACP,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,oBAAoB,EAAE,CAAC;YACnD,MAAM,IAAI,GAAG,sBAAsB,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;YAC/D,aAAa,CAAC,UAAU,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC;QAC1C,CAAC;QACD,OAAO,CAAC,GAAG,CAAC,+BAA+B,UAAU,EAAE,CAAC,CAAC;QACzD,OAAO;IACR,CAAC;IAED,OAAO,CAAC,KAAK,CAAC,oBAAoB,GAAG,iCAAiC,CAAC,CAAC;IACxE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AACjB,CAAC;AAED,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;IACpB,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IACnB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AACjB,CAAC,CAAC,CAAC"}
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
package/dist/config.d.ts CHANGED
@@ -4,6 +4,20 @@
4
4
  * [POS]: Shared by engine and adapters; host products configure via this
5
5
  */
6
6
  import type { MemoryScope } from "./types.js";
7
+ export interface ProgressiveRecallConfig {
8
+ /** Score threshold for Active tier — inject full detail */
9
+ thresholdActive: number;
10
+ /** Score threshold for Cue tier — inject name + summary + id */
11
+ thresholdCue: number;
12
+ /** Budget ratio for Active tier (default 0.15 = 15%) */
13
+ budgetActive: number;
14
+ /** Budget ratio for Cue tier (default 0.70 = 70%) */
15
+ budgetCue: number;
16
+ /** Force entries created within this many hours to Active tier */
17
+ forceRecentHours: number;
18
+ /** Force entries with importance >= this value to Active tier */
19
+ forceImportanceMin: number;
20
+ }
7
21
  export interface NanomemConfig {
8
22
  memoryDir: string;
9
23
  tokenBudget: number;
@@ -41,6 +55,8 @@ export interface NanomemConfig {
41
55
  locale: "en" | "zh";
42
56
  /** Strength growth factor on each successful recall (spaced repetition) */
43
57
  strengthGrowthFactor: number;
58
+ /** Progressive recall injection configuration */
59
+ progressiveRecall: ProgressiveRecallConfig;
44
60
  }
45
61
  export declare function getConfig(overrides?: Partial<NanomemConfig>): NanomemConfig;
46
62
  //# sourceMappingURL=config.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAIH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAE9C,MAAM,WAAW,aAAa;IAC7B,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC;IACpH,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACjC,UAAU,EAAE;QAAE,SAAS,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC;IACtG,sBAAsB,EAAE,MAAM,CAAC;IAC/B,+CAA+C;IAC/C,YAAY,EAAE;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAA;KAAE,CAAC;IACzE,iEAAiE;IACjE,eAAe,EAAE;QAAE,eAAe,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,CAAA;KAAE,CAAC;IACjE,uCAAuC;IACvC,YAAY,CAAC,EAAE,WAAW,CAAC;IAC3B,qDAAqD;IACrD,MAAM,EAAE,IAAI,GAAG,IAAI,CAAC;IACpB,2EAA2E;IAC3E,oBAAoB,EAAE,MAAM,CAAC;CAC7B;AA2BD,wBAAgB,SAAS,CAAC,SAAS,CAAC,EAAE,OAAO,CAAC,aAAa,CAAC,GAAG,aAAa,CAiB3E"}
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAIH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAE9C,MAAM,WAAW,uBAAuB;IACvC,2DAA2D;IAC3D,eAAe,EAAE,MAAM,CAAC;IACxB,gEAAgE;IAChE,YAAY,EAAE,MAAM,CAAC;IACrB,wDAAwD;IACxD,YAAY,EAAE,MAAM,CAAC;IACrB,qDAAqD;IACrD,SAAS,EAAE,MAAM,CAAC;IAClB,kEAAkE;IAClE,gBAAgB,EAAE,MAAM,CAAC;IACzB,iEAAiE;IACjE,kBAAkB,EAAE,MAAM,CAAC;CAC3B;AAED,MAAM,WAAW,aAAa;IAC7B,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC;IACpH,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACjC,UAAU,EAAE;QAAE,SAAS,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC;IACtG,sBAAsB,EAAE,MAAM,CAAC;IAC/B,+CAA+C;IAC/C,YAAY,EAAE;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAA;KAAE,CAAC;IACzE,iEAAiE;IACjE,eAAe,EAAE;QAAE,eAAe,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,CAAA;KAAE,CAAC;IACjE,uCAAuC;IACvC,YAAY,CAAC,EAAE,WAAW,CAAC;IAC3B,qDAAqD;IACrD,MAAM,EAAE,IAAI,GAAG,IAAI,CAAC;IACpB,2EAA2E;IAC3E,oBAAoB,EAAE,MAAM,CAAC;IAC7B,iDAAiD;IACjD,iBAAiB,EAAE,uBAAuB,CAAC;CAC3C;AAmCD,wBAAgB,SAAS,CAAC,SAAS,CAAC,EAAE,OAAO,CAAC,aAAa,CAAC,GAAG,aAAa,CAkB3E"}
package/dist/config.js CHANGED
@@ -24,9 +24,17 @@ const DEFAULT_HALF_LIFE = {
24
24
  pattern: 180,
25
25
  struggle: 120,
26
26
  };
27
- const DEFAULT_MAX_ENTRIES = { knowledge: 200, lessons: 100, preferences: 50, work: 80, facets: 80 };
27
+ const DEFAULT_MAX_ENTRIES = { knowledge: 1000, lessons: 500, preferences: 200, work: 400, facets: 400 };
28
28
  const DEFAULT_SCORE_WEIGHTS = { recency: 1, importance: 1, relevance: 1 };
29
29
  const DEFAULT_EVICTION_WEIGHTS = { accessFrequency: 0.4, baseImpact: 0.6 };
30
+ const DEFAULT_PROGRESSIVE_RECALL = {
31
+ thresholdActive: 0.7,
32
+ thresholdCue: 0.35,
33
+ budgetActive: 0.15,
34
+ budgetCue: 0.70,
35
+ forceRecentHours: 24,
36
+ forceImportanceMin: 9,
37
+ };
30
38
  export function getConfig(overrides) {
31
39
  const tokenBudget = Number(process.env.NANOMEM_TOKEN_BUDGET) || 6000;
32
40
  const memoryDir = process.env.NANOMEM_MEMORY_DIR || overrides?.memoryDir || join(homedir(), ".nanomem", "memory");
@@ -43,6 +51,7 @@ export function getConfig(overrides) {
43
51
  defaultScope: overrides?.defaultScope,
44
52
  locale,
45
53
  strengthGrowthFactor: overrides?.strengthGrowthFactor ?? 1.5,
54
+ progressiveRecall: overrides?.progressiveRecall ?? { ...DEFAULT_PROGRESSIVE_RECALL },
46
55
  };
47
56
  }
48
57
  //# sourceMappingURL=config.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAsBjC,MAAM,cAAc,GAAG;IACtB,OAAO,EAAE,GAAG;IACZ,SAAS,EAAE,GAAG;IACd,QAAQ,EAAE,IAAI;IACd,WAAW,EAAE,GAAG;IAChB,IAAI,EAAE,GAAG;IACT,MAAM,EAAE,IAAI;CACH,CAAC;AAEX,MAAM,iBAAiB,GAA2B;IACjD,MAAM,EAAE,EAAE;IACV,IAAI,EAAE,EAAE;IACR,OAAO,EAAE,EAAE;IACX,UAAU,EAAE,GAAG;IACf,QAAQ,EAAE,EAAE;IACZ,MAAM,EAAE,EAAE;IACV,IAAI,EAAE,EAAE;IACR,OAAO,EAAE,GAAG;IACZ,QAAQ,EAAE,GAAG;CACb,CAAC;AAEF,MAAM,mBAAmB,GAAG,EAAE,SAAS,EAAE,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,WAAW,EAAE,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC;AACpG,MAAM,qBAAqB,GAAG,EAAE,OAAO,EAAE,CAAC,EAAE,UAAU,EAAE,CAAC,EAAE,SAAS,EAAE,CAAC,EAAE,CAAC;AAC1E,MAAM,wBAAwB,GAAG,EAAE,eAAe,EAAE,GAAG,EAAE,UAAU,EAAE,GAAG,EAAE,CAAC;AAE3E,MAAM,UAAU,SAAS,CAAC,SAAkC;IAC3D,MAAM,WAAW,GAAG,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,oBAAoB,CAAC,IAAI,IAAI,CAAC;IACrE,MAAM,SAAS,GAAG,OAAO,CAAC,GAAG,CAAC,kBAAkB,IAAI,SAAS,EAAE,SAAS,IAAI,IAAI,CAAC,OAAO,EAAE,EAAE,UAAU,EAAE,QAAQ,CAAC,CAAC;IAClH,MAAM,MAAM,GAAI,OAAO,CAAC,GAAG,CAAC,cAA8B,IAAI,SAAS,EAAE,MAAM,IAAI,IAAI,CAAC;IACxF,OAAO;QACN,SAAS;QACT,WAAW,EAAE,SAAS,EAAE,WAAW,IAAI,WAAW;QAClD,MAAM,EAAE,SAAS,EAAE,MAAM,IAAI,EAAE,GAAG,cAAc,EAAE;QAClD,QAAQ,EAAE,SAAS,EAAE,QAAQ,IAAI,EAAE,GAAG,iBAAiB,EAAE;QACzD,UAAU,EAAE,SAAS,EAAE,UAAU,IAAI,EAAE,GAAG,mBAAmB,EAAE;QAC/D,sBAAsB,EAAE,SAAS,EAAE,sBAAsB,IAAI,EAAE;QAC/D,YAAY,EAAE,SAAS,EAAE,YAAY,IAAI,EAAE,GAAG,qBAAqB,EAAE;QACrE,eAAe,EAAE,SAAS,EAAE,eAAe,IAAI,EAAE,GAAG,wBAAwB,EAAE;QAC9E,YAAY,EAAE,SAAS,EAAE,YAAY;QACrC,MAAM;QACN,oBAAoB,EAAE,SAAS,EAAE,oBAAoB,IAAI,GAAG;KAC5D,CAAC;AACH,CAAC"}
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAuCjC,MAAM,cAAc,GAAG;IACtB,OAAO,EAAE,GAAG;IACZ,SAAS,EAAE,GAAG;IACd,QAAQ,EAAE,IAAI;IACd,WAAW,EAAE,GAAG;IAChB,IAAI,EAAE,GAAG;IACT,MAAM,EAAE,IAAI;CACH,CAAC;AAEX,MAAM,iBAAiB,GAA2B;IACjD,MAAM,EAAE,EAAE;IACV,IAAI,EAAE,EAAE;IACR,OAAO,EAAE,EAAE;IACX,UAAU,EAAE,GAAG;IACf,QAAQ,EAAE,EAAE;IACZ,MAAM,EAAE,EAAE;IACV,IAAI,EAAE,EAAE;IACR,OAAO,EAAE,GAAG;IACZ,QAAQ,EAAE,GAAG;CACb,CAAC;AAEF,MAAM,mBAAmB,GAAG,EAAE,SAAS,EAAE,IAAI,EAAE,OAAO,EAAE,GAAG,EAAE,WAAW,EAAE,GAAG,EAAE,IAAI,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC;AACxG,MAAM,qBAAqB,GAAG,EAAE,OAAO,EAAE,CAAC,EAAE,UAAU,EAAE,CAAC,EAAE,SAAS,EAAE,CAAC,EAAE,CAAC;AAC1E,MAAM,wBAAwB,GAAG,EAAE,eAAe,EAAE,GAAG,EAAE,UAAU,EAAE,GAAG,EAAE,CAAC;AAC3E,MAAM,0BAA0B,GAA4B;IAC3D,eAAe,EAAE,GAAG;IACpB,YAAY,EAAE,IAAI;IAClB,YAAY,EAAE,IAAI;IAClB,SAAS,EAAE,IAAI;IACf,gBAAgB,EAAE,EAAE;IACpB,kBAAkB,EAAE,CAAC;CACrB,CAAC;AAEF,MAAM,UAAU,SAAS,CAAC,SAAkC;IAC3D,MAAM,WAAW,GAAG,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,oBAAoB,CAAC,IAAI,IAAI,CAAC;IACrE,MAAM,SAAS,GAAG,OAAO,CAAC,GAAG,CAAC,kBAAkB,IAAI,SAAS,EAAE,SAAS,IAAI,IAAI,CAAC,OAAO,EAAE,EAAE,UAAU,EAAE,QAAQ,CAAC,CAAC;IAClH,MAAM,MAAM,GAAI,OAAO,CAAC,GAAG,CAAC,cAA8B,IAAI,SAAS,EAAE,MAAM,IAAI,IAAI,CAAC;IACxF,OAAO;QACN,SAAS;QACT,WAAW,EAAE,SAAS,EAAE,WAAW,IAAI,WAAW;QAClD,MAAM,EAAE,SAAS,EAAE,MAAM,IAAI,EAAE,GAAG,cAAc,EAAE;QAClD,QAAQ,EAAE,SAAS,EAAE,QAAQ,IAAI,EAAE,GAAG,iBAAiB,EAAE;QACzD,UAAU,EAAE,SAAS,EAAE,UAAU,IAAI,EAAE,GAAG,mBAAmB,EAAE;QAC/D,sBAAsB,EAAE,SAAS,EAAE,sBAAsB,IAAI,EAAE;QAC/D,YAAY,EAAE,SAAS,EAAE,YAAY,IAAI,EAAE,GAAG,qBAAqB,EAAE;QACrE,eAAe,EAAE,SAAS,EAAE,eAAe,IAAI,EAAE,GAAG,wBAAwB,EAAE;QAC9E,YAAY,EAAE,SAAS,EAAE,YAAY;QACrC,MAAM;QACN,oBAAoB,EAAE,SAAS,EAAE,oBAAoB,IAAI,GAAG;QAC5D,iBAAiB,EAAE,SAAS,EAAE,iBAAiB,IAAI,EAAE,GAAG,0BAA0B,EAAE;KACpF,CAAC;AACH,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"consolidation.d.ts","sourceRoot":"","sources":["../src/consolidation.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAGjD,OAAO,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAM9D,wBAAsB,mBAAmB,CACxC,QAAQ,EAAE,OAAO,EAAE,EACnB,GAAG,EAAE,aAAa,EAClB,KAAK,CAAC,EAAE,KAAK,GACX,OAAO,CAAC,WAAW,EAAE,CAAC,CAaxB"}
1
+ {"version":3,"file":"consolidation.d.ts","sourceRoot":"","sources":["../src/consolidation.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAIjD,OAAO,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAM9D,wBAAsB,mBAAmB,CACxC,QAAQ,EAAE,OAAO,EAAE,EACnB,GAAG,EAAE,aAAa,EAClB,KAAK,CAAC,EAAE,KAAK,GACX,OAAO,CAAC,WAAW,EAAE,CAAC,CAaxB"}
@@ -9,6 +9,7 @@
9
9
  */
10
10
  import { PROMPTS } from "./i18n.js";
11
11
  import { extractTags } from "./scoring.js";
12
+ import { deriveNameFromContent, deriveSummaryFromContent } from "./store.js";
12
13
  function makeId() {
13
14
  return `${Date.now()}-${Math.random().toString(36).slice(2, 8)}`;
14
15
  }
@@ -38,11 +39,17 @@ async function llmConsolidation(episodes, cfg, llmFn) {
38
39
  const now = new Date().toISOString();
39
40
  return items.map((item) => {
40
41
  const type = item.type === "lesson" ? "lesson" : "fact";
42
+ const detail = item.detail || item.content || "";
43
+ const name = item.name || deriveNameFromContent(detail);
44
+ const summary = item.summary || deriveSummaryFromContent(detail);
41
45
  return {
42
46
  id: makeId(),
43
47
  type,
44
- content: item.content,
45
- tags: extractTags(item.content),
48
+ name,
49
+ summary,
50
+ detail,
51
+ content: detail,
52
+ tags: extractTags(`${name} ${summary} ${detail}`),
46
53
  project: episodes[0]?.project ?? "unknown",
47
54
  importance: item.importance ?? 6,
48
55
  strength: cfg.halfLife[type] ?? 30,
@@ -71,12 +78,17 @@ function heuristicConsolidation(episodes, cfg) {
71
78
  .sort((a, b) => b[1] - a[1])
72
79
  .slice(0, 5);
73
80
  if (hotFiles.length) {
74
- const content = `Frequently modified files: ${hotFiles.map(([f, c]) => `${f} (${c}x)`).join(", ")}`;
81
+ const detail = `Frequently modified files: ${hotFiles.map(([f, c]) => `${f} (${c}x)`).join(", ")}`;
82
+ const name = deriveNameFromContent(detail);
83
+ const summary = deriveSummaryFromContent(detail);
75
84
  result.push({
76
85
  id: makeId(),
77
86
  type: "fact",
78
- content,
79
- tags: extractTags(content),
87
+ name,
88
+ summary,
89
+ detail,
90
+ content: detail,
91
+ tags: extractTags(detail),
80
92
  project: episodes[0]?.project ?? "unknown",
81
93
  importance: 5,
82
94
  strength: cfg.halfLife.fact ?? 60,
@@ -90,12 +102,17 @@ function heuristicConsolidation(episodes, cfg) {
90
102
  const allErrors = episodes.flatMap((ep) => ep.errors).filter(Boolean);
91
103
  if (allErrors.length) {
92
104
  const errorSet = [...new Set(allErrors)].slice(0, 5);
93
- const content = `Recurring issues: ${errorSet.join("; ")}`;
105
+ const detail = `Recurring issues: ${errorSet.join("; ")}`;
106
+ const name = deriveNameFromContent(detail);
107
+ const summary = deriveSummaryFromContent(detail);
94
108
  result.push({
95
109
  id: makeId(),
96
110
  type: "lesson",
97
- content,
98
- tags: extractTags(content),
111
+ name,
112
+ summary,
113
+ detail,
114
+ content: detail,
115
+ tags: extractTags(detail),
99
116
  project: episodes[0]?.project ?? "unknown",
100
117
  importance: 7,
101
118
  strength: cfg.halfLife.lesson ?? 90,
@@ -1 +1 @@
1
- {"version":3,"file":"consolidation.js","sourceRoot":"","sources":["../src/consolidation.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"consolidation.js","sourceRoot":"","sources":["../src/consolidation.ts"],"names":[],"mappings":"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"}
package/dist/engine.d.ts CHANGED
@@ -25,6 +25,12 @@ export declare class NanoMemEngine {
25
25
  saveEpisode(ep: Episode): Promise<void>;
26
26
  consolidate(): Promise<MemoryEntry[]>;
27
27
  getMemoryInjection(project: string, contextTags: string[], scope?: MemoryScope): Promise<string>;
28
+ /** Retrieve a single entry by ID (for recall_memory tool) */
29
+ getEntryById(id: string): Promise<MemoryEntry | null>;
30
+ /** Reinforce a single entry by ID (bump accessCount, lastAccessed, strength) */
31
+ reinforceEntryById(id: string): Promise<boolean>;
32
+ /** Full-text search across ALL entries including dormant (for search_all_memories tool) */
33
+ searchAllEntries(query: string, limit?: number): Promise<MemoryEntry[]>;
28
34
  getStats(): Promise<{
29
35
  knowledge: number;
30
36
  lessons: number;
@@ -62,6 +68,6 @@ export declare class NanoMemEngine {
62
68
  private reinforceEntries;
63
69
  private reinforceWork;
64
70
  private reconsolidateIfNeeded;
65
- private buildInjectionText;
71
+ private buildProgressiveInjectionText;
66
72
  }
67
73
  //# sourceMappingURL=engine.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"engine.d.ts","sourceRoot":"","sources":["../src/engine.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"engine.d.ts","sourceRoot":"","sources":["../src/engine.ts"],"names":[],"mappings":"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"}
package/dist/engine.js CHANGED
@@ -14,7 +14,7 @@ import { extractMemories, extractWork } from "./extraction.js";
14
14
  import { PROMPTS } from "./i18n.js";
15
15
  import { getRelatedSummaries, linkNewEntry } from "./linking.js";
16
16
  import { evictExpiredEntries, evictExpiredWork, filterByScope, filterPII } from "./privacy.js";
17
- import { extractTags, pickTop, scoreEntry, scoreEpisode, scoreWorkEntry, tagOverlap } from "./scoring.js";
17
+ import { extractTags, pickTop, scoreEntry, scoreEpisode, scoreWorkEntry, tagOverlap, tierEntries } from "./scoring.js";
18
18
  import { loadEntries, loadEpisodes, loadMeta, loadWork, saveEpisode as persistEpisode, saveEntries, saveWork, writeJson, } from "./store.js";
19
19
  import { buildFullInsightsReport } from "./full-insights.js";
20
20
  import { applyExtraction } from "./update.js";
@@ -81,6 +81,7 @@ export class NanoMemEngine {
81
81
  id: `${Date.now()}-${Math.random().toString(36).slice(2, 8)}`,
82
82
  goal: sessionGoal || extracted.goal,
83
83
  summary: filterPII(extracted.summary),
84
+ detail: extracted.detail ? filterPII(extracted.detail) : undefined,
84
85
  project,
85
86
  tags: extractTags(`${extracted.goal} ${extracted.summary}`),
86
87
  importance: 6,
@@ -130,7 +131,7 @@ export class NanoMemEngine {
130
131
  await writeJson(this.metaPath, meta);
131
132
  return newEntries;
132
133
  }
133
- // ─── Retrieval & Injection ───────────────────────────────────
134
+ // ─── Retrieval & Injection (Progressive Recall) ────────────
134
135
  async getMemoryInjection(project, contextTags, scope) {
135
136
  const [allKnowledge, allLessons, allPrefs, allFacets, allEpisodes, allWork] = await Promise.all([
136
137
  loadEntries(this.knowledgePath),
@@ -146,28 +147,124 @@ export class NanoMemEngine {
146
147
  const facets = this.filterAndCleanEntries(allFacets, scope);
147
148
  const work = this.filterAndCleanWork(allWork, scope);
148
149
  const episodes = filterByScope(allEpisodes, scope);
149
- const totalBudget = this.cfg.tokenBudget;
150
- const b = this.cfg.budget;
151
150
  const hl = this.cfg.halfLife;
152
151
  const sw = this.cfg.scoreWeights;
152
+ const pr = this.cfg.progressiveRecall;
153
153
  const p = PROMPTS[this.cfg.locale] ?? PROMPTS.en;
154
- const charBudget = (ratio) => Math.floor(totalBudget * 4 * ratio);
155
- const topLessons = pickTop(lessons, (e) => scoreEntry(e, project, contextTags, hl, sw), (e) => e.content.length, charBudget(b.lessons));
156
- const topKnowledge = pickTop(knowledge, (e) => scoreEntry(e, project, contextTags, hl, sw), (e) => e.content.length, charBudget(b.knowledge));
157
- const topPrefs = pickTop(prefs, (e) => scoreEntry(e, project, contextTags, hl, sw), (e) => e.content.length, charBudget(b.preferences));
158
- const topFacets = pickTop(facets, (e) => scoreEntry(e, project, contextTags, hl, sw), (e) => e.content.length, charBudget(b.facets));
159
- const topEpisodes = pickTop(episodes, (ep) => scoreEpisode(ep, project, contextTags, hl, sw), (ep) => ep.summary.length, charBudget(b.episodes));
160
- const topWork = pickTop(work, (w) => scoreWorkEntry(w, project, contextTags, hl, sw), (w) => w.goal.length + w.summary.length, charBudget(b.work));
161
- await this.reinforceEntries(topLessons, allLessons, this.lessonsPath);
162
- await this.reinforceEntries(topKnowledge, allKnowledge, this.knowledgePath);
163
- await this.reinforceEntries(topPrefs, allPrefs, this.preferencesPath);
164
- await this.reinforceEntries(topFacets, allFacets, this.facetsPath);
154
+ // Tier all MemoryEntry categories
155
+ const tieredKnowledge = tierEntries(knowledge, project, contextTags, hl, sw, pr);
156
+ const tieredLessons = tierEntries(lessons, project, contextTags, hl, sw, pr);
157
+ const tieredPrefs = tierEntries(prefs, project, contextTags, hl, sw, pr);
158
+ const tieredFacets = tierEntries(facets, project, contextTags, hl, sw, pr);
159
+ // Budget calculation
160
+ const totalChars = this.cfg.tokenBudget * 4;
161
+ const activeChars = Math.floor(totalChars * pr.budgetActive);
162
+ const cueChars = Math.floor(totalChars * pr.budgetCue);
163
+ // Entry length helpers
164
+ const activeLen = (e) => (e.name?.length || 0) + (e.summary?.length || 0) + (e.detail?.length || 0) + 30;
165
+ const cueLen = (e) => (e.name?.length || 0) + (e.summary?.length || 0) + 30;
166
+ const scoreFn = (e) => scoreEntry(e, project, contextTags, hl, sw);
167
+ // Active tier: pick top entries with full detail, split budget across categories
168
+ const activeBudgetPer = Math.floor(activeChars / 4);
169
+ const activeKnowledge = pickTop(tieredKnowledge.active, scoreFn, activeLen, activeBudgetPer);
170
+ const activeLessons = pickTop(tieredLessons.active, scoreFn, activeLen, activeBudgetPer);
171
+ const activePrefs = pickTop(tieredPrefs.active, scoreFn, activeLen, activeBudgetPer);
172
+ const activeFacets = pickTop(tieredFacets.active, scoreFn, activeLen, activeBudgetPer);
173
+ // Cue tier: pick top entries with name + summary + id, split budget across categories
174
+ const cueBudgetPer = Math.floor(cueChars / 6); // 6 = knowledge + lessons + prefs + facets + episodes + work
175
+ const cueKnowledge = pickTop(tieredKnowledge.cue, scoreFn, cueLen, cueBudgetPer);
176
+ const cueLessons = pickTop(tieredLessons.cue, scoreFn, cueLen, cueBudgetPer);
177
+ const cuePrefs = pickTop(tieredPrefs.cue, scoreFn, cueLen, cueBudgetPer);
178
+ const cueFacets = pickTop(tieredFacets.cue, scoreFn, cueLen, cueBudgetPer);
179
+ // Episodes and Work use their existing scoring for cue layer
180
+ const topEpisodes = pickTop(episodes, (ep) => scoreEpisode(ep, project, contextTags, hl, sw), (ep) => ep.summary.length + 30, cueBudgetPer);
181
+ const topWork = pickTop(work, (w) => scoreWorkEntry(w, project, contextTags, hl, sw), (w) => w.goal.length + w.summary.length + 30, cueBudgetPer);
182
+ // Reinforce all recalled entries (Active + Cue) via spaced repetition
183
+ const allRecalledKnowledge = [...activeKnowledge, ...cueKnowledge];
184
+ const allRecalledLessons = [...activeLessons, ...cueLessons];
185
+ const allRecalledPrefs = [...activePrefs, ...cuePrefs];
186
+ const allRecalledFacets = [...activeFacets, ...cueFacets];
187
+ await this.reinforceEntries(allRecalledKnowledge, allKnowledge, this.knowledgePath);
188
+ await this.reinforceEntries(allRecalledLessons, allLessons, this.lessonsPath);
189
+ await this.reinforceEntries(allRecalledPrefs, allPrefs, this.preferencesPath);
190
+ await this.reinforceEntries(allRecalledFacets, allFacets, this.facetsPath);
165
191
  await this.reinforceWork(topWork, allWork);
192
+ // Optional reconsolidation for low-relevance recalled entries
166
193
  if (this.llmFn) {
167
- await this.reconsolidateIfNeeded(topKnowledge, contextTags, allKnowledge);
168
- await this.reconsolidateIfNeeded(topLessons, contextTags, allLessons);
194
+ await this.reconsolidateIfNeeded(allRecalledKnowledge, contextTags, allKnowledge);
195
+ await this.reconsolidateIfNeeded(allRecalledLessons, contextTags, allLessons);
169
196
  }
170
- return this.buildInjectionText(topLessons, topKnowledge, topEpisodes, topPrefs, topWork, topFacets, allKnowledge, p);
197
+ return this.buildProgressiveInjectionText({
198
+ knowledge: activeKnowledge,
199
+ lessons: activeLessons,
200
+ preferences: activePrefs,
201
+ facets: activeFacets,
202
+ }, {
203
+ knowledge: cueKnowledge,
204
+ lessons: cueLessons,
205
+ preferences: cuePrefs,
206
+ facets: cueFacets,
207
+ episodes: topEpisodes,
208
+ work: topWork,
209
+ }, allKnowledge, p);
210
+ }
211
+ // ─── Progressive Recall Tools ───────────────────────────────
212
+ /** Retrieve a single entry by ID (for recall_memory tool) */
213
+ async getEntryById(id) {
214
+ const paths = [this.knowledgePath, this.lessonsPath, this.preferencesPath, this.facetsPath];
215
+ for (const path of paths) {
216
+ const entries = await loadEntries(path);
217
+ const entry = entries.find((e) => e.id === id);
218
+ if (entry)
219
+ return entry;
220
+ }
221
+ return null;
222
+ }
223
+ /** Reinforce a single entry by ID (bump accessCount, lastAccessed, strength) */
224
+ async reinforceEntryById(id) {
225
+ const pathConfigs = [
226
+ { path: this.knowledgePath, max: this.cfg.maxEntries.knowledge },
227
+ { path: this.lessonsPath, max: this.cfg.maxEntries.lessons },
228
+ { path: this.preferencesPath, max: this.cfg.maxEntries.preferences },
229
+ { path: this.facetsPath, max: this.cfg.maxEntries.facets },
230
+ ];
231
+ const hl = this.cfg.halfLife;
232
+ const ew = this.cfg.evictionWeights;
233
+ for (const { path, max } of pathConfigs) {
234
+ const entries = await loadEntries(path);
235
+ const entry = entries.find((e) => e.id === id);
236
+ if (entry) {
237
+ entry.accessCount = (entry.accessCount ?? 0) + 1;
238
+ entry.lastAccessed = new Date().toISOString();
239
+ entry.strength = (entry.strength || 30) * this.cfg.strengthGrowthFactor;
240
+ await saveEntries(path, entries, max, (e) => utilityEntry(e, hl, ew));
241
+ return true;
242
+ }
243
+ }
244
+ return false;
245
+ }
246
+ /** Full-text search across ALL entries including dormant (for search_all_memories tool) */
247
+ async searchAllEntries(query, limit = 10) {
248
+ const tags = extractTags(query);
249
+ const queryLower = query.toLowerCase();
250
+ const [knowledge, lessons, prefs, facets] = await Promise.all([
251
+ loadEntries(this.knowledgePath),
252
+ loadEntries(this.lessonsPath),
253
+ loadEntries(this.preferencesPath),
254
+ loadEntries(this.facetsPath),
255
+ ]);
256
+ const all = [...knowledge, ...lessons, ...prefs, ...facets];
257
+ return all
258
+ .map((e) => {
259
+ const nameMatch = (e.name || "").toLowerCase().includes(queryLower) ? 2 : 0;
260
+ const summaryMatch = (e.summary || "").toLowerCase().includes(queryLower) ? 1 : 0;
261
+ const tagMatch = tagOverlap(e.tags, tags);
262
+ return { entry: e, score: nameMatch + summaryMatch + tagMatch };
263
+ })
264
+ .filter((x) => x.score > 0)
265
+ .sort((a, b) => b.score - a.score)
266
+ .slice(0, limit)
267
+ .map((x) => x.entry);
171
268
  }
172
269
  // ─── Stats ───────────────────────────────────────────────────
173
270
  async getStats() {
@@ -272,8 +369,8 @@ export class NanoMemEngine {
272
369
  .map((e) => ({
273
370
  entry: e,
274
371
  weight: calcWeight(e),
275
- trigger: e.facetData?.kind === "pattern" ? e.facetData.trigger : e.content.slice(0, 50),
276
- behavior: e.facetData?.kind === "pattern" ? e.facetData.behavior : e.content,
372
+ trigger: e.facetData?.kind === "pattern" ? e.facetData.trigger : (e.summary || e.detail || "").slice(0, 50),
373
+ behavior: e.facetData?.kind === "pattern" ? e.facetData.behavior : (e.summary || e.detail || ""),
277
374
  }))
278
375
  .sort((a, b) => b.weight - a.weight);
279
376
  // Build StruggleInsight[]
@@ -283,7 +380,7 @@ export class NanoMemEngine {
283
380
  return {
284
381
  entry: e,
285
382
  weight: calcWeight(e, !isResolved),
286
- problem: e.facetData?.kind === "struggle" ? e.facetData.problem : e.content,
383
+ problem: e.facetData?.kind === "struggle" ? e.facetData.problem : (e.summary || e.detail || ""),
287
384
  attempts: e.facetData?.kind === "struggle" ? e.facetData.attempts : [],
288
385
  solution: e.facetData?.kind === "struggle" ? e.facetData.solution : "",
289
386
  resolved: isResolved,
@@ -320,7 +417,7 @@ export class NanoMemEngine {
320
417
  const input = JSON.stringify({
321
418
  patterns: patterns.slice(0, 5).map((pa) => ({ trigger: pa.trigger, behavior: pa.behavior })),
322
419
  struggles: struggles.slice(0, 5).map((s) => ({ problem: s.problem, resolved: s.resolved })),
323
- lessons: lessons.slice(0, 5).map((l) => l.content),
420
+ lessons: lessons.slice(0, 5).map((l) => l.summary || l.detail || l.content || ""),
324
421
  });
325
422
  const raw = await this.llmFn(p.insightsRecommendationSystem, input);
326
423
  const cleaned = raw
@@ -428,10 +525,14 @@ export class NanoMemEngine {
428
525
  if (overlap >= 0.3)
429
526
  continue;
430
527
  try {
431
- const updated = await this.llmFn(p.reconsolidationSystem, `Original memory: ${entry.content}\n\nCurrent context tags: ${contextTags.join(", ")}`);
528
+ const memText = entry.detail || entry.summary || entry.content || "";
529
+ const updated = await this.llmFn(p.reconsolidationSystem, `Original memory: ${memText}\n\nCurrent context tags: ${contextTags.join(", ")}`);
432
530
  if (updated && updated.length > 10) {
433
- entry.content = updated.trim();
434
- entry.tags = extractTags(entry.content);
531
+ const trimmed = updated.trim();
532
+ entry.detail = trimmed;
533
+ entry.content = trimmed;
534
+ entry.summary = trimmed.length <= 150 ? trimmed : `${trimmed.slice(0, 147)}...`;
535
+ entry.tags = extractTags(trimmed);
435
536
  }
436
537
  }
437
538
  catch {
@@ -439,50 +540,65 @@ export class NanoMemEngine {
439
540
  }
440
541
  }
441
542
  }
442
- buildInjectionText(lessons, knowledge, episodes, prefs, work, facets, allKnowledge, p) {
543
+ buildProgressiveInjectionText(active, cue, allKnowledge, p) {
443
544
  const sections = [];
444
- if (lessons.length) {
445
- sections.push(`### ${p.sectionLessons}\n${lessons.map((e) => `- ${e.content}`).join("\n")}`);
446
- }
447
- if (knowledge.length) {
448
- const lines = knowledge.map((e) => {
449
- const related = getRelatedSummaries(e, allKnowledge, 2);
450
- const suffix = related.length ? ` [→ ${related.join("; ")}]` : "";
451
- return `- ${e.content}${suffix}`;
452
- });
453
- sections.push(`### ${p.sectionKnowledge}\n${lines.join("\n")}`);
454
- }
455
- if (episodes.length) {
456
- const lines = episodes.map((ep) => `- [${ep.date}] ${ep.project}: ${ep.summary}${ep.userGoal ? ` (Goal: ${ep.userGoal})` : ""}`);
457
- sections.push(`### ${p.sectionEpisodes}\n${lines.join("\n")}`);
458
- }
459
- if (prefs.length) {
460
- sections.push(`### ${p.sectionPreferences}\n${prefs.map((e) => `- ${e.content}`).join("\n")}`);
545
+ // ── Active tier: full detail ──
546
+ const activeLines = [];
547
+ const formatActiveEntry = (e) => {
548
+ const related = getRelatedSummaries(e, allKnowledge, 2);
549
+ const suffix = related.length ? ` [→ ${related.join("; ")}]` : "";
550
+ return `- [ID: ${e.id}] **${e.name || "—"}**: ${e.summary || ""}\n ${e.detail || ""}${suffix}`;
551
+ };
552
+ const formatActiveFacet = (e) => {
553
+ if (e.facetData?.kind === "pattern") {
554
+ return `- [ID: ${e.id}] **${e.name || "—"}**: When ${e.facetData.trigger} → ${e.facetData.behavior}\n ${e.detail || ""}`;
555
+ }
556
+ if (e.facetData?.kind === "struggle") {
557
+ return `- [ID: ${e.id}] **${e.name || "—"}**: ${e.facetData.problem}\n Tried: ${e.facetData.attempts.join(", ")} | Solved: ${e.facetData.solution}\n ${e.detail || ""}`;
558
+ }
559
+ return formatActiveEntry(e);
560
+ };
561
+ for (const e of active.lessons)
562
+ activeLines.push(formatActiveEntry(e));
563
+ for (const e of active.knowledge)
564
+ activeLines.push(formatActiveEntry(e));
565
+ for (const e of active.preferences)
566
+ activeLines.push(formatActiveEntry(e));
567
+ for (const e of active.facets)
568
+ activeLines.push(formatActiveFacet(e));
569
+ if (activeLines.length) {
570
+ sections.push(`### ${p.sectionActiveMemories}\n${activeLines.join("\n")}`);
461
571
  }
462
- if (work.length) {
463
- const lines = work.map((w) => `- [${w.created.slice(0, 10)}] ${w.goal}: ${w.summary}`);
464
- sections.push(`### ${p.sectionWork}\n${lines.join("\n")}`);
572
+ // ── Cue tier: name + summary + id ──
573
+ const cueLines = [];
574
+ const formatCueEntry = (e) => `- [ID: ${e.id}] [${e.type}] **${e.name || ""}**: ${e.summary || ""}`;
575
+ const formatCueFacet = (e) => {
576
+ if (e.facetData?.kind === "pattern") {
577
+ return `- [ID: ${e.id}] [pattern] **${e.name || "—"}**: When ${e.facetData.trigger} → ${e.facetData.behavior}`;
578
+ }
579
+ if (e.facetData?.kind === "struggle") {
580
+ return `- [ID: ${e.id}] [struggle] **${e.name || "—"}**: ${e.facetData.problem}`;
581
+ }
582
+ return formatCueEntry(e);
583
+ };
584
+ for (const e of cue.lessons)
585
+ cueLines.push(formatCueEntry(e));
586
+ for (const e of cue.knowledge)
587
+ cueLines.push(formatCueEntry(e));
588
+ for (const e of cue.preferences)
589
+ cueLines.push(formatCueEntry(e));
590
+ for (const e of cue.facets)
591
+ cueLines.push(formatCueFacet(e));
592
+ // Episodes in cue layer (no ID-based recall)
593
+ for (const ep of cue.episodes) {
594
+ cueLines.push(`- [${ep.date}] ${ep.project}: ${ep.summary}${ep.userGoal ? ` (Goal: ${ep.userGoal})` : ""}`);
465
595
  }
466
- // Facets: patterns and struggles
467
- const patterns = facets.filter((e) => e.type === "pattern");
468
- const struggles = facets.filter((e) => e.type === "struggle");
469
- if (patterns.length) {
470
- const lines = patterns.map((e) => {
471
- if (e.facetData?.kind === "pattern") {
472
- return `- When ${e.facetData.trigger} → ${e.facetData.behavior}`;
473
- }
474
- return `- ${e.content}`;
475
- });
476
- sections.push(`### ${p.sectionPatterns}\n${lines.join("\n")}`);
596
+ // Work in cue layer
597
+ for (const w of cue.work) {
598
+ cueLines.push(`- [${w.created.slice(0, 10)}] ${w.goal}: ${w.summary}`);
477
599
  }
478
- if (struggles.length) {
479
- const lines = struggles.map((e) => {
480
- if (e.facetData?.kind === "struggle") {
481
- return `- Problem: ${e.facetData.problem} | Tried: ${e.facetData.attempts.join(", ")} | Solved: ${e.facetData.solution}`;
482
- }
483
- return `- ${e.content}`;
484
- });
485
- sections.push(`### ${p.sectionStruggles}\n${lines.join("\n")}`);
600
+ if (cueLines.length) {
601
+ sections.push(`### ${p.sectionMemoryCues}\n*${p.memoryCueHint}*\n${cueLines.join("\n")}`);
486
602
  }
487
603
  if (!sections.length)
488
604
  return "";