@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,207 @@
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, Kind, MemoryId, MemoryScopeKey, Tag } from '../types';
8
+ import { IIndexedMemoryRecord } from '../index';
9
+
10
+ /**
11
+ * The capabilities a retriever exposes. A consumer probes these before
12
+ * dispatching a query so it never silently gets an empty result for a
13
+ * capability the retriever does not implement.
14
+ * @public
15
+ */
16
+ export interface IMemoryRetrieverCapabilities {
17
+ /** Semantic / vector recall is operational (an {@link IVectorIndex} is wired). */
18
+ readonly supportsSemanticRecall: boolean;
19
+ /** Temporal "as-of" queries are operational (a temporal index is wired). */
20
+ readonly supportsTemporalQuery: boolean;
21
+ /** Link traversal is supported (an in-memory backlink index is present). */
22
+ readonly supportsLinkTraversal: boolean;
23
+ }
24
+
25
+ /**
26
+ * A retrieval query. Every field is optional; an empty query is the "recency
27
+ * over everything" request. `semantic` and `asOf` are present from day one (the
28
+ * no-resignature guarantee): a backend that adds semantic or temporal recall
29
+ * sets the matching capability flag, with no interface change.
30
+ * @public
31
+ */
32
+ export interface IMemoryQuery {
33
+ /** Restrict to records in this scope. */
34
+ readonly scope?: MemoryScopeKey;
35
+ /** Restrict to records carrying this tag (exact match). */
36
+ readonly tag?: Tag;
37
+ /** Restrict to records of this kind. */
38
+ readonly kind?: Kind;
39
+ /** Restrict to records linked FROM this id (outbound). */
40
+ readonly linkedFrom?: MemoryId;
41
+ /** Restrict to records linked TO this id (inbound / backlinks). */
42
+ readonly linkedTo?: MemoryId;
43
+ /** BFS hop count for link traversal. Default: 1. */
44
+ readonly hops?: number;
45
+ /**
46
+ * Text query for semantic / vector recall. If set and the retriever's
47
+ * `supportsSemanticRecall` is `false`, the retriever returns a loud
48
+ * `Result.fail` ({@link SEMANTIC_UNWIRED_MESSAGE}) — never a silent empty.
49
+ */
50
+ readonly semantic?: string;
51
+ /** Top-K for semantic recall. Default: 10. */
52
+ readonly topK?: number;
53
+ /**
54
+ * As-of epoch ms for temporal "valid at" queries. If set and the retriever's
55
+ * `supportsTemporalQuery` is `false`, the retriever returns a loud
56
+ * `Result.fail` — never a silent empty.
57
+ */
58
+ readonly asOf?: number;
59
+ /** Maximum records to return. Applied after all other filters. */
60
+ readonly limit?: number;
61
+ /** Arbitrary predicate applied after the scope / kind / tag pre-filter. */
62
+ readonly filter?: (record: IMemoryRecord<unknown>) => boolean;
63
+ }
64
+
65
+ /**
66
+ * The retrieval contract. A retriever exposes its {@link
67
+ * IMemoryRetrieverCapabilities | capabilities} and answers
68
+ * {@link IMemoryRetriever.retrieve | queries}, degrading loudly (never silently
69
+ * empty) when a requested capability is not wired.
70
+ * @public
71
+ */
72
+ export interface IMemoryRetriever {
73
+ /** The capabilities this retriever exposes. Probe before dispatch. */
74
+ readonly capabilities: IMemoryRetrieverCapabilities;
75
+ /**
76
+ * Retrieve records matching `query`. Returns a `Result.fail` with a
77
+ * diagnostic message when the query requests a capability this retriever does
78
+ * not support (never an empty success).
79
+ */
80
+ retrieve(query: IMemoryQuery): Promise<Result<ReadonlyArray<IMemoryRecord<unknown>>>>;
81
+ }
82
+
83
+ /**
84
+ * The loud-degradation message a retriever returns when `query.semantic` is set
85
+ * but no {@link IVectorIndex} is wired.
86
+ * @public
87
+ */
88
+ export const SEMANTIC_UNWIRED_MESSAGE: string = 'semantic recall requires a vector index; none configured';
89
+
90
+ /**
91
+ * The loud-degradation message a retriever returns when a link-traversal axis
92
+ * (`linkedFrom` / `linkedTo` / `hops`) is requested but no backlink index is
93
+ * wired.
94
+ * @public
95
+ */
96
+ export const LINK_TRAVERSAL_UNWIRED_MESSAGE: string =
97
+ 'link traversal requires a backlink index; none configured';
98
+
99
+ /**
100
+ * The capabilities every non-semantic, non-temporal, non-link v1 retriever
101
+ * exposes (all three flags `false`).
102
+ * @public
103
+ */
104
+ export const NON_SEMANTIC_CAPABILITIES: IMemoryRetrieverCapabilities = {
105
+ supportsSemanticRecall: false,
106
+ supportsTemporalQuery: false,
107
+ supportsLinkTraversal: false
108
+ };
109
+
110
+ /**
111
+ * Build the loud-degradation message a retriever returns when `query.asOf` is
112
+ * set but no temporal index is wired.
113
+ * @public
114
+ */
115
+ export function temporalUnwiredMessage(kind?: Kind): string {
116
+ return `temporal query requires temporal index; none configured${
117
+ kind !== undefined ? ` for kind ${kind}` : ''
118
+ }`;
119
+ }
120
+
121
+ /**
122
+ * Enforce the loud-degradation contract for the `semantic` and `asOf` axes
123
+ * against a retriever's `capabilities`: a requested capability the retriever
124
+ * does not support fails loudly rather than returning a silent empty result.
125
+ * @public
126
+ */
127
+ export function guardRetrieverCapabilities(
128
+ query: IMemoryQuery,
129
+ capabilities: IMemoryRetrieverCapabilities
130
+ ): Result<true> {
131
+ if (query.semantic !== undefined && !capabilities.supportsSemanticRecall) {
132
+ return fail(SEMANTIC_UNWIRED_MESSAGE);
133
+ }
134
+ if (query.asOf !== undefined && !capabilities.supportsTemporalQuery) {
135
+ return fail(temporalUnwiredMessage(query.kind));
136
+ }
137
+ const requestsLinkTraversal: boolean =
138
+ query.linkedFrom !== undefined || query.linkedTo !== undefined || query.hops !== undefined;
139
+ if (requestsLinkTraversal && !capabilities.supportsLinkTraversal) {
140
+ return fail(LINK_TRAVERSAL_UNWIRED_MESSAGE);
141
+ }
142
+ return succeed(true);
143
+ }
144
+
145
+ /**
146
+ * Recency comparator: most-recently-updated first, with a `seq` tiebreak so
147
+ * equal-`updated` records sort deterministically. Mirrors the B1 index ordering.
148
+ * @public
149
+ */
150
+ export function recencyCompare(a: IMemoryRecord<unknown>, b: IMemoryRecord<unknown>): number {
151
+ const byUpdated: number = b.envelope.updated - a.envelope.updated;
152
+ return byUpdated !== 0 ? byUpdated : b.envelope.seq - a.envelope.seq;
153
+ }
154
+
155
+ /**
156
+ * Whether an indexed entry satisfies a query's scope / kind / tag / predicate
157
+ * pre-filter (the axes shared by every v1 retriever). The `semantic` / `asOf` /
158
+ * link axes are NOT applied here — those are each retriever's own concern.
159
+ * @public
160
+ */
161
+ export function indexedRecordMatchesQuery(entry: IIndexedMemoryRecord, query: IMemoryQuery): boolean {
162
+ if (query.scope !== undefined && entry.scope !== query.scope) {
163
+ return false;
164
+ }
165
+ if (query.kind !== undefined && entry.record.envelope.kind !== query.kind) {
166
+ return false;
167
+ }
168
+ if (query.tag !== undefined && !entry.record.envelope.tags.includes(query.tag)) {
169
+ return false;
170
+ }
171
+ if (query.filter !== undefined && !query.filter(entry.record)) {
172
+ return false;
173
+ }
174
+ return true;
175
+ }
176
+
177
+ /**
178
+ * Apply the shared scope / kind / tag / predicate pre-filter to a set of indexed
179
+ * entries, returning the surviving records (unordered, unlimited).
180
+ * @public
181
+ */
182
+ export function selectByQuery(
183
+ entries: ReadonlyArray<IIndexedMemoryRecord>,
184
+ query: IMemoryQuery
185
+ ): IMemoryRecord<unknown>[] {
186
+ return entries.filter((entry) => indexedRecordMatchesQuery(entry, query)).map((entry) => entry.record);
187
+ }
188
+
189
+ /**
190
+ * Truncate to `query.limit` records (a no-op when `limit` is absent). Applied
191
+ * last, after ordering, so it always takes the top-N of the ordered result. A
192
+ * non-positive `limit` is public query input and means "no records" — it returns
193
+ * an empty array rather than letting a negative value slip into `slice`.
194
+ * @public
195
+ */
196
+ export function limitRecords(
197
+ records: ReadonlyArray<IMemoryRecord<unknown>>,
198
+ limit?: number
199
+ ): ReadonlyArray<IMemoryRecord<unknown>> {
200
+ if (limit === undefined) {
201
+ return records;
202
+ }
203
+ if (limit <= 0) {
204
+ return [];
205
+ }
206
+ return records.length > limit ? records.slice(0, limit) : records;
207
+ }
@@ -0,0 +1,147 @@
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 { IVectorIndex, IVectorQueryHit } from '../vector';
10
+ import {
11
+ IMemoryQuery,
12
+ IMemoryRetriever,
13
+ IMemoryRetrieverCapabilities,
14
+ SEMANTIC_UNWIRED_MESSAGE,
15
+ indexedRecordMatchesQuery,
16
+ limitRecords,
17
+ temporalUnwiredMessage
18
+ } from './retriever';
19
+
20
+ /**
21
+ * Embeds a query string into a vector for {@link IVectorIndex.query}. Async and
22
+ * `Result`-returning, since a real embedder does a network call.
23
+ * @public
24
+ */
25
+ export type QueryEmbedder = (text: string) => Promise<Result<Float32Array>>;
26
+
27
+ /**
28
+ * The semantic backend wired into a {@link SemanticRetriever}: the vector index
29
+ * to query and the embedder that turns the query text into a vector. Both are
30
+ * required together — a vector index is useless without a way to embed the
31
+ * query, so {@link SemanticRetriever.create} treats them as one unit.
32
+ * @public
33
+ */
34
+ export interface ISemanticBackend {
35
+ /** The vector index to query. */
36
+ readonly vectorIndex: IVectorIndex;
37
+ /** Turns the query text into a vector. */
38
+ readonly embedQuery: QueryEmbedder;
39
+ }
40
+
41
+ /**
42
+ * Construction options for {@link SemanticRetriever.create}.
43
+ * @public
44
+ */
45
+ export interface ISemanticRetrieverCreateParams {
46
+ /** The record index, used to resolve vector hits back to full records. */
47
+ readonly index: IMemoryIndex;
48
+ /**
49
+ * The semantic backend. When absent, the retriever reports
50
+ * `supportsSemanticRecall: false` and a `query.semantic` request degrades
51
+ * loudly ({@link SEMANTIC_UNWIRED_MESSAGE}) rather than returning empty.
52
+ */
53
+ readonly backend?: ISemanticBackend;
54
+ }
55
+
56
+ /**
57
+ * Vector-recall retriever. When a {@link ISemanticBackend | backend} is wired it
58
+ * embeds `query.semantic`, queries the vector index, and resolves the hits back
59
+ * to records (preserving vector score order). When no backend is wired,
60
+ * `supportsSemanticRecall` is `false` and any `query.semantic` request degrades
61
+ * loudly — it NEVER returns a silent empty.
62
+ *
63
+ * @remarks
64
+ * A consumer-supplied backend that rejects (throws) is normalized into a
65
+ * `Failure` — `retrieve` always honors its `Promise<Result<...>>` contract.
66
+ * @public
67
+ */
68
+ export class SemanticRetriever implements IMemoryRetriever {
69
+ private readonly _index: IMemoryIndex;
70
+ private readonly _backend: ISemanticBackend | undefined;
71
+
72
+ private constructor(index: IMemoryIndex, backend: ISemanticBackend | undefined) {
73
+ this._index = index;
74
+ this._backend = backend;
75
+ }
76
+
77
+ /** {@inheritDoc IMemoryRetriever.capabilities} */
78
+ public get capabilities(): IMemoryRetrieverCapabilities {
79
+ return {
80
+ supportsSemanticRecall: this._backend !== undefined,
81
+ supportsTemporalQuery: false,
82
+ supportsLinkTraversal: false
83
+ };
84
+ }
85
+
86
+ /** Family-convention factory. */
87
+ public static create(params: ISemanticRetrieverCreateParams): Result<SemanticRetriever> {
88
+ return succeed(new SemanticRetriever(params.index, params.backend));
89
+ }
90
+
91
+ /** {@inheritDoc IMemoryRetriever.retrieve} */
92
+ public async retrieve(query: IMemoryQuery): Promise<Result<ReadonlyArray<IMemoryRecord<unknown>>>> {
93
+ if (query.asOf !== undefined) {
94
+ return fail(temporalUnwiredMessage(query.kind));
95
+ }
96
+ if (query.semantic === undefined) {
97
+ // The semantic term is this retriever's axis; without it there is nothing
98
+ // to recall (a no-op contribution to a HybridRetriever, not a failure).
99
+ return succeed([]);
100
+ }
101
+ if (this._backend === undefined) {
102
+ return fail(SEMANTIC_UNWIRED_MESSAGE);
103
+ }
104
+ const backend: ISemanticBackend = this._backend;
105
+ // The backend hooks are consumer-supplied; a rejecting (throwing) impl must
106
+ // still surface as a `Failure`, never escape `retrieve` as a rejected
107
+ // promise. `_callBackend` normalizes both a returned `fail` and a rejection.
108
+ const embedded: Result<Float32Array> = await SemanticRetriever._callBackend('query embedding', () =>
109
+ backend.embedQuery(query.semantic as string)
110
+ );
111
+ if (embedded.isFailure()) {
112
+ return fail(embedded.message);
113
+ }
114
+ const hits: Result<ReadonlyArray<IVectorQueryHit>> = await SemanticRetriever._callBackend(
115
+ 'vector query',
116
+ () => backend.vectorIndex.query(embedded.value, query.topK ?? 10)
117
+ );
118
+ if (hits.isFailure()) {
119
+ return fail(hits.message);
120
+ }
121
+ const byId: Map<MemoryId, IIndexedMemoryRecord> = new Map(
122
+ this._index.entries().map((entry) => [entry.record.envelope.id, entry])
123
+ );
124
+ const records: IMemoryRecord<unknown>[] = [];
125
+ for (const hit of hits.value) {
126
+ const entry: IIndexedMemoryRecord | undefined = byId.get(hit.id);
127
+ if (entry !== undefined && indexedRecordMatchesQuery(entry, query)) {
128
+ records.push(entry.record);
129
+ }
130
+ }
131
+ return succeed(limitRecords(records, query.limit));
132
+ }
133
+
134
+ /**
135
+ * Invoke a consumer-supplied backend hook, normalizing both a returned `fail`
136
+ * and a thrown/rejected promise into a single `semantic recall: <label> failed`
137
+ * `Failure`. Keeps `retrieve` within the `Promise<Result<...>>` contract even
138
+ * when the injected `embedQuery` / `vectorIndex` misbehaves.
139
+ */
140
+ private static async _callBackend<T>(label: string, op: () => Promise<Result<T>>): Promise<Result<T>> {
141
+ try {
142
+ return (await op()).withErrorFormat((msg) => `semantic recall: ${label} failed: ${msg}`);
143
+ } catch (err) {
144
+ return fail(`semantic recall: ${label} failed: ${String(err)}`);
145
+ }
146
+ }
147
+ }
@@ -0,0 +1,58 @@
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 `query.filter`, narrowed by any scope / kind / tag
22
+ * pre-filter and recency-ordered. The predicate is this retriever's axis: a
23
+ * query without a `filter` is not its concern and yields an empty success (so it
24
+ * contributes nothing to a {@link HybridRetriever}, rather than failing).
25
+ * @public
26
+ */
27
+ export class StructuredFilterRetriever implements IMemoryRetriever {
28
+ private readonly _index: IMemoryIndex;
29
+
30
+ private constructor(index: IMemoryIndex) {
31
+ this._index = index;
32
+ }
33
+
34
+ /** {@inheritDoc IMemoryRetriever.capabilities} */
35
+ public get capabilities(): IMemoryRetrieverCapabilities {
36
+ return NON_SEMANTIC_CAPABILITIES;
37
+ }
38
+
39
+ /** Family-convention factory. */
40
+ public static create(index: IMemoryIndex): Result<StructuredFilterRetriever> {
41
+ return succeed(new StructuredFilterRetriever(index));
42
+ }
43
+
44
+ /** {@inheritDoc IMemoryRetriever.retrieve} */
45
+ public retrieve(query: IMemoryQuery): Promise<Result<ReadonlyArray<IMemoryRecord<unknown>>>> {
46
+ return Promise.resolve(
47
+ guardRetrieverCapabilities(query, this.capabilities).onSuccess(() => {
48
+ if (query.filter === undefined) {
49
+ return succeed([]);
50
+ }
51
+ const ordered: IMemoryRecord<unknown>[] = selectByQuery(this._index.entries(), query).sort(
52
+ recencyCompare
53
+ );
54
+ return succeed(limitRecords(ordered, query.limit));
55
+ })
56
+ );
57
+ }
58
+ }
@@ -0,0 +1,58 @@
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 carrying `query.tag`, recency-ordered within the tag and
22
+ * narrowed by any scope / kind / predicate filters. Tag is this retriever's
23
+ * axis: a query without a `tag` is not its concern and yields an empty success
24
+ * (so it contributes nothing to a {@link HybridRetriever}, rather than failing).
25
+ * @public
26
+ */
27
+ export class TagRetriever implements IMemoryRetriever {
28
+ private readonly _index: IMemoryIndex;
29
+
30
+ private constructor(index: IMemoryIndex) {
31
+ this._index = index;
32
+ }
33
+
34
+ /** {@inheritDoc IMemoryRetriever.capabilities} */
35
+ public get capabilities(): IMemoryRetrieverCapabilities {
36
+ return NON_SEMANTIC_CAPABILITIES;
37
+ }
38
+
39
+ /** Family-convention factory. */
40
+ public static create(index: IMemoryIndex): Result<TagRetriever> {
41
+ return succeed(new TagRetriever(index));
42
+ }
43
+
44
+ /** {@inheritDoc IMemoryRetriever.retrieve} */
45
+ public retrieve(query: IMemoryQuery): Promise<Result<ReadonlyArray<IMemoryRecord<unknown>>>> {
46
+ return Promise.resolve(
47
+ guardRetrieverCapabilities(query, this.capabilities).onSuccess(() => {
48
+ if (query.tag === undefined) {
49
+ return succeed([]);
50
+ }
51
+ const ordered: IMemoryRecord<unknown>[] = selectByQuery(this._index.entries(), query).sort(
52
+ recencyCompare
53
+ );
54
+ return succeed(limitRecords(ordered, query.limit));
55
+ })
56
+ );
57
+ }
58
+ }