@fgv/ts-agent-memory 5.1.0-47 → 5.1.0-49

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 (376) hide show
  1. package/dist/packlets/ingest/orchestrator.js +11 -1
  2. package/dist/packlets/ingest/orchestrator.js.map +1 -1
  3. package/dist/packlets/observe/memoryObservationStore.js +6 -0
  4. package/dist/packlets/observe/memoryObservationStore.js.map +1 -1
  5. package/dist/packlets/observe/observer.js.map +1 -1
  6. package/dist/packlets/retrieve/linkTraversalRetriever.js +1 -1
  7. package/dist/packlets/retrieve/linkTraversalRetriever.js.map +1 -1
  8. package/dist/packlets/retrieve/recencyRetriever.js +1 -1
  9. package/dist/packlets/retrieve/recencyRetriever.js.map +1 -1
  10. package/dist/packlets/retrieve/retriever.js +11 -5
  11. package/dist/packlets/retrieve/retriever.js.map +1 -1
  12. package/dist/packlets/retrieve/structuredFilterRetriever.js +27 -5
  13. package/dist/packlets/retrieve/structuredFilterRetriever.js.map +1 -1
  14. package/dist/packlets/retrieve/tagRetriever.js +1 -1
  15. package/dist/packlets/retrieve/tagRetriever.js.map +1 -1
  16. package/dist/packlets/retrieve/temporalRetrievers.js +1 -1
  17. package/dist/packlets/retrieve/temporalRetrievers.js.map +1 -1
  18. package/dist/packlets/store/fileTreeMemoryStore.js +152 -132
  19. package/dist/packlets/store/fileTreeMemoryStore.js.map +1 -1
  20. package/dist/packlets/store/vectorMaintenance.js +251 -0
  21. package/dist/packlets/store/vectorMaintenance.js.map +1 -0
  22. package/dist/packlets/types/envelope.js.map +1 -1
  23. package/dist/packlets/vector/inMemoryCosineIndex.js +81 -18
  24. package/dist/packlets/vector/inMemoryCosineIndex.js.map +1 -1
  25. package/dist/packlets/vector/inMemoryFragmentCosineIndex.js +7 -0
  26. package/dist/packlets/vector/inMemoryFragmentCosineIndex.js.map +1 -1
  27. package/dist/packlets/vector/vectorIndex.js.map +1 -1
  28. package/dist/ts-agent-memory.d.ts +431 -79
  29. package/lib/packlets/ingest/orchestrator.d.ts.map +1 -1
  30. package/lib/packlets/ingest/orchestrator.js +11 -1
  31. package/lib/packlets/ingest/orchestrator.js.map +1 -1
  32. package/lib/packlets/observe/memoryObservationStore.d.ts.map +1 -1
  33. package/lib/packlets/observe/memoryObservationStore.js +6 -0
  34. package/lib/packlets/observe/memoryObservationStore.js.map +1 -1
  35. package/lib/packlets/observe/observer.d.ts +61 -0
  36. package/lib/packlets/observe/observer.d.ts.map +1 -1
  37. package/lib/packlets/observe/observer.js.map +1 -1
  38. package/lib/packlets/retrieve/linkTraversalRetriever.d.ts +1 -1
  39. package/lib/packlets/retrieve/linkTraversalRetriever.js +1 -1
  40. package/lib/packlets/retrieve/linkTraversalRetriever.js.map +1 -1
  41. package/lib/packlets/retrieve/recencyRetriever.d.ts +1 -1
  42. package/lib/packlets/retrieve/recencyRetriever.js +1 -1
  43. package/lib/packlets/retrieve/recencyRetriever.js.map +1 -1
  44. package/lib/packlets/retrieve/retriever.d.ts +26 -7
  45. package/lib/packlets/retrieve/retriever.d.ts.map +1 -1
  46. package/lib/packlets/retrieve/retriever.js +11 -5
  47. package/lib/packlets/retrieve/retriever.js.map +1 -1
  48. package/lib/packlets/retrieve/structuredFilterRetriever.d.ts +26 -4
  49. package/lib/packlets/retrieve/structuredFilterRetriever.d.ts.map +1 -1
  50. package/lib/packlets/retrieve/structuredFilterRetriever.js +27 -5
  51. package/lib/packlets/retrieve/structuredFilterRetriever.js.map +1 -1
  52. package/lib/packlets/retrieve/tagRetriever.d.ts +1 -1
  53. package/lib/packlets/retrieve/tagRetriever.js +1 -1
  54. package/lib/packlets/retrieve/tagRetriever.js.map +1 -1
  55. package/lib/packlets/retrieve/temporalRetrievers.js +1 -1
  56. package/lib/packlets/retrieve/temporalRetrievers.js.map +1 -1
  57. package/lib/packlets/store/fileTreeMemoryStore.d.ts +135 -59
  58. package/lib/packlets/store/fileTreeMemoryStore.d.ts.map +1 -1
  59. package/lib/packlets/store/fileTreeMemoryStore.js +151 -131
  60. package/lib/packlets/store/fileTreeMemoryStore.js.map +1 -1
  61. package/lib/packlets/store/vectorMaintenance.d.ts +149 -0
  62. package/lib/packlets/store/vectorMaintenance.d.ts.map +1 -0
  63. package/lib/packlets/store/vectorMaintenance.js +255 -0
  64. package/lib/packlets/store/vectorMaintenance.js.map +1 -0
  65. package/lib/packlets/types/envelope.d.ts +11 -0
  66. package/lib/packlets/types/envelope.d.ts.map +1 -1
  67. package/lib/packlets/types/envelope.js.map +1 -1
  68. package/lib/packlets/vector/inMemoryCosineIndex.d.ts +30 -7
  69. package/lib/packlets/vector/inMemoryCosineIndex.d.ts.map +1 -1
  70. package/lib/packlets/vector/inMemoryCosineIndex.js +80 -17
  71. package/lib/packlets/vector/inMemoryCosineIndex.js.map +1 -1
  72. package/lib/packlets/vector/inMemoryFragmentCosineIndex.d.ts +7 -0
  73. package/lib/packlets/vector/inMemoryFragmentCosineIndex.d.ts.map +1 -1
  74. package/lib/packlets/vector/inMemoryFragmentCosineIndex.js +7 -0
  75. package/lib/packlets/vector/inMemoryFragmentCosineIndex.js.map +1 -1
  76. package/lib/packlets/vector/vectorIndex.d.ts +129 -1
  77. package/lib/packlets/vector/vectorIndex.d.ts.map +1 -1
  78. package/lib/packlets/vector/vectorIndex.js.map +1 -1
  79. package/package.json +17 -7
  80. package/.rush/temp/5667e36f1c0cc503a5c20a3ebff76e7b9a702d41.tar.log +0 -468
  81. package/.rush/temp/chunked-rush-logs/ts-agent-memory.build.chunks.jsonl +0 -9
  82. package/.rush/temp/operation/build/all.log +0 -9
  83. package/.rush/temp/operation/build/log-chunks.jsonl +0 -9
  84. package/.rush/temp/operation/build/state.json +0 -3
  85. package/.rush/temp/shrinkwrap-deps.json +0 -689
  86. package/config/api-extractor.json +0 -343
  87. package/config/jest.config.json +0 -14
  88. package/config/rig.json +0 -4
  89. package/dist/test/unit/converters/antagonistRoundTrip.test.js +0 -95
  90. package/dist/test/unit/converters/antagonistRoundTrip.test.js.map +0 -1
  91. package/dist/test/unit/converters/bodyConverterRegistry.test.js +0 -72
  92. package/dist/test/unit/converters/bodyConverterRegistry.test.js.map +0 -1
  93. package/dist/test/unit/converters/envelopeConverter.test.js +0 -313
  94. package/dist/test/unit/converters/envelopeConverter.test.js.map +0 -1
  95. package/dist/test/unit/index/memoryIndex.test.js +0 -214
  96. package/dist/test/unit/index/memoryIndex.test.js.map +0 -1
  97. package/dist/test/unit/ingest/antagonistCycleAndParity.test.js +0 -277
  98. package/dist/test/unit/ingest/antagonistCycleAndParity.test.js.map +0 -1
  99. package/dist/test/unit/ingest/cycleGuard.test.js +0 -81
  100. package/dist/test/unit/ingest/cycleGuard.test.js.map +0 -1
  101. package/dist/test/unit/ingest/dedupScope.test.js +0 -434
  102. package/dist/test/unit/ingest/dedupScope.test.js.map +0 -1
  103. package/dist/test/unit/ingest/orchestrator.test.js +0 -1058
  104. package/dist/test/unit/ingest/orchestrator.test.js.map +0 -1
  105. package/dist/test/unit/observe/memoryObservationStore.test.js +0 -118
  106. package/dist/test/unit/observe/memoryObservationStore.test.js.map +0 -1
  107. package/dist/test/unit/retrieve/fragmentSemanticRetriever.test.js +0 -116
  108. package/dist/test/unit/retrieve/fragmentSemanticRetriever.test.js.map +0 -1
  109. package/dist/test/unit/retrieve/linkTraversalRetriever.test.js +0 -257
  110. package/dist/test/unit/retrieve/linkTraversalRetriever.test.js.map +0 -1
  111. package/dist/test/unit/retrieve/retrievers.test.js +0 -768
  112. package/dist/test/unit/retrieve/retrievers.test.js.map +0 -1
  113. package/dist/test/unit/retrieve/temporalRetrievers.test.js +0 -182
  114. package/dist/test/unit/retrieve/temporalRetrievers.test.js.map +0 -1
  115. package/dist/test/unit/store/antagonistTemporalBoundary.test.js +0 -120
  116. package/dist/test/unit/store/antagonistTemporalBoundary.test.js.map +0 -1
  117. package/dist/test/unit/store/embedOnWrite.test.js +0 -317
  118. package/dist/test/unit/store/embedOnWrite.test.js.map +0 -1
  119. package/dist/test/unit/store/fileTreeMemoryStore.test.js +0 -778
  120. package/dist/test/unit/store/fileTreeMemoryStore.test.js.map +0 -1
  121. package/dist/test/unit/store/fragmentEmbedOnWrite.test.js +0 -255
  122. package/dist/test/unit/store/fragmentEmbedOnWrite.test.js.map +0 -1
  123. package/dist/test/unit/store/indexInjection.test.js +0 -432
  124. package/dist/test/unit/store/indexInjection.test.js.map +0 -1
  125. package/dist/test/unit/store/lenientOpen.test.js +0 -248
  126. package/dist/test/unit/store/lenientOpen.test.js.map +0 -1
  127. package/dist/test/unit/store/listScoped.test.js +0 -109
  128. package/dist/test/unit/store/listScoped.test.js.map +0 -1
  129. package/dist/test/unit/store/observations.test.js +0 -239
  130. package/dist/test/unit/store/observations.test.js.map +0 -1
  131. package/dist/test/unit/store/rankAxis.test.js +0 -254
  132. package/dist/test/unit/store/rankAxis.test.js.map +0 -1
  133. package/dist/test/unit/store/scopeEncoding.test.js +0 -24
  134. package/dist/test/unit/store/scopeEncoding.test.js.map +0 -1
  135. package/dist/test/unit/store/temporalStore.test.js +0 -398
  136. package/dist/test/unit/store/temporalStore.test.js.map +0 -1
  137. package/dist/test/unit/tools/memoryTools.test.js +0 -842
  138. package/dist/test/unit/tools/memoryTools.test.js.map +0 -1
  139. package/dist/test/unit/types/identityCodec.test.js +0 -187
  140. package/dist/test/unit/types/identityCodec.test.js.map +0 -1
  141. package/dist/test/unit/types/ids.test.js +0 -84
  142. package/dist/test/unit/types/ids.test.js.map +0 -1
  143. package/dist/test/unit/types/temporalCodec.test.js +0 -203
  144. package/dist/test/unit/types/temporalCodec.test.js.map +0 -1
  145. package/dist/test/unit/types/temporalPolicy.test.js +0 -83
  146. package/dist/test/unit/types/temporalPolicy.test.js.map +0 -1
  147. package/dist/test/unit/types/writePolicy.test.js +0 -331
  148. package/dist/test/unit/types/writePolicy.test.js.map +0 -1
  149. package/dist/test/unit/vector/fragmentConverters.test.js +0 -58
  150. package/dist/test/unit/vector/fragmentConverters.test.js.map +0 -1
  151. package/dist/test/unit/vector/inMemoryCosineIndex.test.js +0 -252
  152. package/dist/test/unit/vector/inMemoryCosineIndex.test.js.map +0 -1
  153. package/dist/test/unit/vector/inMemoryFragmentCosineIndex.test.js +0 -362
  154. package/dist/test/unit/vector/inMemoryFragmentCosineIndex.test.js.map +0 -1
  155. package/dist/test/unit/vector/vectorIndex.test.js +0 -51
  156. package/dist/test/unit/vector/vectorIndex.test.js.map +0 -1
  157. package/eslint.config.js +0 -15
  158. package/etc/ts-agent-memory.api.md +0 -940
  159. package/lib/test/unit/converters/antagonistRoundTrip.test.d.ts +0 -10
  160. package/lib/test/unit/converters/antagonistRoundTrip.test.d.ts.map +0 -1
  161. package/lib/test/unit/converters/antagonistRoundTrip.test.js +0 -97
  162. package/lib/test/unit/converters/antagonistRoundTrip.test.js.map +0 -1
  163. package/lib/test/unit/converters/bodyConverterRegistry.test.d.ts +0 -2
  164. package/lib/test/unit/converters/bodyConverterRegistry.test.d.ts.map +0 -1
  165. package/lib/test/unit/converters/bodyConverterRegistry.test.js +0 -74
  166. package/lib/test/unit/converters/bodyConverterRegistry.test.js.map +0 -1
  167. package/lib/test/unit/converters/envelopeConverter.test.d.ts +0 -2
  168. package/lib/test/unit/converters/envelopeConverter.test.d.ts.map +0 -1
  169. package/lib/test/unit/converters/envelopeConverter.test.js +0 -315
  170. package/lib/test/unit/converters/envelopeConverter.test.js.map +0 -1
  171. package/lib/test/unit/index/memoryIndex.test.d.ts +0 -2
  172. package/lib/test/unit/index/memoryIndex.test.d.ts.map +0 -1
  173. package/lib/test/unit/index/memoryIndex.test.js +0 -216
  174. package/lib/test/unit/index/memoryIndex.test.js.map +0 -1
  175. package/lib/test/unit/ingest/antagonistCycleAndParity.test.d.ts +0 -9
  176. package/lib/test/unit/ingest/antagonistCycleAndParity.test.d.ts.map +0 -1
  177. package/lib/test/unit/ingest/antagonistCycleAndParity.test.js +0 -279
  178. package/lib/test/unit/ingest/antagonistCycleAndParity.test.js.map +0 -1
  179. package/lib/test/unit/ingest/cycleGuard.test.d.ts +0 -2
  180. package/lib/test/unit/ingest/cycleGuard.test.d.ts.map +0 -1
  181. package/lib/test/unit/ingest/cycleGuard.test.js +0 -83
  182. package/lib/test/unit/ingest/cycleGuard.test.js.map +0 -1
  183. package/lib/test/unit/ingest/dedupScope.test.d.ts +0 -2
  184. package/lib/test/unit/ingest/dedupScope.test.d.ts.map +0 -1
  185. package/lib/test/unit/ingest/dedupScope.test.js +0 -436
  186. package/lib/test/unit/ingest/dedupScope.test.js.map +0 -1
  187. package/lib/test/unit/ingest/orchestrator.test.d.ts +0 -2
  188. package/lib/test/unit/ingest/orchestrator.test.d.ts.map +0 -1
  189. package/lib/test/unit/ingest/orchestrator.test.js +0 -1060
  190. package/lib/test/unit/ingest/orchestrator.test.js.map +0 -1
  191. package/lib/test/unit/observe/memoryObservationStore.test.d.ts +0 -2
  192. package/lib/test/unit/observe/memoryObservationStore.test.d.ts.map +0 -1
  193. package/lib/test/unit/observe/memoryObservationStore.test.js +0 -120
  194. package/lib/test/unit/observe/memoryObservationStore.test.js.map +0 -1
  195. package/lib/test/unit/retrieve/fragmentSemanticRetriever.test.d.ts +0 -2
  196. package/lib/test/unit/retrieve/fragmentSemanticRetriever.test.d.ts.map +0 -1
  197. package/lib/test/unit/retrieve/fragmentSemanticRetriever.test.js +0 -118
  198. package/lib/test/unit/retrieve/fragmentSemanticRetriever.test.js.map +0 -1
  199. package/lib/test/unit/retrieve/linkTraversalRetriever.test.d.ts +0 -2
  200. package/lib/test/unit/retrieve/linkTraversalRetriever.test.d.ts.map +0 -1
  201. package/lib/test/unit/retrieve/linkTraversalRetriever.test.js +0 -259
  202. package/lib/test/unit/retrieve/linkTraversalRetriever.test.js.map +0 -1
  203. package/lib/test/unit/retrieve/retrievers.test.d.ts +0 -2
  204. package/lib/test/unit/retrieve/retrievers.test.d.ts.map +0 -1
  205. package/lib/test/unit/retrieve/retrievers.test.js +0 -770
  206. package/lib/test/unit/retrieve/retrievers.test.js.map +0 -1
  207. package/lib/test/unit/retrieve/temporalRetrievers.test.d.ts +0 -2
  208. package/lib/test/unit/retrieve/temporalRetrievers.test.d.ts.map +0 -1
  209. package/lib/test/unit/retrieve/temporalRetrievers.test.js +0 -184
  210. package/lib/test/unit/retrieve/temporalRetrievers.test.js.map +0 -1
  211. package/lib/test/unit/store/antagonistTemporalBoundary.test.d.ts +0 -9
  212. package/lib/test/unit/store/antagonistTemporalBoundary.test.d.ts.map +0 -1
  213. package/lib/test/unit/store/antagonistTemporalBoundary.test.js +0 -122
  214. package/lib/test/unit/store/antagonistTemporalBoundary.test.js.map +0 -1
  215. package/lib/test/unit/store/embedOnWrite.test.d.ts +0 -2
  216. package/lib/test/unit/store/embedOnWrite.test.d.ts.map +0 -1
  217. package/lib/test/unit/store/embedOnWrite.test.js +0 -319
  218. package/lib/test/unit/store/embedOnWrite.test.js.map +0 -1
  219. package/lib/test/unit/store/fileTreeMemoryStore.test.d.ts +0 -2
  220. package/lib/test/unit/store/fileTreeMemoryStore.test.d.ts.map +0 -1
  221. package/lib/test/unit/store/fileTreeMemoryStore.test.js +0 -780
  222. package/lib/test/unit/store/fileTreeMemoryStore.test.js.map +0 -1
  223. package/lib/test/unit/store/fragmentEmbedOnWrite.test.d.ts +0 -2
  224. package/lib/test/unit/store/fragmentEmbedOnWrite.test.d.ts.map +0 -1
  225. package/lib/test/unit/store/fragmentEmbedOnWrite.test.js +0 -257
  226. package/lib/test/unit/store/fragmentEmbedOnWrite.test.js.map +0 -1
  227. package/lib/test/unit/store/indexInjection.test.d.ts +0 -2
  228. package/lib/test/unit/store/indexInjection.test.d.ts.map +0 -1
  229. package/lib/test/unit/store/indexInjection.test.js +0 -434
  230. package/lib/test/unit/store/indexInjection.test.js.map +0 -1
  231. package/lib/test/unit/store/lenientOpen.test.d.ts +0 -2
  232. package/lib/test/unit/store/lenientOpen.test.d.ts.map +0 -1
  233. package/lib/test/unit/store/lenientOpen.test.js +0 -250
  234. package/lib/test/unit/store/lenientOpen.test.js.map +0 -1
  235. package/lib/test/unit/store/listScoped.test.d.ts +0 -2
  236. package/lib/test/unit/store/listScoped.test.d.ts.map +0 -1
  237. package/lib/test/unit/store/listScoped.test.js +0 -111
  238. package/lib/test/unit/store/listScoped.test.js.map +0 -1
  239. package/lib/test/unit/store/observations.test.d.ts +0 -2
  240. package/lib/test/unit/store/observations.test.d.ts.map +0 -1
  241. package/lib/test/unit/store/observations.test.js +0 -241
  242. package/lib/test/unit/store/observations.test.js.map +0 -1
  243. package/lib/test/unit/store/rankAxis.test.d.ts +0 -2
  244. package/lib/test/unit/store/rankAxis.test.d.ts.map +0 -1
  245. package/lib/test/unit/store/rankAxis.test.js +0 -256
  246. package/lib/test/unit/store/rankAxis.test.js.map +0 -1
  247. package/lib/test/unit/store/scopeEncoding.test.d.ts +0 -2
  248. package/lib/test/unit/store/scopeEncoding.test.d.ts.map +0 -1
  249. package/lib/test/unit/store/scopeEncoding.test.js +0 -26
  250. package/lib/test/unit/store/scopeEncoding.test.js.map +0 -1
  251. package/lib/test/unit/store/temporalStore.test.d.ts +0 -2
  252. package/lib/test/unit/store/temporalStore.test.d.ts.map +0 -1
  253. package/lib/test/unit/store/temporalStore.test.js +0 -400
  254. package/lib/test/unit/store/temporalStore.test.js.map +0 -1
  255. package/lib/test/unit/tools/memoryTools.test.d.ts +0 -2
  256. package/lib/test/unit/tools/memoryTools.test.d.ts.map +0 -1
  257. package/lib/test/unit/tools/memoryTools.test.js +0 -844
  258. package/lib/test/unit/tools/memoryTools.test.js.map +0 -1
  259. package/lib/test/unit/types/identityCodec.test.d.ts +0 -2
  260. package/lib/test/unit/types/identityCodec.test.d.ts.map +0 -1
  261. package/lib/test/unit/types/identityCodec.test.js +0 -189
  262. package/lib/test/unit/types/identityCodec.test.js.map +0 -1
  263. package/lib/test/unit/types/ids.test.d.ts +0 -2
  264. package/lib/test/unit/types/ids.test.d.ts.map +0 -1
  265. package/lib/test/unit/types/ids.test.js +0 -86
  266. package/lib/test/unit/types/ids.test.js.map +0 -1
  267. package/lib/test/unit/types/temporalCodec.test.d.ts +0 -2
  268. package/lib/test/unit/types/temporalCodec.test.d.ts.map +0 -1
  269. package/lib/test/unit/types/temporalCodec.test.js +0 -205
  270. package/lib/test/unit/types/temporalCodec.test.js.map +0 -1
  271. package/lib/test/unit/types/temporalPolicy.test.d.ts +0 -2
  272. package/lib/test/unit/types/temporalPolicy.test.d.ts.map +0 -1
  273. package/lib/test/unit/types/temporalPolicy.test.js +0 -85
  274. package/lib/test/unit/types/temporalPolicy.test.js.map +0 -1
  275. package/lib/test/unit/types/writePolicy.test.d.ts +0 -2
  276. package/lib/test/unit/types/writePolicy.test.d.ts.map +0 -1
  277. package/lib/test/unit/types/writePolicy.test.js +0 -333
  278. package/lib/test/unit/types/writePolicy.test.js.map +0 -1
  279. package/lib/test/unit/vector/fragmentConverters.test.d.ts +0 -2
  280. package/lib/test/unit/vector/fragmentConverters.test.d.ts.map +0 -1
  281. package/lib/test/unit/vector/fragmentConverters.test.js +0 -60
  282. package/lib/test/unit/vector/fragmentConverters.test.js.map +0 -1
  283. package/lib/test/unit/vector/inMemoryCosineIndex.test.d.ts +0 -2
  284. package/lib/test/unit/vector/inMemoryCosineIndex.test.d.ts.map +0 -1
  285. package/lib/test/unit/vector/inMemoryCosineIndex.test.js +0 -254
  286. package/lib/test/unit/vector/inMemoryCosineIndex.test.js.map +0 -1
  287. package/lib/test/unit/vector/inMemoryFragmentCosineIndex.test.d.ts +0 -2
  288. package/lib/test/unit/vector/inMemoryFragmentCosineIndex.test.d.ts.map +0 -1
  289. package/lib/test/unit/vector/inMemoryFragmentCosineIndex.test.js +0 -364
  290. package/lib/test/unit/vector/inMemoryFragmentCosineIndex.test.js.map +0 -1
  291. package/lib/test/unit/vector/vectorIndex.test.d.ts +0 -2
  292. package/lib/test/unit/vector/vectorIndex.test.d.ts.map +0 -1
  293. package/lib/test/unit/vector/vectorIndex.test.js +0 -53
  294. package/lib/test/unit/vector/vectorIndex.test.js.map +0 -1
  295. package/rush-logs/ts-agent-memory.build.cache.log +0 -3
  296. package/rush-logs/ts-agent-memory.build.log +0 -9
  297. package/src/index.ts +0 -14
  298. package/src/packlets/converters/bodyConverterRegistry.ts +0 -105
  299. package/src/packlets/converters/envelopeConverter.ts +0 -233
  300. package/src/packlets/converters/index.ts +0 -7
  301. package/src/packlets/index/index.ts +0 -6
  302. package/src/packlets/index/memoryIndex.ts +0 -332
  303. package/src/packlets/ingest/cycleGuard.ts +0 -153
  304. package/src/packlets/ingest/hostStages.ts +0 -111
  305. package/src/packlets/ingest/index.ts +0 -9
  306. package/src/packlets/ingest/model.ts +0 -195
  307. package/src/packlets/ingest/orchestrator.ts +0 -968
  308. package/src/packlets/observe/index.ts +0 -7
  309. package/src/packlets/observe/memoryObservationStore.ts +0 -153
  310. package/src/packlets/observe/observer.ts +0 -119
  311. package/src/packlets/retrieve/fragmentSemanticRetriever.ts +0 -138
  312. package/src/packlets/retrieve/hybridRetriever.ts +0 -194
  313. package/src/packlets/retrieve/index.ts +0 -14
  314. package/src/packlets/retrieve/linkTraversalRetriever.ts +0 -158
  315. package/src/packlets/retrieve/recencyRetriever.ts +0 -54
  316. package/src/packlets/retrieve/retriever.ts +0 -291
  317. package/src/packlets/retrieve/semanticRetriever.ts +0 -152
  318. package/src/packlets/retrieve/structuredFilterRetriever.ts +0 -58
  319. package/src/packlets/retrieve/tagRetriever.ts +0 -58
  320. package/src/packlets/retrieve/temporalRetrievers.ts +0 -210
  321. package/src/packlets/store/fileTreeMemoryStore.ts +0 -1872
  322. package/src/packlets/store/index.ts +0 -7
  323. package/src/packlets/store/scopeEncoding.ts +0 -36
  324. package/src/packlets/tools/index.ts +0 -6
  325. package/src/packlets/tools/memoryTools.ts +0 -706
  326. package/src/packlets/types/envelope.ts +0 -196
  327. package/src/packlets/types/filenameSafety.ts +0 -57
  328. package/src/packlets/types/identityCodec.ts +0 -447
  329. package/src/packlets/types/ids.ts +0 -124
  330. package/src/packlets/types/index.ts +0 -11
  331. package/src/packlets/types/temporal.ts +0 -96
  332. package/src/packlets/types/writePolicy.ts +0 -612
  333. package/src/packlets/vector/fragmentConverters.ts +0 -55
  334. package/src/packlets/vector/inMemoryCosineIndex.ts +0 -196
  335. package/src/packlets/vector/inMemoryFragmentCosineIndex.ts +0 -289
  336. package/src/packlets/vector/index.ts +0 -9
  337. package/src/packlets/vector/vectorIndex.ts +0 -273
  338. package/src/test/unit/converters/antagonistRoundTrip.test.ts +0 -110
  339. package/src/test/unit/converters/bodyConverterRegistry.test.ts +0 -89
  340. package/src/test/unit/converters/envelopeConverter.test.ts +0 -418
  341. package/src/test/unit/index/memoryIndex.test.ts +0 -272
  342. package/src/test/unit/ingest/antagonistCycleAndParity.test.ts +0 -367
  343. package/src/test/unit/ingest/cycleGuard.test.ts +0 -110
  344. package/src/test/unit/ingest/dedupScope.test.ts +0 -542
  345. package/src/test/unit/ingest/orchestrator.test.ts +0 -1355
  346. package/src/test/unit/observe/memoryObservationStore.test.ts +0 -158
  347. package/src/test/unit/retrieve/fragmentSemanticRetriever.test.ts +0 -163
  348. package/src/test/unit/retrieve/linkTraversalRetriever.test.ts +0 -329
  349. package/src/test/unit/retrieve/retrievers.test.ts +0 -1018
  350. package/src/test/unit/retrieve/temporalRetrievers.test.ts +0 -226
  351. package/src/test/unit/store/antagonistTemporalBoundary.test.ts +0 -158
  352. package/src/test/unit/store/embedOnWrite.test.ts +0 -418
  353. package/src/test/unit/store/fileTreeMemoryStore.test.ts +0 -1041
  354. package/src/test/unit/store/fragmentEmbedOnWrite.test.ts +0 -349
  355. package/src/test/unit/store/indexInjection.test.ts +0 -550
  356. package/src/test/unit/store/lenientOpen.test.ts +0 -292
  357. package/src/test/unit/store/listScoped.test.ts +0 -138
  358. package/src/test/unit/store/observations.test.ts +0 -290
  359. package/src/test/unit/store/rankAxis.test.ts +0 -349
  360. package/src/test/unit/store/scopeEncoding.test.ts +0 -37
  361. package/src/test/unit/store/temporalStore.test.ts +0 -469
  362. package/src/test/unit/tools/memoryTools.test.ts +0 -1121
  363. package/src/test/unit/types/identityCodec.test.ts +0 -266
  364. package/src/test/unit/types/ids.test.ts +0 -94
  365. package/src/test/unit/types/temporalCodec.test.ts +0 -259
  366. package/src/test/unit/types/temporalPolicy.test.ts +0 -124
  367. package/src/test/unit/types/writePolicy.test.ts +0 -446
  368. package/src/test/unit/vector/fragmentConverters.test.ts +0 -80
  369. package/src/test/unit/vector/inMemoryCosineIndex.test.ts +0 -318
  370. package/src/test/unit/vector/inMemoryFragmentCosineIndex.test.ts +0 -477
  371. package/src/test/unit/vector/vectorIndex.test.ts +0 -64
  372. package/temp/build/lint/_eslint-5eVG3S6w.json +0 -306
  373. package/temp/build/typescript/ts_8nwakTlr.json +0 -1
  374. package/temp/ts-agent-memory.api.json +0 -21030
  375. package/temp/ts-agent-memory.api.md +0 -940
  376. package/tsconfig.json +0 -8
