@farukada/aws-langgraph-dynamodb-ts 1.0.0-rc.1 → 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (608) hide show
  1. package/README.md +1820 -290
  2. package/dist/cjs/backfill/backfill.d.ts +171 -0
  3. package/dist/cjs/backfill/backfill.js +177 -0
  4. package/dist/cjs/checkpointer/actions/delete-thread.d.ts +50 -0
  5. package/dist/cjs/checkpointer/actions/delete-thread.js +26 -0
  6. package/dist/cjs/checkpointer/actions/get-tuple.d.ts +36 -0
  7. package/dist/cjs/checkpointer/actions/get-tuple.js +22 -0
  8. package/dist/cjs/checkpointer/actions/list.d.ts +55 -0
  9. package/dist/cjs/checkpointer/actions/list.js +70 -0
  10. package/dist/cjs/checkpointer/actions/put-writes.d.ts +49 -0
  11. package/dist/cjs/checkpointer/actions/put-writes.js +21 -0
  12. package/dist/cjs/checkpointer/actions/put.d.ts +95 -0
  13. package/dist/cjs/checkpointer/actions/put.js +79 -0
  14. package/dist/cjs/checkpointer/internal/delta-history.d.ts +124 -0
  15. package/dist/cjs/checkpointer/internal/delta-history.js +131 -0
  16. package/dist/cjs/checkpointer/internal/listing.d.ts +149 -0
  17. package/dist/cjs/checkpointer/internal/listing.js +104 -0
  18. package/dist/cjs/checkpointer/internal/parse.d.ts +298 -0
  19. package/dist/cjs/checkpointer/internal/parse.js +184 -0
  20. package/dist/cjs/checkpointer/internal/pending-writes.d.ts +314 -0
  21. package/dist/cjs/checkpointer/internal/pending-writes.js +241 -0
  22. package/dist/cjs/checkpointer/internal/read.d.ts +135 -0
  23. package/dist/cjs/checkpointer/internal/read.js +132 -0
  24. package/dist/cjs/checkpointer/internal/rows.d.ts +644 -0
  25. package/dist/cjs/checkpointer/internal/rows.js +356 -0
  26. package/dist/cjs/checkpointer/internal/setup.d.ts +47 -0
  27. package/dist/cjs/checkpointer/internal/setup.js +25 -0
  28. package/dist/cjs/checkpointer/saver.d.ts +306 -0
  29. package/dist/cjs/checkpointer/saver.js +56 -0
  30. package/dist/cjs/checkpointer/types.d.ts +51 -0
  31. package/dist/cjs/factory/factory.d.ts +154 -0
  32. package/dist/cjs/factory/factory.js +137 -0
  33. package/dist/{factory → cjs/factory}/types.d.ts +33 -14
  34. package/dist/cjs/history/actions/add-messages.d.ts +51 -0
  35. package/dist/cjs/history/actions/add-messages.js +17 -0
  36. package/dist/cjs/history/actions/clear.d.ts +52 -0
  37. package/dist/cjs/history/actions/clear.js +29 -0
  38. package/dist/cjs/history/actions/get-messages.d.ts +60 -0
  39. package/dist/cjs/history/actions/get-messages.js +58 -0
  40. package/dist/cjs/history/actions/list-sessions.d.ts +55 -0
  41. package/dist/cjs/history/actions/list-sessions.js +67 -0
  42. package/dist/cjs/history/actions/reconcile-count.d.ts +49 -0
  43. package/dist/cjs/history/actions/reconcile-count.js +8 -0
  44. package/dist/cjs/history/chat-message-history.d.ts +267 -0
  45. package/dist/cjs/history/chat-message-history.js +61 -0
  46. package/dist/cjs/history/internal/append.d.ts +244 -0
  47. package/dist/cjs/history/internal/append.js +267 -0
  48. package/dist/cjs/history/internal/message-read.d.ts +84 -0
  49. package/dist/cjs/history/internal/message-read.js +93 -0
  50. package/dist/cjs/history/internal/parse.d.ts +153 -0
  51. package/dist/cjs/history/internal/parse.js +113 -0
  52. package/dist/cjs/history/internal/rows.d.ts +196 -0
  53. package/dist/cjs/history/internal/rows.js +96 -0
  54. package/dist/cjs/history/internal/session.d.ts +350 -0
  55. package/dist/cjs/history/internal/session.js +296 -0
  56. package/dist/cjs/history/internal/setup.d.ts +64 -0
  57. package/dist/cjs/history/internal/setup.js +60 -0
  58. package/dist/cjs/history/session-adapter.d.ts +112 -0
  59. package/dist/cjs/history/session-adapter.js +38 -0
  60. package/dist/cjs/history/types.d.ts +102 -0
  61. package/dist/cjs/index.d.ts +53 -0
  62. package/dist/cjs/index.js +25 -0
  63. package/dist/cjs/package.json +1 -0
  64. package/dist/cjs/shared/adapter.d.ts +146 -0
  65. package/dist/cjs/shared/adapter.js +70 -0
  66. package/dist/cjs/shared/clock.d.ts +52 -0
  67. package/dist/cjs/shared/clock.js +14 -0
  68. package/dist/cjs/shared/codec/codec.d.ts +336 -0
  69. package/dist/cjs/shared/codec/codec.js +162 -0
  70. package/dist/cjs/shared/codec/compression.d.ts +66 -0
  71. package/dist/cjs/shared/codec/compression.js +45 -0
  72. package/dist/cjs/shared/codec/json-serde.d.ts +80 -0
  73. package/dist/cjs/shared/codec/json-serde.js +58 -0
  74. package/dist/{shared → cjs/shared}/codec/s3/client-types.d.ts +22 -2
  75. package/dist/{shared → cjs/shared}/codec/s3/client-types.js +0 -1
  76. package/dist/cjs/shared/codec/s3/client.d.ts +63 -0
  77. package/dist/cjs/shared/codec/s3/client.js +78 -0
  78. package/dist/cjs/shared/codec/s3/config.d.ts +260 -0
  79. package/dist/cjs/shared/codec/s3/config.js +92 -0
  80. package/dist/cjs/shared/codec/s3/lifecycle.d.ts +220 -0
  81. package/dist/cjs/shared/codec/s3/lifecycle.js +223 -0
  82. package/dist/cjs/shared/codec/s3/offloader.d.ts +428 -0
  83. package/dist/cjs/shared/codec/s3/offloader.js +289 -0
  84. package/dist/cjs/shared/concurrency.d.ts +43 -0
  85. package/dist/{shared → cjs/shared}/concurrency.js +10 -9
  86. package/dist/cjs/shared/dynamodb/abort.d.ts +47 -0
  87. package/dist/cjs/shared/dynamodb/abort.js +16 -0
  88. package/dist/cjs/shared/dynamodb/batch-write.d.ts +86 -0
  89. package/dist/cjs/shared/dynamodb/batch-write.js +79 -0
  90. package/dist/cjs/shared/dynamodb/cancellation.d.ts +124 -0
  91. package/dist/cjs/shared/dynamodb/cancellation.js +37 -0
  92. package/dist/cjs/shared/dynamodb/client.d.ts +177 -0
  93. package/dist/{shared → cjs/shared}/dynamodb/client.js +12 -14
  94. package/dist/cjs/shared/dynamodb/idempotent-write.d.ts +596 -0
  95. package/dist/cjs/shared/dynamodb/idempotent-write.js +173 -0
  96. package/dist/cjs/shared/dynamodb/paginate.d.ts +111 -0
  97. package/dist/cjs/shared/dynamodb/paginate.js +90 -0
  98. package/dist/cjs/shared/dynamodb/partition-delete.d.ts +204 -0
  99. package/dist/cjs/shared/dynamodb/partition-delete.js +177 -0
  100. package/dist/cjs/shared/dynamodb/recency-index.d.ts +243 -0
  101. package/dist/cjs/shared/dynamodb/recency-index.js +146 -0
  102. package/dist/cjs/shared/dynamodb/retry.d.ts +317 -0
  103. package/dist/cjs/shared/dynamodb/retry.js +193 -0
  104. package/dist/cjs/shared/dynamodb/row-size.d.ts +33 -0
  105. package/dist/cjs/shared/dynamodb/row-size.js +30 -0
  106. package/dist/cjs/shared/dynamodb/table-schema.d.ts +199 -0
  107. package/dist/cjs/shared/dynamodb/table-schema.js +52 -0
  108. package/dist/cjs/shared/errors/base-error.d.ts +231 -0
  109. package/dist/cjs/shared/errors/base-error.js +73 -0
  110. package/dist/cjs/shared/errors/boundary.d.ts +86 -0
  111. package/dist/cjs/shared/errors/boundary.js +61 -0
  112. package/dist/cjs/shared/errors/classify.d.ts +206 -0
  113. package/dist/cjs/shared/errors/classify.js +232 -0
  114. package/dist/cjs/shared/errors/error-code.d.ts +95 -0
  115. package/dist/{shared → cjs/shared}/errors/error-code.js +12 -2
  116. package/dist/cjs/shared/errors/errors.d.ts +233 -0
  117. package/dist/cjs/shared/errors/errors.js +123 -0
  118. package/dist/cjs/shared/logging/logger.d.ts +80 -0
  119. package/dist/cjs/shared/logging/logger.js +30 -0
  120. package/dist/cjs/shared/logging/redaction.d.ts +123 -0
  121. package/dist/cjs/shared/logging/redaction.js +145 -0
  122. package/dist/cjs/shared/logging/secret-patterns.d.ts +227 -0
  123. package/dist/cjs/shared/logging/secret-patterns.js +93 -0
  124. package/dist/cjs/shared/logging/truncate.d.ts +197 -0
  125. package/dist/cjs/shared/logging/truncate.js +31 -0
  126. package/dist/cjs/shared/options.d.ts +100 -0
  127. package/dist/cjs/shared/ulid.d.ts +80 -0
  128. package/dist/{shared → cjs/shared}/ulid.js +7 -21
  129. package/dist/cjs/shared/validation/collaborators.d.ts +160 -0
  130. package/dist/cjs/shared/validation/collaborators.js +79 -0
  131. package/dist/cjs/shared/validation/option-shape.d.ts +91 -0
  132. package/dist/cjs/shared/validation/option-shape.js +31 -0
  133. package/dist/cjs/shared/validation/options.d.ts +145 -0
  134. package/dist/cjs/shared/validation/options.js +166 -0
  135. package/dist/cjs/shared/validation/primitives.d.ts +292 -0
  136. package/dist/cjs/shared/validation/primitives.js +114 -0
  137. package/dist/cjs/shared/validation/ttl.d.ts +94 -0
  138. package/dist/cjs/shared/validation/ttl.js +52 -0
  139. package/dist/cjs/store/actions/list-namespaces.d.ts +79 -0
  140. package/dist/cjs/store/actions/list-namespaces.js +92 -0
  141. package/dist/cjs/store/actions/put.d.ts +43 -0
  142. package/dist/cjs/store/actions/put.js +49 -0
  143. package/dist/cjs/store/actions/reconcile-vector-index.d.ts +38 -0
  144. package/dist/cjs/store/actions/reconcile-vector-index.js +13 -0
  145. package/dist/cjs/store/actions/search.d.ts +38 -0
  146. package/dist/cjs/store/actions/search.js +26 -0
  147. package/dist/cjs/store/internal/batch-plan.d.ts +56 -0
  148. package/dist/cjs/store/internal/batch-plan.js +32 -0
  149. package/dist/cjs/store/internal/filter.d.ts +43 -0
  150. package/dist/cjs/store/internal/filter.js +64 -0
  151. package/dist/cjs/store/internal/get-item.d.ts +77 -0
  152. package/dist/cjs/store/internal/get-item.js +58 -0
  153. package/dist/cjs/store/internal/item-write.d.ts +270 -0
  154. package/dist/cjs/store/internal/item-write.js +181 -0
  155. package/dist/cjs/store/internal/parse.d.ts +230 -0
  156. package/dist/cjs/store/internal/parse.js +180 -0
  157. package/dist/cjs/store/internal/rows.d.ts +359 -0
  158. package/dist/cjs/store/internal/rows.js +166 -0
  159. package/dist/cjs/store/internal/semantic-search.d.ts +168 -0
  160. package/dist/{store/internal/text-path.js → cjs/store/internal/semantic-search.js} +92 -28
  161. package/dist/cjs/store/internal/setup.d.ts +96 -0
  162. package/dist/cjs/store/internal/setup.js +103 -0
  163. package/dist/cjs/store/internal/table-search.d.ts +100 -0
  164. package/dist/cjs/store/internal/table-search.js +123 -0
  165. package/dist/cjs/store/internal/vector-index.d.ts +258 -0
  166. package/dist/cjs/store/internal/vector-index.js +269 -0
  167. package/dist/cjs/store/store.d.ts +329 -0
  168. package/dist/cjs/store/store.js +97 -0
  169. package/dist/cjs/store/types.d.ts +111 -0
  170. package/dist/cjs/store/vector-backend.d.ts +104 -0
  171. package/dist/cjs/store/vector-backend.js +4 -0
  172. package/dist/esm/backfill/backfill.d.ts +171 -0
  173. package/dist/esm/backfill/backfill.js +170 -0
  174. package/dist/esm/checkpointer/actions/delete-thread.d.ts +50 -0
  175. package/dist/esm/checkpointer/actions/delete-thread.js +23 -0
  176. package/dist/esm/checkpointer/actions/get-tuple.d.ts +36 -0
  177. package/dist/esm/checkpointer/actions/get-tuple.js +19 -0
  178. package/dist/esm/checkpointer/actions/list.d.ts +55 -0
  179. package/dist/esm/checkpointer/actions/list.js +67 -0
  180. package/dist/esm/checkpointer/actions/put-writes.d.ts +49 -0
  181. package/dist/esm/checkpointer/actions/put-writes.js +18 -0
  182. package/dist/esm/checkpointer/actions/put.d.ts +95 -0
  183. package/dist/esm/checkpointer/actions/put.js +75 -0
  184. package/dist/esm/checkpointer/internal/delta-history.d.ts +124 -0
  185. package/dist/esm/checkpointer/internal/delta-history.js +126 -0
  186. package/dist/esm/checkpointer/internal/listing.d.ts +149 -0
  187. package/dist/esm/checkpointer/internal/listing.js +95 -0
  188. package/dist/esm/checkpointer/internal/parse.d.ts +298 -0
  189. package/dist/esm/checkpointer/internal/parse.js +169 -0
  190. package/dist/esm/checkpointer/internal/pending-writes.d.ts +314 -0
  191. package/dist/esm/checkpointer/internal/pending-writes.js +229 -0
  192. package/dist/esm/checkpointer/internal/read.d.ts +135 -0
  193. package/dist/esm/checkpointer/internal/read.js +125 -0
  194. package/dist/esm/checkpointer/internal/rows.d.ts +644 -0
  195. package/dist/esm/checkpointer/internal/rows.js +323 -0
  196. package/dist/esm/checkpointer/internal/setup.d.ts +47 -0
  197. package/dist/esm/checkpointer/internal/setup.js +21 -0
  198. package/dist/esm/checkpointer/saver.d.ts +306 -0
  199. package/dist/esm/checkpointer/saver.js +52 -0
  200. package/dist/esm/checkpointer/types.d.ts +51 -0
  201. package/dist/esm/checkpointer/types.js +1 -0
  202. package/dist/esm/factory/factory.d.ts +154 -0
  203. package/dist/esm/factory/factory.js +133 -0
  204. package/dist/esm/factory/types.d.ts +76 -0
  205. package/dist/esm/factory/types.js +1 -0
  206. package/dist/esm/history/actions/add-messages.d.ts +51 -0
  207. package/dist/esm/history/actions/add-messages.js +14 -0
  208. package/dist/esm/history/actions/clear.d.ts +52 -0
  209. package/dist/esm/history/actions/clear.js +26 -0
  210. package/dist/esm/history/actions/get-messages.d.ts +60 -0
  211. package/dist/esm/history/actions/get-messages.js +55 -0
  212. package/dist/esm/history/actions/list-sessions.d.ts +55 -0
  213. package/dist/esm/history/actions/list-sessions.js +64 -0
  214. package/dist/esm/history/actions/reconcile-count.d.ts +49 -0
  215. package/dist/esm/history/actions/reconcile-count.js +5 -0
  216. package/dist/esm/history/chat-message-history.d.ts +267 -0
  217. package/dist/esm/history/chat-message-history.js +57 -0
  218. package/dist/esm/history/internal/append.d.ts +244 -0
  219. package/dist/esm/history/internal/append.js +259 -0
  220. package/dist/esm/history/internal/message-read.d.ts +84 -0
  221. package/dist/esm/history/internal/message-read.js +89 -0
  222. package/dist/esm/history/internal/parse.d.ts +153 -0
  223. package/dist/esm/history/internal/parse.js +105 -0
  224. package/dist/esm/history/internal/rows.d.ts +196 -0
  225. package/dist/esm/history/internal/rows.js +83 -0
  226. package/dist/esm/history/internal/session.d.ts +350 -0
  227. package/dist/esm/history/internal/session.js +285 -0
  228. package/dist/esm/history/internal/setup.d.ts +64 -0
  229. package/dist/esm/history/internal/setup.js +56 -0
  230. package/dist/esm/history/session-adapter.d.ts +112 -0
  231. package/dist/esm/history/session-adapter.js +34 -0
  232. package/dist/esm/history/types.d.ts +102 -0
  233. package/dist/esm/history/types.js +1 -0
  234. package/dist/esm/index.d.ts +53 -0
  235. package/dist/esm/index.js +10 -0
  236. package/dist/esm/shared/adapter.d.ts +146 -0
  237. package/dist/esm/shared/adapter.js +65 -0
  238. package/dist/esm/shared/clock.d.ts +52 -0
  239. package/dist/esm/shared/clock.js +9 -0
  240. package/dist/esm/shared/codec/codec.d.ts +336 -0
  241. package/dist/esm/shared/codec/codec.js +150 -0
  242. package/dist/esm/shared/codec/compression.d.ts +66 -0
  243. package/dist/esm/shared/codec/compression.js +40 -0
  244. package/dist/esm/shared/codec/json-serde.d.ts +80 -0
  245. package/dist/esm/shared/codec/json-serde.js +54 -0
  246. package/dist/esm/shared/codec/s3/client-types.d.ts +54 -0
  247. package/dist/esm/shared/codec/s3/client-types.js +3 -0
  248. package/dist/esm/shared/codec/s3/client.d.ts +63 -0
  249. package/dist/esm/shared/codec/s3/client.js +40 -0
  250. package/dist/esm/shared/codec/s3/config.d.ts +260 -0
  251. package/dist/esm/shared/codec/s3/config.js +79 -0
  252. package/dist/esm/shared/codec/s3/lifecycle.d.ts +220 -0
  253. package/dist/esm/shared/codec/s3/lifecycle.js +214 -0
  254. package/dist/esm/shared/codec/s3/offloader.d.ts +428 -0
  255. package/dist/esm/shared/codec/s3/offloader.js +278 -0
  256. package/dist/esm/shared/concurrency.d.ts +43 -0
  257. package/dist/esm/shared/concurrency.js +27 -0
  258. package/dist/esm/shared/dynamodb/abort.d.ts +47 -0
  259. package/dist/esm/shared/dynamodb/abort.js +12 -0
  260. package/dist/esm/shared/dynamodb/batch-write.d.ts +86 -0
  261. package/dist/esm/shared/dynamodb/batch-write.js +74 -0
  262. package/dist/esm/shared/dynamodb/cancellation.d.ts +124 -0
  263. package/dist/esm/shared/dynamodb/cancellation.js +30 -0
  264. package/dist/esm/shared/dynamodb/client.d.ts +177 -0
  265. package/dist/esm/shared/dynamodb/client.js +35 -0
  266. package/dist/esm/shared/dynamodb/idempotent-write.d.ts +596 -0
  267. package/dist/esm/shared/dynamodb/idempotent-write.js +153 -0
  268. package/dist/esm/shared/dynamodb/paginate.d.ts +111 -0
  269. package/dist/esm/shared/dynamodb/paginate.js +84 -0
  270. package/dist/esm/shared/dynamodb/partition-delete.d.ts +204 -0
  271. package/dist/esm/shared/dynamodb/partition-delete.js +171 -0
  272. package/dist/esm/shared/dynamodb/recency-index.d.ts +243 -0
  273. package/dist/esm/shared/dynamodb/recency-index.js +136 -0
  274. package/dist/esm/shared/dynamodb/retry.d.ts +317 -0
  275. package/dist/esm/shared/dynamodb/retry.js +180 -0
  276. package/dist/esm/shared/dynamodb/row-size.d.ts +33 -0
  277. package/dist/esm/shared/dynamodb/row-size.js +26 -0
  278. package/dist/esm/shared/dynamodb/table-schema.d.ts +199 -0
  279. package/dist/esm/shared/dynamodb/table-schema.js +43 -0
  280. package/dist/esm/shared/errors/base-error.d.ts +231 -0
  281. package/dist/esm/shared/errors/base-error.js +64 -0
  282. package/dist/esm/shared/errors/boundary.d.ts +86 -0
  283. package/dist/esm/shared/errors/boundary.js +54 -0
  284. package/dist/esm/shared/errors/classify.d.ts +206 -0
  285. package/dist/esm/shared/errors/classify.js +220 -0
  286. package/dist/esm/shared/errors/error-code.d.ts +95 -0
  287. package/dist/esm/shared/errors/error-code.js +24 -0
  288. package/dist/esm/shared/errors/errors.d.ts +233 -0
  289. package/dist/esm/shared/errors/errors.js +110 -0
  290. package/dist/esm/shared/logging/logger.d.ts +80 -0
  291. package/dist/esm/shared/logging/logger.js +25 -0
  292. package/dist/esm/shared/logging/redaction.d.ts +123 -0
  293. package/dist/esm/shared/logging/redaction.js +140 -0
  294. package/dist/esm/shared/logging/secret-patterns.d.ts +227 -0
  295. package/dist/esm/shared/logging/secret-patterns.js +83 -0
  296. package/dist/esm/shared/logging/truncate.d.ts +197 -0
  297. package/dist/esm/shared/logging/truncate.js +25 -0
  298. package/dist/esm/shared/options.d.ts +100 -0
  299. package/dist/esm/shared/options.js +1 -0
  300. package/dist/esm/shared/ulid.d.ts +80 -0
  301. package/dist/esm/shared/ulid.js +77 -0
  302. package/dist/esm/shared/validation/collaborators.d.ts +160 -0
  303. package/dist/esm/shared/validation/collaborators.js +70 -0
  304. package/dist/esm/shared/validation/option-shape.d.ts +91 -0
  305. package/dist/esm/shared/validation/option-shape.js +24 -0
  306. package/dist/esm/shared/validation/options.d.ts +145 -0
  307. package/dist/esm/shared/validation/options.js +156 -0
  308. package/dist/esm/shared/validation/primitives.d.ts +292 -0
  309. package/dist/esm/shared/validation/primitives.js +100 -0
  310. package/dist/esm/shared/validation/ttl.d.ts +94 -0
  311. package/dist/esm/shared/validation/ttl.js +46 -0
  312. package/dist/esm/store/actions/list-namespaces.d.ts +79 -0
  313. package/dist/esm/store/actions/list-namespaces.js +86 -0
  314. package/dist/esm/store/actions/put.d.ts +43 -0
  315. package/dist/esm/store/actions/put.js +46 -0
  316. package/dist/esm/store/actions/reconcile-vector-index.d.ts +38 -0
  317. package/dist/esm/store/actions/reconcile-vector-index.js +10 -0
  318. package/dist/esm/store/actions/search.d.ts +38 -0
  319. package/dist/esm/store/actions/search.js +23 -0
  320. package/dist/esm/store/internal/batch-plan.d.ts +56 -0
  321. package/dist/esm/store/internal/batch-plan.js +28 -0
  322. package/dist/esm/store/internal/filter.d.ts +43 -0
  323. package/dist/esm/store/internal/filter.js +60 -0
  324. package/dist/esm/store/internal/get-item.d.ts +77 -0
  325. package/dist/esm/store/internal/get-item.js +54 -0
  326. package/dist/esm/store/internal/item-write.d.ts +270 -0
  327. package/dist/esm/store/internal/item-write.js +173 -0
  328. package/dist/esm/store/internal/parse.d.ts +230 -0
  329. package/dist/esm/store/internal/parse.js +169 -0
  330. package/dist/esm/store/internal/rows.d.ts +359 -0
  331. package/dist/esm/store/internal/rows.js +147 -0
  332. package/dist/esm/store/internal/semantic-search.d.ts +168 -0
  333. package/dist/esm/store/internal/semantic-search.js +200 -0
  334. package/dist/esm/store/internal/setup.d.ts +96 -0
  335. package/dist/esm/store/internal/setup.js +98 -0
  336. package/dist/esm/store/internal/table-search.d.ts +100 -0
  337. package/dist/esm/store/internal/table-search.js +119 -0
  338. package/dist/esm/store/internal/vector-index.d.ts +258 -0
  339. package/dist/esm/store/internal/vector-index.js +256 -0
  340. package/dist/esm/store/store.d.ts +329 -0
  341. package/dist/esm/store/store.js +93 -0
  342. package/dist/esm/store/types.d.ts +111 -0
  343. package/dist/esm/store/types.js +1 -0
  344. package/dist/esm/store/vector-backend.d.ts +104 -0
  345. package/dist/esm/store/vector-backend.js +1 -0
  346. package/package.json +68 -46
  347. package/dist/checkpointer/actions/delete-thread.d.ts +0 -10
  348. package/dist/checkpointer/actions/delete-thread.js +0 -38
  349. package/dist/checkpointer/actions/get-tuple.d.ts +0 -11
  350. package/dist/checkpointer/actions/get-tuple.js +0 -25
  351. package/dist/checkpointer/actions/list.d.ts +0 -20
  352. package/dist/checkpointer/actions/list.js +0 -113
  353. package/dist/checkpointer/actions/put-writes.d.ts +0 -15
  354. package/dist/checkpointer/actions/put-writes.js +0 -62
  355. package/dist/checkpointer/actions/put.d.ts +0 -17
  356. package/dist/checkpointer/actions/put.js +0 -73
  357. package/dist/checkpointer/internal/assemble.d.ts +0 -17
  358. package/dist/checkpointer/internal/assemble.js +0 -38
  359. package/dist/checkpointer/internal/checkpoint-write-verify.d.ts +0 -24
  360. package/dist/checkpointer/internal/checkpoint-write-verify.js +0 -67
  361. package/dist/checkpointer/internal/configurable.d.ts +0 -12
  362. package/dist/checkpointer/internal/configurable.js +0 -24
  363. package/dist/checkpointer/internal/fetch.d.ts +0 -19
  364. package/dist/checkpointer/internal/fetch.js +0 -88
  365. package/dist/checkpointer/internal/filter-match.d.ts +0 -13
  366. package/dist/checkpointer/internal/filter-match.js +0 -15
  367. package/dist/checkpointer/internal/item-reader.d.ts +0 -66
  368. package/dist/checkpointer/internal/item-reader.js +0 -113
  369. package/dist/checkpointer/internal/item-writer.d.ts +0 -35
  370. package/dist/checkpointer/internal/item-writer.js +0 -107
  371. package/dist/checkpointer/internal/keys.d.ts +0 -41
  372. package/dist/checkpointer/internal/keys.js +0 -117
  373. package/dist/checkpointer/internal/list-scope.d.ts +0 -61
  374. package/dist/checkpointer/internal/list-scope.js +0 -108
  375. package/dist/checkpointer/internal/pending-sends.d.ts +0 -13
  376. package/dist/checkpointer/internal/pending-sends.js +0 -29
  377. package/dist/checkpointer/internal/query.d.ts +0 -21
  378. package/dist/checkpointer/internal/query.js +0 -42
  379. package/dist/checkpointer/internal/regular-write.d.ts +0 -28
  380. package/dist/checkpointer/internal/regular-write.js +0 -66
  381. package/dist/checkpointer/internal/setup.d.ts +0 -33
  382. package/dist/checkpointer/internal/setup.js +0 -38
  383. package/dist/checkpointer/internal/special-write-cas.d.ts +0 -29
  384. package/dist/checkpointer/internal/special-write-cas.js +0 -104
  385. package/dist/checkpointer/internal/special-write-cleanup.d.ts +0 -23
  386. package/dist/checkpointer/internal/special-write-cleanup.js +0 -50
  387. package/dist/checkpointer/internal/special-write-verify.d.ts +0 -53
  388. package/dist/checkpointer/internal/special-write-verify.js +0 -80
  389. package/dist/checkpointer/internal/stored-channels.d.ts +0 -31
  390. package/dist/checkpointer/internal/stored-channels.js +0 -70
  391. package/dist/checkpointer/internal/validation.d.ts +0 -18
  392. package/dist/checkpointer/internal/validation.js +0 -40
  393. package/dist/checkpointer/internal/write-guard.d.ts +0 -20
  394. package/dist/checkpointer/internal/write-guard.js +0 -48
  395. package/dist/checkpointer/internal/write-index.d.ts +0 -36
  396. package/dist/checkpointer/internal/write-index.js +0 -41
  397. package/dist/checkpointer/saver.d.ts +0 -70
  398. package/dist/checkpointer/saver.js +0 -105
  399. package/dist/checkpointer/types.d.ts +0 -58
  400. package/dist/factory/factory.d.ts +0 -40
  401. package/dist/factory/factory.js +0 -87
  402. package/dist/history/actions/add-messages.d.ts +0 -15
  403. package/dist/history/actions/add-messages.js +0 -77
  404. package/dist/history/actions/clear.d.ts +0 -10
  405. package/dist/history/actions/clear.js +0 -34
  406. package/dist/history/actions/get-messages.d.ts +0 -17
  407. package/dist/history/actions/get-messages.js +0 -79
  408. package/dist/history/actions/list-sessions.d.ts +0 -13
  409. package/dist/history/actions/list-sessions.js +0 -53
  410. package/dist/history/actions/reconcile-count.d.ts +0 -12
  411. package/dist/history/actions/reconcile-count.js +0 -64
  412. package/dist/history/chat-message-history.d.ts +0 -73
  413. package/dist/history/chat-message-history.js +0 -111
  414. package/dist/history/internal/append-saga.d.ts +0 -25
  415. package/dist/history/internal/append-saga.js +0 -79
  416. package/dist/history/internal/compensation.d.ts +0 -25
  417. package/dist/history/internal/compensation.js +0 -92
  418. package/dist/history/internal/item-mapper.d.ts +0 -9
  419. package/dist/history/internal/item-mapper.js +0 -27
  420. package/dist/history/internal/keys.d.ts +0 -16
  421. package/dist/history/internal/keys.js +0 -48
  422. package/dist/history/internal/message-chunker.d.ts +0 -13
  423. package/dist/history/internal/message-chunker.js +0 -67
  424. package/dist/history/internal/message-transaction.d.ts +0 -25
  425. package/dist/history/internal/message-transaction.js +0 -61
  426. package/dist/history/internal/message-window.d.ts +0 -17
  427. package/dist/history/internal/message-window.js +0 -49
  428. package/dist/history/internal/query.d.ts +0 -23
  429. package/dist/history/internal/query.js +0 -39
  430. package/dist/history/internal/session-count.d.ts +0 -47
  431. package/dist/history/internal/session-count.js +0 -115
  432. package/dist/history/internal/session-title.d.ts +0 -19
  433. package/dist/history/internal/session-title.js +0 -43
  434. package/dist/history/internal/session-update.d.ts +0 -27
  435. package/dist/history/internal/session-update.js +0 -69
  436. package/dist/history/internal/setup.d.ts +0 -31
  437. package/dist/history/internal/setup.js +0 -43
  438. package/dist/history/internal/title-generator.d.ts +0 -12
  439. package/dist/history/internal/title-generator.js +0 -41
  440. package/dist/history/internal/ttl-anchor.d.ts +0 -24
  441. package/dist/history/internal/ttl-anchor.js +0 -38
  442. package/dist/history/internal/validation.d.ts +0 -25
  443. package/dist/history/internal/validation.js +0 -53
  444. package/dist/history/session-adapter.d.ts +0 -29
  445. package/dist/history/session-adapter.js +0 -35
  446. package/dist/history/types.d.ts +0 -69
  447. package/dist/index.d.ts +0 -29
  448. package/dist/index.js +0 -32
  449. package/dist/shared/clock.d.ts +0 -8
  450. package/dist/shared/clock.js +0 -16
  451. package/dist/shared/codec/codec.d.ts +0 -53
  452. package/dist/shared/codec/codec.js +0 -66
  453. package/dist/shared/codec/compression.d.ts +0 -24
  454. package/dist/shared/codec/compression.js +0 -48
  455. package/dist/shared/codec/descriptor-keys.d.ts +0 -12
  456. package/dist/shared/codec/descriptor-keys.js +0 -14
  457. package/dist/shared/codec/encode.d.ts +0 -13
  458. package/dist/shared/codec/encode.js +0 -43
  459. package/dist/shared/codec/json-serde.d.ts +0 -7
  460. package/dist/shared/codec/json-serde.js +0 -17
  461. package/dist/shared/codec/payload-loss.d.ts +0 -12
  462. package/dist/shared/codec/payload-loss.js +0 -38
  463. package/dist/shared/codec/s3/adapter-config.d.ts +0 -13
  464. package/dist/shared/codec/s3/adapter-config.js +0 -22
  465. package/dist/shared/codec/s3/bounded-body.d.ts +0 -14
  466. package/dist/shared/codec/s3/bounded-body.js +0 -47
  467. package/dist/shared/codec/s3/client.d.ts +0 -18
  468. package/dist/shared/codec/s3/client.js +0 -46
  469. package/dist/shared/codec/s3/config.d.ts +0 -51
  470. package/dist/shared/codec/s3/config.js +0 -58
  471. package/dist/shared/codec/s3/delete.d.ts +0 -7
  472. package/dist/shared/codec/s3/delete.js +0 -28
  473. package/dist/shared/codec/s3/key-scope.d.ts +0 -23
  474. package/dist/shared/codec/s3/key-scope.js +0 -44
  475. package/dist/shared/codec/s3/lifecycle.d.ts +0 -14
  476. package/dist/shared/codec/s3/lifecycle.js +0 -63
  477. package/dist/shared/codec/s3/offloader.d.ts +0 -44
  478. package/dist/shared/codec/s3/offloader.js +0 -118
  479. package/dist/shared/codec/s3/orphans.d.ts +0 -23
  480. package/dist/shared/codec/s3/orphans.js +0 -71
  481. package/dist/shared/codec/s3/read-write.d.ts +0 -18
  482. package/dist/shared/codec/s3/read-write.js +0 -51
  483. package/dist/shared/codec/s3/retry.d.ts +0 -5
  484. package/dist/shared/codec/s3/retry.js +0 -22
  485. package/dist/shared/concurrency.d.ts +0 -6
  486. package/dist/shared/constants.d.ts +0 -112
  487. package/dist/shared/constants.js +0 -115
  488. package/dist/shared/dynamodb/abort.d.ts +0 -9
  489. package/dist/shared/dynamodb/abort.js +0 -27
  490. package/dist/shared/dynamodb/backoff.d.ts +0 -15
  491. package/dist/shared/dynamodb/backoff.js +0 -48
  492. package/dist/shared/dynamodb/batch-write.d.ts +0 -22
  493. package/dist/shared/dynamodb/batch-write.js +0 -53
  494. package/dist/shared/dynamodb/cancellation.d.ts +0 -6
  495. package/dist/shared/dynamodb/cancellation.js +0 -7
  496. package/dist/shared/dynamodb/client.d.ts +0 -28
  497. package/dist/shared/dynamodb/conditional-put.d.ts +0 -67
  498. package/dist/shared/dynamodb/conditional-put.js +0 -76
  499. package/dist/shared/dynamodb/drain-unprocessed.d.ts +0 -21
  500. package/dist/shared/dynamodb/drain-unprocessed.js +0 -43
  501. package/dist/shared/dynamodb/expiry.d.ts +0 -16
  502. package/dist/shared/dynamodb/expiry.js +0 -29
  503. package/dist/shared/dynamodb/paginate-core.d.ts +0 -24
  504. package/dist/shared/dynamodb/paginate-core.js +0 -82
  505. package/dist/shared/dynamodb/paginate.d.ts +0 -14
  506. package/dist/shared/dynamodb/paginate.js +0 -19
  507. package/dist/shared/dynamodb/partition-delete.d.ts +0 -39
  508. package/dist/shared/dynamodb/partition-delete.js +0 -71
  509. package/dist/shared/dynamodb/retry-classifier.d.ts +0 -17
  510. package/dist/shared/dynamodb/retry-classifier.js +0 -118
  511. package/dist/shared/dynamodb/retry-policy.d.ts +0 -26
  512. package/dist/shared/dynamodb/retry-policy.js +0 -22
  513. package/dist/shared/dynamodb/retry.d.ts +0 -31
  514. package/dist/shared/dynamodb/retry.js +0 -57
  515. package/dist/shared/dynamodb/scan.d.ts +0 -14
  516. package/dist/shared/dynamodb/scan.js +0 -19
  517. package/dist/shared/dynamodb/types.d.ts +0 -23
  518. package/dist/shared/errors/base-error.d.ts +0 -30
  519. package/dist/shared/errors/base-error.js +0 -27
  520. package/dist/shared/errors/boundary.d.ts +0 -18
  521. package/dist/shared/errors/boundary.js +0 -46
  522. package/dist/shared/errors/error-code.d.ts +0 -13
  523. package/dist/shared/errors/errors.d.ts +0 -68
  524. package/dist/shared/errors/errors.js +0 -114
  525. package/dist/shared/errors/upstream-error.d.ts +0 -16
  526. package/dist/shared/errors/upstream-error.js +0 -27
  527. package/dist/shared/errors/wrap-error.d.ts +0 -7
  528. package/dist/shared/errors/wrap-error.js +0 -15
  529. package/dist/shared/logging/logger.d.ts +0 -18
  530. package/dist/shared/logging/logger.js +0 -15
  531. package/dist/shared/logging/redaction-walk.d.ts +0 -23
  532. package/dist/shared/logging/redaction-walk.js +0 -112
  533. package/dist/shared/logging/redaction.d.ts +0 -39
  534. package/dist/shared/logging/redaction.js +0 -75
  535. package/dist/shared/logging/secret-patterns.d.ts +0 -92
  536. package/dist/shared/logging/secret-patterns.js +0 -133
  537. package/dist/shared/options.d.ts +0 -37
  538. package/dist/shared/ulid.d.ts +0 -23
  539. package/dist/shared/validation/options.d.ts +0 -8
  540. package/dist/shared/validation/options.js +0 -90
  541. package/dist/shared/validation/primitives.d.ts +0 -29
  542. package/dist/shared/validation/primitives.js +0 -82
  543. package/dist/shared/validation/ttl.d.ts +0 -28
  544. package/dist/shared/validation/ttl.js +0 -52
  545. package/dist/store/actions/get.d.ts +0 -13
  546. package/dist/store/actions/get.js +0 -73
  547. package/dist/store/actions/list-namespaces.d.ts +0 -8
  548. package/dist/store/actions/list-namespaces.js +0 -59
  549. package/dist/store/actions/put.d.ts +0 -10
  550. package/dist/store/actions/put.js +0 -96
  551. package/dist/store/actions/reconcile-vector-index.d.ts +0 -18
  552. package/dist/store/actions/reconcile-vector-index.js +0 -26
  553. package/dist/store/actions/search.d.ts +0 -9
  554. package/dist/store/actions/search.js +0 -34
  555. package/dist/store/internal/backend-search.d.ts +0 -4
  556. package/dist/store/internal/backend-search.js +0 -74
  557. package/dist/store/internal/batch-plan.d.ts +0 -11
  558. package/dist/store/internal/batch-plan.js +0 -52
  559. package/dist/store/internal/candidates.d.ts +0 -23
  560. package/dist/store/internal/candidates.js +0 -94
  561. package/dist/store/internal/filter.d.ts +0 -9
  562. package/dist/store/internal/filter.js +0 -85
  563. package/dist/store/internal/index-reconcile.d.ts +0 -21
  564. package/dist/store/internal/index-reconcile.js +0 -118
  565. package/dist/store/internal/index-sync.d.ts +0 -10
  566. package/dist/store/internal/index-sync.js +0 -25
  567. package/dist/store/internal/item-mapper.d.ts +0 -27
  568. package/dist/store/internal/item-mapper.js +0 -61
  569. package/dist/store/internal/keys.d.ts +0 -17
  570. package/dist/store/internal/keys.js +0 -41
  571. package/dist/store/internal/namespace-match.d.ts +0 -11
  572. package/dist/store/internal/namespace-match.js +0 -40
  573. package/dist/store/internal/option-validation.d.ts +0 -13
  574. package/dist/store/internal/option-validation.js +0 -77
  575. package/dist/store/internal/overwrite-swap.d.ts +0 -32
  576. package/dist/store/internal/overwrite-swap.js +0 -68
  577. package/dist/store/internal/persist.d.ts +0 -28
  578. package/dist/store/internal/persist.js +0 -64
  579. package/dist/store/internal/query.d.ts +0 -11
  580. package/dist/store/internal/query.js +0 -48
  581. package/dist/store/internal/ranker.d.ts +0 -18
  582. package/dist/store/internal/ranker.js +0 -39
  583. package/dist/store/internal/read-existing.d.ts +0 -23
  584. package/dist/store/internal/read-existing.js +0 -41
  585. package/dist/store/internal/score-direction.d.ts +0 -31
  586. package/dist/store/internal/score-direction.js +0 -38
  587. package/dist/store/internal/search-filter.d.ts +0 -3
  588. package/dist/store/internal/search-filter.js +0 -10
  589. package/dist/store/internal/semantic-search.d.ts +0 -34
  590. package/dist/store/internal/semantic-search.js +0 -87
  591. package/dist/store/internal/setup.d.ts +0 -36
  592. package/dist/store/internal/setup.js +0 -40
  593. package/dist/store/internal/text-path.d.ts +0 -17
  594. package/dist/store/internal/validation.d.ts +0 -18
  595. package/dist/store/internal/validation.js +0 -51
  596. package/dist/store/internal/write-verify.d.ts +0 -42
  597. package/dist/store/internal/write-verify.js +0 -71
  598. package/dist/store/store.d.ts +0 -61
  599. package/dist/store/store.js +0 -107
  600. package/dist/store/types.d.ts +0 -50
  601. package/dist/store/types.js +0 -2
  602. package/dist/store/vector-backend.d.ts +0 -43
  603. package/dist/store/vector-backend.js +0 -2
  604. /package/dist/{checkpointer → cjs/checkpointer}/types.js +0 -0
  605. /package/dist/{factory → cjs/factory}/types.js +0 -0
  606. /package/dist/{history → cjs/history}/types.js +0 -0
  607. /package/dist/{shared → cjs/shared}/options.js +0 -0
  608. /package/dist/{shared/dynamodb → cjs/store}/types.js +0 -0
