mnemon-mcp 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (104) hide show
  1. package/CHANGELOG.md +34 -0
  2. package/CONTRIBUTING.md +59 -0
  3. package/LICENSE +21 -0
  4. package/README.md +434 -0
  5. package/SECURITY.md +29 -0
  6. package/config.example.json +52 -0
  7. package/dist/.tsbuildinfo +1 -0
  8. package/dist/db.d.ts +16 -0
  9. package/dist/db.d.ts.map +1 -0
  10. package/dist/db.js +360 -0
  11. package/dist/db.js.map +1 -0
  12. package/dist/embedder.d.ts +22 -0
  13. package/dist/embedder.d.ts.map +1 -0
  14. package/dist/embedder.js +109 -0
  15. package/dist/embedder.js.map +1 -0
  16. package/dist/import/cli.d.ts +12 -0
  17. package/dist/import/cli.d.ts.map +1 -0
  18. package/dist/import/cli.js +105 -0
  19. package/dist/import/cli.js.map +1 -0
  20. package/dist/import/config-loader.d.ts +29 -0
  21. package/dist/import/config-loader.d.ts.map +1 -0
  22. package/dist/import/config-loader.js +140 -0
  23. package/dist/import/config-loader.js.map +1 -0
  24. package/dist/import/kb-config.d.ts +27 -0
  25. package/dist/import/kb-config.d.ts.map +1 -0
  26. package/dist/import/kb-config.js +10 -0
  27. package/dist/import/kb-config.js.map +1 -0
  28. package/dist/import/kb-import.d.ts +45 -0
  29. package/dist/import/kb-import.d.ts.map +1 -0
  30. package/dist/import/kb-import.js +285 -0
  31. package/dist/import/kb-import.js.map +1 -0
  32. package/dist/import/md-parser.d.ts +35 -0
  33. package/dist/import/md-parser.d.ts.map +1 -0
  34. package/dist/import/md-parser.js +104 -0
  35. package/dist/import/md-parser.js.map +1 -0
  36. package/dist/index-http.d.ts +12 -0
  37. package/dist/index-http.d.ts.map +1 -0
  38. package/dist/index-http.js +202 -0
  39. package/dist/index-http.js.map +1 -0
  40. package/dist/index.d.ts +9 -0
  41. package/dist/index.d.ts.map +1 -0
  42. package/dist/index.js +56 -0
  43. package/dist/index.js.map +1 -0
  44. package/dist/server.d.ts +16 -0
  45. package/dist/server.d.ts.map +1 -0
  46. package/dist/server.js +341 -0
  47. package/dist/server.js.map +1 -0
  48. package/dist/stemmer.d.ts +29 -0
  49. package/dist/stemmer.d.ts.map +1 -0
  50. package/dist/stemmer.js +68 -0
  51. package/dist/stemmer.js.map +1 -0
  52. package/dist/stop-words.d.ts +12 -0
  53. package/dist/stop-words.d.ts.map +1 -0
  54. package/dist/stop-words.js +112 -0
  55. package/dist/stop-words.js.map +1 -0
  56. package/dist/tools/memory-add.d.ts +15 -0
  57. package/dist/tools/memory-add.d.ts.map +1 -0
  58. package/dist/tools/memory-add.js +120 -0
  59. package/dist/tools/memory-add.js.map +1 -0
  60. package/dist/tools/memory-delete.d.ts +10 -0
  61. package/dist/tools/memory-delete.d.ts.map +1 -0
  62. package/dist/tools/memory-delete.js +39 -0
  63. package/dist/tools/memory-delete.js.map +1 -0
  64. package/dist/tools/memory-export.d.ts +10 -0
  65. package/dist/tools/memory-export.d.ts.map +1 -0
  66. package/dist/tools/memory-export.js +102 -0
  67. package/dist/tools/memory-export.js.map +1 -0
  68. package/dist/tools/memory-health.d.ts +11 -0
  69. package/dist/tools/memory-health.d.ts.map +1 -0
  70. package/dist/tools/memory-health.js +79 -0
  71. package/dist/tools/memory-health.js.map +1 -0
  72. package/dist/tools/memory-inspect.d.ts +10 -0
  73. package/dist/tools/memory-inspect.d.ts.map +1 -0
  74. package/dist/tools/memory-inspect.js +139 -0
  75. package/dist/tools/memory-inspect.js.map +1 -0
  76. package/dist/tools/memory-search.d.ts +16 -0
  77. package/dist/tools/memory-search.d.ts.map +1 -0
  78. package/dist/tools/memory-search.js +459 -0
  79. package/dist/tools/memory-search.js.map +1 -0
  80. package/dist/tools/memory-update.d.ts +11 -0
  81. package/dist/tools/memory-update.d.ts.map +1 -0
  82. package/dist/tools/memory-update.js +142 -0
  83. package/dist/tools/memory-update.js.map +1 -0
  84. package/dist/tools/style-extract.d.ts +40 -0
  85. package/dist/tools/style-extract.d.ts.map +1 -0
  86. package/dist/tools/style-extract.js +43 -0
  87. package/dist/tools/style-extract.js.map +1 -0
  88. package/dist/tools/utils.d.ts +28 -0
  89. package/dist/tools/utils.d.ts.map +1 -0
  90. package/dist/tools/utils.js +33 -0
  91. package/dist/tools/utils.js.map +1 -0
  92. package/dist/types.d.ts +216 -0
  93. package/dist/types.d.ts.map +1 -0
  94. package/dist/types.js +6 -0
  95. package/dist/types.js.map +1 -0
  96. package/dist/validation.d.ts +122 -0
  97. package/dist/validation.d.ts.map +1 -0
  98. package/dist/validation.js +96 -0
  99. package/dist/validation.js.map +1 -0
  100. package/dist/vector.d.ts +30 -0
  101. package/dist/vector.d.ts.map +1 -0
  102. package/dist/vector.js +90 -0
  103. package/dist/vector.js.map +1 -0
  104. package/package.json +75 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAE5C,OAAO,EAAE,MAAM,EAAE,MAAM,2CAA2C,CAAC;AACnE,OAAO,EACL,qBAAqB,EACrB,sBAAsB,EACtB,0BAA0B,EAC1B,kCAAkC,EAClC,yBAAyB,EACzB,wBAAwB,EACxB,sBAAsB,GACvB,MAAM,oCAAoC,CAAC;AAE5C,OAAO,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AAClD,OAAO,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AACxD,OAAO,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AACxD,OAAO,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAC;AAC1D,OAAO,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AACxD,OAAO,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AACxD,OAAO,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAExD,OAAO,EACL,eAAe,EACf,kBAAkB,EAClB,kBAAkB,EAClB,mBAAmB,EACnB,kBAAkB,EAClB,kBAAkB,EAClB,kBAAkB,EAClB,mBAAmB,EACnB,sBAAsB,EACtB,sBAAsB,EACtB,uBAAuB,EACvB,sBAAsB,EACtB,sBAAsB,EACtB,sBAAsB,GACvB,MAAM,iBAAiB,CAAC;AAazB,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAEhE,OAAO,EAAE,UAAU,EAAE,MAAM,2BAA2B,CAAC;AACvD,OAAO,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AAEpD,MAAM,OAAO,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAC/C,MAAM,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC,iBAAiB,CAAwB,CAAC;AAEtE,OAAO,EAAE,OAAO,EAAE,CAAC;AAEnB,kEAAkE;AAClE,MAAM,UAAU,kBAAkB;IAChC,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,UAAU,EAAE,CAAC;QAC5B,IAAI,MAAM,CAAC,cAAc,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACrC,iBAAiB,CAAC,MAAM,CAAC,cAAc,CAAC,CAAC;QAC3C,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;QACP,mDAAmD;IACrD,CAAC;AACH,CAAC;AAED,6DAA6D;AAC7D,MAAM,UAAU,eAAe,CAAC,EAAqB,EAAE,QAA0B;IAC/E,MAAM,MAAM,GAAG,IAAI,MAAM,CACvB,EAAE,IAAI,EAAE,YAAY,EAAE,OAAO,EAAE,EAC/B,EAAE,YAAY,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,SAAS,EAAE,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE,EAAE,CAC5D,CAAC;IAEF,MAAM,CAAC,iBAAiB,CAAC,sBAAsB,EAAE,GAAG,EAAE,CAAC,CAAC;QACtD,KAAK,EAAE;YACL;gBACE,IAAI,EAAE,YAAY;gBAClB,WAAW,EACT,iQAAiQ;gBACnQ,WAAW,EAAE,mBAAmB;aACjC;YACD;gBACE,IAAI,EAAE,eAAe;gBACrB,WAAW,EACT,iLAAiL;gBACnL,WAAW,EAAE,sBAAsB;aACpC;YACD;gBACE,IAAI,EAAE,eAAe;gBACrB,WAAW,EACT,qKAAqK;gBACvK,WAAW,EAAE,sBAAsB;aACpC;YACD;gBACE,IAAI,EAAE,eAAe;gBACrB,WAAW,EACT,oHAAoH;gBACtH,WAAW,EAAE,sBAAsB;aACpC;YACD;gBACE,IAAI,EAAE,gBAAgB;gBACtB,WAAW,EACT,6NAA6N;gBAC/N,WAAW,EAAE,uBAAuB;aACrC;YACD;gBACE,IAAI,EAAE,eAAe;gBACrB,WAAW,EACT,2KAA2K;gBAC7K,WAAW,EAAE,sBAAsB;aACpC;YACD;gBACE,IAAI,EAAE,eAAe;gBACrB,WAAW,EACT,sOAAsO;gBACxO,WAAW,EAAE,sBAAsB;aACpC;SACF;KACF,CAAC,CAAC,CAAC;IAEJ,MAAM,CAAC,iBAAiB,CAAC,qBAAqB,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE;QAChE,MAAM,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC;QAEjD,IAAI,CAAC;YACH,QAAQ,IAAI,EAAE,CAAC;gBACb,KAAK,YAAY,CAAC,CAAC,CAAC;oBAClB,MAAM,KAAK,GAAG,eAAe,CAAC,KAAK,CAAC,IAAI,CAAmB,CAAC;oBAC5D,MAAM,MAAM,GAAG,SAAS,CAAC,EAAE,EAAE,KAAK,CAAC,CAAC;oBACpC,0DAA0D;oBAC1D,IAAI,QAAQ,IAAI,WAAW,EAAE,EAAE,CAAC;wBAC9B,IAAI,CAAC;4BACH,MAAM,WAAW,GAAG,KAAK,CAAC,KAAK;gCAC7B,CAAC,CAAC,GAAG,KAAK,CAAC,KAAK,OAAO,KAAK,CAAC,OAAO,EAAE;gCACtC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC;4BAClB,MAAM,SAAS,GAAG,MAAM,QAAQ,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;4BACpD,SAAS,CAAC,EAAE,EAAE,MAAM,CAAC,EAAE,EAAE,SAAS,CAAC,CAAC;wBACtC,CAAC;wBAAC,MAAM,CAAC;4BACP,gDAAgD;wBAClD,CAAC;oBACH,CAAC;oBACD,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC;gBAChF,CAAC;gBACD,KAAK,eAAe,CAAC,CAAC,CAAC;oBACrB,MAAM,KAAK,GAAG,kBAAkB,CAAC,KAAK,CAAC,IAAI,CAAsB,CAAC;oBAClE,MAAM,MAAM,GAAG,MAAM,YAAY,CAAC,EAAE,EAAE,KAAK,EAAE,QAAQ,CAAC,CAAC;oBACvD,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC;gBAChF,CAAC;gBACD,KAAK,eAAe,CAAC,CAAC,CAAC;oBACrB,MAAM,KAAK,GAAG,kBAAkB,CAAC,KAAK,CAAC,IAAI,CAAsB,CAAC;oBAClE,MAAM,MAAM,GAAG,YAAY,CAAC,EAAE,EAAE,KAAK,CAAC,CAAC;oBACvC,8CAA8C;oBAC9C,IAAI,QAAQ,IAAI,WAAW,EAAE,EAAE,CAAC;wBAC9B,IAAI,CAAC;4BACH,MAAM,QAAQ,GAAG,MAAM,CAAC,MAAM,IAAI,MAAM,CAAC,UAAU,CAAC;4BACpD,MAAM,GAAG,GAAG,EAAE,CAAC,OAAO,CACpB,kDAAkD,CACnD,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;4BAChB,IAAI,GAAG,EAAE,CAAC;gCACR,MAAM,IAAI,GAAG,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,KAAK,OAAO,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC;gCACxE,MAAM,SAAS,GAAG,MAAM,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;gCAC7C,SAAS,CAAC,EAAE,EAAE,QAAQ,EAAE,SAAS,CAAC,CAAC;4BACrC,CAAC;4BACD,2CAA2C;4BAC3C,IAAI,MAAM,CAAC,MAAM,EAAE,CAAC;gCAClB,SAAS,CAAC,EAAE,EAAE,MAAM,CAAC,UAAU,CAAC,CAAC;4BACnC,CAAC;wBACH,CAAC;wBAAC,MAAM,CAAC;4BACP,cAAc;wBAChB,CAAC;oBACH,CAAC;oBACD,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC;gBAChF,CAAC;gBACD,KAAK,eAAe,CAAC,CAAC,CAAC;oBACrB,MAAM,KAAK,GAAG,kBAAkB,CAAC,KAAK,CAAC,IAAI,CAAsB,CAAC;oBAClE,MAAM,MAAM,GAAG,YAAY,CAAC,EAAE,EAAE,KAAK,CAAC,CAAC;oBACvC,mCAAmC;oBACnC,IAAI,WAAW,EAAE,EAAE,CAAC;wBAClB,SAAS,CAAC,EAAE,EAAE,KAAK,CAAC,EAAE,CAAC,CAAC;oBAC1B,CAAC;oBACD,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC;gBAChF,CAAC;gBACD,KAAK,gBAAgB,CAAC,CAAC,CAAC;oBACtB,MAAM,KAAK,GAAG,mBAAmB,CAAC,KAAK,CAAC,IAAI,CAAuB,CAAC;oBACpE,MAAM,MAAM,GAAG,aAAa,CAAC,EAAE,EAAE,KAAK,CAAC,CAAC;oBACxC,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC;gBAChF,CAAC;gBACD,KAAK,eAAe,CAAC,CAAC,CAAC;oBACrB,MAAM,KAAK,GAAG,kBAAkB,CAAC,KAAK,CAAC,IAAI,CAAsB,CAAC;oBAClE,MAAM,MAAM,GAAG,YAAY,CAAC,EAAE,EAAE,KAAK,CAAC,CAAC;oBACvC,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC;gBAChF,CAAC;gBACD,KAAK,eAAe,CAAC,CAAC,CAAC;oBACrB,MAAM,KAAK,GAAG,kBAAkB,CAAC,KAAK,CAAC,IAAI,IAAI,EAAE,CAAsB,CAAC;oBACxE,MAAM,MAAM,GAAG,YAAY,CAAC,EAAE,EAAE,KAAK,CAAC,CAAC;oBACvC,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC;gBAChF,CAAC;gBACD;oBACE,MAAM,IAAI,KAAK,CAAC,iBAAiB,IAAI,EAAE,CAAC,CAAC;YAC7C,CAAC;QACH,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,MAAM,OAAO,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YACjE,OAAO;gBACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,UAAU,OAAO,EAAE,EAAE,CAAC;gBACtD,OAAO,EAAE,IAAI;aACd,CAAC;QACJ,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,0EAA0E;IAC1E,+DAA+D;IAC/D,0EAA0E;IAE1E,MAAM,CAAC,iBAAiB,CAAC,0BAA0B,EAAE,GAAG,EAAE,CAAC,CAAC;QAC1D,SAAS,EAAE;YACT;gBACE,GAAG,EAAE,gBAAgB;gBACrB,IAAI,EAAE,mBAAmB;gBACzB,WAAW,EAAE,sGAAsG;gBACnH,QAAQ,EAAE,kBAAkB;aAC7B;YACD;gBACE,GAAG,EAAE,iBAAiB;gBACtB,IAAI,EAAE,iBAAiB;gBACvB,WAAW,EAAE,kDAAkD;gBAC/D,QAAQ,EAAE,kBAAkB;aAC7B;SACF;KACF,CAAC,CAAC,CAAC;IAEJ,MAAM,CAAC,iBAAiB,CAAC,kCAAkC,EAAE,GAAG,EAAE,CAAC,CAAC;QAClE,iBAAiB,EAAE;YACjB;gBACE,WAAW,EAAE,wBAAwB;gBACrC,IAAI,EAAE,mBAAmB;gBACzB,WAAW,EAAE,qFAAqF;gBAClG,QAAQ,EAAE,kBAAkB;aAC7B;YACD;gBACE,WAAW,EAAE,wBAAwB;gBACrC,IAAI,EAAE,oBAAoB;gBAC1B,WAAW,EAAE,8CAA8C;gBAC3D,QAAQ,EAAE,kBAAkB;aAC7B;SACF;KACF,CAAC,CAAC,CAAC;IAEJ,MAAM,CAAC,iBAAiB,CAAC,yBAAyB,EAAE,CAAC,OAAO,EAAE,EAAE;QAC9D,MAAM,EAAE,GAAG,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC;QAE/B,IAAI,GAAG,KAAK,gBAAgB,EAAE,CAAC;YAC7B,MAAM,MAAM,GAAG,aAAa,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;YACrC,OAAO;gBACL,QAAQ,EAAE,CAAC;wBACT,GAAG;wBACH,QAAQ,EAAE,kBAAkB;wBAC5B,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;qBACtC,CAAC;aACH,CAAC;QACJ,CAAC;QAED,IAAI,GAAG,KAAK,iBAAiB,EAAE,CAAC;YAC9B,MAAM,KAAK,GAAG,IAAI,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC,WAAW,EAAE,CAAC,OAAO,CAAC,WAAW,EAAE,GAAG,CAAC,CAAC;YACjG,MAAM,IAAI,GAAG,EAAE,CAAC,OAAO,CACrB;;iEAEyD,CAC1D,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;YACb,OAAO;gBACL,QAAQ,EAAE,CAAC;wBACT,GAAG;wBACH,QAAQ,EAAE,kBAAkB;wBAC5B,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,CAAC,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC;qBAC7E,CAAC;aACH,CAAC;QACJ,CAAC;QAED,MAAM,YAAY,GAAG,CAAC,UAAU,EAAE,UAAU,EAAE,YAAY,EAAE,UAAU,CAAC,CAAC;QACxE,MAAM,UAAU,GAAG,GAAG,CAAC,KAAK,CAAC,2BAA2B,CAAC,CAAC;QAC1D,IAAI,UAAU,EAAE,CAAC;YACf,MAAM,KAAK,GAAG,UAAU,CAAC,CAAC,CAAE,CAAC;YAC7B,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;gBAClC,MAAM,IAAI,KAAK,CAAC,mBAAmB,KAAK,sBAAsB,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YAC3F,CAAC;YACD,MAAM,IAAI,GAAG,EAAE,CAAC,OAAO,CACrB;;6DAEqD,CACtD,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;YACb,OAAO;gBACL,QAAQ,EAAE,CAAC;wBACT,GAAG;wBACH,QAAQ,EAAE,kBAAkB;wBAC5B,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,CAAC,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC;qBAC7E,CAAC;aACH,CAAC;QACJ,CAAC;QAED,MAAM,WAAW,GAAG,GAAG,CAAC,KAAK,CAAC,2BAA2B,CAAC,CAAC;QAC3D,IAAI,WAAW,EAAE,CAAC;YAChB,MAAM,IAAI,GAAG,kBAAkB,CAAC,WAAW,CAAC,CAAC,CAAE,CAAC,CAAC;YACjD,MAAM,IAAI,GAAG,EAAE,CAAC,OAAO,CACrB;;6DAEqD,CACtD,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;YACZ,OAAO;gBACL,QAAQ,EAAE,CAAC;wBACT,GAAG;wBACH,QAAQ,EAAE,kBAAkB;wBAC5B,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,WAAW,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,CAAC,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC;qBACzF,CAAC;aACH,CAAC;QACJ,CAAC;QAED,MAAM,IAAI,KAAK,CAAC,yBAAyB,GAAG,EAAE,CAAC,CAAC;IAClD,CAAC,CAAC,CAAC;IAEH,0EAA0E;IAC1E,wEAAwE;IACxE,0EAA0E;IAE1E,MAAM,CAAC,iBAAiB,CAAC,wBAAwB,EAAE,GAAG,EAAE,CAAC,CAAC;QACxD,OAAO,EAAE;YACP;gBACE,IAAI,EAAE,QAAQ;gBACd,WAAW,EAAE,mDAAmD;gBAChE,SAAS,EAAE;oBACT,EAAE,IAAI,EAAE,OAAO,EAAE,WAAW,EAAE,8DAA8D,EAAE,QAAQ,EAAE,IAAI,EAAE;iBAC/G;aACF;YACD;gBACE,IAAI,EAAE,cAAc;gBACpB,WAAW,EAAE,wDAAwD;gBACrE,SAAS,EAAE;oBACT,EAAE,IAAI,EAAE,MAAM,EAAE,WAAW,EAAE,kCAAkC,EAAE,QAAQ,EAAE,IAAI,EAAE;oBACjF,EAAE,IAAI,EAAE,OAAO,EAAE,WAAW,EAAE,uDAAuD,EAAE,QAAQ,EAAE,KAAK,EAAE;iBACzG;aACF;YACD;gBACE,IAAI,EAAE,SAAS;gBACf,WAAW,EAAE,0DAA0D;gBACvE,SAAS,EAAE;oBACT,EAAE,IAAI,EAAE,SAAS,EAAE,WAAW,EAAE,+BAA+B,EAAE,QAAQ,EAAE,IAAI,EAAE;iBAClF;aACF;SACF;KACF,CAAC,CAAC,CAAC;IAEJ,MAAM,CAAC,iBAAiB,CAAC,sBAAsB,EAAE,CAAC,OAAO,EAAE,EAAE;QAC3D,MAAM,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC;QAEjD,QAAQ,IAAI,EAAE,CAAC;YACb,KAAK,QAAQ,CAAC,CAAC,CAAC;gBACd,MAAM,KAAK,GAAG,IAAI,EAAE,CAAC,OAAO,CAAC,IAAI,SAAS,CAAC;gBAC3C,OAAO;oBACL,QAAQ,EAAE;wBACR;4BACE,IAAI,EAAE,MAAe;4BACrB,OAAO,EAAE;gCACP,IAAI,EAAE,MAAe;gCACrB,IAAI,EAAE,kDAAkD,KAAK,kaAAka;6BAChe;yBACF;qBACF;iBACF,CAAC;YACJ,CAAC;YAED,KAAK,cAAc,CAAC,CAAC,CAAC;gBACpB,MAAM,IAAI,GAAG,IAAI,EAAE,CAAC,MAAM,CAAC,IAAI,cAAc,CAAC;gBAC9C,MAAM,KAAK,GAAG,IAAI,EAAE,CAAC,OAAO,CAAC,CAAC;gBAC9B,MAAM,SAAS,GAAG,KAAK,CAAC,CAAC,CAAC,uBAAuB,KAAK,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;gBAC/D,OAAO;oBACL,QAAQ,EAAE;wBACR;4BACE,IAAI,EAAE,MAAe;4BACrB,OAAO,EAAE;gCACP,IAAI,EAAE,MAAe;gCACrB,IAAI,EAAE,yCAAyC,IAAI,IAAI,SAAS,2SAA2S;6BAC5W;yBACF;qBACF;iBACF,CAAC;YACJ,CAAC;YAED,KAAK,SAAS,CAAC,CAAC,CAAC;gBACf,MAAM,OAAO,GAAG,IAAI,EAAE,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC;gBACxC,OAAO;oBACL,QAAQ,EAAE;wBACR;4BACE,IAAI,EAAE,MAAe;4BACrB,OAAO,EAAE;gCACP,IAAI,EAAE,MAAe;gCACrB,IAAI,EAAE,wDAAwD,OAAO,2PAA2P;6BACjU;yBACF;qBACF;iBACF,CAAC;YACJ,CAAC;YAED;gBACE,MAAM,IAAI,KAAK,CAAC,mBAAmB,IAAI,EAAE,CAAC,CAAC;QAC/C,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,OAAO,MAAM,CAAC;AAChB,CAAC"}
