@fgv/ts-agent-memory 5.1.0-36

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 (331) hide show
  1. package/.rush/temp/chunked-rush-logs/ts-agent-memory.build.chunks.jsonl +9 -0
  2. package/.rush/temp/f6a88bfdd66517ccb98c2c7ae1be6e6fe9e15d38.tar.log +282 -0
  3. package/.rush/temp/operation/build/all.log +9 -0
  4. package/.rush/temp/operation/build/log-chunks.jsonl +9 -0
  5. package/.rush/temp/operation/build/state.json +3 -0
  6. package/.rush/temp/shrinkwrap-deps.json +688 -0
  7. package/LICENSE +21 -0
  8. package/README.md +45 -0
  9. package/config/api-extractor.json +343 -0
  10. package/config/jest.config.json +14 -0
  11. package/config/rig.json +4 -0
  12. package/dist/index.js +12 -0
  13. package/dist/index.js.map +1 -0
  14. package/dist/packlets/converters/bodyConverterRegistry.js +51 -0
  15. package/dist/packlets/converters/bodyConverterRegistry.js.map +1 -0
  16. package/dist/packlets/converters/envelopeConverter.js +159 -0
  17. package/dist/packlets/converters/envelopeConverter.js.map +1 -0
  18. package/dist/packlets/converters/index.js +7 -0
  19. package/dist/packlets/converters/index.js.map +1 -0
  20. package/dist/packlets/index/index.js +6 -0
  21. package/dist/packlets/index/index.js.map +1 -0
  22. package/dist/packlets/index/memoryIndex.js +170 -0
  23. package/dist/packlets/index/memoryIndex.js.map +1 -0
  24. package/dist/packlets/observe/index.js +7 -0
  25. package/dist/packlets/observe/index.js.map +1 -0
  26. package/dist/packlets/observe/memoryObservationStore.js +119 -0
  27. package/dist/packlets/observe/memoryObservationStore.js.map +1 -0
  28. package/dist/packlets/observe/observer.js +6 -0
  29. package/dist/packlets/observe/observer.js.map +1 -0
  30. package/dist/packlets/retrieve/hybridRetriever.js +135 -0
  31. package/dist/packlets/retrieve/hybridRetriever.js.map +1 -0
  32. package/dist/packlets/retrieve/index.js +12 -0
  33. package/dist/packlets/retrieve/index.js.map +1 -0
  34. package/dist/packlets/retrieve/linkTraversalRetriever.js +143 -0
  35. package/dist/packlets/retrieve/linkTraversalRetriever.js.map +1 -0
  36. package/dist/packlets/retrieve/recencyRetriever.js +33 -0
  37. package/dist/packlets/retrieve/recencyRetriever.js.map +1 -0
  38. package/dist/packlets/retrieve/retriever.js +110 -0
  39. package/dist/packlets/retrieve/retriever.js.map +1 -0
  40. package/dist/packlets/retrieve/semanticRetriever.js +86 -0
  41. package/dist/packlets/retrieve/semanticRetriever.js.map +1 -0
  42. package/dist/packlets/retrieve/structuredFilterRetriever.js +37 -0
  43. package/dist/packlets/retrieve/structuredFilterRetriever.js.map +1 -0
  44. package/dist/packlets/retrieve/tagRetriever.js +37 -0
  45. package/dist/packlets/retrieve/tagRetriever.js.map +1 -0
  46. package/dist/packlets/store/fileTreeMemoryStore.js +698 -0
  47. package/dist/packlets/store/fileTreeMemoryStore.js.map +1 -0
  48. package/dist/packlets/store/index.js +7 -0
  49. package/dist/packlets/store/index.js.map +1 -0
  50. package/dist/packlets/store/scopeEncoding.js +31 -0
  51. package/dist/packlets/store/scopeEncoding.js.map +1 -0
  52. package/dist/packlets/types/envelope.js +6 -0
  53. package/dist/packlets/types/envelope.js.map +1 -0
  54. package/dist/packlets/types/filenameSafety.js +52 -0
  55. package/dist/packlets/types/filenameSafety.js.map +1 -0
  56. package/dist/packlets/types/identityCodec.js +184 -0
  57. package/dist/packlets/types/identityCodec.js.map +1 -0
  58. package/dist/packlets/types/ids.js +67 -0
  59. package/dist/packlets/types/ids.js.map +1 -0
  60. package/dist/packlets/types/index.js +10 -0
  61. package/dist/packlets/types/index.js.map +1 -0
  62. package/dist/packlets/types/writePolicy.js +263 -0
  63. package/dist/packlets/types/writePolicy.js.map +1 -0
  64. package/dist/packlets/vector/inMemoryCosineIndex.js +150 -0
  65. package/dist/packlets/vector/inMemoryCosineIndex.js.map +1 -0
  66. package/dist/packlets/vector/index.js +7 -0
  67. package/dist/packlets/vector/index.js.map +1 -0
  68. package/dist/packlets/vector/vectorIndex.js +6 -0
  69. package/dist/packlets/vector/vectorIndex.js.map +1 -0
  70. package/dist/test/unit/converters/bodyConverterRegistry.test.js +72 -0
  71. package/dist/test/unit/converters/bodyConverterRegistry.test.js.map +1 -0
  72. package/dist/test/unit/converters/envelopeConverter.test.js +196 -0
  73. package/dist/test/unit/converters/envelopeConverter.test.js.map +1 -0
  74. package/dist/test/unit/index/memoryIndex.test.js +152 -0
  75. package/dist/test/unit/index/memoryIndex.test.js.map +1 -0
  76. package/dist/test/unit/observe/memoryObservationStore.test.js +118 -0
  77. package/dist/test/unit/observe/memoryObservationStore.test.js.map +1 -0
  78. package/dist/test/unit/retrieve/linkTraversalRetriever.test.js +182 -0
  79. package/dist/test/unit/retrieve/linkTraversalRetriever.test.js.map +1 -0
  80. package/dist/test/unit/retrieve/retrievers.test.js +506 -0
  81. package/dist/test/unit/retrieve/retrievers.test.js.map +1 -0
  82. package/dist/test/unit/store/embedOnWrite.test.js +260 -0
  83. package/dist/test/unit/store/embedOnWrite.test.js.map +1 -0
  84. package/dist/test/unit/store/fileTreeMemoryStore.test.js +647 -0
  85. package/dist/test/unit/store/fileTreeMemoryStore.test.js.map +1 -0
  86. package/dist/test/unit/store/observations.test.js +239 -0
  87. package/dist/test/unit/store/observations.test.js.map +1 -0
  88. package/dist/test/unit/store/scopeEncoding.test.js +24 -0
  89. package/dist/test/unit/store/scopeEncoding.test.js.map +1 -0
  90. package/dist/test/unit/types/identityCodec.test.js +187 -0
  91. package/dist/test/unit/types/identityCodec.test.js.map +1 -0
  92. package/dist/test/unit/types/ids.test.js +84 -0
  93. package/dist/test/unit/types/ids.test.js.map +1 -0
  94. package/dist/test/unit/types/writePolicy.test.js +241 -0
  95. package/dist/test/unit/types/writePolicy.test.js.map +1 -0
  96. package/dist/test/unit/vector/inMemoryCosineIndex.test.js +192 -0
  97. package/dist/test/unit/vector/inMemoryCosineIndex.test.js.map +1 -0
  98. package/dist/test/unit/vector/vectorIndex.test.js +42 -0
  99. package/dist/test/unit/vector/vectorIndex.test.js.map +1 -0
  100. package/dist/ts-agent-memory.d.ts +1901 -0
  101. package/dist/tsdoc-metadata.json +11 -0
  102. package/eslint.config.js +15 -0
  103. package/etc/ts-agent-memory.api.md +525 -0
  104. package/lib/index.d.ts +8 -0
  105. package/lib/index.d.ts.map +1 -0
  106. package/lib/index.js +28 -0
  107. package/lib/index.js.map +1 -0
  108. package/lib/packlets/converters/bodyConverterRegistry.d.ts +64 -0
  109. package/lib/packlets/converters/bodyConverterRegistry.d.ts.map +1 -0
  110. package/lib/packlets/converters/bodyConverterRegistry.js +55 -0
  111. package/lib/packlets/converters/bodyConverterRegistry.js.map +1 -0
  112. package/lib/packlets/converters/envelopeConverter.d.ts +70 -0
  113. package/lib/packlets/converters/envelopeConverter.d.ts.map +1 -0
  114. package/lib/packlets/converters/envelopeConverter.js +166 -0
  115. package/lib/packlets/converters/envelopeConverter.js.map +1 -0
  116. package/lib/packlets/converters/index.d.ts +3 -0
  117. package/lib/packlets/converters/index.d.ts.map +1 -0
  118. package/lib/packlets/converters/index.js +23 -0
  119. package/lib/packlets/converters/index.js.map +1 -0
  120. package/lib/packlets/index/index.d.ts +2 -0
  121. package/lib/packlets/index/index.d.ts.map +1 -0
  122. package/lib/packlets/index/index.js +22 -0
  123. package/lib/packlets/index/index.js.map +1 -0
  124. package/lib/packlets/index/memoryIndex.d.ts +127 -0
  125. package/lib/packlets/index/memoryIndex.d.ts.map +1 -0
  126. package/lib/packlets/index/memoryIndex.js +174 -0
  127. package/lib/packlets/index/memoryIndex.js.map +1 -0
  128. package/lib/packlets/observe/index.d.ts +3 -0
  129. package/lib/packlets/observe/index.d.ts.map +1 -0
  130. package/lib/packlets/observe/index.js +23 -0
  131. package/lib/packlets/observe/index.js.map +1 -0
  132. package/lib/packlets/observe/memoryObservationStore.d.ts +91 -0
  133. package/lib/packlets/observe/memoryObservationStore.d.ts.map +1 -0
  134. package/lib/packlets/observe/memoryObservationStore.js +123 -0
  135. package/lib/packlets/observe/memoryObservationStore.js.map +1 -0
  136. package/lib/packlets/observe/observer.d.ts +110 -0
  137. package/lib/packlets/observe/observer.d.ts.map +1 -0
  138. package/lib/packlets/observe/observer.js +7 -0
  139. package/lib/packlets/observe/observer.js.map +1 -0
  140. package/lib/packlets/retrieve/hybridRetriever.d.ts +79 -0
  141. package/lib/packlets/retrieve/hybridRetriever.d.ts.map +1 -0
  142. package/lib/packlets/retrieve/hybridRetriever.js +140 -0
  143. package/lib/packlets/retrieve/hybridRetriever.js.map +1 -0
  144. package/lib/packlets/retrieve/index.d.ts +8 -0
  145. package/lib/packlets/retrieve/index.d.ts.map +1 -0
  146. package/lib/packlets/retrieve/index.js +28 -0
  147. package/lib/packlets/retrieve/index.js.map +1 -0
  148. package/lib/packlets/retrieve/linkTraversalRetriever.d.ts +61 -0
  149. package/lib/packlets/retrieve/linkTraversalRetriever.d.ts.map +1 -0
  150. package/lib/packlets/retrieve/linkTraversalRetriever.js +147 -0
  151. package/lib/packlets/retrieve/linkTraversalRetriever.js.map +1 -0
  152. package/lib/packlets/retrieve/recencyRetriever.d.ts +21 -0
  153. package/lib/packlets/retrieve/recencyRetriever.d.ts.map +1 -0
  154. package/lib/packlets/retrieve/recencyRetriever.js +37 -0
  155. package/lib/packlets/retrieve/recencyRetriever.js.map +1 -0
  156. package/lib/packlets/retrieve/retriever.d.ts +133 -0
  157. package/lib/packlets/retrieve/retriever.d.ts.map +1 -0
  158. package/lib/packlets/retrieve/retriever.js +119 -0
  159. package/lib/packlets/retrieve/retriever.js.map +1 -0
  160. package/lib/packlets/retrieve/semanticRetriever.d.ts +69 -0
  161. package/lib/packlets/retrieve/semanticRetriever.d.ts.map +1 -0
  162. package/lib/packlets/retrieve/semanticRetriever.js +90 -0
  163. package/lib/packlets/retrieve/semanticRetriever.js.map +1 -0
  164. package/lib/packlets/retrieve/structuredFilterRetriever.d.ts +22 -0
  165. package/lib/packlets/retrieve/structuredFilterRetriever.d.ts.map +1 -0
  166. package/lib/packlets/retrieve/structuredFilterRetriever.js +41 -0
  167. package/lib/packlets/retrieve/structuredFilterRetriever.js.map +1 -0
  168. package/lib/packlets/retrieve/tagRetriever.d.ts +22 -0
  169. package/lib/packlets/retrieve/tagRetriever.d.ts.map +1 -0
  170. package/lib/packlets/retrieve/tagRetriever.js +41 -0
  171. package/lib/packlets/retrieve/tagRetriever.js.map +1 -0
  172. package/lib/packlets/store/fileTreeMemoryStore.d.ts +327 -0
  173. package/lib/packlets/store/fileTreeMemoryStore.d.ts.map +1 -0
  174. package/lib/packlets/store/fileTreeMemoryStore.js +702 -0
  175. package/lib/packlets/store/fileTreeMemoryStore.js.map +1 -0
  176. package/lib/packlets/store/index.d.ts +3 -0
  177. package/lib/packlets/store/index.d.ts.map +1 -0
  178. package/lib/packlets/store/index.js +23 -0
  179. package/lib/packlets/store/index.js.map +1 -0
  180. package/lib/packlets/store/scopeEncoding.d.ts +19 -0
  181. package/lib/packlets/store/scopeEncoding.d.ts.map +1 -0
  182. package/lib/packlets/store/scopeEncoding.js +34 -0
  183. package/lib/packlets/store/scopeEncoding.js.map +1 -0
  184. package/lib/packlets/types/envelope.d.ts +119 -0
  185. package/lib/packlets/types/envelope.d.ts.map +1 -0
  186. package/lib/packlets/types/envelope.js +7 -0
  187. package/lib/packlets/types/envelope.js.map +1 -0
  188. package/lib/packlets/types/filenameSafety.d.ts +16 -0
  189. package/lib/packlets/types/filenameSafety.d.ts.map +1 -0
  190. package/lib/packlets/types/filenameSafety.js +55 -0
  191. package/lib/packlets/types/filenameSafety.js.map +1 -0
  192. package/lib/packlets/types/identityCodec.d.ts +136 -0
  193. package/lib/packlets/types/identityCodec.d.ts.map +1 -0
  194. package/lib/packlets/types/identityCodec.js +190 -0
  195. package/lib/packlets/types/identityCodec.js.map +1 -0
  196. package/lib/packlets/types/ids.d.ts +55 -0
  197. package/lib/packlets/types/ids.d.ts.map +1 -0
  198. package/lib/packlets/types/ids.js +70 -0
  199. package/lib/packlets/types/ids.js.map +1 -0
  200. package/lib/packlets/types/index.d.ts +6 -0
  201. package/lib/packlets/types/index.d.ts.map +1 -0
  202. package/lib/packlets/types/index.js +26 -0
  203. package/lib/packlets/types/index.js.map +1 -0
  204. package/lib/packlets/types/writePolicy.d.ts +213 -0
  205. package/lib/packlets/types/writePolicy.d.ts.map +1 -0
  206. package/lib/packlets/types/writePolicy.js +268 -0
  207. package/lib/packlets/types/writePolicy.js.map +1 -0
  208. package/lib/packlets/vector/inMemoryCosineIndex.d.ts +69 -0
  209. package/lib/packlets/vector/inMemoryCosineIndex.d.ts.map +1 -0
  210. package/lib/packlets/vector/inMemoryCosineIndex.js +154 -0
  211. package/lib/packlets/vector/inMemoryCosineIndex.js.map +1 -0
  212. package/lib/packlets/vector/index.d.ts +3 -0
  213. package/lib/packlets/vector/index.d.ts.map +1 -0
  214. package/lib/packlets/vector/index.js +23 -0
  215. package/lib/packlets/vector/index.js.map +1 -0
  216. package/lib/packlets/vector/vectorIndex.d.ts +68 -0
  217. package/lib/packlets/vector/vectorIndex.d.ts.map +1 -0
  218. package/lib/packlets/vector/vectorIndex.js +7 -0
  219. package/lib/packlets/vector/vectorIndex.js.map +1 -0
  220. package/lib/test/unit/converters/bodyConverterRegistry.test.d.ts +2 -0
  221. package/lib/test/unit/converters/bodyConverterRegistry.test.d.ts.map +1 -0
  222. package/lib/test/unit/converters/bodyConverterRegistry.test.js +74 -0
  223. package/lib/test/unit/converters/bodyConverterRegistry.test.js.map +1 -0
  224. package/lib/test/unit/converters/envelopeConverter.test.d.ts +2 -0
  225. package/lib/test/unit/converters/envelopeConverter.test.d.ts.map +1 -0
  226. package/lib/test/unit/converters/envelopeConverter.test.js +198 -0
  227. package/lib/test/unit/converters/envelopeConverter.test.js.map +1 -0
  228. package/lib/test/unit/index/memoryIndex.test.d.ts +2 -0
  229. package/lib/test/unit/index/memoryIndex.test.d.ts.map +1 -0
  230. package/lib/test/unit/index/memoryIndex.test.js +154 -0
  231. package/lib/test/unit/index/memoryIndex.test.js.map +1 -0
  232. package/lib/test/unit/observe/memoryObservationStore.test.d.ts +2 -0
  233. package/lib/test/unit/observe/memoryObservationStore.test.d.ts.map +1 -0
  234. package/lib/test/unit/observe/memoryObservationStore.test.js +120 -0
  235. package/lib/test/unit/observe/memoryObservationStore.test.js.map +1 -0
  236. package/lib/test/unit/retrieve/linkTraversalRetriever.test.d.ts +2 -0
  237. package/lib/test/unit/retrieve/linkTraversalRetriever.test.d.ts.map +1 -0
  238. package/lib/test/unit/retrieve/linkTraversalRetriever.test.js +184 -0
  239. package/lib/test/unit/retrieve/linkTraversalRetriever.test.js.map +1 -0
  240. package/lib/test/unit/retrieve/retrievers.test.d.ts +2 -0
  241. package/lib/test/unit/retrieve/retrievers.test.d.ts.map +1 -0
  242. package/lib/test/unit/retrieve/retrievers.test.js +508 -0
  243. package/lib/test/unit/retrieve/retrievers.test.js.map +1 -0
  244. package/lib/test/unit/store/embedOnWrite.test.d.ts +2 -0
  245. package/lib/test/unit/store/embedOnWrite.test.d.ts.map +1 -0
  246. package/lib/test/unit/store/embedOnWrite.test.js +262 -0
  247. package/lib/test/unit/store/embedOnWrite.test.js.map +1 -0
  248. package/lib/test/unit/store/fileTreeMemoryStore.test.d.ts +2 -0
  249. package/lib/test/unit/store/fileTreeMemoryStore.test.d.ts.map +1 -0
  250. package/lib/test/unit/store/fileTreeMemoryStore.test.js +649 -0
  251. package/lib/test/unit/store/fileTreeMemoryStore.test.js.map +1 -0
  252. package/lib/test/unit/store/observations.test.d.ts +2 -0
  253. package/lib/test/unit/store/observations.test.d.ts.map +1 -0
  254. package/lib/test/unit/store/observations.test.js +241 -0
  255. package/lib/test/unit/store/observations.test.js.map +1 -0
  256. package/lib/test/unit/store/scopeEncoding.test.d.ts +2 -0
  257. package/lib/test/unit/store/scopeEncoding.test.d.ts.map +1 -0
  258. package/lib/test/unit/store/scopeEncoding.test.js +26 -0
  259. package/lib/test/unit/store/scopeEncoding.test.js.map +1 -0
  260. package/lib/test/unit/types/identityCodec.test.d.ts +2 -0
  261. package/lib/test/unit/types/identityCodec.test.d.ts.map +1 -0
  262. package/lib/test/unit/types/identityCodec.test.js +189 -0
  263. package/lib/test/unit/types/identityCodec.test.js.map +1 -0
  264. package/lib/test/unit/types/ids.test.d.ts +2 -0
  265. package/lib/test/unit/types/ids.test.d.ts.map +1 -0
  266. package/lib/test/unit/types/ids.test.js +86 -0
  267. package/lib/test/unit/types/ids.test.js.map +1 -0
  268. package/lib/test/unit/types/writePolicy.test.d.ts +2 -0
  269. package/lib/test/unit/types/writePolicy.test.d.ts.map +1 -0
  270. package/lib/test/unit/types/writePolicy.test.js +243 -0
  271. package/lib/test/unit/types/writePolicy.test.js.map +1 -0
  272. package/lib/test/unit/vector/inMemoryCosineIndex.test.d.ts +2 -0
  273. package/lib/test/unit/vector/inMemoryCosineIndex.test.d.ts.map +1 -0
  274. package/lib/test/unit/vector/inMemoryCosineIndex.test.js +194 -0
  275. package/lib/test/unit/vector/inMemoryCosineIndex.test.js.map +1 -0
  276. package/lib/test/unit/vector/vectorIndex.test.d.ts +2 -0
  277. package/lib/test/unit/vector/vectorIndex.test.d.ts.map +1 -0
  278. package/lib/test/unit/vector/vectorIndex.test.js +44 -0
  279. package/lib/test/unit/vector/vectorIndex.test.js.map +1 -0
  280. package/package.json +81 -0
  281. package/rush-logs/ts-agent-memory.build.cache.log +3 -0
  282. package/rush-logs/ts-agent-memory.build.log +9 -0
  283. package/src/index.ts +12 -0
  284. package/src/packlets/converters/bodyConverterRegistry.ts +105 -0
  285. package/src/packlets/converters/envelopeConverter.ts +210 -0
  286. package/src/packlets/converters/index.ts +7 -0
  287. package/src/packlets/index/index.ts +6 -0
  288. package/src/packlets/index/memoryIndex.ts +268 -0
  289. package/src/packlets/observe/index.ts +7 -0
  290. package/src/packlets/observe/memoryObservationStore.ts +153 -0
  291. package/src/packlets/observe/observer.ts +119 -0
  292. package/src/packlets/retrieve/hybridRetriever.ts +181 -0
  293. package/src/packlets/retrieve/index.ts +12 -0
  294. package/src/packlets/retrieve/linkTraversalRetriever.ts +169 -0
  295. package/src/packlets/retrieve/recencyRetriever.ts +54 -0
  296. package/src/packlets/retrieve/retriever.ts +207 -0
  297. package/src/packlets/retrieve/semanticRetriever.ts +147 -0
  298. package/src/packlets/retrieve/structuredFilterRetriever.ts +58 -0
  299. package/src/packlets/retrieve/tagRetriever.ts +58 -0
  300. package/src/packlets/store/fileTreeMemoryStore.ts +1073 -0
  301. package/src/packlets/store/index.ts +7 -0
  302. package/src/packlets/store/scopeEncoding.ts +36 -0
  303. package/src/packlets/types/envelope.ts +138 -0
  304. package/src/packlets/types/filenameSafety.ts +57 -0
  305. package/src/packlets/types/identityCodec.ts +263 -0
  306. package/src/packlets/types/ids.ts +124 -0
  307. package/src/packlets/types/index.ts +10 -0
  308. package/src/packlets/types/writePolicy.ts +447 -0
  309. package/src/packlets/vector/inMemoryCosineIndex.ts +173 -0
  310. package/src/packlets/vector/index.ts +7 -0
  311. package/src/packlets/vector/vectorIndex.ts +78 -0
  312. package/src/test/unit/converters/bodyConverterRegistry.test.ts +89 -0
  313. package/src/test/unit/converters/envelopeConverter.test.ts +261 -0
  314. package/src/test/unit/index/memoryIndex.test.ts +187 -0
  315. package/src/test/unit/observe/memoryObservationStore.test.ts +158 -0
  316. package/src/test/unit/retrieve/linkTraversalRetriever.test.ts +230 -0
  317. package/src/test/unit/retrieve/retrievers.test.ts +662 -0
  318. package/src/test/unit/store/embedOnWrite.test.ts +346 -0
  319. package/src/test/unit/store/fileTreeMemoryStore.test.ts +875 -0
  320. package/src/test/unit/store/observations.test.ts +290 -0
  321. package/src/test/unit/store/scopeEncoding.test.ts +37 -0
  322. package/src/test/unit/types/identityCodec.test.ts +266 -0
  323. package/src/test/unit/types/ids.test.ts +94 -0
  324. package/src/test/unit/types/writePolicy.test.ts +325 -0
  325. package/src/test/unit/vector/inMemoryCosineIndex.test.ts +242 -0
  326. package/src/test/unit/vector/vectorIndex.test.ts +48 -0
  327. package/temp/build/lint/_eslint-5eVG3S6w.json +182 -0
  328. package/temp/build/typescript/ts_8nwakTlr.json +1 -0
  329. package/temp/ts-agent-memory.api.json +12438 -0
  330. package/temp/ts-agent-memory.api.md +525 -0
  331. package/tsconfig.json +8 -0