@@ -0,0 +1,123 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.collectCandidates = collectCandidates;
4
+ exports.rankInMemory = rankInMemory;
5
+ const clock_js_1 = require("../../shared/clock.js");
6
+ const concurrency_js_1 = require("../../shared/concurrency.js");
7
+ const paginate_js_1 = require("../../shared/dynamodb/paginate.js");
8
+ const retry_js_1 = require("../../shared/dynamodb/retry.js");
9
+ const table_schema_js_1 = require("../../shared/dynamodb/table-schema.js");
10
+ const errors_js_1 = require("../../shared/errors/errors.js");
11
+ const filter_js_1 = require("./filter.js");
12
+ const get_item_js_1 = require("./get-item.js");
13
+ const rows_js_1 = require("./rows.js");
14
+ const semantic_search_js_1 = require("./semantic-search.js");
15
+ function storedVectors(record) {
16
+ if (record.embeddings)
17
+ return record.embeddings;
18
+ return record.embedding ? [record.embedding] : undefined;
19
+ }
20
+ function candidateSource(context, search, signal, now) {
21
+ return search.namespacePrefix.length > 0
22
+ ? (0, paginate_js_1.paginateQuery)({
23
+ retry: (0, retry_js_1.retryFor)(context, signal),
24
+ signal,
25
+ client: context.client,
26
+ params: (0, table_schema_js_1.withoutExpired)((0, rows_js_1.scopedQuery)(context.tableName, search.namespacePrefix), now),
27
+ maxItems: context.maxScanItems,
28
+ maxIterations: context.maxIterations,
29
+ })
30
+ : (0, paginate_js_1.paginateScan)({
31
+ retry: (0, retry_js_1.retryFor)(context, signal),
32
+ signal,
33
+ client: context.client,
34
+ params: (0, table_schema_js_1.withoutExpired)((0, rows_js_1.storeScan)(context.tableName), now),
35
+ maxItems: context.maxScanItems,
36
+ maxIterations: context.maxIterations,
37
+ });
38
+ }
39
+ function liveRow(raw, search, now) {
40
+ const record = (0, rows_js_1.parseWholeStoreRow)(raw);
41
+ if (!record || (0, table_schema_js_1.isExpiredRow)(record, now))
42
+ return undefined;
43
+ return (0, rows_js_1.namespaceMatchesPrefix)(record.namespace, search.namespacePrefix) ? record : undefined;
44
+ }
45
+ async function flush(context, search, state, signal) {
46
+ if (state.pending.length === 0)
47
+ return;
48
+ const batch = state.pending;
49
+ state.pending = [];
50
+ const reads = await (0, concurrency_js_1.mapWithConcurrency)(batch, context.readConcurrency ?? concurrency_js_1.DEFAULT_READ_CONCURRENCY, (record) => (0, get_item_js_1.readCandidate)(context, record, signal));
51
+ for (const read of reads) {
52
+ if (read !== undefined && (0, filter_js_1.passesFilter)(read.item, search.filter)) {
53
+ state.collected.push({ item: read.item, embeddings: storedVectors(read.row) });
54
+ }
55
+ }
56
+ }
57
+ function batchSize(search, need, collected, limit) {
58
+ return search.filter === undefined ? Math.min(limit, need - collected) : limit;
59
+ }
60
+ function tooManyCandidates(count, cap) {
61
+ return (0, errors_js_1.validationError)(`Semantic search candidate set (${count}) exceeds maxSearchCandidates (${cap}); ` +
62
+ 'use a dedicated VectorBackend for large corpora', 'maxSearchCandidates');
63
+ }
64
+ async function collectCandidates(context, search, bound, signal) {
65
+ const now = (0, clock_js_1.nowSeconds)();
66
+ const limit = context.readConcurrency ?? concurrency_js_1.DEFAULT_READ_CONCURRENCY;
67
+ const state = { pending: [], collected: [] };
68
+ for await (const raw of candidateSource(context, search, signal, now)) {
69
+ const record = liveRow(raw, search, now);
70
+ if (!record)
71
+ continue;
72
+ state.pending.push(record);
73
+ if (bound.kind === 'semantic') {
74
+ if (state.pending.length > bound.cap)
75
+ throw tooManyCandidates(state.pending.length, bound.cap);
76
+ continue;
77
+ }
78
+ if (state.pending.length < batchSize(search, bound.need, state.collected.length, limit)) {
79
+ continue;
80
+ }
81
+ await flush(context, search, state, signal);
82
+ if (state.collected.length >= bound.need)
83
+ return state.collected;
84
+ }
85
+ await flush(context, search, state, signal);
86
+ return state.collected;
87
+ }
88
+ const UNSCORED_RANK = -2;
89
+ function bestScore(vectors, queryVector) {
90
+ let best;
91
+ for (const vector of vectors) {
92
+ if (vector.length !== queryVector.length)
93
+ continue;
94
+ const score = (0, semantic_search_js_1.cosineSimilarity)(queryVector, vector);
95
+ if (best === undefined || score > best)
96
+ best = score;
97
+ }
98
+ return best;
99
+ }
100
+ function isDimensionMismatch(candidate, queryVector) {
101
+ const vectors = candidate.embeddings;
102
+ return (vectors !== undefined &&
103
+ vectors.length > 0 &&
104
+ vectors.every((vector) => vector.length !== queryVector.length));
105
+ }
106
+ function rankInMemory(candidates, queryVector, maxCandidates, onDimensionMismatch) {
107
+ if (candidates.length > maxCandidates) {
108
+ throw (0, errors_js_1.validationError)(`Semantic search candidate set (${candidates.length}) exceeds maxSearchCandidates ` +
109
+ `(${maxCandidates}); use a dedicated VectorBackend for large corpora`, 'maxSearchCandidates');
110
+ }
111
+ const mismatched = candidates.filter((candidate) => isDimensionMismatch(candidate, queryVector)).length;
112
+ if (mismatched > 0)
113
+ onDimensionMismatch?.(mismatched);
114
+ return candidates
115
+ .map(({ item, embeddings }) => ({
116
+ ...item,
117
+ score: embeddings ? bestScore(embeddings, queryVector) : undefined,
118
+ }))
119
+ .sort((a, b) => rankValue(b) - rankValue(a));
120
+ }
121
+ function rankValue(item) {
122
+ return item.score ?? UNSCORED_RANK;
123
+ }
@@ -0,0 +1,258 @@
1
+ /**
2
+ * Hides the vector backend as a copy of the items' embeddings.
3
+ *
4
+ * When a store is given a `VectorBackend`, every item's embedding is kept there
5
+ * as well as the item in the table, and the table is the truth. When the copy
6
+ * is written (after the row commits), when an entry is dropped (only once a
7
+ * fresh read finds the row gone), how a backend's answer is resolved back to
8
+ * the canonical items and in which direction its scores run, and how the copy
9
+ * is repaired against the table are decided here, and nothing else calls the
10
+ * backend.
11
+ */
12
+ import type { IndexConfig, SearchItem } from '@langchain/langgraph-checkpoint';
13
+ import type { VectorReconcileResult } from '../types.js';
14
+ import type { VectorBackend, VectorMatch, VectorRef, VectorScoreDirection } from '../vector-backend.js';
15
+ import { type Namespace, type ParsedPut, type ParsedSearch, type StoreAddress } from './parse.js';
16
+ import type { StoreContext } from './setup.js';
17
+ /** A store context whose vector copy is configured: an embeddings index and a backend. */
18
+ export type BackendContext = StoreContext & {
19
+ readonly index: IndexConfig;
20
+ readonly vectorBackend: VectorBackend;
21
+ };
22
+ /**
23
+ * Whether the store keeps a vector copy.
24
+ *
25
+ * Accepts: `context` — the store's.
26
+ *
27
+ * Returns: `true`, narrowing `context`, when both `index` and `vectorBackend`
28
+ * are configured.
29
+ *
30
+ * Throws: nothing.
31
+ */
32
+ export declare function hasVectorBackend(context: StoreContext): context is BackendContext;
33
+ /**
34
+ * The one vector a put gives the backend for its item.
35
+ *
36
+ * Accepts: `op` — the parsed put. Its `index` is `false` to embed nothing, a
37
+ * field list to embed those fields, absent to embed the configured ones.
38
+ *
39
+ * Returns: the joined embedding, or `undefined` when the store keeps no vector
40
+ * copy, the put indexes nothing, or the value has no text to embed.
41
+ *
42
+ * Throws: `VALIDATION` naming `index.dims` when the model returns a vector of
43
+ * another length; whatever `embedDocuments` throws.
44
+ */
45
+ export declare function itemVector(context: StoreContext, op: ParsedPut): Promise<number[] | undefined>;
46
+ /**
47
+ * Write an item's entry in the vector copy after its row has committed: the
48
+ * vector when there is one, a delete when there is none. Best-effort sync of
49
+ * one item's embedding to the vector backend after the canonical DynamoDB
50
+ * write has already succeeded.
51
+ *
52
+ * Accepts: `address` — the item's. `embedding` — from {@link itemVector}:
53
+ * present upserts it; absent deletes any vector the backend still holds, which
54
+ * is what a re-put with no indexable text, an `index: false` put and a delete
55
+ * all mean.
56
+ *
57
+ * Returns: nothing, in both the synced and the failed case; without a backend,
58
+ * nothing is done.
59
+ *
60
+ * Throws: nothing. The canonical item is already committed, so failing here
61
+ * would report a put that in fact succeeded; the drift is logged at `warn` and
62
+ * `reconcileVectorIndex` repairs it.
63
+ */
64
+ export declare function syncItemVector(context: StoreContext, address: StoreAddress, embedding: number[] | undefined): Promise<void>;
65
+ /**
66
+ * Drop the item's vector, but only on a fresh read that finds no row at the
67
+ * key.
68
+ *
69
+ * The question is deliberately **not** "did this call remove the row" — that
70
+ * one is true in exactly the interleaving that goes wrong. It is "does the key
71
+ * hold a row *now*", which a racing put that recreated it and a
72
+ * compare-and-swap that left it alone both answer the same way, and which costs
73
+ * a point read of this library's own table rather than anything the backend has
74
+ * to offer. The reconciler asks the same question before pruning a candidate
75
+ * it never saw; one it did see is pinned to the revision the snapshot read
76
+ * instead. Either way, the delete path and the reconciler are equally careful.
77
+ *
78
+ * A read that itself fails answers "not confirmed" and keeps the vector: a
79
+ * stale vector for a deleted item, which `reconcileVectorIndex` removes, rather
80
+ * than a missing one for a live item, which is the defect this exists for.
81
+ *
82
+ * Accepts: `address` — the deleted item's; the row read is derived from it.
83
+ *
84
+ * Returns: nothing; without a backend, nothing is read or dropped. A row still
85
+ * at the key keeps its vector and logs one `info`.
86
+ *
87
+ * Throws: nothing the backend throws (see {@link syncItemVector}); whatever the
88
+ * confirmation read throws that `isRowAbsent` does not answer as "not
89
+ * confirmed".
90
+ */
91
+ export declare function dropVectorWhenGone(context: StoreContext, address: StoreAddress): Promise<void>;
92
+ /** A canonical item's location plus the embedding recomputed for it. */
93
+ export interface ReconcileTarget {
94
+ namespace: string[];
95
+ key: string;
96
+ embedding: number[] | undefined;
97
+ /** The revision the snapshot read, which a later put replaces; absent on a row written before revisions. */
98
+ rev?: string;
99
+ }
100
+ /**
101
+ * Enumerate the live (unexpired) items under `prefix` and recompute their
102
+ * embeddings.
103
+ *
104
+ * Accepts: `prefix` — at least one element, since the enumeration is one
105
+ * partition's Query; reconciling is always scoped. `signal` — aborts between
106
+ * pages.
107
+ *
108
+ * Returns: one target per live item, each with the embedding the item's current
109
+ * value produces — `undefined` when it yields no indexable text, which is the
110
+ * evidence that lets {@link pruneOrphans} drop a vector that has gone stale.
111
+ *
112
+ * Throws: whatever the reads, the decodes and the embeddings model throw; a
113
+ * failed embedding rejects the whole reconcile, because a skipped item would
114
+ * leave the live set and {@link selectOrphans} would prune its still-valid
115
+ * vector. `RESULT_TRUNCATED` when `maxScanItems` or `maxIterations` is
116
+ * reached while rows remain — reconciling from a partial view would prune
117
+ * live vectors.
118
+ *
119
+ * Guarantees: rows are decoded in bounded batches, so a namespace of offloaded
120
+ * items costs neither one round-trip at a time nor every payload in memory at
121
+ * once.
122
+ */
123
+ export declare function collectReconcileTargets(context: StoreContext, prefix: Namespace, signal?: AbortSignal): Promise<ReconcileTarget[]>;
124
+ /**
125
+ * Re-push every live embedding to the backend.
126
+ *
127
+ * Accepts: `targets` — a target with no embedding is not pushed; its vector is
128
+ * {@link pruneOrphans}' business, not an upsert of nothing.
129
+ *
130
+ * Returns: how many vectors were upserted.
131
+ *
132
+ * Throws: whatever the backend throws. The upserts are issued one at a time on
133
+ * purpose: this is a bulk repair against a third-party index, and the run has
134
+ * no latency budget worth a thundering herd.
135
+ */
136
+ export declare function pushEmbeddings(backend: VectorBackend, targets: ReconcileTarget[]): Promise<number>;
137
+ /**
138
+ * Refs the backend holds that the live set does not account for.
139
+ *
140
+ * Accepts: `backendRefs` — whatever the backend lists under the prefix.
141
+ * `live` — the snapshot; a target with no embedding does not account for a
142
+ * vector, since its item no longer produces one.
143
+ *
144
+ * Returns: the candidates to prune — candidates, not conclusions: the snapshot
145
+ * and the backend listing are not one point in time (see {@link pruneOrphans}).
146
+ *
147
+ * Throws: nothing.
148
+ */
149
+ export declare function selectOrphans(backendRefs: VectorRef[], live: ReconcileTarget[]): VectorRef[];
150
+ /**
151
+ * Delete backend vectors with no canonical item.
152
+ *
153
+ * Accepts: `live` — the snapshot {@link collectReconcileTargets} took.
154
+ * `backend.listKeys` — optional; a backend that cannot enumerate its own keys
155
+ * cannot be pruned, which is reported rather than silently skipped.
156
+ *
157
+ * Returns: how many vectors were deleted.
158
+ *
159
+ * Throws: whatever the backend and the confirmation read throw.
160
+ *
161
+ * Guarantees: a vector is deleted only on evidence that its item is gone — a
162
+ * fresh strongly-consistent read finds the item still at the revision the
163
+ * snapshot read — when that snapshot yielded it no embedding — or finds no
164
+ * row at all, or one past its `ttl` that DynamoDB has yet to sweep. An item
165
+ * written between the snapshot and the listing looks orphaned and is kept, so
166
+ * reconciling never drops a just-written item out of semantic search.
167
+ */
168
+ export declare function pruneOrphans(context: StoreContext, backend: VectorBackend, prefix: Namespace, live: ReconcileTarget[]): Promise<number>;
169
+ /**
170
+ * Repair the vector copy against the items under a prefix: re-push every live
171
+ * embedding, then prune entries whose item is confirmed gone.
172
+ *
173
+ * Accepts: `prefix` — parsed. `signal` — cancels the table read.
174
+ *
175
+ * Returns: how many entries were upserted and pruned.
176
+ *
177
+ * Throws: whatever the table read, the embeddings model or the backend throws.
178
+ */
179
+ export declare function reconcileVectors(context: BackendContext, prefix: Namespace, signal?: AbortSignal): Promise<VectorReconcileResult>;
180
+ /**
181
+ * Rank a search through a configured vector backend.
182
+ *
183
+ * Accepts: `context` — the store's, with the backend searched and the index
184
+ * whose embeddings model embeds the query. `search.query` — non-empty; the
185
+ * caller checks that before choosing this path. `search.offset`/`search.limit`
186
+ * — the page, whose end (`offset + limit`) must fit within
187
+ * `maxSearchCandidates`, since that many matches have to be fetched to fill it.
188
+ * `search.filter` — applied to the canonical item, not to whatever the backend
189
+ * stored, so a filter is never answered from a stale vector.
190
+ *
191
+ * Returns: the page's items in the backend's order, each carrying the relevance
192
+ * score for its vector — once each: a backend holding several vectors for one
193
+ * item (one per passage, say) can return it more than once in a round, and
194
+ * the item is answered at the first score it gave, as the reference store and
195
+ * {@link rankInMemory} answer an item by its best-matching vector. Fewer than
196
+ * `limit` items means the backend has no more matches under the prefix, not
197
+ * that the page was cut short. An item the backend holds no vector for — put
198
+ * with `index: false`, or with no indexable text — is not a match here, where
199
+ * the in-DynamoDB ranker lists it last with no score.
200
+ *
201
+ * Throws: `VALIDATION` naming `index.dims` when the query embeds to a
202
+ * different width than the index declares, and naming `maxSearchCandidates`
203
+ * either for a page larger than the cap or when the filter leaves the page short
204
+ * at the cap — the same answer the in-DynamoDB ranker gives, rather than a
205
+ * silently short page. Whatever a canonical read throws — a read that did not
206
+ * happen is not an item that is not there — since a match this store cannot
207
+ * address is dropped before its read rather than caught after it (see
208
+ * {@link addressOf}). Whatever the embeddings model and the backend throw.
209
+ *
210
+ * Guarantees: DynamoDB stays canonical. A match whose item has since been
211
+ * deleted or lies outside the prefix is dropped and the search asks the backend
212
+ * for more, so a stale or over-broad index costs results only in latency. A
213
+ * match whose read *fails* is not dropped: the page a caller receives is never
214
+ * shorter than the matches that exist, which is what the in-DynamoDB path
215
+ * already promises. Items are fetched with the same bounded concurrency as the
216
+ * in-DynamoDB path, and each distinct match is read once for the whole call
217
+ * however many rounds it takes (see {@link fetchUnseen}).
218
+ */
219
+ export declare function searchViaBackend(context: BackendContext, search: ParsedSearch, signal?: AbortSignal): Promise<SearchItem[]>;
220
+ /**
221
+ * Normalise a backend's matches to the relevance direction upstream
222
+ * `SearchItem.score` documents — "higher scores indicate better matches",
223
+ * typically a cosine similarity between -1 and 1.
224
+ *
225
+ * A distance is converted by **negation** rather than `1 / (1 + d)`: negation
226
+ * is monotone over the whole real line, needs no non-negativity precondition,
227
+ * and is exactly invertible, so the original distance is simply `-score`. A
228
+ * reciprocal would silently imply a different `(0, 1]` scale and is undefined
229
+ * at `d === -1`. Negative scores are already in range for this contract, so
230
+ * nothing is lost by producing them.
231
+ *
232
+ * Results are re-sorted after conversion so a backend that returns its matches
233
+ * in some other order still ranks correctly. Anything that is not `'distance'`
234
+ * is returned untouched — its own order stays authoritative, exactly as before.
235
+ *
236
+ * The test is for `'distance'` rather than against `'relevance'` on purpose:
237
+ * converting is the destructive branch, so only the exact value that asks for
238
+ * it may reach it. Testing the other way round made every unrecognised
239
+ * string — `'Distance'`, a typo, a value read from a config file — reverse the
240
+ * ranking silently, with no error and no warning (the ascending-score warning
241
+ * lives downstream of this conversion, so it could never fire). `setUpStore`
242
+ * rejects such a value outright; this keeps the failure harmless for any
243
+ * caller that reaches the function some other way.
244
+ *
245
+ * Accepts: `matches` — in any order, including empty. `direction` — only the
246
+ * exact string `'distance'` converts; every other value, recognised or not,
247
+ * passes the matches through untouched.
248
+ *
249
+ * Returns: matches whose `score` follows the relevance direction upstream
250
+ * documents, highest first. Converting re-sorts, so a backend that returned its
251
+ * matches in some other order still ranks correctly.
252
+ *
253
+ * Throws: nothing.
254
+ *
255
+ * Guarantees: the conversion is exactly invertible — the original distance is
256
+ * `-score` — so nothing about the backend's answer is lost.
257
+ */
258
+ export declare function toRelevanceScores(matches: VectorMatch[], direction: VectorScoreDirection): VectorMatch[];
@@ -0,0 +1,269 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.hasVectorBackend = hasVectorBackend;
4
+ exports.itemVector = itemVector;
5
+ exports.syncItemVector = syncItemVector;
6
+ exports.dropVectorWhenGone = dropVectorWhenGone;
7
+ exports.collectReconcileTargets = collectReconcileTargets;
8
+ exports.pushEmbeddings = pushEmbeddings;
9
+ exports.selectOrphans = selectOrphans;
10
+ exports.pruneOrphans = pruneOrphans;
11
+ exports.reconcileVectors = reconcileVectors;
12
+ exports.searchViaBackend = searchViaBackend;
13
+ exports.toRelevanceScores = toRelevanceScores;
14
+ const clock_js_1 = require("../../shared/clock.js");
15
+ const concurrency_js_1 = require("../../shared/concurrency.js");
16
+ const idempotent_write_js_1 = require("../../shared/dynamodb/idempotent-write.js");
17
+ const paginate_js_1 = require("../../shared/dynamodb/paginate.js");
18
+ const retry_js_1 = require("../../shared/dynamodb/retry.js");
19
+ const table_schema_js_1 = require("../../shared/dynamodb/table-schema.js");
20
+ const base_error_js_1 = require("../../shared/errors/base-error.js");
21
+ const errors_js_1 = require("../../shared/errors/errors.js");
22
+ const truncate_js_1 = require("../../shared/logging/truncate.js");
23
+ const filter_js_1 = require("./filter.js");
24
+ const get_item_js_1 = require("./get-item.js");
25
+ const parse_js_1 = require("./parse.js");
26
+ const rows_js_1 = require("./rows.js");
27
+ const semantic_search_js_1 = require("./semantic-search.js");
28
+ function hasVectorBackend(context) {
29
+ return context.index !== undefined && context.vectorBackend !== undefined;
30
+ }
31
+ async function itemVector(context, op) {
32
+ if (!context.vectorBackend || op.index === false)
33
+ return undefined;
34
+ return (0, semantic_search_js_1.embedValue)(context, op.value, op.index);
35
+ }
36
+ async function syncItemVector(context, address, embedding) {
37
+ const backend = context.vectorBackend;
38
+ if (backend === undefined)
39
+ return;
40
+ try {
41
+ if (embedding)
42
+ await backend.upsert(address.namespace, address.key, embedding);
43
+ else
44
+ await backend.delete(address.namespace, address.key);
45
+ }
46
+ catch (error) {
47
+ context.logger.warn('store vector-index sync failed; reconcileVectorIndex will repair', {
48
+ namespace: address.namespace,
49
+ key: address.key,
50
+ operation: embedding ? 'upsert' : 'delete',
51
+ reason: (0, truncate_js_1.truncateForLog)((0, base_error_js_1.failureLabel)(error)),
52
+ });
53
+ }
54
+ }
55
+ async function dropVectorWhenGone(context, address) {
56
+ if (context.vectorBackend === undefined)
57
+ return;
58
+ const key = (0, rows_js_1.itemRowKey)(address);
59
+ if (!(await (0, idempotent_write_js_1.isRowAbsent)(context, key))) {
60
+ context.logger.info('store.delete: kept a vector whose item was not confirmed gone', {
61
+ namespace: address.namespace,
62
+ key: address.key,
63
+ });
64
+ return;
65
+ }
66
+ await syncItemVector(context, address, undefined);
67
+ }
68
+ function refIdentity(namespace, key) {
69
+ return JSON.stringify([...namespace, key]);
70
+ }
71
+ async function drainPending(context, pending, live, signal) {
72
+ if (pending.length === 0)
73
+ return;
74
+ const batch = pending.splice(0, pending.length);
75
+ const reads = await (0, concurrency_js_1.mapWithConcurrency)(batch, context.readConcurrency ?? concurrency_js_1.DEFAULT_READ_CONCURRENCY, (record) => (0, get_item_js_1.readCandidate)(context, record, signal));
76
+ for (const read of reads) {
77
+ if (read === undefined)
78
+ continue;
79
+ live.push({
80
+ namespace: read.row.namespace,
81
+ key: read.row.key,
82
+ rev: read.row.rev,
83
+ value: read.item.value,
84
+ });
85
+ }
86
+ }
87
+ async function collectReconcileTargets(context, prefix, signal) {
88
+ const now = (0, clock_js_1.nowSeconds)();
89
+ const live = [];
90
+ const pending = [];
91
+ const batchLimit = context.readConcurrency ?? concurrency_js_1.DEFAULT_READ_CONCURRENCY;
92
+ const source = (0, paginate_js_1.paginateQuery)({
93
+ retry: (0, retry_js_1.retryFor)(context, signal),
94
+ signal,
95
+ client: context.client,
96
+ params: (0, table_schema_js_1.withoutExpired)((0, rows_js_1.scopedQuery)(context.tableName, prefix), now),
97
+ maxItems: context.maxScanItems,
98
+ maxIterations: context.maxIterations,
99
+ });
100
+ for await (const raw of source) {
101
+ const record = (0, rows_js_1.parseWholeStoreRow)(raw);
102
+ if (!record) {
103
+ context.logger.warn('reconcileVectorIndex: skipped a row that is not a store item', {
104
+ sortKey: (0, truncate_js_1.truncateForLog)(raw.SK),
105
+ });
106
+ continue;
107
+ }
108
+ if ((0, table_schema_js_1.isExpiredRow)(record, now) || !(0, rows_js_1.namespaceMatchesPrefix)(record.namespace, prefix))
109
+ continue;
110
+ pending.push(record);
111
+ if (pending.length >= batchLimit)
112
+ await drainPending(context, pending, live, signal);
113
+ }
114
+ await drainPending(context, pending, live, signal);
115
+ const embeddings = await (0, semantic_search_js_1.embedValues)(context, live.map((entry) => entry.value));
116
+ return live.map((entry, i) => ({
117
+ namespace: entry.namespace,
118
+ key: entry.key,
119
+ embedding: embeddings[i],
120
+ rev: entry.rev,
121
+ }));
122
+ }
123
+ async function pushEmbeddings(backend, targets) {
124
+ let upserted = 0;
125
+ for (const target of targets) {
126
+ if (!target.embedding)
127
+ continue;
128
+ await backend.upsert(target.namespace, target.key, target.embedding);
129
+ upserted += 1;
130
+ }
131
+ return upserted;
132
+ }
133
+ function selectOrphans(backendRefs, live) {
134
+ const liveKeys = new Set(live
135
+ .filter((target) => target.embedding !== undefined)
136
+ .map((target) => refIdentity(target.namespace, target.key)));
137
+ return backendRefs.filter((ref) => !liveKeys.has(refIdentity(ref.namespace, ref.key)));
138
+ }
139
+ async function confirmedGone(context, ref) {
140
+ const row = await (0, idempotent_write_js_1.readRow)(context, {
141
+ key: (0, rows_js_1.itemRowKey)(ref),
142
+ attribute: table_schema_js_1.PARTITION_KEY_ATTRIBUTE,
143
+ also: ['ttl'],
144
+ });
145
+ return row === undefined || (0, table_schema_js_1.isExpiredRow)(row, (0, clock_js_1.nowSeconds)());
146
+ }
147
+ async function unchangedSinceSnapshot(context, ref, rev) {
148
+ const row = await (0, idempotent_write_js_1.readRow)(context, { key: (0, rows_js_1.itemRowKey)(ref), attribute: rows_js_1.REVISION_ATTRIBUTE });
149
+ return row === undefined || row[rows_js_1.REVISION_ATTRIBUTE] === rev;
150
+ }
151
+ async function pruneOrphans(context, backend, prefix, live) {
152
+ if (!backend.listKeys) {
153
+ context.logger.info('reconcileVectorIndex prune skipped: backend has no listKeys', {
154
+ prefix: (0, truncate_js_1.truncateLabelsForLog)(prefix),
155
+ });
156
+ return 0;
157
+ }
158
+ const candidates = selectOrphans(await backend.listKeys(prefix), live);
159
+ const snapshot = new Map(live.map((target) => [refIdentity(target.namespace, target.key), target.rev]));
160
+ let pruned = 0;
161
+ for (const ref of candidates) {
162
+ const identity = refIdentity(ref.namespace, ref.key);
163
+ const stale = snapshot.has(identity)
164
+ ? await unchangedSinceSnapshot(context, ref, snapshot.get(identity))
165
+ : await confirmedGone(context, ref);
166
+ if (!stale) {
167
+ context.logger.info('reconcileVectorIndex: kept a vector whose item reappeared', {
168
+ namespace: (0, truncate_js_1.truncateLabelsForLog)(ref.namespace),
169
+ key: (0, truncate_js_1.truncateForLog)(ref.key),
170
+ });
171
+ continue;
172
+ }
173
+ await backend.delete(ref.namespace, ref.key);
174
+ pruned += 1;
175
+ }
176
+ return pruned;
177
+ }
178
+ async function reconcileVectors(context, prefix, signal) {
179
+ const targets = await collectReconcileTargets(context, prefix, signal);
180
+ const upserted = await pushEmbeddings(context.vectorBackend, targets);
181
+ const pruned = await pruneOrphans(context, context.vectorBackend, prefix, targets);
182
+ return { upserted, pruned };
183
+ }
184
+ function warnOnNonDescendingScores(context, matches, namespacePrefix) {
185
+ const descending = matches.every((match, position) => position === 0 || matches[position - 1].score >= match.score);
186
+ if (descending)
187
+ return;
188
+ context.logger.warn('search: vectorBackend returned ascending scores; VectorMatch.score must be a relevance ' +
189
+ '(higher is better), not a distance — results are forwarded in the order the backend gave', { namespacePrefix: (0, truncate_js_1.truncateLabelsForLog)(namespacePrefix) });
190
+ }
191
+ function addressOf(context, match) {
192
+ try {
193
+ return (0, parse_js_1.parseStoreAddress)(match.namespace, match.key);
194
+ }
195
+ catch (error) {
196
+ context.logger.warn('search: skipped an unusable vectorBackend match', {
197
+ namespace: (0, truncate_js_1.truncateLabelsForLog)(match.namespace),
198
+ key: (0, truncate_js_1.truncateForLog)(match.key),
199
+ reason: (0, truncate_js_1.truncateForLog)((0, base_error_js_1.failureLabel)(error)),
200
+ });
201
+ return undefined;
202
+ }
203
+ }
204
+ async function fetchMatch(context, match, signal) {
205
+ const address = addressOf(context, match);
206
+ if (address === undefined)
207
+ return null;
208
+ return (0, get_item_js_1.getItem)(context, address, signal);
209
+ }
210
+ function matchIdentity(match) {
211
+ return JSON.stringify([match.namespace, match.key]);
212
+ }
213
+ async function fetchUnseen(context, scoped, fetched, signal) {
214
+ const unseen = new Map();
215
+ for (const match of scoped) {
216
+ const identity = matchIdentity(match);
217
+ if (!fetched.has(identity))
218
+ unseen.set(identity, match);
219
+ }
220
+ const pending = [...unseen.values()];
221
+ const items = await (0, concurrency_js_1.mapWithConcurrency)(pending, context.readConcurrency ?? concurrency_js_1.DEFAULT_READ_CONCURRENCY, (match) => fetchMatch(context, match, signal));
222
+ pending.forEach((match, index) => fetched.set(matchIdentity(match), items[index]));
223
+ }
224
+ async function searchViaBackend(context, search, signal) {
225
+ const backend = context.vectorBackend;
226
+ const index = context.index;
227
+ const { offset, limit } = search;
228
+ const need = offset + limit;
229
+ if (need > context.maxSearchCandidates) {
230
+ throw (0, errors_js_1.validationError)(`Requested page (offset ${offset} + limit ${limit} = ${need}) exceeds maxSearchCandidates ` +
231
+ `(${context.maxSearchCandidates}); narrow the page or raise maxSearchCandidates`, 'maxSearchCandidates');
232
+ }
233
+ const queryVector = await index.embeddings.embedQuery(search.query);
234
+ (0, semantic_search_js_1.assertVectorDims)(index, queryVector, 'query');
235
+ let topK = Math.min(need, context.maxSearchCandidates);
236
+ let results;
237
+ const fetched = new Map();
238
+ for (;;) {
239
+ const matches = toRelevanceScores(await backend.query(search.namespacePrefix, queryVector, topK), context.vectorScoreDirection);
240
+ warnOnNonDescendingScores(context, matches, search.namespacePrefix);
241
+ const scoped = matches.filter((match) => (0, rows_js_1.namespaceMatchesPrefix)(match.namespace, search.namespacePrefix));
242
+ await fetchUnseen(context, scoped, fetched, signal);
243
+ results = [];
244
+ const answered = new Set();
245
+ for (const match of scoped) {
246
+ const identity = matchIdentity(match);
247
+ const item = fetched.get(identity);
248
+ if (!item || answered.has(identity) || !(0, filter_js_1.passesFilter)(item, search.filter))
249
+ continue;
250
+ answered.add(identity);
251
+ results.push({ ...item, score: match.score });
252
+ }
253
+ if (results.length >= need || matches.length < topK)
254
+ break;
255
+ if (topK >= context.maxSearchCandidates) {
256
+ throw (0, errors_js_1.validationError)(`Semantic search collected ${results.length} of ${need} matches within maxSearchCandidates ` +
257
+ `(${context.maxSearchCandidates}); narrow the filter or raise maxSearchCandidates`, 'maxSearchCandidates');
258
+ }
259
+ topK = Math.min(topK * 2, context.maxSearchCandidates);
260
+ }
261
+ return results;
262
+ }
263
+ function toRelevanceScores(matches, direction) {
264
+ if (direction !== 'distance')
265
+ return matches;
266
+ return matches
267
+ .map((match) => ({ ...match, score: -match.score }))
268
+ .sort((left, right) => right.score - left.score);
269
+ }