@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,273 +0,0 @@
1
- /*
2
- * Copyright (c) 2026 Erik Fortune
3
- * SPDX-License-Identifier: MIT
4
- */
5
-
6
- import { Result } from '@fgv/ts-utils';
7
- import { IEdgeTarget, IMemoryRecord } from '../types';
8
-
9
- /**
10
- * A half-open `[start, end)` span into a record's body — the in-record locator a
11
- * {@link IFragmentVectorIndex} may carry on a fragment. `start` is inclusive,
12
- * `end` exclusive. The unit (character / byte / token offsets) is the consumer's
13
- * choice: the index stores the two integers opaquely and never interprets them,
14
- * so they line up with whatever locator the consumer's own read side uses.
15
- *
16
- * @remarks
17
- * **The span is advisory.** It names the region of the body a fragment was
18
- * *derived from*; it is NOT a slice guaranteed to reproduce the fragment's text.
19
- * `body.slice(start, end)` round-trips only under a segmenter that merely chooses
20
- * boundaries. Under a **rewriting** segmenter — one that turns a span into a
21
- * curated block, an increasingly common ingestion shape when a model both selects
22
- * and rewrites — the fragment text is not a substring of the body at all, and the
23
- * fragmentation is not re-derivable from the body. Treat the span as a pointer for
24
- * locating context, never as an extraction recipe.
25
- *
26
- * A fragment whose provenance cannot honestly be expressed as a body span should
27
- * omit the locator entirely and carry an {@link IEmbeddedFragment.fragmentId}
28
- * instead.
29
- * @public
30
- */
31
- export interface IFragmentLocator {
32
- /** Inclusive start offset into the record body. */
33
- readonly start: number;
34
- /** Exclusive end offset into the record body. */
35
- readonly end: number;
36
- }
37
-
38
- /**
39
- * A single hit returned by {@link IVectorIndex.query} (or
40
- * {@link IFragmentVectorIndex.query}): the matched record's scope-qualified
41
- * {@link IEdgeTarget | address} and the backend's similarity score (higher = more
42
- * similar; the exact scale is backend-defined). Hits are returned in descending
43
- * score order.
44
- *
45
- * @remarks
46
- * The address is a `(scope, id)` pair, NOT a bare {@link MemoryId} — per-scope
47
- * codecs (e.g. the medium-term codec's `turn-<n>` stems) legally mint the same
48
- * stem under different scopes, so a bare id could not disambiguate two records
49
- * that share a stem. The caller re-resolves the hit against the record index by
50
- * the same scoped address.
51
- *
52
- * **No single field discriminates a fragment hit from a record-granular hit.** A
53
- * record hit carries neither `locator` nor `fragmentId`; a fragment hit carries at
54
- * least one of the two, but not necessarily any particular one — a fragment with a
55
- * body span but no consumer-minted id, and a fragment with an id but no honest span,
56
- * are both legal. Testing one field for presence therefore cannot tell you which
57
- * kind of hit you hold.
58
- *
59
- * That "at least one" requirement is enforced on the upsert side by
60
- * {@link embeddedFragmentConverter} — a different boundary from this type — and is
61
- * deliberately NOT offered here as a discriminator either. A caller keyed off it
62
- * would be coupled to an invariant this type does not own, and would fail silently
63
- * if the invariant were ever relaxed.
64
- *
65
- * **The robust rule is that fragment-ness is determined by which index produced the
66
- * hit**: {@link IFragmentVectorIndex.query} returns fragment hits and
67
- * {@link IVectorIndex.query} returns record hits. The caller chose the index it
68
- * queried, so it already knows which kind it is holding.
69
- *
70
- * Note in particular that an absent `locator` now carries **two** distinct meanings
71
- * — a record-granular hit, or a fragment with no honest body span (see
72
- * {@link IFragmentLocator}) — which is precisely why presence-branching is unsafe.
73
- * @public
74
- */
75
- export interface IVectorQueryHit {
76
- /** The scope-qualified address of the matched record. */
77
- readonly target: IEdgeTarget;
78
- /** Backend similarity score; higher is more similar. */
79
- readonly score: number;
80
- /**
81
- * The advisory in-record span the matched fragment was derived from, when the
82
- * producing fragment carried one. Absent on record-granular hits AND on fragment
83
- * hits with no honest span — see the remarks above; do not branch on its presence.
84
- */
85
- readonly locator?: IFragmentLocator;
86
- /**
87
- * The opaque identity the producing fragment was stored with, carried back
88
- * verbatim. Absent on record-granular hits AND on fragment hits stored without
89
- * one — see the remarks above; do not branch on its presence.
90
- */
91
- readonly fragmentId?: string;
92
- }
93
-
94
- /**
95
- * The vector-index seam an embedding backend implements to make
96
- * {@link SemanticRetriever | semantic recall} operational.
97
- *
98
- * @remarks
99
- * Vectors cross this seam as `Float32Array` (the in-memory representation an
100
- * embedding model produces); `number[]` is reserved for the JSON-wire edges
101
- * (e.g. a provider's embedding response). The in-package brute-force cosine
102
- * implementation is {@link InMemoryCosineIndex}; a consumer can swap an external
103
- * ANN backend behind the same seam once N grows beyond the in-memory regime.
104
- *
105
- * Every operation returns a `Result` (async, since a real backend does I/O) so
106
- * failure is explicit and never throws across the seam.
107
- * @public
108
- */
109
- export interface IVectorIndex {
110
- /**
111
- * Add (or replace) the embedding for the scope-qualified `target`. Returns the
112
- * opaque {@link IMemoryEnvelope.embeddingRef | embeddingRef} the store stamps
113
- * onto the envelope so a later read knows the record is embedded. Keying on the
114
- * `(scope, id)` address (not a bare id) is load-bearing: two records that share
115
- * a filename stem across scopes must not clobber each other's embedding.
116
- */
117
- add(target: IEdgeTarget, vector: Float32Array): Promise<Result<string>>;
118
-
119
- /**
120
- * Remove the embedding for the scope-qualified `target`. Returns the removed
121
- * target. Idempotent — removing a target with no embedding still succeeds
122
- * (returns the target).
123
- */
124
- remove(target: IEdgeTarget): Promise<Result<IEdgeTarget>>;
125
-
126
- /**
127
- * Return the `topK` nearest records to `vector`, in descending score order.
128
- */
129
- query(vector: Float32Array, topK: number): Promise<Result<ReadonlyArray<IVectorQueryHit>>>;
130
- }
131
-
132
- /**
133
- * One embedded fragment of a record: the fragment's vector, plus at least one of the
134
- * two ways to identify it — its advisory in-record {@link IFragmentLocator | span}
135
- * and/or an opaque consumer-minted {@link IEmbeddedFragment.fragmentId | fragmentId}.
136
- * Produced by a {@link FragmentEmbedder} and stored via
137
- * {@link IFragmentVectorIndex.addFragments}.
138
- *
139
- * @remarks
140
- * Both identity fields are optional **in the type**, but the "at least one"
141
- * requirement is real — a fragment carrying neither is unidentifiable at the read
142
- * side. It is enforced by {@link embeddedFragmentConverter} (and re-checked by the
143
- * in-package index implementations) rather than by a conditional-required union
144
- * (`{ locator; fragmentId? } | { locator?; fragmentId }`), which was considered and
145
- * declined: the union costs at every construction site and buys nothing at the read
146
- * site, where each field reads as `… | undefined` either way.
147
- * @public
148
- */
149
- export interface IEmbeddedFragment {
150
- /**
151
- * The region of the record body this fragment was derived from, when one can be
152
- * stated honestly. Advisory — see {@link IFragmentLocator}; it is NOT a slice that
153
- * reproduces the fragment text. Omit it for a fragment with no honest body span (a
154
- * rewriting segmenter), in which case `fragmentId` must be supplied.
155
- */
156
- readonly locator?: IFragmentLocator;
157
- /**
158
- * An opaque, consumer-minted identity for this fragment, carried verbatim through
159
- * the index and returned on the corresponding {@link IVectorQueryHit}. The index
160
- * **never parses it, never filters on it, and never assigns meaning to it** — it is
161
- * a bytestring, not part of the query path. It exists so a fragment stays
162
- * identifiable when its text is not re-derivable from the record body.
163
- *
164
- * The guarantee is "we never parse it", NOT "we keep it stable". Because
165
- * `addFragments` is whole-record-replace, an updated record re-emits its entire
166
- * fragment set, so **any stability of a fragment id across re-embeds is the
167
- * consumer's responsibility**, not the index's.
168
- */
169
- readonly fragmentId?: string;
170
- /** The embedding vector for this fragment. */
171
- readonly vector: Float32Array;
172
- }
173
-
174
- /**
175
- * The fragment-granular sibling of {@link IVectorIndex}: instead of one vector per
176
- * record it holds many vectors per record, each tagged with the identity its
177
- * {@link IEmbeddedFragment} carried, and its `query` returns per-fragment hits
178
- * carrying that identity back. This is the seam behind sub-document semantic search
179
- * — the "discovery" half of a search-then-read contract, where a hit tells the
180
- * consumer which record AND which fragment of it to read.
181
- *
182
- * @remarks
183
- * Deliberately NOT `extends IVectorIndex`: an index holding many vectors per record
184
- * has no well-defined single-vector `add(target, vector)`. It is a parallel contract
185
- * with three operations — `addFragments`, `remove`, `query` — reusing
186
- * {@link IVectorQueryHit}, on which both `locator` and `fragmentId` are optional. A
187
- * fragment hit populates whichever of the two its stored fragment carried; see
188
- * {@link IVectorQueryHit} for why that is not a discriminator and why fragment-ness
189
- * is determined by the index queried, not by field presence. Kept distinct from the
190
- * record-granular index per the consumer contract: memory recall stays
191
- * record-granular; sub-document knowledge uses a separate fragment index.
192
- * @public
193
- */
194
- export interface IFragmentVectorIndex {
195
- /**
196
- * Add (or replace) all fragments for the scope-qualified `target`. Whole-record
197
- * semantics: every fragment previously held for `target` is dropped and replaced
198
- * by `fragments`, so a re-authored document never leaves stale fragments behind.
199
- * Returns the number of fragments now held for the record.
200
- */
201
- addFragments(target: IEdgeTarget, fragments: ReadonlyArray<IEmbeddedFragment>): Promise<Result<number>>;
202
-
203
- /**
204
- * Remove every fragment for the scope-qualified `target`. Returns the removed
205
- * target. Idempotent — removing a target with no fragments still succeeds.
206
- */
207
- remove(target: IEdgeTarget): Promise<Result<IEdgeTarget>>;
208
-
209
- /**
210
- * Return the `topK` nearest fragments to `vector`, in descending score order,
211
- * each hit carrying its record `target` plus whichever of `locator` /
212
- * `fragmentId` the stored fragment was added with. When
213
- * `maxPerRecord` is supplied, no more than that many fragments of any single
214
- * record appear in the result — the cap is applied during selection (before the
215
- * `topK` cut) so one long document cannot crowd out others.
216
- */
217
- query(
218
- vector: Float32Array,
219
- topK: number,
220
- maxPerRecord?: number
221
- ): Promise<Result<ReadonlyArray<IVectorQueryHit>>>;
222
- }
223
-
224
- /**
225
- * Embeds a complete record into a vector for the store's embed-on-write hook.
226
- * Async and `Result`-returning, since a real embedder does a network call (cloud
227
- * provider) or in-process model inference. The consumer wires this — the core
228
- * package never calls an embedding provider directly, staying embedder-agnostic.
229
- * @public
230
- */
231
- export type MemoryEmbedder = (record: IMemoryRecord<unknown>) => Promise<Result<Float32Array>>;
232
-
233
- /**
234
- * The fragment-granular sibling of {@link MemoryEmbedder}: chunks a record's body
235
- * and embeds each chunk, returning one {@link IEmbeddedFragment} per chunk. The
236
- * chunking policy (window size, overlap) lives entirely in the consumer's embedder
237
- * — the core stays chunking-agnostic, exactly as it stays embedder-agnostic for
238
- * the record-granular path. Used by the store's fragment-embed-on-write hook.
239
- * @public
240
- */
241
- export type FragmentEmbedder = (
242
- record: IMemoryRecord<unknown>
243
- ) => Promise<Result<ReadonlyArray<IEmbeddedFragment>>>;
244
-
245
- /**
246
- * A record paired with its scope-qualified {@link IEdgeTarget | address}, as
247
- * yielded by {@link IMemoryRecordSource.list}. The address is required because
248
- * {@link InMemoryCosineIndex.rebuild} keys each re-embedded entry on the
249
- * scope-qualified target, not a bare {@link MemoryId} — two records that share a
250
- * filename stem across scopes must not collide when the whole vault is re-indexed.
251
- * @public
252
- */
253
- export interface IScopedMemoryRecord {
254
- /** The record's scope-qualified `(scope, id)` address. */
255
- readonly target: IEdgeTarget;
256
- /** The record itself, passed to the embedder. */
257
- readonly record: IMemoryRecord<unknown>;
258
- }
259
-
260
- /**
261
- * The minimal record-source surface {@link InMemoryCosineIndex.rebuild} reads to
262
- * re-embed an entire vault. Each entry carries the record's scope-qualified
263
- * address (see {@link IScopedMemoryRecord}) so the rebuild keys the vector index
264
- * exactly as the incremental embed-on-write path does. A consumer backs this with
265
- * the store's scoped index — the vector packlet does not import the store packlet
266
- * (which depends on the vector packlet for {@link IVectorIndex}, so the reverse
267
- * import would be a cycle).
268
- * @public
269
- */
270
- export interface IMemoryRecordSource {
271
- /** List every record in the vault, each paired with its scoped address. */
272
- list(): Promise<Result<ReadonlyArray<IScopedMemoryRecord>>>;
273
- }
@@ -1,110 +0,0 @@
1
- /*
2
- * Copyright (c) 2026 Erik Fortune
3
- * SPDX-License-Identifier: MIT
4
- */
5
-
6
- /**
7
- * Antagonist torture test — convert/validate round-trip symmetry (target class
8
- * 7): every OPTIONAL field the envelope/edge/provenance shapes carry must
9
- * survive a full on-disk round-trip (serialize → YAML text → parse), not just a
10
- * single `Converter.convert` pass in memory. This exercises the exact path a
11
- * corrupted or field-dropping serializer/parser pair would break, mirroring the
12
- * `aiClientToolConfig`/`annotations` field-drop class named in the brief.
13
- */
14
-
15
- import '@fgv/ts-utils-jest';
16
- import { Converters } from '@fgv/ts-utils';
17
- import {
18
- BodyConverterRegistry,
19
- IBodyConverterRegistry,
20
- IMemoryEnvelope,
21
- parseMemoryFile,
22
- serializeMemoryFile
23
- } from '../../../index';
24
-
25
- const kind = 'note' as IMemoryEnvelope['kind'];
26
-
27
- function registry(): IBodyConverterRegistry {
28
- const reg = BodyConverterRegistry.create().orThrow();
29
- reg.register(kind, Converters.string);
30
- return reg;
31
- }
32
-
33
- describe('antagonist — full on-disk round-trip preserves every optional field', () => {
34
- // Wrong impl this catches: a serializer/parser pair where one side silently
35
- // drops an optional field (the exact class of bug the brief calls out for
36
- // `aiClientToolConfig`/`annotations`-shaped converters) — e.g. omitting
37
- // `temporal.invalid_at: null`, an edge's `valid_at`/`invalid_at`/`provenance`,
38
- // a `null` `embeddingRef`, or a provenance extension key, because the author
39
- // forgot to thread it through both the YAML emit AND the envelope Converter.
40
- test('every optional envelope/edge/provenance field set simultaneously survives a full YAML round-trip', () => {
41
- const envelope: IMemoryEnvelope = {
42
- id: 'doc-1' as IMemoryEnvelope['id'],
43
- entityId: 'doc-1' as IMemoryEnvelope['entityId'],
44
- kind,
45
- tags: ['t1', 't2'] as unknown as IMemoryEnvelope['tags'],
46
- links: [
47
- {
48
- type: 'rel' as never,
49
- target: { scope: 'knowledge', id: 'doc-2' } as never,
50
- confidence: 0.42,
51
- provenance: { source: 'agent', by: 'curator', extra: { nested: true } },
52
- valid_at: 111,
53
-
54
- invalid_at: null
55
- }
56
- ],
57
- created: 1000,
58
- updated: 2000,
59
- seq: 7,
60
- contentHash: 'abc123',
61
- provenance: {
62
- source: 'host-ingest',
63
- by: 'erik',
64
- model: 'gpt-5',
65
- confidence: 0.87,
66
- derivedFrom: { scope: 'conversations/c1', id: 'turn-3' } as never,
67
- // Opaque extension keys (per IProvenance's `[key: string]: unknown` arm).
68
- sentiment: { score: 0.5 },
69
- epistemic: 'belief'
70
- },
71
-
72
- temporal: { valid_at: 500, invalid_at: null },
73
-
74
- embeddingRef: null
75
- };
76
-
77
- const raw = serializeMemoryFile(envelope, 'the body text').orThrow();
78
- expect(parseMemoryFile(raw, registry())).toSucceedAndSatisfy((record) => {
79
- // Deep-equal the ENTIRE envelope, not field-by-field — a partial assertion
80
- // list is exactly how a single dropped field slips through review.
81
- expect(record.envelope).toEqual(envelope);
82
- expect(record.body).toBe('the body text');
83
- });
84
- });
85
-
86
- test('an absent temporal/embeddingRef/edge-optionals round-trips to fully absent (no null-vs-undefined drift)', () => {
87
- const envelope: IMemoryEnvelope = {
88
- id: 'doc-2' as IMemoryEnvelope['id'],
89
- entityId: 'doc-2' as IMemoryEnvelope['entityId'],
90
- kind,
91
- tags: [],
92
- links: [{ type: 'rel' as never, target: { scope: 'knowledge', id: 'doc-3' } as never }],
93
- created: 0,
94
- updated: 0,
95
- seq: 0,
96
- contentHash: '',
97
- provenance: { source: 'agent' }
98
- };
99
- const raw = serializeMemoryFile(envelope, 'body').orThrow();
100
- expect(parseMemoryFile(raw, registry())).toSucceedAndSatisfy((record) => {
101
- expect(record.envelope.temporal).toBeUndefined();
102
- expect(record.envelope.embeddingRef).toBeUndefined();
103
- expect(record.envelope.links[0].confidence).toBeUndefined();
104
- expect(record.envelope.links[0].provenance).toBeUndefined();
105
- expect(record.envelope.links[0].valid_at).toBeUndefined();
106
- expect(record.envelope.links[0].invalid_at).toBeUndefined();
107
- expect(record.envelope).toEqual(envelope);
108
- });
109
- });
110
- });
@@ -1,89 +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 } from '@fgv/ts-utils';
8
- import { JsonSchema } from '@fgv/ts-json-base';
9
- import { BodyConverterRegistry } from '../../../packlets/converters';
10
- import { Kind } from '../../../packlets/types';
11
-
12
- const knowledgeKind: Kind = 'knowledge' as Kind;
13
- const profileKind: Kind = 'profile' as Kind;
14
-
15
- describe('BodyConverterRegistry', () => {
16
- let registry: BodyConverterRegistry;
17
-
18
- beforeEach(() => {
19
- registry = BodyConverterRegistry.create().orThrow();
20
- });
21
-
22
- test('create succeeds', () => {
23
- expect(BodyConverterRegistry.create()).toSucceed();
24
- });
25
-
26
- describe('register / has / convert', () => {
27
- test('registers a Converter and converts a matching body', () => {
28
- registry.register(knowledgeKind, Converters.string);
29
- expect(registry.has(knowledgeKind)).toBe(true);
30
- expect(registry.convert(knowledgeKind, 'a knowledge doc')).toSucceedWith('a knowledge doc');
31
- });
32
-
33
- test('a registered Converter rejects an invalid body', () => {
34
- registry.register(knowledgeKind, Converters.string);
35
- expect(registry.convert(knowledgeKind, 42)).toFail();
36
- });
37
-
38
- test('has returns false for an unregistered kind', () => {
39
- expect(registry.has(knowledgeKind)).toBe(false);
40
- });
41
-
42
- test('convert fails for an unregistered kind', () => {
43
- expect(registry.convert(knowledgeKind, 'x')).toFailWith(
44
- /no converter registered for kind 'knowledge'/i
45
- );
46
- });
47
-
48
- test('register replaces a prior registration for the same kind', () => {
49
- registry.register(knowledgeKind, Converters.string);
50
- registry.register(knowledgeKind, Converters.number);
51
- expect(registry.convert(knowledgeKind, 7)).toSucceedWith(7);
52
- expect(registry.convert(knowledgeKind, 'x')).toFail();
53
- });
54
- });
55
-
56
- describe('getConverter', () => {
57
- test('returns the registered converter', () => {
58
- registry.register(knowledgeKind, Converters.string);
59
- expect(registry.getConverter(knowledgeKind)).toSucceedAndSatisfy((converter) => {
60
- expect(converter.convert('hello')).toSucceedWith('hello');
61
- });
62
- });
63
-
64
- test('fails for an unregistered kind', () => {
65
- expect(registry.getConverter(knowledgeKind)).toFailWith(/no converter registered for kind/i);
66
- });
67
- });
68
-
69
- describe('registerSchema', () => {
70
- const profileSchema = JsonSchema.object({
71
- name: JsonSchema.string(),
72
- age: JsonSchema.integer()
73
- });
74
-
75
- test('registers a JsonSchema validator and validates a matching body', () => {
76
- registry.registerSchema(profileKind, profileSchema);
77
- expect(registry.has(profileKind)).toBe(true);
78
- expect(registry.convert(profileKind, { name: 'Ada', age: 36 })).toSucceedWith({
79
- name: 'Ada',
80
- age: 36
81
- });
82
- });
83
-
84
- test('a registered schema rejects an invalid body', () => {
85
- registry.registerSchema(profileKind, profileSchema);
86
- expect(registry.convert(profileKind, { name: 'Ada' })).toFail();
87
- });
88
- });
89
- });