@@ -0,0 +1,29 @@
1
+ /**
2
+ * Snowball stemmer wrapper with automatic Russian/English language detection.
3
+ *
4
+ * Used at query time to improve FTS5 prefix matching:
5
+ * - "субличностях" → stem "субличн" → FTS5 "субличн"* matches "субличность"
6
+ * - "meditation" → stem "medit" → FTS5 "medit"* matches "meditating"
7
+ *
8
+ * Language detection: Cyrillic chars → Russian, otherwise → English.
9
+ */
10
+ /**
11
+ * Stem a single word using the appropriate Snowball stemmer.
12
+ * Returns the stemmed form (lowercase).
13
+ *
14
+ * If the stem is empty or longer than the original, returns the original lowercase.
15
+ */
16
+ export declare function stemWord(word: string): string;
17
+ /**
18
+ * Stem all words in a full text string for FTS5 index-time stemming.
19
+ *
20
+ * Splits on whitespace and punctuation boundaries, stems each token,
21
+ * and reassembles into a space-separated string. Non-alphanumeric tokens
22
+ * (punctuation, brackets, etc.) are dropped.
23
+ *
24
+ * Used to populate stemmed_content / stemmed_title columns so FTS5
25
+ * indexes stemmed forms — enabling exact stem matches instead of
26
+ * prefix-only matching at query time.
27
+ */
28
+ export declare function stemText(text: string): string;
29
+ //# sourceMappingURL=stemmer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stemmer.d.ts","sourceRoot":"","sources":["../src/stemmer.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AA0BH;;;;;GAKG;AACH,wBAAgB,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAW7C;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAsB7C"}
@@ -0,0 +1,68 @@
1
+ /**
2
+ * Snowball stemmer wrapper with automatic Russian/English language detection.
3
+ *
4
+ * Used at query time to improve FTS5 prefix matching:
5
+ * - "субличностях" → stem "субличн" → FTS5 "субличн"* matches "субличность"
6
+ * - "meditation" → stem "medit" → FTS5 "medit"* matches "meditating"
7
+ *
8
+ * Language detection: Cyrillic chars → Russian, otherwise → English.
9
+ */
10
+ import { createRequire } from "node:module";
11
+ const require = createRequire(import.meta.url);
12
+ const ruModule = require("snowball-stemmer.jsx/dest/russian-stemmer.common.js");
13
+ const enModule = require("snowball-stemmer.jsx/dest/english-stemmer.common.js");
14
+ const ruStemmer = new ruModule.RussianStemmer();
15
+ const enStemmer = new enModule.EnglishStemmer();
16
+ const CYRILLIC_RE = /[\u0400-\u04FF]/;
17
+ /** Detect if a word contains Cyrillic characters */
18
+ function isCyrillic(word) {
19
+ return CYRILLIC_RE.test(word);
20
+ }
21
+ /**
22
+ * Stem a single word using the appropriate Snowball stemmer.
23
+ * Returns the stemmed form (lowercase).
24
+ *
25
+ * If the stem is empty or longer than the original, returns the original lowercase.
26
+ */
27
+ export function stemWord(word) {
28
+ const lower = word.toLowerCase();
29
+ const stemmer = isCyrillic(lower) ? ruStemmer : enStemmer;
30
+ const stemmed = stemmer.stemWord(lower);
31
+ // Guard: if stemming produced nothing or made it longer, use original
32
+ if (!stemmed || stemmed.length > lower.length) {
33
+ return lower;
34
+ }
35
+ return stemmed;
36
+ }
37
+ /**
38
+ * Stem all words in a full text string for FTS5 index-time stemming.
39
+ *
40
+ * Splits on whitespace and punctuation boundaries, stems each token,
41
+ * and reassembles into a space-separated string. Non-alphanumeric tokens
42
+ * (punctuation, brackets, etc.) are dropped.
43
+ *
44
+ * Used to populate stemmed_content / stemmed_title columns so FTS5
45
+ * indexes stemmed forms — enabling exact stem matches instead of
46
+ * prefix-only matching at query time.
47
+ */
48
+ export function stemText(text) {
49
+ // Split on whitespace and common separators, keep only meaningful tokens
50
+ const tokens = text.split(/[\s\u2013\u2014\u2015—–,;:!?.…()[\]{}"'`/\\|]+/);
51
+ const result = [];
52
+ for (const token of tokens) {
53
+ if (!token)
54
+ continue;
55
+ // Strip remaining non-letter/digit chars from edges (e.g. «quotes»)
56
+ const clean = token.replace(/^[^\p{L}\p{N}]+|[^\p{L}\p{N}]+$/gu, "");
57
+ if (!clean || clean.length < 2)
58
+ continue;
59
+ // Keep numbers as-is (dates, versions, IDs)
60
+ if (/^\d+$/.test(clean)) {
61
+ result.push(clean);
62
+ continue;
63
+ }
64
+ result.push(stemWord(clean));
65
+ }
66
+ return result.join(" ");
67
+ }
68
+ //# sourceMappingURL=stemmer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stemmer.js","sourceRoot":"","sources":["../src/stemmer.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,MAAM,OAAO,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAE/C,MAAM,QAAQ,GAAG,OAAO,CAAC,qDAAqD,CAE7E,CAAC;AACF,MAAM,QAAQ,GAAG,OAAO,CAAC,qDAAqD,CAE7E,CAAC;AAMF,MAAM,SAAS,GAAG,IAAI,QAAQ,CAAC,cAAc,EAAE,CAAC;AAChD,MAAM,SAAS,GAAG,IAAI,QAAQ,CAAC,cAAc,EAAE,CAAC;AAEhD,MAAM,WAAW,GAAG,iBAAiB,CAAC;AAEtC,oDAAoD;AACpD,SAAS,UAAU,CAAC,IAAY;IAC9B,OAAO,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAChC,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,QAAQ,CAAC,IAAY;IACnC,MAAM,KAAK,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC;IACjC,MAAM,OAAO,GAAG,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC;IAC1D,MAAM,OAAO,GAAG,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;IAExC,sEAAsE;IACtE,IAAI,CAAC,OAAO,IAAI,OAAO,CAAC,MAAM,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC;QAC9C,OAAO,KAAK,CAAC;IACf,CAAC;IAED,OAAO,OAAO,CAAC;AACjB,CAAC;AAED;;;;;;;;;;GAUG;AACH,MAAM,UAAU,QAAQ,CAAC,IAAY;IACnC,yEAAyE;IACzE,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,gDAAgD,CAAC,CAAC;IAE5E,MAAM,MAAM,GAAa,EAAE,CAAC;IAC5B,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;QAC3B,IAAI,CAAC,KAAK;YAAE,SAAS;QAErB,oEAAoE;QACpE,MAAM,KAAK,GAAG,KAAK,CAAC,OAAO,CAAC,mCAAmC,EAAE,EAAE,CAAC,CAAC;QACrE,IAAI,CAAC,KAAK,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC;YAAE,SAAS;QAEzC,4CAA4C;QAC5C,IAAI,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;YACxB,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YACnB,SAAS;QACX,CAAC;QAED,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC;IAC/B,CAAC;IAED,OAAO,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAC1B,CAAC"}
@@ -0,0 +1,12 @@
1
+ /**
2
+ * Stop words for FTS5 query preprocessing.
3
+ * Removed before building MATCH expression to prevent over-restrictive AND queries.
4
+ *
5
+ * Two sets: Russian (personal KB, journal, Cyrillic) and English (technical content).
6
+ * All tokens stored lowercase — caller must .toLowerCase() before lookup.
7
+ */
8
+ /** Register additional stop words at runtime (from config.extra_stop_words) */
9
+ export declare function addExtraStopWords(words: string[]): void;
10
+ /** Check if a token (lowercase) is a stop word in either language */
11
+ export declare function isStopWord(token: string): boolean;
12
+ //# sourceMappingURL=stop-words.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stop-words.d.ts","sourceRoot":"","sources":["../src/stop-words.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAmGH,+EAA+E;AAC/E,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,IAAI,CAIvD;AAED,qEAAqE;AACrE,wBAAgB,UAAU,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAEjD"}
@@ -0,0 +1,112 @@
1
+ /**
2
+ * Stop words for FTS5 query preprocessing.
3
+ * Removed before building MATCH expression to prevent over-restrictive AND queries.
4
+ *
5
+ * Two sets: Russian (personal KB, journal, Cyrillic) and English (technical content).
6
+ * All tokens stored lowercase — caller must .toLowerCase() before lookup.
7
+ */
8
+ const RUSSIAN_STOP_WORDS = new Set([
9
+ // Pronouns
10
+ "я", "ты", "он", "она", "оно", "мы", "вы", "они",
11
+ "мне", "тебе", "ему", "ей", "нам", "вам", "им",
12
+ "меня", "тебя", "его", "её", "нас", "вас", "их",
13
+ "мой", "моя", "моё", "мои", "твой", "твоя", "твоё", "твои",
14
+ "наш", "наша", "наше", "наши", "ваш", "ваша", "ваше", "ваши",
15
+ "свой", "своя", "своё", "свои",
16
+ "этот", "эта", "это", "эти", "тот", "та", "те",
17
+ "себя", "себе", "сам", "сама", "само", "сами",
18
+ // Auxiliary verbs
19
+ "быть", "есть", "был", "была", "было", "были",
20
+ "буду", "будет", "будут", "будем", "будете",
21
+ "является", "являются",
22
+ // Prepositions
23
+ "в", "на", "с", "из", "у", "к", "о", "об", "по", "до",
24
+ "за", "под", "над", "при", "без", "для", "через", "после",
25
+ "перед", "между", "во", "со", "ко", "про",
26
+ // Conjunctions and particles
27
+ "и", "или", "но", "а", "да", "же", "ли", "бы", "вот", "уже",
28
+ "что", "как", "так", "тут", "там", "тоже", "также", "ещё",
29
+ "не", "ни", "нет", "то", "если", "когда", "чтобы", "хотя",
30
+ "них", "него", "неё", "ней", "нём", "ними",
31
+ "всего", "всех", "всему", "всем", "всеми",
32
+ "имеют", "имеет", "иметь", "имел", "имела", "имели",
33
+ // Question words (navigational — no semantic value in search)
34
+ "кто", "где", "куда", "откуда", "зачем", "почему", "чем",
35
+ "какой", "какая", "какое", "какие", "который", "которая", "которое", "которые",
36
+ "сколько", "насколько",
37
+ "каков", "какова", "каково", "каковы",
38
+ "каком", "каким", "какому", "какими", "какого",
39
+ // Navigational verbs (describe searching/finding, not content)
40
+ "хранится", "хранятся", "хранить",
41
+ "находится", "находятся", "найти",
42
+ "содержит", "содержится", "содержать",
43
+ "описан", "описана", "описано", "описаны", "описывает",
44
+ "указан", "указана", "указано",
45
+ "ведётся", "ведутся",
46
+ "насчитывает",
47
+ "упоминается", "упоминаются",
48
+ "относится", "относятся",
49
+ // Temporal/narrative verbs — describe events, not content topics
50
+ "произошло", "произошёл", "произошла", "произошли", "происходило",
51
+ "случилось", "случился", "случилась", "случились",
52
+ "делал", "делала", "делали", "делало",
53
+ "проходил", "проходила", "прошёл", "прошла", "прошли",
54
+ // Generic navigational nouns
55
+ "информация", "информации", "информацию", "информацией",
56
+ "файл", "файла", "файле", "файлу", "файлом", "файлы",
57
+ "контекст", "контексте", "контекста", "контексту", "контекстом",
58
+ // Generic adjectives/nouns describing state — navigational, not content
59
+ "текущий", "текущая", "текущее", "текущие", "текущего", "текущем",
60
+ "состояние", "состоянии", "состоянием", "состояния",
61
+ "данные", "данных", "данным", "данными",
62
+ // Temporal state words — too generic, present in many files
63
+ "сейчас", "сегодня", "вчера", "завтра",
64
+ // Action verbs describing reading/writing — not content topics
65
+ "прочитал", "прочитала", "прочитали",
66
+ "написал", "написала", "написали", "написаны", "написано",
67
+ "начал", "начала", "начали", "начало",
68
+ "вписывается", "вписываются",
69
+ "соотносятся", "соотносится",
70
+ // Quantifier words — navigational
71
+ "всего", "около", "примерно", "более", "менее",
72
+ "конкретно", "конкретные", "конкретных", "конкретный",
73
+ // "серия"/"серии" kept as content words — needed for habit streak queries (KU-002, KU-005)
74
+ // Generic time nouns — too common to be discriminative
75
+ "год", "года", "году", "годом", "годов", "годы",
76
+ "лет", "лето", "лета",
77
+ "время", "времени", "временем",
78
+ ]);
79
+ const ENGLISH_STOP_WORDS = new Set([
80
+ // Articles
81
+ "a", "an", "the",
82
+ // Auxiliary verbs
83
+ "is", "are", "was", "were", "be", "been", "being",
84
+ "have", "has", "had", "do", "does", "did",
85
+ "will", "would", "can", "could", "shall", "should", "may", "might", "must",
86
+ // Pronouns
87
+ "i", "me", "my", "we", "our", "you", "your", "he", "she", "it", "they",
88
+ "him", "his", "her", "its", "us", "their", "them",
89
+ "this", "that", "these", "those",
90
+ // Prepositions
91
+ "in", "on", "at", "to", "from", "of", "for", "with", "by",
92
+ "about", "into", "through", "during", "before", "after",
93
+ "above", "below", "between", "under", "over",
94
+ // Conjunctions and particles
95
+ "and", "or", "but", "not", "no", "so", "if", "as", "than",
96
+ "also", "already", "still", "just", "very", "more", "most",
97
+ // Question words (navigational)
98
+ "what", "who", "which", "where", "when", "why", "how", "whose",
99
+ ]);
100
+ /** Extra stop words loaded from config (e.g. owner name forms) */
101
+ const extraStopWords = new Set();
102
+ /** Register additional stop words at runtime (from config.extra_stop_words) */
103
+ export function addExtraStopWords(words) {
104
+ for (const w of words) {
105
+ extraStopWords.add(w.toLowerCase());
106
+ }
107
+ }
108
+ /** Check if a token (lowercase) is a stop word in either language */
109
+ export function isStopWord(token) {
110
+ return RUSSIAN_STOP_WORDS.has(token) || ENGLISH_STOP_WORDS.has(token) || extraStopWords.has(token);
111
+ }
112
+ //# sourceMappingURL=stop-words.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stop-words.js","sourceRoot":"","sources":["../src/stop-words.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ /**
2
+ * memory_add — insert a new memory into the unified memories table.
3
+ *
4
+ * Auto-detects if the same source_file was previously imported and supersedes
5
+ * the existing entry when content differs significantly.
6
+ */
7
+ import type Database from "better-sqlite3";
8
+ import type { MemoryAddInput, MemoryAddOutput } from "../types.js";
9
+ /**
10
+ * Insert a memory record.
11
+ * If source_file is provided and a non-superseded record with the same
12
+ * source_file exists, the old record is superseded by the new one.
13
+ */
14
+ export declare function memoryAdd(db: Database.Database, input: MemoryAddInput): MemoryAddOutput;
15
+ //# sourceMappingURL=memory-add.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"memory-add.d.ts","sourceRoot":"","sources":["../../src/tools/memory-add.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,QAAQ,MAAM,gBAAgB,CAAC;AAC3C,OAAO,KAAK,EAAS,cAAc,EAAE,eAAe,EAAa,MAAM,aAAa,CAAC;AAWrF;;;;GAIG;AACH,wBAAgB,SAAS,CACvB,EAAE,EAAE,QAAQ,CAAC,QAAQ,EACrB,KAAK,EAAE,cAAc,GACpB,eAAe,CAoFjB"}
@@ -0,0 +1,120 @@
1
+ /**
2
+ * memory_add — insert a new memory into the unified memories table.
3
+ *
4
+ * Auto-detects if the same source_file was previously imported and supersedes
5
+ * the existing entry when content differs significantly.
6
+ */
7
+ import { generateId, insertMemory } from "./utils.js";
8
+ import { stemWord } from "../stemmer.js";
9
+ import { isStopWord } from "../stop-words.js";
10
+ function computeExpiresAt(ttlDays) {
11
+ const d = new Date();
12
+ d.setDate(d.getDate() + ttlDays);
13
+ return d.toISOString().replace(/\.\d{3}Z$/, "Z");
14
+ }
15
+ /**
16
+ * Insert a memory record.
17
+ * If source_file is provided and a non-superseded record with the same
18
+ * source_file exists, the old record is superseded by the new one.
19
+ */
20
+ export function memoryAdd(db, input) {
21
+ const id = generateId();
22
+ const expires_at = input.ttl_days !== undefined ? computeExpiresAt(input.ttl_days) : null;
23
+ const metaJson = input.meta !== undefined ? JSON.stringify(input.meta) : "{}";
24
+ // Find existing active records for the same source_file (if provided)
25
+ const supersededIds = [];
26
+ if (input.source_file) {
27
+ const stmt = db.prepare(`SELECT id FROM memories
28
+ WHERE source_file = ?
29
+ AND superseded_by IS NULL`);
30
+ const existing = stmt.all(input.source_file);
31
+ supersededIds.push(...existing.map((r) => r.id));
32
+ }
33
+ const actor = input.source ?? "api";
34
+ // Run insert + supersede chain in a single transaction
35
+ const run = db.transaction(() => {
36
+ insertMemory(db, {
37
+ id,
38
+ layer: input.layer,
39
+ content: input.content,
40
+ title: input.title ?? null,
41
+ source: actor,
42
+ source_file: input.source_file ?? null,
43
+ session_id: input.session_id ?? null,
44
+ event_at: input.event_at ?? null,
45
+ expires_at,
46
+ confidence: input.confidence ?? 0.8,
47
+ importance: input.importance ?? 0.5,
48
+ supersedes: supersededIds.length > 0 ? (supersededIds[supersededIds.length - 1] ?? null) : null,
49
+ entity_type: input.entity_type ?? null,
50
+ entity_name: input.entity_name ?? null,
51
+ scope: input.scope ?? "global",
52
+ meta: metaJson,
53
+ valid_from: input.valid_from ?? null,
54
+ valid_until: input.valid_until ?? null,
55
+ });
56
+ db.prepare(`INSERT INTO event_log (memory_id, event_type, actor, old_content, new_content)
57
+ VALUES (?, ?, ?, ?, ?)`).run(id, "created", actor, null, input.content);
58
+ for (const oldId of supersededIds) {
59
+ db.prepare(`UPDATE memories SET superseded_by = ? WHERE id = ?`).run(id, oldId);
60
+ db.prepare(`INSERT INTO event_log (memory_id, event_type, actor, old_content, new_content)
61
+ VALUES (?, ?, ?, ?, ?)`).run(oldId, "superseded", actor, null, null);
62
+ }
63
+ });
64
+ run();
65
+ const result = {
66
+ id,
67
+ layer: input.layer,
68
+ created: true,
69
+ };
70
+ if (supersededIds.length > 0) {
71
+ result.superseded_ids = supersededIds;
72
+ }
73
+ // Contradiction detection: find existing memories for the same entity with similar content
74
+ if (input.entity_name) {
75
+ const conflicts = findPotentialConflicts(db, input.entity_name, input.content, id);
76
+ if (conflicts.length > 0) {
77
+ result.potential_conflicts = conflicts;
78
+ }
79
+ }
80
+ return result;
81
+ }
82
+ /**
83
+ * Find existing active memories for the same entity that share content tokens.
84
+ * Uses FTS search with OR-mode on key tokens from the new content, filtered by entity_name.
85
+ * Returns potential conflicts (topically similar memories) — non-blocking, advisory only.
86
+ */
87
+ function findPotentialConflicts(db, entityName, newContent, excludeId) {
88
+ const tokens = newContent
89
+ .split(/[\s\u2013\u2014\u2015—–]+/)
90
+ .map(t => t.replace(/[.,;:!?"'()]/g, "").toLowerCase())
91
+ .filter(t => t.length >= 3 && !isStopWord(t))
92
+ .slice(0, 5);
93
+ if (tokens.length === 0)
94
+ return [];
95
+ const ftsTokens = tokens
96
+ .map(t => {
97
+ const stemmed = stemWord(t);
98
+ return stemmed.length >= 3 ? `"${stemmed}"*` : `"${t}"`;
99
+ })
100
+ .join(" OR ");
101
+ try {
102
+ const rows = db.prepare(`SELECT m.id, m.content
103
+ FROM memories_fts fts
104
+ JOIN memories m ON fts.id = m.id
105
+ WHERE memories_fts MATCH ?
106
+ AND m.entity_name = ?
107
+ AND m.superseded_by IS NULL
108
+ LIMIT 3`).all(ftsTokens, entityName);
109
+ return rows
110
+ .filter(r => r.id !== excludeId)
111
+ .map(r => ({
112
+ id: r.id,
113
+ snippet: r.content.length > 150 ? r.content.slice(0, 150) + "…" : r.content,
114
+ }));
115
+ }
116
+ catch {
117
+ return [];
118
+ }
119
+ }
120
+ //# sourceMappingURL=memory-add.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"memory-add.js","sourceRoot":"","sources":["../../src/tools/memory-add.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AACtD,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACzC,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAE9C,SAAS,gBAAgB,CAAC,OAAe;IACvC,MAAM,CAAC,GAAG,IAAI,IAAI,EAAE,CAAC;IACrB,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,EAAE,GAAG,OAAO,CAAC,CAAC;IACjC,OAAO,CAAC,CAAC,WAAW,EAAE,CAAC,OAAO,CAAC,WAAW,EAAE,GAAG,CAAC,CAAC;AACnD,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,SAAS,CACvB,EAAqB,EACrB,KAAqB;IAErB,MAAM,EAAE,GAAG,UAAU,EAAE,CAAC;IAExB,MAAM,UAAU,GACd,KAAK,CAAC,QAAQ,KAAK,SAAS,CAAC,CAAC,CAAC,gBAAgB,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IAEzE,MAAM,QAAQ,GAAG,KAAK,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IAE9E,sEAAsE;IACtE,MAAM,aAAa,GAAa,EAAE,CAAC;IAEnC,IAAI,KAAK,CAAC,WAAW,EAAE,CAAC;QACtB,MAAM,IAAI,GAAG,EAAE,CAAC,OAAO,CACrB;;mCAE6B,CAC9B,CAAC;QACF,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;QAC7C,aAAa,CAAC,IAAI,CAAC,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IACnD,CAAC;IAED,MAAM,KAAK,GAAG,KAAK,CAAC,MAAM,IAAI,KAAK,CAAC;IAEpC,uDAAuD;IACvD,MAAM,GAAG,GAAG,EAAE,CAAC,WAAW,CAAC,GAAG,EAAE;QAC9B,YAAY,CAAC,EAAE,EAAE;YACf,EAAE;YACF,KAAK,EAAE,KAAK,CAAC,KAAK;YAClB,OAAO,EAAE,KAAK,CAAC,OAAO;YACtB,KAAK,EAAE,KAAK,CAAC,KAAK,IAAI,IAAI;YAC1B,MAAM,EAAE,KAAK;YACb,WAAW,EAAE,KAAK,CAAC,WAAW,IAAI,IAAI;YACtC,UAAU,EAAE,KAAK,CAAC,UAAU,IAAI,IAAI;YACpC,QAAQ,EAAE,KAAK,CAAC,QAAQ,IAAI,IAAI;YAChC,UAAU;YACV,UAAU,EAAE,KAAK,CAAC,UAAU,IAAI,GAAG;YACnC,UAAU,EAAE,KAAK,CAAC,UAAU,IAAI,GAAG;YACnC,UAAU,EAAE,aAAa,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC,aAAa,CAAC,MAAM,GAAG,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI;YAC/F,WAAW,EAAE,KAAK,CAAC,WAAW,IAAI,IAAI;YACtC,WAAW,EAAE,KAAK,CAAC,WAAW,IAAI,IAAI;YACtC,KAAK,EAAE,KAAK,CAAC,KAAK,IAAI,QAAQ;YAC9B,IAAI,EAAE,QAAQ;YACd,UAAU,EAAE,KAAK,CAAC,UAAU,IAAI,IAAI;YACpC,WAAW,EAAE,KAAK,CAAC,WAAW,IAAI,IAAI;SACvC,CAAC,CAAC;QAEH,EAAE,CAAC,OAAO,CACR;8BACwB,CACzB,CAAC,GAAG,CAAC,EAAE,EAAE,SAAS,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC;QAEjD,KAAK,MAAM,KAAK,IAAI,aAAa,EAAE,CAAC;YAClC,EAAE,CAAC,OAAO,CACR,oDAAoD,CACrD,CAAC,GAAG,CAAC,EAAE,EAAE,KAAK,CAAC,CAAC;YAEjB,EAAE,CAAC,OAAO,CACR;gCACwB,CACzB,CAAC,GAAG,CAAC,KAAK,EAAE,YAAY,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;QAChD,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,GAAG,EAAE,CAAC;IAEN,MAAM,MAAM,GAAoB;QAC9B,EAAE;QACF,KAAK,EAAE,KAAK,CAAC,KAAc;QAC3B,OAAO,EAAE,IAAI;KACd,CAAC;IAEF,IAAI,aAAa,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC7B,MAAM,CAAC,cAAc,GAAG,aAAa,CAAC;IACxC,CAAC;IAED,2FAA2F;IAC3F,IAAI,KAAK,CAAC,WAAW,EAAE,CAAC;QACtB,MAAM,SAAS,GAAG,sBAAsB,CAAC,EAAE,EAAE,KAAK,CAAC,WAAW,EAAE,KAAK,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;QACnF,IAAI,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACzB,MAAM,CAAC,mBAAmB,GAAG,SAAS,CAAC;QACzC,CAAC;IACH,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC;AAED;;;;GAIG;AACH,SAAS,sBAAsB,CAC7B,EAAqB,EACrB,UAAkB,EAClB,UAAkB,EAClB,SAAiB;IAEjB,MAAM,MAAM,GAAG,UAAU;SACtB,KAAK,CAAC,2BAA2B,CAAC;SAClC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,eAAe,EAAE,EAAE,CAAC,CAAC,WAAW,EAAE,CAAC;SACtD,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;SAC5C,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IAEf,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,CAAC;IAEnC,MAAM,SAAS,GAAG,MAAM;SACrB,GAAG,CAAC,CAAC,CAAC,EAAE;QACP,MAAM,OAAO,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC;QAC5B,OAAO,OAAO,CAAC,MAAM,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,OAAO,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC;IAC1D,CAAC,CAAC;SACD,IAAI,CAAC,MAAM,CAAC,CAAC;IAEhB,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,EAAE,CAAC,OAAO,CACrB;;;;;;eAMS,CACV,CAAC,GAAG,CAAC,SAAS,EAAE,UAAU,CAAC,CAAC;QAE7B,OAAO,IAAI;aACR,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,SAAS,CAAC;aAC/B,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;YACT,EAAE,EAAE,CAAC,CAAC,EAAE;YACR,OAAO,EAAE,CAAC,CAAC,OAAO,CAAC,MAAM,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO;SAC5E,CAAC,CAAC,CAAC;IACR,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAC;IACZ,CAAC;AACH,CAAC"}
@@ -0,0 +1,10 @@
1
+ /**
2
+ * memory_delete — permanently remove a memory and clean up superseding chain references.
3
+ *
4
+ * If the deleted memory superseded another, the predecessor becomes active again.
5
+ * If the deleted memory was superseded by another, the successor's chain is updated.
6
+ */
7
+ import type Database from "better-sqlite3";
8
+ import type { MemoryDeleteInput, MemoryDeleteOutput } from "../types.js";
9
+ export declare function memoryDelete(db: Database.Database, input: MemoryDeleteInput): MemoryDeleteOutput;
10
+ //# sourceMappingURL=memory-delete.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"memory-delete.d.ts","sourceRoot":"","sources":["../../src/tools/memory-delete.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,QAAQ,MAAM,gBAAgB,CAAC;AAC3C,OAAO,KAAK,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AAUzE,wBAAgB,YAAY,CAC1B,EAAE,EAAE,QAAQ,CAAC,QAAQ,EACrB,KAAK,EAAE,iBAAiB,GACvB,kBAAkB,CAiDpB"}
@@ -0,0 +1,39 @@
1
+ /**
2
+ * memory_delete — permanently remove a memory and clean up superseding chain references.
3
+ *
4
+ * If the deleted memory superseded another, the predecessor becomes active again.
5
+ * If the deleted memory was superseded by another, the successor's chain is updated.
6
+ */
7
+ export function memoryDelete(db, input) {
8
+ const existing = db
9
+ .prepare(`SELECT id, content, source, supersedes, superseded_by
10
+ FROM memories WHERE id = ?`)
11
+ .get(input.id);
12
+ if (!existing) {
13
+ throw new Error(`Memory not found: ${input.id}`);
14
+ }
15
+ const run = db.transaction(() => {
16
+ // If this memory has both a predecessor and a successor (middle of chain A→B→C),
17
+ // link them together: C.supersedes = A, A.superseded_by = C
18
+ if (existing.supersedes && existing.superseded_by) {
19
+ db.prepare(`UPDATE memories SET superseded_by = ? WHERE id = ?`).run(existing.superseded_by, existing.supersedes);
20
+ db.prepare(`UPDATE memories SET supersedes = ? WHERE id = ?`).run(existing.supersedes, existing.superseded_by);
21
+ }
22
+ // If this memory only has a predecessor (tail of chain), re-activate it
23
+ else if (existing.supersedes) {
24
+ db.prepare(`UPDATE memories SET superseded_by = NULL WHERE id = ?`).run(existing.supersedes);
25
+ }
26
+ // If this memory only has a successor, clear the successor's supersedes link
27
+ else if (existing.superseded_by) {
28
+ db.prepare(`UPDATE memories SET supersedes = NULL WHERE id = ?`).run(existing.superseded_by);
29
+ }
30
+ // Log deletion in event_log
31
+ db.prepare(`INSERT INTO event_log (memory_id, event_type, actor, old_content)
32
+ VALUES (?, 'deleted', ?, ?)`).run(input.id, existing.source, existing.content);
33
+ // Delete the memory (FTS5 DELETE trigger handles index cleanup)
34
+ db.prepare(`DELETE FROM memories WHERE id = ?`).run(input.id);
35
+ });
36
+ run();
37
+ return { deleted_id: input.id };
38
+ }
39
+ //# sourceMappingURL=memory-delete.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"memory-delete.js","sourceRoot":"","sources":["../../src/tools/memory-delete.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAaH,MAAM,UAAU,YAAY,CAC1B,EAAqB,EACrB,KAAwB;IAExB,MAAM,QAAQ,GAAG,EAAE;SAChB,OAAO,CACN;kCAC4B,CAC7B;SACA,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;IAEjB,IAAI,CAAC,QAAQ,EAAE,CAAC;QACd,MAAM,IAAI,KAAK,CAAC,qBAAqB,KAAK,CAAC,EAAE,EAAE,CAAC,CAAC;IACnD,CAAC;IAED,MAAM,GAAG,GAAG,EAAE,CAAC,WAAW,CAAC,GAAG,EAAE;QAC9B,iFAAiF;QACjF,4DAA4D;QAC5D,IAAI,QAAQ,CAAC,UAAU,IAAI,QAAQ,CAAC,aAAa,EAAE,CAAC;YAClD,EAAE,CAAC,OAAO,CACR,oDAAoD,CACrD,CAAC,GAAG,CAAC,QAAQ,CAAC,aAAa,EAAE,QAAQ,CAAC,UAAU,CAAC,CAAC;YACnD,EAAE,CAAC,OAAO,CACR,iDAAiD,CAClD,CAAC,GAAG,CAAC,QAAQ,CAAC,UAAU,EAAE,QAAQ,CAAC,aAAa,CAAC,CAAC;QACrD,CAAC;QACD,wEAAwE;aACnE,IAAI,QAAQ,CAAC,UAAU,EAAE,CAAC;YAC7B,EAAE,CAAC,OAAO,CACR,uDAAuD,CACxD,CAAC,GAAG,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC;QAC7B,CAAC;QACD,6EAA6E;aACxE,IAAI,QAAQ,CAAC,aAAa,EAAE,CAAC;YAChC,EAAE,CAAC,OAAO,CACR,oDAAoD,CACrD,CAAC,GAAG,CAAC,QAAQ,CAAC,aAAa,CAAC,CAAC;QAChC,CAAC;QAED,4BAA4B;QAC5B,EAAE,CAAC,OAAO,CACR;mCAC6B,CAC9B,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,EAAE,QAAQ,CAAC,MAAM,EAAE,QAAQ,CAAC,OAAO,CAAC,CAAC;QAEnD,gEAAgE;QAChE,EAAE,CAAC,OAAO,CAAC,mCAAmC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;IAChE,CAAC,CAAC,CAAC;IAEH,GAAG,EAAE,CAAC;IAEN,OAAO,EAAE,UAAU,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC;AAClC,CAAC"}
@@ -0,0 +1,10 @@
1
+ /**
2
+ * memory_export — export memories to JSON or Markdown format.
3
+ *
4
+ * Supports filtering by layer, scope, date range.
5
+ * Returns the exported content as a string (JSON or Markdown).
6
+ */
7
+ import type Database from "better-sqlite3";
8
+ import type { MemoryExportInput, MemoryExportOutput } from "../types.js";
9
+ export declare function memoryExport(db: Database.Database, input: MemoryExportInput): MemoryExportOutput;
10
+ //# sourceMappingURL=memory-export.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"memory-export.d.ts","sourceRoot":"","sources":["../../src/tools/memory-export.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,QAAQ,MAAM,gBAAgB,CAAC;AAC3C,OAAO,KAAK,EAAE,iBAAiB,EAAE,kBAAkB,EAAa,MAAM,aAAa,CAAC;AAYpF,wBAAgB,YAAY,CAC1B,EAAE,EAAE,QAAQ,CAAC,QAAQ,EACrB,KAAK,EAAE,iBAAiB,GACvB,kBAAkB,CAoEpB"}
@@ -0,0 +1,102 @@
1
+ /**
2
+ * memory_export — export memories to JSON or Markdown format.
3
+ *
4
+ * Supports filtering by layer, scope, date range.
5
+ * Returns the exported content as a string (JSON or Markdown).
6
+ */
7
+ const DEFAULT_EXPORT_LIMIT = 1000;
8
+ const MAX_EXPORT_LIMIT = 10000;
9
+ export function memoryExport(db, input) {
10
+ const conditions = [];
11
+ const params = [];
12
+ if (!input.include_superseded) {
13
+ conditions.push("superseded_by IS NULL");
14
+ }
15
+ if (input.layers && input.layers.length > 0) {
16
+ const placeholders = input.layers.map(() => "?").join(", ");
17
+ conditions.push(`layer IN (${placeholders})`);
18
+ params.push(...input.layers);
19
+ }
20
+ if (input.scope) {
21
+ conditions.push("scope = ?");
22
+ params.push(input.scope);
23
+ }
24
+ if (input.date_from) {
25
+ conditions.push("COALESCE(event_at, created_at) >= ?");
26
+ params.push(input.date_from);
27
+ }
28
+ if (input.date_to) {
29
+ conditions.push("COALESCE(event_at, created_at) <= ?");
30
+ params.push(input.date_to);
31
+ }
32
+ const where = conditions.length > 0 ? `WHERE ${conditions.join(" AND ")}` : "";
33
+ const limit = Math.min(input.limit ?? DEFAULT_EXPORT_LIMIT, MAX_EXPORT_LIMIT);
34
+ params.push(limit);
35
+ const rows = db
36
+ .prepare(`SELECT id, layer, title, content, entity_type, entity_name,
37
+ confidence, importance, scope, created_at, event_at,
38
+ source, source_file, superseded_by
39
+ FROM memories
40
+ ${where}
41
+ ORDER BY layer, created_at DESC
42
+ LIMIT ?`)
43
+ .all(...params);
44
+ let content;
45
+ switch (input.format) {
46
+ case "json":
47
+ content = JSON.stringify(rows, null, 2);
48
+ break;
49
+ case "markdown":
50
+ content = formatMarkdown(rows);
51
+ break;
52
+ case "claude-md":
53
+ content = formatClaudeMd(rows);
54
+ break;
55
+ default: {
56
+ const _exhaustive = input.format;
57
+ throw new Error(`Unsupported export format: ${_exhaustive}`);
58
+ }
59
+ }
60
+ return {
61
+ format: input.format,
62
+ count: rows.length,
63
+ content,
64
+ };
65
+ }
66
+ function formatMarkdown(rows) {
67
+ const lines = [`# Memory Export`, ``, `Total: ${rows.length} memories`, ``];
68
+ // Group by layer
69
+ const byLayer = new Map();
70
+ for (const row of rows) {
71
+ const existing = byLayer.get(row.layer) ?? [];
72
+ existing.push(row);
73
+ byLayer.set(row.layer, existing);
74
+ }
75
+ for (const [layer, memories] of byLayer) {
76
+ lines.push(`## ${layer} (${memories.length})`, ``);
77
+ for (const m of memories) {
78
+ const title = m.title ?? "(untitled)";
79
+ const entity = m.entity_name ? ` [${m.entity_name}]` : "";
80
+ lines.push(`### ${title}${entity}`, ``);
81
+ if (m.event_at)
82
+ lines.push(`- **Date:** ${m.event_at}`);
83
+ lines.push(`- **Confidence:** ${m.confidence} | **Importance:** ${m.importance}`);
84
+ if (m.entity_type)
85
+ lines.push(`- **Entity:** ${m.entity_type}`);
86
+ lines.push(``);
87
+ lines.push(m.content, ``);
88
+ }
89
+ }
90
+ return lines.join("\n");
91
+ }
92
+ function formatClaudeMd(rows) {
93
+ // Compact format optimized for LLM context injection
94
+ const lines = [];
95
+ for (const m of rows) {
96
+ const title = m.title ?? "(untitled)";
97
+ const meta = [m.layer, m.entity_name, m.event_at].filter(Boolean).join(" | ");
98
+ lines.push(`## ${title}`, `<!-- ${meta} -->`, ``, m.content, ``);
99
+ }
100
+ return lines.join("\n");
101
+ }
102
+ //# sourceMappingURL=memory-export.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"memory-export.js","sourceRoot":"","sources":["../../src/tools/memory-export.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ /**
2
+ * memory_health — diagnostic report on memory store quality.
3
+ *
4
+ * Returns health metrics: expired entries, orphaned chains, stale memories,
5
+ * low-confidence entries, and storage stats per layer.
6
+ * Optional cleanup=true garbage-collects expired entries.
7
+ */
8
+ import type Database from "better-sqlite3";
9
+ import type { MemoryHealthInput, MemoryHealthOutput } from "../types.js";
10
+ export declare function memoryHealth(db: Database.Database, input: MemoryHealthInput): MemoryHealthOutput;
11
+ //# sourceMappingURL=memory-health.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"memory-health.d.ts","sourceRoot":"","sources":["../../src/tools/memory-health.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,QAAQ,MAAM,gBAAgB,CAAC;AAC3C,OAAO,KAAK,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AAsBzE,wBAAgB,YAAY,CAC1B,EAAE,EAAE,QAAQ,CAAC,QAAQ,EACrB,KAAK,EAAE,iBAAiB,GACvB,kBAAkB,CA0FpB"}