@@ -0,0 +1,119 @@
1
+ /*
2
+ * Copyright (c) 2026 Erik Fortune
3
+ * SPDX-License-Identifier: MIT
4
+ */
5
+
6
+ import { Result } from '@fgv/ts-utils';
7
+ import { IProvenance, Kind, MemoryId, MemoryScopeKey } from '../types';
8
+
9
+ /**
10
+ * The store/retriever operation an observation record describes.
11
+ *
12
+ * @remarks
13
+ * `'read'` / `'write'` / `'delete'` are fired post-op by
14
+ * {@link FileTreeMemoryStore} (on `get` / `put` / `delete` respectively) when
15
+ * observers are wired. `'retrieve'` is reserved for retriever-fired
16
+ * observations; no B2 retriever fires one (a single seq authority per
17
+ * observation store is the supported topology), so it never appears in B2 but
18
+ * is part of the vocabulary so a future retriever-firing hook is additive.
19
+ * @public
20
+ */
21
+ export type MemoryObservationPhase = 'read' | 'write' | 'delete' | 'retrieve';
22
+
23
+ /**
24
+ * The outcome of the observed operation.
25
+ * @public
26
+ */
27
+ export type MemoryObservationOutcome = 'success' | 'failure';
28
+
29
+ /**
30
+ * A single audit record produced by an observed store (or retriever) operation.
31
+ *
32
+ * @remarks
33
+ * `seq` and `timestamp` are assigned by the firing authority (the store) before
34
+ * fan-out, so the same record carries the same `seq` across every observer it
35
+ * lands in. `seq` is strictly increasing per authority, satisfying the
36
+ * `RetainingRingBuffer` cursor contract that {@link MemoryObservationStore}
37
+ * relies on.
38
+ * @public
39
+ */
40
+ export interface IMemoryObservationRecord {
41
+ /**
42
+ * Monotonic 1-based sequence number assigned by the firing authority, stable
43
+ * across a store's ring eviction. The ordering / paging key.
44
+ */
45
+ readonly seq: number;
46
+ /** Milliseconds since epoch when the firing authority produced the record. */
47
+ readonly timestamp: number;
48
+ /** Which operation this record describes. */
49
+ readonly phase: MemoryObservationPhase;
50
+ /** The scope the operation touched, when resolvable. */
51
+ readonly scope?: MemoryScopeKey;
52
+ /** The record id the operation touched, when resolvable. */
53
+ readonly id?: MemoryId;
54
+ /** The kind the operation targeted, when known. */
55
+ readonly kind?: Kind;
56
+ /** Whether the operation succeeded. */
57
+ readonly outcome: MemoryObservationOutcome;
58
+ /** Present on failure: the failure `Result`'s message. */
59
+ readonly error?: string;
60
+ /** Structured provenance of the write, when the operation carried one. */
61
+ readonly provenance?: IProvenance;
62
+ /**
63
+ * For `'retrieve'` observations: an opaque snapshot of the query that drove
64
+ * the retrieval. Carried verbatim; never interpreted by the store.
65
+ */
66
+ readonly querySnapshot?: Readonly<Record<string, unknown>>;
67
+ }
68
+
69
+ /**
70
+ * Single-method async observer hook. The store fires `observe` once per public
71
+ * `get` / `put` / `delete` call when observers are wired.
72
+ *
73
+ * @remarks
74
+ * Observer errors never affect the store operation — the store swallows a
75
+ * failed `Result` or a thrown / rejected `observe`, logging it to the injected
76
+ * diagnostic logger at `warn`.
77
+ * @public
78
+ */
79
+ export interface IMemoryObserver {
80
+ /**
81
+ * When `true`, the store dispatches `observe` without awaiting it, so a slow
82
+ * remote observer (SIEM, network sink) does not extend the store operation's
83
+ * latency. Defaults to `false` (awaited), which is correct for the cheap
84
+ * in-memory default {@link MemoryObservationStore}. Errors are swallowed
85
+ * either way.
86
+ */
87
+ readonly fireAndForget?: boolean;
88
+ /**
89
+ * Receives a fully-formed observation record.
90
+ * @param record - The observation record.
91
+ * @returns A `Result` whose failure is swallowed (logged to the store's
92
+ * diagnostic logger). A rejected promise is likewise swallowed.
93
+ */
94
+ observe(record: IMemoryObservationRecord): Promise<Result<unknown>>;
95
+ }
96
+
97
+ /**
98
+ * Query criteria for {@link MemoryObservationStore.query}. All supplied criteria
99
+ * are AND-combined.
100
+ * @public
101
+ */
102
+ export interface IMemoryObservationQuery {
103
+ /** Only records with `seq > sinceSeq` (incremental paging cursor). */
104
+ readonly sinceSeq?: number;
105
+ /** Return at most this many records — the most-recent N, still oldest-first. */
106
+ readonly limit?: number;
107
+ /** Only records with `timestamp >= since`. */
108
+ readonly since?: number;
109
+ /** Only records with `timestamp <= until`. */
110
+ readonly until?: number;
111
+ /** Only records that touched this scope. */
112
+ readonly scope?: MemoryScopeKey;
113
+ /** Only records that targeted this kind. */
114
+ readonly kind?: Kind;
115
+ /** Only records of this phase. */
116
+ readonly phase?: MemoryObservationPhase;
117
+ /** Only records with this outcome. */
118
+ readonly outcome?: MemoryObservationOutcome;
119
+ }
@@ -0,0 +1,181 @@
1
+ /*
2
+ * Copyright (c) 2026 Erik Fortune
3
+ * SPDX-License-Identifier: MIT
4
+ */
5
+
6
+ import { Result, fail, mapResults, succeed } from '@fgv/ts-utils';
7
+ import { IMemoryRecord, MemoryId } from '../types';
8
+ import {
9
+ IMemoryQuery,
10
+ IMemoryRetriever,
11
+ IMemoryRetrieverCapabilities,
12
+ guardRetrieverCapabilities,
13
+ limitRecords,
14
+ recencyCompare
15
+ } from './retriever';
16
+
17
+ /**
18
+ * Strategy for combining the result sets of the retrievers a
19
+ * {@link HybridRetriever} composes. Injectable so a consumer can weight,
20
+ * re-rank, or intersect instead of the default union.
21
+ * @public
22
+ */
23
+ export interface IMergeStrategy {
24
+ /**
25
+ * Merge the per-retriever result sets into a single ordered result.
26
+ * @param resultSets - One entry per composed retriever, in composition order.
27
+ */
28
+ merge(
29
+ resultSets: ReadonlyArray<ReadonlyArray<IMemoryRecord<unknown>>>
30
+ ): Result<ReadonlyArray<IMemoryRecord<unknown>>>;
31
+ }
32
+
33
+ /**
34
+ * The reference {@link IMergeStrategy}: a score-union. Every record is scored by
35
+ * the number of composed result sets it appears in (deduplicated by
36
+ * {@link IMemoryEnvelope.id | id}); the merged result is ordered by descending
37
+ * score, then by recency. Records surfaced by more retrievers rank higher.
38
+ *
39
+ * @remarks
40
+ * Dedup is by `id` alone, which is unambiguous for the flat (one-file-per-entity)
41
+ * kinds B2 ships. Phase-C versioned kinds that reuse a stem across scopes will
42
+ * extend the dedup key — additive, no API change.
43
+ * @public
44
+ */
45
+ export class ScoreUnionMergeStrategy implements IMergeStrategy {
46
+ private constructor() {}
47
+
48
+ /** Family-convention factory. */
49
+ public static create(): Result<ScoreUnionMergeStrategy> {
50
+ return succeed(new ScoreUnionMergeStrategy());
51
+ }
52
+
53
+ /** {@inheritDoc IMergeStrategy.merge} */
54
+ public merge(
55
+ resultSets: ReadonlyArray<ReadonlyArray<IMemoryRecord<unknown>>>
56
+ ): Result<ReadonlyArray<IMemoryRecord<unknown>>> {
57
+ const scored: Map<MemoryId, { readonly record: IMemoryRecord<unknown>; score: number }> = new Map();
58
+ for (const set of resultSets) {
59
+ // Count each id at most once per result set, so the score is "how many
60
+ // retrievers surfaced this record" rather than "how many copies total".
61
+ const seenInSet: Set<MemoryId> = new Set<MemoryId>();
62
+ for (const record of set) {
63
+ const id: MemoryId = record.envelope.id;
64
+ if (seenInSet.has(id)) {
65
+ continue;
66
+ }
67
+ seenInSet.add(id);
68
+ const existing = scored.get(id);
69
+ if (existing === undefined) {
70
+ scored.set(id, { record, score: 1 });
71
+ } else {
72
+ existing.score += 1;
73
+ }
74
+ }
75
+ }
76
+ const merged: IMemoryRecord<unknown>[] = Array.from(scored.values())
77
+ .sort((a, b) => (b.score !== a.score ? b.score - a.score : recencyCompare(a.record, b.record)))
78
+ .map((entry) => entry.record);
79
+ return succeed(merged);
80
+ }
81
+ }
82
+
83
+ /**
84
+ * Composes several retrievers, dispatches a query to each, and merges their
85
+ * results via an injectable {@link IMergeStrategy}. Its capabilities are the
86
+ * union of the composed retrievers' capabilities.
87
+ *
88
+ * @remarks
89
+ * The hybrid enforces the loud-degradation contract against its OWN (union)
90
+ * capabilities, then projects the query for each child: a child that does not
91
+ * support the `semantic` (or `asOf`) axis is handed a query with that axis
92
+ * stripped, so it returns its normal results instead of loud-failing on a field
93
+ * a sibling handles. A child that genuinely fails (e.g. a wired semantic backend
94
+ * erroring) propagates — the hybrid never silently drops a failure.
95
+ * @public
96
+ */
97
+ export class HybridRetriever implements IMemoryRetriever {
98
+ private readonly _retrievers: ReadonlyArray<IMemoryRetriever>;
99
+ private readonly _mergeStrategy: IMergeStrategy;
100
+ private readonly _capabilities: IMemoryRetrieverCapabilities;
101
+
102
+ private constructor(
103
+ retrievers: ReadonlyArray<IMemoryRetriever>,
104
+ mergeStrategy: IMergeStrategy,
105
+ capabilities: IMemoryRetrieverCapabilities
106
+ ) {
107
+ this._retrievers = retrievers;
108
+ this._mergeStrategy = mergeStrategy;
109
+ this._capabilities = capabilities;
110
+ }
111
+
112
+ /** {@inheritDoc IMemoryRetriever.capabilities} */
113
+ public get capabilities(): IMemoryRetrieverCapabilities {
114
+ return this._capabilities;
115
+ }
116
+
117
+ /**
118
+ * Family-convention factory.
119
+ * @param retrievers - The retrievers to compose (at least one).
120
+ * @param mergeStrategy - How to combine their results.
121
+ */
122
+ public static create(
123
+ retrievers: ReadonlyArray<IMemoryRetriever>,
124
+ mergeStrategy: IMergeStrategy
125
+ ): Result<HybridRetriever> {
126
+ if (retrievers.length === 0) {
127
+ return fail('HybridRetriever: at least one retriever is required');
128
+ }
129
+ // Snapshot the caller's array so a later mutation cannot make `retrieve()`
130
+ // and the cached `capabilities` disagree.
131
+ const stableRetrievers: ReadonlyArray<IMemoryRetriever> = [...retrievers];
132
+ const capabilities: IMemoryRetrieverCapabilities = {
133
+ supportsSemanticRecall: stableRetrievers.some((r) => r.capabilities.supportsSemanticRecall),
134
+ supportsTemporalQuery: stableRetrievers.some((r) => r.capabilities.supportsTemporalQuery),
135
+ supportsLinkTraversal: stableRetrievers.some((r) => r.capabilities.supportsLinkTraversal)
136
+ };
137
+ return succeed(new HybridRetriever(stableRetrievers, mergeStrategy, capabilities));
138
+ }
139
+
140
+ /** {@inheritDoc IMemoryRetriever.retrieve} */
141
+ public async retrieve(query: IMemoryQuery): Promise<Result<ReadonlyArray<IMemoryRecord<unknown>>>> {
142
+ return guardRetrieverCapabilities(query, this._capabilities).thenOnSuccess(async () => {
143
+ const perRetriever: Result<ReadonlyArray<IMemoryRecord<unknown>>>[] = await Promise.all(
144
+ this._retrievers.map((retriever) => retriever.retrieve(this._projectQuery(query, retriever)))
145
+ );
146
+ return mapResults(perRetriever)
147
+ .onSuccess((resultSets) => this._mergeStrategy.merge(resultSets))
148
+ .onSuccess((merged) => succeed(limitRecords(merged, query.limit)));
149
+ });
150
+ }
151
+
152
+ /**
153
+ * Project the query for one child retriever. Two adjustments:
154
+ *
155
+ * - Strip axes the child does not support (`semantic` / `topK` for a
156
+ * non-semantic child, `asOf` for a non-temporal child, the link axes for a
157
+ * non-link child) so it returns its normal results rather than loud-failing
158
+ * on a field a sibling handles.
159
+ * - Strip `limit` unconditionally: limit is a post-merge concern. A child that
160
+ * pre-truncated its result set would starve the merge strategy of candidates
161
+ * it needs to score correctly (a record both children would surface must
162
+ * reach the merge to score 2). The hybrid applies `limit` once, after merge.
163
+ */
164
+ private _projectQuery(query: IMemoryQuery, retriever: IMemoryRetriever): IMemoryQuery {
165
+ const projected: { -readonly [K in keyof IMemoryQuery]: IMemoryQuery[K] } = { ...query };
166
+ delete projected.limit;
167
+ if (!retriever.capabilities.supportsSemanticRecall) {
168
+ delete projected.semantic;
169
+ delete projected.topK;
170
+ }
171
+ if (!retriever.capabilities.supportsTemporalQuery) {
172
+ delete projected.asOf;
173
+ }
174
+ if (!retriever.capabilities.supportsLinkTraversal) {
175
+ delete projected.linkedFrom;
176
+ delete projected.linkedTo;
177
+ delete projected.hops;
178
+ }
179
+ return projected;
180
+ }
181
+ }
@@ -0,0 +1,12 @@
1
+ /*
2
+ * Copyright (c) 2026 Erik Fortune
3
+ * SPDX-License-Identifier: MIT
4
+ */
5
+
6
+ export * from './retriever';
7
+ export * from './recencyRetriever';
8
+ export * from './linkTraversalRetriever';
9
+ export * from './tagRetriever';
10
+ export * from './structuredFilterRetriever';
11
+ export * from './semanticRetriever';
12
+ export * from './hybridRetriever';
@@ -0,0 +1,169 @@
1
+ /*
2
+ * Copyright (c) 2026 Erik Fortune
3
+ * SPDX-License-Identifier: MIT
4
+ */
5
+
6
+ import { Result, fail, succeed } from '@fgv/ts-utils';
7
+ import { IMemoryRecord, MemoryId } from '../types';
8
+ import { IIndexedMemoryRecord, IMemoryIndex } from '../index';
9
+ import {
10
+ IMemoryQuery,
11
+ IMemoryRetriever,
12
+ IMemoryRetrieverCapabilities,
13
+ guardRetrieverCapabilities,
14
+ indexedRecordMatchesQuery,
15
+ limitRecords,
16
+ recencyCompare
17
+ } from './retriever';
18
+
19
+ /** The capabilities a link-traversal retriever exposes (link traversal only). */
20
+ const LINK_TRAVERSAL_CAPABILITIES: IMemoryRetrieverCapabilities = {
21
+ supportsSemanticRecall: false,
22
+ supportsTemporalQuery: false,
23
+ supportsLinkTraversal: true
24
+ };
25
+
26
+ /** Default BFS hop count when `query.hops` is not supplied. */
27
+ const DEFAULT_HOPS: number = 1;
28
+
29
+ /**
30
+ * The loud-degradation message returned when a link-traversal query supplies no
31
+ * seed (`linkedFrom` / `linkedTo`).
32
+ * @public
33
+ */
34
+ export const LINK_TRAVERSAL_NO_SEED_MESSAGE: string =
35
+ 'link traversal requires a seed id (linkedFrom or linkedTo)';
36
+
37
+ /**
38
+ * Breadth-first link-traversal retriever. From a seed {@link MemoryId} it walks
39
+ * the link graph up to `query.hops` levels and returns the records reached
40
+ * (excluding the seed), recency-ordered and limited.
41
+ *
42
+ * @remarks
43
+ * - **Direction.** `linkedFrom` walks OUTBOUND edges (each record's
44
+ * `envelope.links[].target`); `linkedTo` walks INBOUND edges (the index's
45
+ * `backlinks`). Exactly one is the seed; `linkedFrom` wins if both are set.
46
+ * - **Bound + cycle safety.** Traversal is bounded by `hops` (default `1` — a
47
+ * single hop) and a visited-set guard. The graph is keyed by bare
48
+ * string {@link MemoryId}s, so a `Set<string>` visited-set is the exact,
49
+ * collision-free cycle key — no structural hashing (e.g. `Crc32Normalizer`) is
50
+ * needed. A self-loop or any multi-hop cycle terminates because a revisited id
51
+ * is never re-expanded.
52
+ * - **Post-filter.** The scope / kind / tag / predicate axes of the query are
53
+ * applied to the reached records (the link axes are the traversal itself).
54
+ * @public
55
+ */
56
+ export class LinkTraversalRetriever implements IMemoryRetriever {
57
+ private readonly _index: IMemoryIndex;
58
+
59
+ private constructor(index: IMemoryIndex) {
60
+ this._index = index;
61
+ }
62
+
63
+ /** Family-convention factory. */
64
+ public static create(index: IMemoryIndex): Result<LinkTraversalRetriever> {
65
+ return succeed(new LinkTraversalRetriever(index));
66
+ }
67
+
68
+ /** {@inheritDoc IMemoryRetriever.capabilities} */
69
+ public get capabilities(): IMemoryRetrieverCapabilities {
70
+ return LINK_TRAVERSAL_CAPABILITIES;
71
+ }
72
+
73
+ /** {@inheritDoc IMemoryRetriever.retrieve} */
74
+ public retrieve(query: IMemoryQuery): Promise<Result<ReadonlyArray<IMemoryRecord<unknown>>>> {
75
+ return Promise.resolve(
76
+ guardRetrieverCapabilities(query, this.capabilities).onSuccess(() => this._traverse(query))
77
+ );
78
+ }
79
+
80
+ /** Run the bounded, cycle-safe BFS and post-filter the reached records. */
81
+ private _traverse(query: IMemoryQuery): Result<ReadonlyArray<IMemoryRecord<unknown>>> {
82
+ const outbound: boolean = query.linkedFrom !== undefined;
83
+ const seed: MemoryId | undefined = query.linkedFrom ?? query.linkedTo;
84
+ if (seed === undefined) {
85
+ return fail(LINK_TRAVERSAL_NO_SEED_MESSAGE);
86
+ }
87
+ const hops: number = query.hops ?? DEFAULT_HOPS;
88
+ const byId: ReadonlyMap<MemoryId, IIndexedMemoryRecord[]> = this._indexById();
89
+
90
+ // The visited-set IS the cycle guard: ids are strings, so set membership is
91
+ // an exact identity check. The seed is pre-marked so it is never re-added.
92
+ const visited: Set<string> = new Set<string>([seed]);
93
+ const reached: MemoryId[] = [];
94
+ let frontier: MemoryId[] = [seed];
95
+ for (let hop = 0; hop < hops && frontier.length > 0; hop++) {
96
+ const next: MemoryId[] = [];
97
+ for (const id of frontier) {
98
+ for (const neighbor of outbound ? this._outbound(id, byId) : this._inbound(id)) {
99
+ if (!visited.has(neighbor)) {
100
+ visited.add(neighbor);
101
+ reached.push(neighbor);
102
+ next.push(neighbor);
103
+ }
104
+ }
105
+ }
106
+ frontier = next;
107
+ }
108
+
109
+ const entries: IIndexedMemoryRecord[] = [];
110
+ for (const id of reached) {
111
+ const matches: IIndexedMemoryRecord[] | undefined = byId.get(id);
112
+ if (matches !== undefined) {
113
+ entries.push(...matches);
114
+ }
115
+ }
116
+ const ordered: IMemoryRecord<unknown>[] = entries
117
+ .filter((entry) => indexedRecordMatchesQuery(entry, query))
118
+ .map((entry) => entry.record)
119
+ .sort(recencyCompare);
120
+ return succeed(limitRecords(ordered, query.limit));
121
+ }
122
+
123
+ /**
124
+ * Group the index's entries by bare {@link MemoryId}. An id can map to more
125
+ * than one entry when distinct scopes reuse a filename stem (e.g. `turn-0` in
126
+ * two conversations), so the value is an array.
127
+ *
128
+ * @remarks
129
+ * **Design note (links are globally-scoped identifiers in this phase).** An
130
+ * {@link IEdge.target} is a bare `MemoryId`, not a `(scope, id)` pair, so
131
+ * traversal resolves a target across ALL scopes that hold that id. When two
132
+ * scopes reuse a stem, following an edge to it reaches every match. This
133
+ * mirrors the `backlinks` index, which is also keyed by bare id. Scope-
134
+ * qualified link resolution is intentionally out of scope for Phase C and
135
+ * would be an additive change here (and to {@link IEdge} / the index).
136
+ */
137
+ private _indexById(): ReadonlyMap<MemoryId, IIndexedMemoryRecord[]> {
138
+ const byId: Map<MemoryId, IIndexedMemoryRecord[]> = new Map<MemoryId, IIndexedMemoryRecord[]>();
139
+ for (const entry of this._index.entries()) {
140
+ const id: MemoryId = entry.record.envelope.id;
141
+ const existing: IIndexedMemoryRecord[] | undefined = byId.get(id);
142
+ if (existing === undefined) {
143
+ byId.set(id, [entry]);
144
+ } else {
145
+ existing.push(entry);
146
+ }
147
+ }
148
+ return byId;
149
+ }
150
+
151
+ /** Outbound neighbors: the targets of every edge on the records with this id. */
152
+ private _outbound(id: MemoryId, byId: ReadonlyMap<MemoryId, IIndexedMemoryRecord[]>): MemoryId[] {
153
+ const targets: MemoryId[] = [];
154
+ const matches: IIndexedMemoryRecord[] | undefined = byId.get(id);
155
+ if (matches !== undefined) {
156
+ for (const entry of matches) {
157
+ for (const edge of entry.record.envelope.links) {
158
+ targets.push(edge.target);
159
+ }
160
+ }
161
+ }
162
+ return targets;
163
+ }
164
+
165
+ /** Inbound neighbors: the ids whose edges point AT this id (the backlinks). */
166
+ private _inbound(id: MemoryId): ReadonlyArray<MemoryId> {
167
+ return this._index.backlinks(id);
168
+ }
169
+ }
@@ -0,0 +1,54 @@
1
+ /*
2
+ * Copyright (c) 2026 Erik Fortune
3
+ * SPDX-License-Identifier: MIT
4
+ */
5
+
6
+ import { Result, succeed } from '@fgv/ts-utils';
7
+ import { IMemoryRecord } from '../types';
8
+ import { IMemoryIndex } from '../index';
9
+ import {
10
+ IMemoryQuery,
11
+ IMemoryRetriever,
12
+ IMemoryRetrieverCapabilities,
13
+ NON_SEMANTIC_CAPABILITIES,
14
+ guardRetrieverCapabilities,
15
+ limitRecords,
16
+ recencyCompare,
17
+ selectByQuery
18
+ } from './retriever';
19
+
20
+ /**
21
+ * Returns records matching the query's scope / kind / tag / predicate filters,
22
+ * ordered most-recently-updated first. The universal v1 retriever — an empty
23
+ * query returns the whole vault in recency order.
24
+ * @public
25
+ */
26
+ export class RecencyRetriever implements IMemoryRetriever {
27
+ private readonly _index: IMemoryIndex;
28
+
29
+ private constructor(index: IMemoryIndex) {
30
+ this._index = index;
31
+ }
32
+
33
+ /** {@inheritDoc IMemoryRetriever.capabilities} */
34
+ public get capabilities(): IMemoryRetrieverCapabilities {
35
+ return NON_SEMANTIC_CAPABILITIES;
36
+ }
37
+
38
+ /** Family-convention factory. */
39
+ public static create(index: IMemoryIndex): Result<RecencyRetriever> {
40
+ return succeed(new RecencyRetriever(index));
41
+ }
42
+
43
+ /** {@inheritDoc IMemoryRetriever.retrieve} */
44
+ public retrieve(query: IMemoryQuery): Promise<Result<ReadonlyArray<IMemoryRecord<unknown>>>> {
45
+ return Promise.resolve(
46
+ guardRetrieverCapabilities(query, this.capabilities).onSuccess(() => {
47
+ const ordered: IMemoryRecord<unknown>[] = selectByQuery(this._index.entries(), query).sort(
48
+ recencyCompare
49
+ );
50
+ return succeed(limitRecords(ordered, query.limit));
51
+ })
52
+ );
53
+ }
54
+ }