@@ -1,418 +0,0 @@
1
- /*
2
- * Copyright (c) 2026 Erik Fortune
3
- * SPDX-License-Identifier: MIT
4
- */
5
-
6
- import '@fgv/ts-utils-jest';
7
- import { Converters, Logging, Result, fail, succeed } from '@fgv/ts-utils';
8
- import { FileTree } from '@fgv/ts-json-base';
9
- import {
10
- BodyConverterRegistry,
11
- FileTreeMemoryStore,
12
- IBodyConverterRegistry,
13
- IEdgeTarget,
14
- IIdentityCodec,
15
- IIndexedMemoryRecord,
16
- IMemoryRecord,
17
- IVectorIndex,
18
- IVectorQueryHit,
19
- InMemoryCosineIndex,
20
- Kind,
21
- KnowledgeIdentityCodec,
22
- MemoryCapCullPolicy,
23
- EntityId,
24
- MemoryId,
25
- MemoryIndex,
26
- MemoryScopeKey,
27
- MtmIdentityCodec,
28
- IWritePolicy,
29
- SemanticRetriever,
30
- TemporalIdentityCodec,
31
- TemporalVersionedPolicy,
32
- envelopeConverter
33
- } from '../../../index';
34
-
35
- const knowledgeKind: Kind = 'knowledge' as Kind;
36
- const mtmKind: Kind = 'mtm' as Kind;
37
- const factKind: Kind = 'fact' as Kind;
38
-
39
- function mutableRoot(): FileTree.IMutableFileTreeDirectoryItem {
40
- const tree = FileTree.inMemory([], { mutable: true }).orThrow();
41
- const root = tree.getDirectory('/').orThrow();
42
- if (!FileTree.isMutableDirectoryItem(root)) {
43
- throw new Error('expected a mutable root directory');
44
- }
45
- return root;
46
- }
47
-
48
- function makeRecord(
49
- id: string,
50
- body: string,
51
- kind: string = 'knowledge',
52
- entityId?: string
53
- ): IMemoryRecord<unknown> {
54
- return {
55
- envelope: envelopeConverter
56
- .convert({
57
- id,
58
- entityId: entityId ?? id,
59
- kind,
60
- tags: [],
61
- links: [],
62
- created: 0,
63
- updated: 0,
64
- seq: 0,
65
- contentHash: '',
66
- provenance: { source: 'agent' }
67
- })
68
- .orThrow(),
69
- body
70
- };
71
- }
72
-
73
- /**
74
- * Deterministic keyword-count embedder (no network). Counts occurrences of three
75
- * marker words, so a record's vector and a query's vector live in the same space
76
- * and cosine ordering is fully predictable.
77
- */
78
- const MARKERS: ReadonlyArray<string> = ['cat', 'dog', 'fish'];
79
- function featureVector(text: string): Float32Array {
80
- const lower: string = text.toLowerCase();
81
- return Float32Array.from(MARKERS.map((m) => lower.split(m).length - 1));
82
- }
83
- const recordEmbed = (r: IMemoryRecord<unknown>): Promise<Result<Float32Array>> =>
84
- // A real embedder receives an `IMemoryRecord<unknown>` and must validate the
85
- // body through a Converter rather than casting — this models that idiom.
86
- Promise.resolve(
87
- Converters.string
88
- .convert(r.body)
89
- .withErrorFormat((msg) => `cannot embed: body is not a string: ${msg}`)
90
- .onSuccess((body) => succeed(featureVector(body)))
91
- );
92
- const queryEmbed = (text: string): Promise<Result<Float32Array>> =>
93
- Promise.resolve(succeed(featureVector(text)));
94
-
95
- /** Records add/remove call order and can be configured to fail either op. */
96
- class SpyVectorIndex implements IVectorIndex {
97
- public readonly calls: string[] = [];
98
- public failAdd: boolean = false;
99
- public failRemove: boolean = false;
100
- private readonly _inner: InMemoryCosineIndex = InMemoryCosineIndex.create().orThrow();
101
-
102
- public async add(target: IEdgeTarget, vector: Float32Array): Promise<Result<string>> {
103
- this.calls.push(`add:${target.id}`);
104
- return this.failAdd ? fail('add boom') : this._inner.add(target, vector);
105
- }
106
- public async remove(target: IEdgeTarget): Promise<Result<IEdgeTarget>> {
107
- this.calls.push(`remove:${target.id}`);
108
- return this.failRemove ? fail('remove boom') : this._inner.remove(target);
109
- }
110
- public query(vector: Float32Array, topK: number): Promise<Result<ReadonlyArray<IVectorQueryHit>>> {
111
- return this._inner.query(vector, topK);
112
- }
113
- }
114
-
115
- function knowledgeStore(
116
- vectorIndex?: IVectorIndex,
117
- embed?: (r: IMemoryRecord<unknown>) => Promise<Result<Float32Array>>,
118
- logger?: Logging.ILogger
119
- ): FileTreeMemoryStore {
120
- const registry: IBodyConverterRegistry = BodyConverterRegistry.create().orThrow();
121
- registry.register(knowledgeKind, Converters.string);
122
- return FileTreeMemoryStore.create({
123
- root: mutableRoot(),
124
- registry,
125
- codecs: new Map<Kind, IIdentityCodec>([[knowledgeKind, new KnowledgeIdentityCodec()]]),
126
- vectorIndex,
127
- embed,
128
- logger
129
- }).orThrow();
130
- }
131
-
132
- describe('FileTreeMemoryStore embed-on-write', () => {
133
- describe('when wired', () => {
134
- test('embeds on write, stamps embeddingRef, and indexes the vector', async () => {
135
- const index = InMemoryCosineIndex.create().orThrow();
136
- const store = knowledgeStore(index, recordEmbed);
137
- expect(await store.put(makeRecord('doc-a', 'cat cat'))).toSucceedAndSatisfy(
138
- (record: IMemoryRecord<unknown>) => {
139
- // InMemoryCosineIndex keys entries by the scope-qualified target, so the
140
- // ref IS that canonical key (scope + NUL + id).
141
- expect(record.envelope.embeddingRef).toBe('knowledge\0doc-a');
142
- }
143
- );
144
- expect(index.size).toBe(1);
145
- // The persisted file carries the embeddingRef (round-trips through disk).
146
- expect(await store.getById('knowledge' as MemoryScopeKey, 'doc-a' as MemoryId)).toSucceedAndSatisfy(
147
- (record: IMemoryRecord<unknown> | undefined) => {
148
- expect(record?.envelope.embeddingRef).toBe('knowledge\0doc-a');
149
- }
150
- );
151
- // The vector is queryable.
152
- expect(await index.query(featureVector('cat'), 1)).toSucceedAndSatisfy(
153
- (hits: ReadonlyArray<IVectorQueryHit>) => {
154
- expect(hits[0].target.id).toBe('doc-a');
155
- }
156
- );
157
- });
158
-
159
- test('re-embeds on a content change by re-adding (replace semantics, no eager remove)', async () => {
160
- const spy = new SpyVectorIndex();
161
- const store = knowledgeStore(spy, recordEmbed);
162
- (await store.put(makeRecord('doc-a', 'cat'))).orThrow();
163
- (await store.put(makeRecord('doc-a', 'dog'))).orThrow();
164
- // The content change re-adds (IVectorIndex.add replaces for a same id) —
165
- // no redundant eager remove.
166
- expect(spy.calls).toEqual(['add:doc-a', 'add:doc-a']);
167
- // The index now reflects the new content ('dog'), not the original.
168
- expect(await spy.query(featureVector('dog'), 1)).toSucceedAndSatisfy(
169
- (hits: ReadonlyArray<IVectorQueryHit>) => {
170
- expect(hits[0].score).toBeCloseTo(1);
171
- }
172
- );
173
- });
174
-
175
- test('does not re-embed a dedup no-op (identical content)', async () => {
176
- const spy = new SpyVectorIndex();
177
- const store = knowledgeStore(spy, recordEmbed);
178
- (await store.put(makeRecord('doc-a', 'cat'))).orThrow();
179
- (await store.put(makeRecord('doc-a', 'cat'))).orThrow();
180
- // The second identical put is a content-dedup no-op — no second embedding.
181
- expect(spy.calls).toEqual(['add:doc-a']);
182
- });
183
-
184
- test('removes the vector on delete', async () => {
185
- const spy = new SpyVectorIndex();
186
- const store = knowledgeStore(spy, recordEmbed);
187
- (await store.put(makeRecord('doc-a', 'cat'))).orThrow();
188
- expect(await store.delete(knowledgeKind, 'doc-a' as unknown as EntityId)).toSucceedWith(
189
- 'doc-a' as MemoryId
190
- );
191
- expect(spy.calls).toEqual(['add:doc-a', 'remove:doc-a']);
192
- expect(await spy.query(featureVector('cat'), 5)).toSucceedWith([]);
193
- });
194
-
195
- test('removes evicted vectors on cap-cull eviction', async () => {
196
- const index = InMemoryCosineIndex.create().orThrow();
197
- const capCull: IWritePolicy = MemoryCapCullPolicy.create({
198
- maxRecords: 2,
199
- mutableFields: ['body', 'tags', 'links', 'provenance', 'embeddingRef']
200
- }).orThrow();
201
- const registry: IBodyConverterRegistry = BodyConverterRegistry.create().orThrow();
202
- registry.register(mtmKind, Converters.string);
203
- const store = FileTreeMemoryStore.create({
204
- root: mutableRoot(),
205
- registry,
206
- codecs: new Map<Kind, IIdentityCodec>([[mtmKind, new MtmIdentityCodec()]]),
207
- writePolicies: new Map<Kind, IWritePolicy>([[mtmKind, capCull]]),
208
- vectorIndex: index,
209
- embed: recordEmbed
210
- }).orThrow();
211
-
212
- // Distinct bodies so each gets a distinct vector; maxRecords=2 evicts the
213
- // oldest on the third write.
214
- (await store.put(makeRecord('turn-0', 'cat', 'mtm', 'conv-1:0'))).orThrow();
215
- (await store.put(makeRecord('turn-1', 'dog', 'mtm', 'conv-1:1'))).orThrow();
216
- (await store.put(makeRecord('turn-2', 'fish', 'mtm', 'conv-1:2'))).orThrow();
217
- // turn-0 was evicted from the store AND the vector index.
218
- expect(index.size).toBe(2);
219
- expect(await index.query(featureVector('cat'), 5)).toSucceedAndSatisfy(
220
- (hits: ReadonlyArray<IVectorQueryHit>) => {
221
- expect(hits.map((h) => h.target.id)).not.toContain('turn-0');
222
- }
223
- );
224
- });
225
-
226
- test('persists the record (best-effort) and logs when embedding fails', async () => {
227
- const index = InMemoryCosineIndex.create().orThrow();
228
- const logger = new Logging.InMemoryLogger();
229
- const failEmbed = (): Promise<Result<Float32Array>> => Promise.resolve(fail('no model'));
230
- const store = knowledgeStore(index, failEmbed, logger);
231
- // The durable write succeeds; only the derived index is skipped (rebuildable).
232
- expect(await store.put(makeRecord('doc-a', 'cat'))).toSucceedAndSatisfy(
233
- (record: IMemoryRecord<unknown>) => {
234
- expect(record.envelope.embeddingRef).toBeUndefined();
235
- }
236
- );
237
- expect(await store.getById('knowledge' as MemoryScopeKey, 'doc-a' as MemoryId)).toSucceedAndSatisfy(
238
- (record: IMemoryRecord<unknown> | undefined) => {
239
- expect(record?.envelope.id).toBe('doc-a');
240
- }
241
- );
242
- expect(index.size).toBe(0);
243
- expect(logger.logged.some((m) => /embedding 'doc-a' failed.*no model/i.test(m))).toBe(true);
244
- });
245
-
246
- test('persists the record (best-effort) and logs when the vector add fails', async () => {
247
- const spy = new SpyVectorIndex();
248
- spy.failAdd = true;
249
- const logger = new Logging.InMemoryLogger();
250
- const store = knowledgeStore(spy, recordEmbed, logger);
251
- expect(await store.put(makeRecord('doc-a', 'cat'))).toSucceedAndSatisfy(
252
- (record: IMemoryRecord<unknown>) => {
253
- expect(record.envelope.embeddingRef).toBeUndefined();
254
- }
255
- );
256
- expect(await store.getById('knowledge' as MemoryScopeKey, 'doc-a' as MemoryId)).toSucceedAndSatisfy(
257
- (record: IMemoryRecord<unknown> | undefined) => {
258
- expect(record?.envelope.id).toBe('doc-a');
259
- }
260
- );
261
- expect(logger.logged.some((m) => /vector add for 'doc-a' failed.*add boom/i.test(m))).toBe(true);
262
- });
263
-
264
- test('best-effort embed survives a throwing/rejecting embedder', async () => {
265
- const index = InMemoryCosineIndex.create().orThrow();
266
- const logger = new Logging.InMemoryLogger();
267
- const throwingEmbed = (): Promise<Result<Float32Array>> => Promise.reject(new Error('embedder kaboom'));
268
- const store = knowledgeStore(index, throwingEmbed, logger);
269
- expect(await store.put(makeRecord('doc-a', 'cat'))).toSucceed();
270
- expect(index.size).toBe(0);
271
- expect(logger.logged.some((m) => /embedding 'doc-a' threw.*embedder kaboom/i.test(m))).toBe(true);
272
- });
273
-
274
- test('a committed delete succeeds (best-effort) and logs when vector removal fails', async () => {
275
- const spy = new SpyVectorIndex();
276
- const logger = new Logging.InMemoryLogger();
277
- const store = knowledgeStore(spy, recordEmbed, logger);
278
- (await store.put(makeRecord('doc-a', 'cat'))).orThrow();
279
- spy.failRemove = true;
280
- // The record is already gone; vector cleanup failure must NOT fail the delete.
281
- expect(await store.delete(knowledgeKind, 'doc-a' as unknown as EntityId)).toSucceedWith(
282
- 'doc-a' as MemoryId
283
- );
284
- expect(await store.getById('knowledge' as MemoryScopeKey, 'doc-a' as MemoryId)).toSucceedWith(
285
- undefined
286
- );
287
- expect(logger.logged.some((m) => /vector removal for 'doc-a' failed.*remove boom/i.test(m))).toBe(true);
288
- });
289
- });
290
-
291
- describe('when unwired', () => {
292
- test('a store without a vector index or embedder leaves embeddingRef unset', async () => {
293
- const store = knowledgeStore();
294
- expect(await store.put(makeRecord('doc-a', 'cat'))).toSucceedAndSatisfy(
295
- (record: IMemoryRecord<unknown>) => {
296
- expect(record.envelope.embeddingRef).toBeUndefined();
297
- }
298
- );
299
- });
300
-
301
- test('a vector index without an embedder is fully inert (no add or remove)', async () => {
302
- const spy = new SpyVectorIndex();
303
- const store = knowledgeStore(spy, undefined);
304
- expect(await store.put(makeRecord('doc-a', 'cat'))).toSucceedAndSatisfy(
305
- (record: IMemoryRecord<unknown>) => {
306
- expect(record.envelope.embeddingRef).toBeUndefined();
307
- }
308
- );
309
- // The vector lifecycle is wholly off without an embedder: neither put nor
310
- // delete touches the index (a remove would target a record never embedded).
311
- (await store.delete(knowledgeKind, 'doc-a' as unknown as EntityId)).orThrow();
312
- expect(spy.calls).toEqual([]);
313
- });
314
- });
315
-
316
- describe('semantic recall end-to-end', () => {
317
- test('a wired store + InMemoryCosineIndex + SemanticRetriever returns cosine top-k', async () => {
318
- const index = InMemoryCosineIndex.create().orThrow();
319
- const store = knowledgeStore(index, recordEmbed);
320
- (await store.put(makeRecord('cats', 'cat cat cat'))).orThrow();
321
- (await store.put(makeRecord('dogs', 'dog dog dog'))).orThrow();
322
- (await store.put(makeRecord('fishes', 'fish fish fish'))).orThrow();
323
-
324
- // SemanticRetriever takes an IMemoryIndex separate from the store (the
325
- // store's derived index is private and the two are intentionally
326
- // decoupled), so build a record index mirroring the store — keyed by the
327
- // shared vectorIndex instance — for hit hydration.
328
- const listed: ReadonlyArray<IMemoryRecord<unknown>> = (await store.list()).orThrow();
329
- const recordIndex = MemoryIndex.create().orThrow();
330
- recordIndex
331
- .rebuild(
332
- listed.map((record): IIndexedMemoryRecord => ({ scope: 'knowledge' as MemoryScopeKey, record }))
333
- )
334
- .orThrow();
335
-
336
- const retriever = SemanticRetriever.create({
337
- index: recordIndex,
338
- backend: { vectorIndex: index, embedQuery: queryEmbed }
339
- }).orThrow();
340
- expect(retriever.capabilities.supportsSemanticRecall).toBe(true);
341
-
342
- expect(await retriever.retrieve({ semantic: 'cat', topK: 2 })).toSucceedAndSatisfy(
343
- (records: ReadonlyArray<IMemoryRecord<unknown>>) => {
344
- // 'cats' is the closest; 'dogs'/'fishes' are orthogonal (cosine 0) so
345
- // only the cat record ranks above them — it is first.
346
- expect(records[0].envelope.id).toBe('cats');
347
- }
348
- );
349
- });
350
- });
351
-
352
- describe('versioned (temporal) embed-on-write', () => {
353
- // Wires the vector lifecycle against a TemporalIdentityCodec-backed kind so the
354
- // versioned put path (`_putVersioned -> _embedOnWrite(built, scope)`) is
355
- // exercised with a real vector index. The flat-path tests already cover the
356
- // SHARED `_embedOnWrite` line, so this asserts specifically that the VERSIONED
357
- // call site threads the correct entity scope (not the version stem or some
358
- // other variable) into the vector target — a scope swap at that call site would
359
- // fail these assertions, whereas line coverage alone would not catch it.
360
- function temporalStore(
361
- vectorIndex: IVectorIndex,
362
- embed: (r: IMemoryRecord<unknown>) => Promise<Result<Float32Array>>
363
- ): FileTreeMemoryStore {
364
- const reg: IBodyConverterRegistry = BodyConverterRegistry.create().orThrow();
365
- reg.register(factKind, Converters.string);
366
- return FileTreeMemoryStore.create({
367
- root: mutableRoot(),
368
- registry: reg,
369
- codecs: new Map<Kind, IIdentityCodec>([[factKind, TemporalIdentityCodec.create('facts').orThrow()]]),
370
- writePolicies: new Map<Kind, IWritePolicy>([[factKind, TemporalVersionedPolicy.create().orThrow()]]),
371
- vectorIndex,
372
- embed
373
- }).orThrow();
374
- }
375
-
376
- test('stamps the entity-scope-qualified target as embeddingRef for each version', async () => {
377
- const spy = new SpyVectorIndex();
378
- const store = temporalStore(spy, recordEmbed);
379
- // Two versions of the SAME temporal entity `greeting` (distinct bodies so the
380
- // second mints a new version rather than deduping). The entity subtree scope
381
- // is `facts/entities/greeting`; the version stem is `greeting-v<store-seq>`
382
- // (the store's monotonic seq, which starts at 1 for the first write).
383
- expect(await store.put(makeRecord('greeting', 'cat', 'fact'))).toSucceedAndSatisfy(
384
- (record: IMemoryRecord<unknown>) => {
385
- // embeddingRef IS edgeTargetKey(target) = `<entity-scope>\0<version-stem>`.
386
- // A wrong scope at the versioned call site would corrupt the prefix here.
387
- expect(record.envelope.embeddingRef).toBe('facts/entities/greeting\0greeting-v1');
388
- }
389
- );
390
- expect(await store.put(makeRecord('greeting', 'dog', 'fact'))).toSucceedAndSatisfy(
391
- (record: IMemoryRecord<unknown>) => {
392
- expect(record.envelope.embeddingRef).toBe('facts/entities/greeting\0greeting-v2');
393
- }
394
- );
395
- // Both versions were added under the entity scope, keyed by their version stems.
396
- expect(spy.calls).toEqual(['add:greeting-v1', 'add:greeting-v2']);
397
- });
398
-
399
- test('keeps two temporal entities under distinct scopes — no cross-entity vector collision', async () => {
400
- const index = InMemoryCosineIndex.create().orThrow();
401
- const store = temporalStore(index, recordEmbed);
402
- (await store.put(makeRecord('greeting', 'cat', 'fact'))).orThrow();
403
- (await store.put(makeRecord('farewell', 'fish', 'fact'))).orThrow();
404
- // Two distinct entity subtrees → two distinct vector entries.
405
- expect(index.size).toBe(2);
406
- // A query surfaces both, each carrying its own entity-scope-qualified target.
407
- expect(await index.query(featureVector('cat'), 5)).toSucceedAndSatisfy(
408
- (hits: ReadonlyArray<IVectorQueryHit>) => {
409
- const targets = hits.map((h) => `${h.target.scope}\0${h.target.id}`).sort();
410
- expect(targets).toEqual([
411
- 'facts/entities/farewell\0farewell-v2',
412
- 'facts/entities/greeting\0greeting-v1'
413
- ]);
414
- }
415
- );
416
- });
417
- });
418
- });