@farukada/aws-langgraph-dynamodb-ts 1.0.0-rc.2 → 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 (409) hide show
  1. package/README.md +390 -193
  2. package/dist/{backfill → cjs/backfill}/backfill.d.ts +15 -12
  3. package/dist/cjs/backfill/backfill.js +177 -0
  4. package/dist/{checkpointer → cjs/checkpointer}/actions/delete-thread.d.ts +1 -1
  5. package/dist/cjs/checkpointer/actions/delete-thread.js +26 -0
  6. package/dist/{checkpointer → cjs/checkpointer}/actions/get-tuple.d.ts +4 -3
  7. package/dist/cjs/checkpointer/actions/get-tuple.js +22 -0
  8. package/dist/{checkpointer → cjs/checkpointer}/actions/list.d.ts +7 -4
  9. package/dist/cjs/checkpointer/actions/list.js +70 -0
  10. package/dist/{checkpointer → cjs/checkpointer}/actions/put-writes.d.ts +8 -6
  11. package/dist/cjs/checkpointer/actions/put-writes.js +21 -0
  12. package/dist/{checkpointer → cjs/checkpointer}/actions/put.d.ts +21 -15
  13. package/dist/cjs/checkpointer/actions/put.js +79 -0
  14. package/dist/{checkpointer → cjs/checkpointer}/internal/delta-history.d.ts +38 -26
  15. package/dist/cjs/checkpointer/internal/delta-history.js +131 -0
  16. package/dist/{checkpointer → cjs/checkpointer}/internal/listing.d.ts +4 -4
  17. package/dist/cjs/checkpointer/internal/listing.js +104 -0
  18. package/dist/{checkpointer → cjs/checkpointer}/internal/parse.d.ts +51 -15
  19. package/dist/cjs/checkpointer/internal/parse.js +184 -0
  20. package/dist/{checkpointer → cjs/checkpointer}/internal/pending-writes.d.ts +64 -25
  21. package/dist/cjs/checkpointer/internal/pending-writes.js +241 -0
  22. package/dist/{checkpointer → cjs/checkpointer}/internal/read.d.ts +15 -10
  23. package/dist/cjs/checkpointer/internal/read.js +132 -0
  24. package/dist/{checkpointer → cjs/checkpointer}/internal/rows.d.ts +94 -21
  25. package/dist/cjs/checkpointer/internal/rows.js +356 -0
  26. package/dist/{checkpointer → cjs/checkpointer}/internal/setup.d.ts +13 -20
  27. package/dist/cjs/checkpointer/internal/setup.js +25 -0
  28. package/dist/{checkpointer → cjs/checkpointer}/saver.d.ts +72 -36
  29. package/dist/cjs/checkpointer/saver.js +56 -0
  30. package/dist/{checkpointer → cjs/checkpointer}/types.d.ts +1 -1
  31. package/dist/cjs/checkpointer/types.js +2 -0
  32. package/dist/{factory → cjs/factory}/factory.d.ts +25 -20
  33. package/dist/cjs/factory/factory.js +137 -0
  34. package/dist/{factory → cjs/factory}/types.d.ts +12 -12
  35. package/dist/cjs/factory/types.js +2 -0
  36. package/dist/{history → cjs/history}/actions/add-messages.d.ts +18 -10
  37. package/dist/cjs/history/actions/add-messages.js +17 -0
  38. package/dist/{history → cjs/history}/actions/clear.d.ts +1 -1
  39. package/dist/cjs/history/actions/clear.js +29 -0
  40. package/dist/{history → cjs/history}/actions/get-messages.d.ts +11 -9
  41. package/dist/cjs/history/actions/get-messages.js +58 -0
  42. package/dist/{history → cjs/history}/actions/list-sessions.d.ts +3 -3
  43. package/dist/cjs/history/actions/list-sessions.js +67 -0
  44. package/dist/{history → cjs/history}/actions/reconcile-count.d.ts +13 -9
  45. package/dist/cjs/history/actions/reconcile-count.js +8 -0
  46. package/dist/{history → cjs/history}/chat-message-history.d.ts +62 -30
  47. package/dist/cjs/history/chat-message-history.js +61 -0
  48. package/dist/{history → cjs/history}/internal/append.d.ts +64 -32
  49. package/dist/cjs/history/internal/append.js +267 -0
  50. package/dist/{history → cjs/history}/internal/message-read.d.ts +3 -3
  51. package/dist/cjs/history/internal/message-read.js +93 -0
  52. package/dist/{history → cjs/history}/internal/parse.d.ts +2 -2
  53. package/dist/cjs/history/internal/parse.js +113 -0
  54. package/dist/{history → cjs/history}/internal/rows.d.ts +11 -10
  55. package/dist/cjs/history/internal/rows.js +96 -0
  56. package/dist/{history → cjs/history}/internal/session.d.ts +41 -22
  57. package/dist/cjs/history/internal/session.js +296 -0
  58. package/dist/{history → cjs/history}/internal/setup.d.ts +2 -2
  59. package/dist/cjs/history/internal/setup.js +60 -0
  60. package/dist/{history → cjs/history}/session-adapter.d.ts +0 -6
  61. package/dist/cjs/history/session-adapter.js +38 -0
  62. package/dist/{history → cjs/history}/types.d.ts +18 -15
  63. package/dist/cjs/history/types.js +2 -0
  64. package/dist/{index.d.ts → cjs/index.d.ts} +27 -27
  65. package/dist/cjs/index.js +25 -0
  66. package/dist/cjs/package.json +1 -0
  67. package/dist/{shared → cjs/shared}/adapter.d.ts +27 -16
  68. package/dist/cjs/shared/adapter.js +70 -0
  69. package/dist/cjs/shared/clock.js +14 -0
  70. package/dist/{shared → cjs/shared}/codec/codec.d.ts +37 -20
  71. package/dist/cjs/shared/codec/codec.js +162 -0
  72. package/dist/{shared → cjs/shared}/codec/compression.d.ts +9 -4
  73. package/dist/cjs/shared/codec/compression.js +45 -0
  74. package/dist/cjs/shared/codec/json-serde.js +58 -0
  75. package/dist/{shared → cjs/shared}/codec/s3/client-types.d.ts +2 -1
  76. package/dist/cjs/shared/codec/s3/client-types.js +6 -0
  77. package/dist/{shared → cjs/shared}/codec/s3/client.d.ts +25 -7
  78. package/dist/cjs/shared/codec/s3/client.js +78 -0
  79. package/dist/{shared → cjs/shared}/codec/s3/config.d.ts +12 -7
  80. package/dist/cjs/shared/codec/s3/config.js +92 -0
  81. package/dist/{shared → cjs/shared}/codec/s3/lifecycle.d.ts +71 -17
  82. package/dist/cjs/shared/codec/s3/lifecycle.js +223 -0
  83. package/dist/{shared → cjs/shared}/codec/s3/offloader.d.ts +42 -29
  84. package/dist/cjs/shared/codec/s3/offloader.js +289 -0
  85. package/dist/cjs/shared/concurrency.js +31 -0
  86. package/dist/{shared → cjs/shared}/dynamodb/abort.d.ts +2 -2
  87. package/dist/cjs/shared/dynamodb/abort.js +16 -0
  88. package/dist/{shared → cjs/shared}/dynamodb/batch-write.d.ts +2 -2
  89. package/dist/cjs/shared/dynamodb/batch-write.js +79 -0
  90. package/dist/cjs/shared/dynamodb/cancellation.js +37 -0
  91. package/dist/{shared → cjs/shared}/dynamodb/client.d.ts +24 -22
  92. package/dist/cjs/shared/dynamodb/client.js +40 -0
  93. package/dist/{shared → cjs/shared}/dynamodb/idempotent-write.d.ts +64 -19
  94. package/dist/cjs/shared/dynamodb/idempotent-write.js +173 -0
  95. package/dist/{shared → cjs/shared}/dynamodb/paginate.d.ts +2 -2
  96. package/dist/cjs/shared/dynamodb/paginate.js +90 -0
  97. package/dist/{shared → cjs/shared}/dynamodb/partition-delete.d.ts +6 -6
  98. package/dist/cjs/shared/dynamodb/partition-delete.js +177 -0
  99. package/dist/{shared → cjs/shared}/dynamodb/recency-index.d.ts +27 -15
  100. package/dist/cjs/shared/dynamodb/recency-index.js +146 -0
  101. package/dist/{shared → cjs/shared}/dynamodb/retry.d.ts +37 -6
  102. package/dist/cjs/shared/dynamodb/retry.js +193 -0
  103. package/dist/cjs/shared/dynamodb/row-size.d.ts +33 -0
  104. package/dist/cjs/shared/dynamodb/row-size.js +30 -0
  105. package/dist/{shared → cjs/shared}/dynamodb/table-schema.d.ts +27 -18
  106. package/dist/cjs/shared/dynamodb/table-schema.js +52 -0
  107. package/dist/{shared → cjs/shared}/errors/base-error.d.ts +42 -7
  108. package/dist/cjs/shared/errors/base-error.js +73 -0
  109. package/dist/{shared → cjs/shared}/errors/boundary.d.ts +29 -14
  110. package/dist/cjs/shared/errors/boundary.js +61 -0
  111. package/dist/cjs/shared/errors/classify.d.ts +206 -0
  112. package/dist/cjs/shared/errors/classify.js +232 -0
  113. package/dist/{shared → cjs/shared}/errors/error-code.d.ts +17 -10
  114. package/dist/cjs/shared/errors/error-code.js +27 -0
  115. package/dist/{shared → cjs/shared}/errors/errors.d.ts +75 -9
  116. package/dist/cjs/shared/errors/errors.js +123 -0
  117. package/dist/cjs/shared/logging/logger.js +30 -0
  118. package/dist/{shared → cjs/shared}/logging/redaction.d.ts +8 -4
  119. package/dist/cjs/shared/logging/redaction.js +145 -0
  120. package/dist/{shared → cjs/shared}/logging/secret-patterns.d.ts +30 -7
  121. package/dist/cjs/shared/logging/secret-patterns.js +93 -0
  122. package/dist/cjs/shared/logging/truncate.js +31 -0
  123. package/dist/{shared → cjs/shared}/options.d.ts +27 -11
  124. package/dist/cjs/shared/options.js +2 -0
  125. package/dist/cjs/shared/ulid.js +83 -0
  126. package/dist/{shared → cjs/shared}/validation/collaborators.d.ts +21 -2
  127. package/dist/cjs/shared/validation/collaborators.js +79 -0
  128. package/dist/{shared → cjs/shared}/validation/option-shape.d.ts +7 -5
  129. package/dist/cjs/shared/validation/option-shape.js +31 -0
  130. package/dist/{shared → cjs/shared}/validation/options.d.ts +4 -4
  131. package/dist/cjs/shared/validation/options.js +166 -0
  132. package/dist/cjs/shared/validation/primitives.js +114 -0
  133. package/dist/{shared → cjs/shared}/validation/ttl.d.ts +26 -9
  134. package/dist/cjs/shared/validation/ttl.js +52 -0
  135. package/dist/{store → cjs/store}/actions/list-namespaces.d.ts +5 -5
  136. package/dist/cjs/store/actions/list-namespaces.js +92 -0
  137. package/dist/{store → cjs/store}/actions/put.d.ts +11 -4
  138. package/dist/cjs/store/actions/put.js +49 -0
  139. package/dist/{store → cjs/store}/actions/reconcile-vector-index.d.ts +5 -5
  140. package/dist/cjs/store/actions/reconcile-vector-index.js +13 -0
  141. package/dist/{store → cjs/store}/actions/search.d.ts +2 -2
  142. package/dist/cjs/store/actions/search.js +26 -0
  143. package/dist/cjs/store/internal/batch-plan.d.ts +56 -0
  144. package/dist/cjs/store/internal/batch-plan.js +32 -0
  145. package/dist/{store → cjs/store}/internal/filter.d.ts +3 -3
  146. package/dist/cjs/store/internal/filter.js +64 -0
  147. package/dist/cjs/store/internal/get-item.d.ts +77 -0
  148. package/dist/cjs/store/internal/get-item.js +58 -0
  149. package/dist/{store → cjs/store}/internal/item-write.d.ts +72 -32
  150. package/dist/cjs/store/internal/item-write.js +181 -0
  151. package/dist/{store → cjs/store}/internal/parse.d.ts +15 -10
  152. package/dist/cjs/store/internal/parse.js +180 -0
  153. package/dist/{store → cjs/store}/internal/rows.d.ts +38 -34
  154. package/dist/cjs/store/internal/rows.js +166 -0
  155. package/dist/{store → cjs/store}/internal/semantic-search.d.ts +2 -2
  156. package/dist/cjs/store/internal/semantic-search.js +211 -0
  157. package/dist/{store → cjs/store}/internal/setup.d.ts +10 -15
  158. package/dist/cjs/store/internal/setup.js +103 -0
  159. package/dist/{store → cjs/store}/internal/table-search.d.ts +5 -5
  160. package/dist/cjs/store/internal/table-search.js +123 -0
  161. package/dist/{store → cjs/store}/internal/vector-index.d.ts +26 -15
  162. package/dist/cjs/store/internal/vector-index.js +269 -0
  163. package/dist/{store → cjs/store}/store.d.ts +82 -39
  164. package/dist/cjs/store/store.js +97 -0
  165. package/dist/{store → cjs/store}/types.d.ts +25 -10
  166. package/dist/cjs/store/types.js +2 -0
  167. package/dist/cjs/store/vector-backend.js +4 -0
  168. package/dist/esm/backfill/backfill.d.ts +171 -0
  169. package/dist/esm/backfill/backfill.js +170 -0
  170. package/dist/{checkpointer/actions/delete-thread.js → esm/checkpointer/actions/delete-thread.d.ts} +4 -26
  171. package/dist/esm/checkpointer/actions/delete-thread.js +23 -0
  172. package/dist/{checkpointer/actions/get-tuple.js → esm/checkpointer/actions/get-tuple.d.ts} +7 -24
  173. package/dist/esm/checkpointer/actions/get-tuple.js +19 -0
  174. package/dist/esm/checkpointer/actions/list.d.ts +55 -0
  175. package/dist/esm/checkpointer/actions/list.js +67 -0
  176. package/dist/{checkpointer/actions/put-writes.js → esm/checkpointer/actions/put-writes.d.ts} +10 -37
  177. package/dist/esm/checkpointer/actions/put-writes.js +18 -0
  178. package/dist/esm/checkpointer/actions/put.d.ts +95 -0
  179. package/dist/esm/checkpointer/actions/put.js +75 -0
  180. package/dist/esm/checkpointer/internal/delta-history.d.ts +124 -0
  181. package/dist/esm/checkpointer/internal/delta-history.js +126 -0
  182. package/dist/{checkpointer/internal/listing.js → esm/checkpointer/internal/listing.d.ts} +22 -118
  183. package/dist/esm/checkpointer/internal/listing.js +95 -0
  184. package/dist/esm/checkpointer/internal/parse.d.ts +298 -0
  185. package/dist/esm/checkpointer/internal/parse.js +169 -0
  186. package/dist/esm/checkpointer/internal/pending-writes.d.ts +314 -0
  187. package/dist/esm/checkpointer/internal/pending-writes.js +229 -0
  188. package/dist/esm/checkpointer/internal/read.d.ts +135 -0
  189. package/dist/esm/checkpointer/internal/read.js +125 -0
  190. package/dist/esm/checkpointer/internal/rows.d.ts +644 -0
  191. package/dist/esm/checkpointer/internal/rows.js +323 -0
  192. package/dist/esm/checkpointer/internal/setup.d.ts +47 -0
  193. package/dist/esm/checkpointer/internal/setup.js +21 -0
  194. package/dist/{checkpointer/saver.js → esm/checkpointer/saver.d.ts} +84 -87
  195. package/dist/esm/checkpointer/saver.js +52 -0
  196. package/dist/esm/checkpointer/types.d.ts +51 -0
  197. package/dist/esm/checkpointer/types.js +1 -0
  198. package/dist/esm/factory/factory.d.ts +154 -0
  199. package/dist/esm/factory/factory.js +133 -0
  200. package/dist/esm/factory/types.d.ts +76 -0
  201. package/dist/esm/factory/types.js +1 -0
  202. package/dist/{history/actions/add-messages.js → esm/history/actions/add-messages.d.ts} +20 -26
  203. package/dist/esm/history/actions/add-messages.js +14 -0
  204. package/dist/{history/actions/clear.js → esm/history/actions/clear.d.ts} +4 -35
  205. package/dist/esm/history/actions/clear.js +26 -0
  206. package/dist/esm/history/actions/get-messages.d.ts +60 -0
  207. package/dist/esm/history/actions/get-messages.js +55 -0
  208. package/dist/esm/history/actions/list-sessions.d.ts +55 -0
  209. package/dist/esm/history/actions/list-sessions.js +64 -0
  210. package/dist/{history/actions/reconcile-count.js → esm/history/actions/reconcile-count.d.ts} +14 -16
  211. package/dist/esm/history/actions/reconcile-count.js +5 -0
  212. package/dist/{history/chat-message-history.js → esm/history/chat-message-history.d.ts} +76 -87
  213. package/dist/esm/history/chat-message-history.js +57 -0
  214. package/dist/esm/history/internal/append.d.ts +244 -0
  215. package/dist/esm/history/internal/append.js +259 -0
  216. package/dist/esm/history/internal/message-read.d.ts +84 -0
  217. package/dist/esm/history/internal/message-read.js +89 -0
  218. package/dist/esm/history/internal/parse.d.ts +153 -0
  219. package/dist/esm/history/internal/parse.js +105 -0
  220. package/dist/{history/internal/rows.js → esm/history/internal/rows.d.ts} +58 -112
  221. package/dist/esm/history/internal/rows.js +83 -0
  222. package/dist/esm/history/internal/session.d.ts +350 -0
  223. package/dist/esm/history/internal/session.js +285 -0
  224. package/dist/esm/history/internal/setup.d.ts +64 -0
  225. package/dist/esm/history/internal/setup.js +56 -0
  226. package/dist/{history/session-adapter.js → esm/history/session-adapter.d.ts} +25 -39
  227. package/dist/esm/history/session-adapter.js +34 -0
  228. package/dist/esm/history/types.d.ts +102 -0
  229. package/dist/esm/history/types.js +1 -0
  230. package/dist/esm/index.d.ts +53 -0
  231. package/dist/esm/index.js +10 -0
  232. package/dist/esm/shared/adapter.d.ts +146 -0
  233. package/dist/esm/shared/adapter.js +65 -0
  234. package/dist/{shared/clock.js → esm/shared/clock.d.ts} +3 -14
  235. package/dist/esm/shared/clock.js +9 -0
  236. package/dist/esm/shared/codec/codec.d.ts +336 -0
  237. package/dist/esm/shared/codec/codec.js +150 -0
  238. package/dist/esm/shared/codec/compression.d.ts +66 -0
  239. package/dist/esm/shared/codec/compression.js +40 -0
  240. package/dist/esm/shared/codec/json-serde.d.ts +80 -0
  241. package/dist/esm/shared/codec/json-serde.js +54 -0
  242. package/dist/esm/shared/codec/s3/client-types.d.ts +54 -0
  243. package/dist/esm/shared/codec/s3/client-types.js +3 -0
  244. package/dist/esm/shared/codec/s3/client.d.ts +63 -0
  245. package/dist/esm/shared/codec/s3/client.js +40 -0
  246. package/dist/{shared/codec/s3/config.js → esm/shared/codec/s3/config.d.ts} +45 -93
  247. package/dist/esm/shared/codec/s3/config.js +79 -0
  248. package/dist/esm/shared/codec/s3/lifecycle.d.ts +220 -0
  249. package/dist/esm/shared/codec/s3/lifecycle.js +214 -0
  250. package/dist/esm/shared/codec/s3/offloader.d.ts +428 -0
  251. package/dist/esm/shared/codec/s3/offloader.js +278 -0
  252. package/dist/{shared/concurrency.js → esm/shared/concurrency.d.ts} +2 -37
  253. package/dist/esm/shared/concurrency.js +27 -0
  254. package/dist/{shared/dynamodb/abort.js → esm/shared/dynamodb/abort.d.ts} +4 -16
  255. package/dist/esm/shared/dynamodb/abort.js +12 -0
  256. package/dist/esm/shared/dynamodb/batch-write.d.ts +86 -0
  257. package/dist/esm/shared/dynamodb/batch-write.js +74 -0
  258. package/dist/{shared/dynamodb/cancellation.js → esm/shared/dynamodb/cancellation.d.ts} +25 -53
  259. package/dist/esm/shared/dynamodb/cancellation.js +30 -0
  260. package/dist/{shared/dynamodb/client.js → esm/shared/dynamodb/client.d.ts} +74 -64
  261. package/dist/esm/shared/dynamodb/client.js +35 -0
  262. package/dist/{shared/dynamodb/idempotent-write.js → esm/shared/dynamodb/idempotent-write.d.ts} +172 -169
  263. package/dist/esm/shared/dynamodb/idempotent-write.js +153 -0
  264. package/dist/esm/shared/dynamodb/paginate.d.ts +111 -0
  265. package/dist/esm/shared/dynamodb/paginate.js +84 -0
  266. package/dist/esm/shared/dynamodb/partition-delete.d.ts +204 -0
  267. package/dist/esm/shared/dynamodb/partition-delete.js +171 -0
  268. package/dist/esm/shared/dynamodb/recency-index.d.ts +243 -0
  269. package/dist/esm/shared/dynamodb/recency-index.js +136 -0
  270. package/dist/esm/shared/dynamodb/retry.d.ts +317 -0
  271. package/dist/esm/shared/dynamodb/retry.js +180 -0
  272. package/dist/esm/shared/dynamodb/row-size.d.ts +33 -0
  273. package/dist/esm/shared/dynamodb/row-size.js +26 -0
  274. package/dist/{shared/dynamodb/table-schema.js → esm/shared/dynamodb/table-schema.d.ts} +57 -67
  275. package/dist/esm/shared/dynamodb/table-schema.js +43 -0
  276. package/dist/esm/shared/errors/base-error.d.ts +231 -0
  277. package/dist/esm/shared/errors/base-error.js +64 -0
  278. package/dist/esm/shared/errors/boundary.d.ts +86 -0
  279. package/dist/esm/shared/errors/boundary.js +54 -0
  280. package/dist/esm/shared/errors/classify.d.ts +206 -0
  281. package/dist/esm/shared/errors/classify.js +220 -0
  282. package/dist/{shared/errors/error-code.js → esm/shared/errors/error-code.d.ts} +39 -43
  283. package/dist/esm/shared/errors/error-code.js +24 -0
  284. package/dist/{shared/errors/errors.js → esm/shared/errors/errors.d.ts} +92 -98
  285. package/dist/esm/shared/errors/errors.js +110 -0
  286. package/dist/{shared/logging/logger.js → esm/shared/logging/logger.d.ts} +22 -52
  287. package/dist/esm/shared/logging/logger.js +25 -0
  288. package/dist/esm/shared/logging/redaction.d.ts +123 -0
  289. package/dist/esm/shared/logging/redaction.js +140 -0
  290. package/dist/{shared/logging/secret-patterns.js → esm/shared/logging/secret-patterns.d.ts} +46 -87
  291. package/dist/esm/shared/logging/secret-patterns.js +83 -0
  292. package/dist/{shared/logging/truncate.js → esm/shared/logging/truncate.d.ts} +6 -40
  293. package/dist/esm/shared/logging/truncate.js +25 -0
  294. package/dist/esm/shared/options.d.ts +100 -0
  295. package/dist/esm/shared/options.js +1 -0
  296. package/dist/{shared/ulid.js → esm/shared/ulid.d.ts} +4 -84
  297. package/dist/esm/shared/ulid.js +77 -0
  298. package/dist/{shared/validation/collaborators.js → esm/shared/validation/collaborators.d.ts} +37 -65
  299. package/dist/esm/shared/validation/collaborators.js +70 -0
  300. package/dist/{shared/validation/option-shape.js → esm/shared/validation/option-shape.d.ts} +14 -36
  301. package/dist/esm/shared/validation/option-shape.js +24 -0
  302. package/dist/esm/shared/validation/options.d.ts +145 -0
  303. package/dist/esm/shared/validation/options.js +156 -0
  304. package/dist/{shared/validation/primitives.js → esm/shared/validation/primitives.d.ts} +30 -125
  305. package/dist/esm/shared/validation/primitives.js +100 -0
  306. package/dist/esm/shared/validation/ttl.d.ts +94 -0
  307. package/dist/esm/shared/validation/ttl.js +46 -0
  308. package/dist/esm/store/actions/list-namespaces.d.ts +79 -0
  309. package/dist/esm/store/actions/list-namespaces.js +86 -0
  310. package/dist/esm/store/actions/put.d.ts +43 -0
  311. package/dist/esm/store/actions/put.js +46 -0
  312. package/dist/{store/actions/reconcile-vector-index.js → esm/store/actions/reconcile-vector-index.d.ts} +8 -16
  313. package/dist/esm/store/actions/reconcile-vector-index.js +10 -0
  314. package/dist/esm/store/actions/search.d.ts +38 -0
  315. package/dist/esm/store/actions/search.js +23 -0
  316. package/dist/esm/store/internal/batch-plan.d.ts +56 -0
  317. package/dist/esm/store/internal/batch-plan.js +28 -0
  318. package/dist/esm/store/internal/filter.d.ts +43 -0
  319. package/dist/esm/store/internal/filter.js +60 -0
  320. package/dist/esm/store/internal/get-item.d.ts +77 -0
  321. package/dist/esm/store/internal/get-item.js +54 -0
  322. package/dist/esm/store/internal/item-write.d.ts +270 -0
  323. package/dist/esm/store/internal/item-write.js +173 -0
  324. package/dist/esm/store/internal/parse.d.ts +230 -0
  325. package/dist/esm/store/internal/parse.js +169 -0
  326. package/dist/{store/internal/rows.js → esm/store/internal/rows.d.ts} +111 -199
  327. package/dist/esm/store/internal/rows.js +147 -0
  328. package/dist/esm/store/internal/semantic-search.d.ts +168 -0
  329. package/dist/esm/store/internal/semantic-search.js +200 -0
  330. package/dist/esm/store/internal/setup.d.ts +96 -0
  331. package/dist/esm/store/internal/setup.js +98 -0
  332. package/dist/esm/store/internal/table-search.d.ts +100 -0
  333. package/dist/esm/store/internal/table-search.js +119 -0
  334. package/dist/esm/store/internal/vector-index.d.ts +258 -0
  335. package/dist/esm/store/internal/vector-index.js +256 -0
  336. package/dist/{store/store.js → esm/store/store.d.ts} +99 -133
  337. package/dist/esm/store/store.js +93 -0
  338. package/dist/esm/store/types.d.ts +111 -0
  339. package/dist/esm/store/types.js +1 -0
  340. package/dist/esm/store/vector-backend.d.ts +104 -0
  341. package/dist/esm/store/vector-backend.js +1 -0
  342. package/package.json +50 -44
  343. package/dist/backfill/backfill.js +0 -393
  344. package/dist/checkpointer/actions/list.js +0 -142
  345. package/dist/checkpointer/actions/put.js +0 -195
  346. package/dist/checkpointer/internal/delta-history.js +0 -252
  347. package/dist/checkpointer/internal/parse.js +0 -372
  348. package/dist/checkpointer/internal/pending-writes.js +0 -588
  349. package/dist/checkpointer/internal/read.js +0 -264
  350. package/dist/checkpointer/internal/rows.js +0 -834
  351. package/dist/checkpointer/internal/setup.js +0 -72
  352. package/dist/checkpointer/types.js +0 -12
  353. package/dist/factory/factory.js +0 -266
  354. package/dist/factory/types.js +0 -10
  355. package/dist/history/actions/get-messages.js +0 -141
  356. package/dist/history/actions/list-sessions.js +0 -156
  357. package/dist/history/internal/append.js +0 -500
  358. package/dist/history/internal/message-read.js +0 -204
  359. package/dist/history/internal/parse.js +0 -252
  360. package/dist/history/internal/session.js +0 -628
  361. package/dist/history/internal/setup.js +0 -106
  362. package/dist/history/types.js +0 -12
  363. package/dist/index.js +0 -51
  364. package/dist/shared/adapter.js +0 -143
  365. package/dist/shared/codec/codec.js +0 -441
  366. package/dist/shared/codec/compression.js +0 -89
  367. package/dist/shared/codec/json-serde.js +0 -191
  368. package/dist/shared/codec/s3/client-types.js +0 -26
  369. package/dist/shared/codec/s3/client.js +0 -97
  370. package/dist/shared/codec/s3/lifecycle.js +0 -355
  371. package/dist/shared/codec/s3/offloader.js +0 -658
  372. package/dist/shared/dynamodb/batch-write.js +0 -173
  373. package/dist/shared/dynamodb/paginate.js +0 -188
  374. package/dist/shared/dynamodb/partition-delete.js +0 -340
  375. package/dist/shared/dynamodb/recency-index.js +0 -377
  376. package/dist/shared/dynamodb/retry.js +0 -463
  377. package/dist/shared/errors/base-error.js +0 -174
  378. package/dist/shared/errors/boundary.js +0 -143
  379. package/dist/shared/errors/classify.d.ts +0 -97
  380. package/dist/shared/errors/classify.js +0 -257
  381. package/dist/shared/logging/redaction.js +0 -316
  382. package/dist/shared/options.js +0 -11
  383. package/dist/shared/validation/options.js +0 -328
  384. package/dist/shared/validation/ttl.js +0 -132
  385. package/dist/store/actions/list-namespaces.js +0 -197
  386. package/dist/store/actions/put.js +0 -78
  387. package/dist/store/actions/search.js +0 -66
  388. package/dist/store/internal/batch-plan.d.ts +0 -26
  389. package/dist/store/internal/batch-plan.js +0 -109
  390. package/dist/store/internal/filter.js +0 -137
  391. package/dist/store/internal/get-item.d.ts +0 -45
  392. package/dist/store/internal/get-item.js +0 -115
  393. package/dist/store/internal/item-write.js +0 -463
  394. package/dist/store/internal/parse.js +0 -350
  395. package/dist/store/internal/semantic-search.js +0 -389
  396. package/dist/store/internal/setup.js +0 -223
  397. package/dist/store/internal/table-search.js +0 -213
  398. package/dist/store/internal/vector-index.js +0 -546
  399. package/dist/store/types.js +0 -15
  400. package/dist/store/vector-backend.js +0 -17
  401. /package/dist/{shared → cjs/shared}/clock.d.ts +0 -0
  402. /package/dist/{shared → cjs/shared}/codec/json-serde.d.ts +0 -0
  403. /package/dist/{shared → cjs/shared}/concurrency.d.ts +0 -0
  404. /package/dist/{shared → cjs/shared}/dynamodb/cancellation.d.ts +0 -0
  405. /package/dist/{shared → cjs/shared}/logging/logger.d.ts +0 -0
  406. /package/dist/{shared → cjs/shared}/logging/truncate.d.ts +0 -0
  407. /package/dist/{shared → cjs/shared}/ulid.d.ts +0 -0
  408. /package/dist/{shared → cjs/shared}/validation/primitives.d.ts +0 -0
  409. /package/dist/{store → cjs/store}/vector-backend.d.ts +0 -0
@@ -0,0 +1,166 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.REVISION_ATTRIBUTE = void 0;
4
+ exports.storePartitionPrefix = storePartitionPrefix;
5
+ exports.partitionKey = partitionKey;
6
+ exports.sortKey = sortKey;
7
+ exports.sortKeyPrefix = sortKeyPrefix;
8
+ exports.namespaceMatchesPrefix = namespaceMatchesPrefix;
9
+ exports.itemRowKey = itemRowKey;
10
+ exports.scopedQuery = scopedQuery;
11
+ exports.storeScan = storeScan;
12
+ exports.projectKeys = projectKeys;
13
+ exports.isLiveRow = isLiveRow;
14
+ exports.readExisting = readExisting;
15
+ exports.existingFrom = existingFrom;
16
+ exports.parseStoreRow = parseStoreRow;
17
+ exports.parseWholeStoreRow = parseWholeStoreRow;
18
+ exports.buildStoreRow = buildStoreRow;
19
+ exports.readStoreItem = readStoreItem;
20
+ const node_crypto_1 = require("node:crypto");
21
+ const clock_js_1 = require("../../shared/clock.js");
22
+ const codec_js_1 = require("../../shared/codec/codec.js");
23
+ const retry_js_1 = require("../../shared/dynamodb/retry.js");
24
+ const table_schema_js_1 = require("../../shared/dynamodb/table-schema.js");
25
+ exports.REVISION_ATTRIBUTE = 'rev';
26
+ const ADAPTER_PARTITION_PREFIX = `${table_schema_js_1.ADAPTER_TAGS.store}${table_schema_js_1.KEY_SEPARATOR}`;
27
+ function storePartitionPrefix() {
28
+ return ADAPTER_PARTITION_PREFIX;
29
+ }
30
+ function partitionKey(namespace) {
31
+ return `${ADAPTER_PARTITION_PREFIX}${namespace[0]}`;
32
+ }
33
+ function sortKey(namespace, key) {
34
+ return [...namespace.slice(1), key].join(table_schema_js_1.KEY_SEPARATOR);
35
+ }
36
+ function sortKeyPrefix(prefix) {
37
+ const rest = prefix.slice(1);
38
+ return rest.length === 0 ? '' : `${rest.join(table_schema_js_1.KEY_SEPARATOR)}${table_schema_js_1.KEY_SEPARATOR}`;
39
+ }
40
+ function namespaceMatchesPrefix(namespace, prefix) {
41
+ if (prefix.length > namespace.length)
42
+ return false;
43
+ return prefix.every((element, index) => namespace[index] === element);
44
+ }
45
+ function itemRowKey(address) {
46
+ return { PK: partitionKey(address.namespace), SK: sortKey(address.namespace, address.key) };
47
+ }
48
+ function scopedQuery(tableName, prefix) {
49
+ const skPrefix = sortKeyPrefix(prefix);
50
+ if (skPrefix.length === 0) {
51
+ return {
52
+ TableName: tableName,
53
+ KeyConditionExpression: '#pk = :pk',
54
+ ExpressionAttributeNames: { '#pk': table_schema_js_1.PARTITION_KEY_ATTRIBUTE },
55
+ ExpressionAttributeValues: { ':pk': partitionKey(prefix) },
56
+ };
57
+ }
58
+ return {
59
+ TableName: tableName,
60
+ KeyConditionExpression: '#pk = :pk AND begins_with(#sk, :skp)',
61
+ ExpressionAttributeNames: { '#pk': table_schema_js_1.PARTITION_KEY_ATTRIBUTE, '#sk': table_schema_js_1.SORT_KEY_ATTRIBUTE },
62
+ ExpressionAttributeValues: { ':pk': partitionKey(prefix), ':skp': skPrefix },
63
+ };
64
+ }
65
+ function storeScan(tableName) {
66
+ return {
67
+ TableName: tableName,
68
+ FilterExpression: 'begins_with(#pk, :pkp) AND attribute_exists(#ns)',
69
+ ExpressionAttributeNames: { '#pk': table_schema_js_1.PARTITION_KEY_ATTRIBUTE, '#ns': 'namespace' },
70
+ ExpressionAttributeValues: { ':pkp': storePartitionPrefix() },
71
+ };
72
+ }
73
+ function projectKeys(params) {
74
+ return {
75
+ ...params,
76
+ ProjectionExpression: `${table_schema_js_1.PARTITION_KEY_ATTRIBUTE}, ${table_schema_js_1.SORT_KEY_ATTRIBUTE}, #ns, #key, #v`,
77
+ ExpressionAttributeNames: {
78
+ ...params.ExpressionAttributeNames,
79
+ '#ns': 'namespace',
80
+ '#key': 'key',
81
+ '#v': 'v',
82
+ },
83
+ };
84
+ }
85
+ function isLiveRow(existing) {
86
+ return existing.exists && !(0, table_schema_js_1.isExpiredRow)(existing, (0, clock_js_1.nowSeconds)());
87
+ }
88
+ async function readExisting(context, key) {
89
+ const existing = await (0, retry_js_1.withDynamoDBRetry)((request) => context.client.get({
90
+ TableName: context.tableName,
91
+ Key: key,
92
+ ConsistentRead: true,
93
+ ProjectionExpression: '#c, #r, #ttl, #v.#loc, #v.#s3k',
94
+ ExpressionAttributeNames: {
95
+ '#c': 'createdAt',
96
+ '#r': exports.REVISION_ATTRIBUTE,
97
+ '#ttl': 'ttl',
98
+ '#v': 'value',
99
+ '#loc': 'location',
100
+ '#s3k': 's3Key',
101
+ },
102
+ }, request), context.retry);
103
+ return existingFrom(existing.Item);
104
+ }
105
+ function existingFrom(item) {
106
+ return {
107
+ exists: item !== undefined,
108
+ createdAt: item?.createdAt,
109
+ ttl: item?.ttl,
110
+ value: item?.value,
111
+ revision: item?.[exports.REVISION_ATTRIBUTE],
112
+ };
113
+ }
114
+ function parseStoreRow(raw) {
115
+ (0, table_schema_js_1.assertReadableRow)(raw, 'store item');
116
+ if (!Array.isArray(raw.namespace) || typeof raw.key !== 'string')
117
+ return undefined;
118
+ const record = raw;
119
+ const consistent = record.PK === partitionKey(record.namespace) &&
120
+ record.SK === sortKey(record.namespace, record.key);
121
+ return consistent ? record : undefined;
122
+ }
123
+ function parseWholeStoreRow(raw) {
124
+ const record = parseStoreRow(raw);
125
+ if (record === undefined)
126
+ return undefined;
127
+ const stamped = typeof record.createdAt === 'string' && typeof record.updatedAt === 'string';
128
+ return stamped ? record : undefined;
129
+ }
130
+ async function buildStoreRow(context, address, value, options) {
131
+ const { namespace, key } = address;
132
+ const pk = partitionKey(namespace);
133
+ const sk = sortKey(namespace, key);
134
+ const rev = options.rev ?? (0, node_crypto_1.randomUUID)();
135
+ const descriptor = await (0, codec_js_1.encodePayload)(value, (0, codec_js_1.codecDepsOf)(context), {
136
+ keyParts: [...namespace, key],
137
+ objectId: rev,
138
+ row: { pk, sk },
139
+ });
140
+ const record = {
141
+ PK: pk,
142
+ SK: sk,
143
+ v: table_schema_js_1.ROW_FORMAT_VERSION,
144
+ namespace,
145
+ key,
146
+ value: descriptor,
147
+ createdAt: options.createdAt,
148
+ updatedAt: options.updatedAt,
149
+ rev,
150
+ };
151
+ if (options.embeddings)
152
+ record.embeddings = options.embeddings;
153
+ if (options.ttlTimestamp !== undefined)
154
+ record.ttl = options.ttlTimestamp;
155
+ return record;
156
+ }
157
+ async function readStoreItem(context, record, signal) {
158
+ const value = await (0, codec_js_1.decodePayload)(record.value, (0, codec_js_1.codecDepsOf)(context, signal), [...record.namespace, record.key]);
159
+ return {
160
+ namespace: record.namespace,
161
+ key: record.key,
162
+ value,
163
+ createdAt: new Date(record.createdAt),
164
+ updatedAt: new Date(record.updatedAt),
165
+ };
166
+ }
@@ -7,8 +7,8 @@
7
7
  * model returns is held to the configured dimension.
8
8
  */
9
9
  import type { IndexConfig } from '@langchain/langgraph-checkpoint';
10
- import type { JsonValue } from './filter';
11
- import type { StoreContext } from './setup';
10
+ import type { JsonValue } from './filter.js';
11
+ import type { StoreContext } from './setup.js';
12
12
  /**
13
13
  * Cosine similarity of two vectors.
14
14
  *
@@ -0,0 +1,211 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.cosineSimilarity = cosineSimilarity;
4
+ exports.extractTexts = extractTexts;
5
+ exports.extractText = extractText;
6
+ exports.assertVectorDims = assertVectorDims;
7
+ exports.embedValues = embedValues;
8
+ exports.embedValue = embedValue;
9
+ exports.embedPassages = embedPassages;
10
+ exports.tokenizePath = tokenizePath;
11
+ exports.getTextAtPath = getTextAtPath;
12
+ const errors_js_1 = require("../../shared/errors/errors.js");
13
+ const EMBED_BATCH_SIZE = 100;
14
+ function cosineSimilarity(a, b) {
15
+ if (a.length !== b.length)
16
+ return 0;
17
+ let dot = 0;
18
+ let normA = 0;
19
+ let normB = 0;
20
+ for (let i = 0; i < a.length; i++) {
21
+ dot += a[i] * b[i];
22
+ normA += a[i] * a[i];
23
+ normB += b[i] * b[i];
24
+ }
25
+ if (normA === 0 || normB === 0)
26
+ return 0;
27
+ return dot / (Math.sqrt(normA) * Math.sqrt(normB));
28
+ }
29
+ function extractTexts(value, fields) {
30
+ return fields.flatMap((field) => getTextAtPath(value, field)).filter((text) => text.length > 0);
31
+ }
32
+ function extractText(value, fields) {
33
+ return extractTexts(value, fields).join(' ');
34
+ }
35
+ function assertVectorDims(index, vector, what) {
36
+ const dims = index.dims;
37
+ if (!Number.isInteger(dims) || dims <= 0 || vector.length === dims)
38
+ return;
39
+ throw (0, errors_js_1.validationError)(`index.embeddings returned a ${vector.length}-dimensional ${what} vector but index.dims ` +
40
+ `is ${dims}; the embeddings model does not match the configured index`, 'index.dims');
41
+ }
42
+ async function embedValues(context, values, fieldsOverride) {
43
+ const index = context.index;
44
+ if (!index)
45
+ return values.map(() => undefined);
46
+ const fields = fieldsOverride ?? index.fields ?? ['$'];
47
+ const pending = [];
48
+ values.forEach((value, position) => {
49
+ const text = extractText(value, fields);
50
+ if (text.length > 0)
51
+ pending.push({ text, position });
52
+ });
53
+ const vectors = values.map(() => undefined);
54
+ for (let start = 0; start < pending.length; start += EMBED_BATCH_SIZE) {
55
+ const batch = pending.slice(start, start + EMBED_BATCH_SIZE);
56
+ const embedded = await index.embeddings.embedDocuments(batch.map((entry) => entry.text));
57
+ batch.forEach((entry, i) => {
58
+ assertVectorDims(index, embedded[i], 'document');
59
+ vectors[entry.position] = embedded[i];
60
+ });
61
+ }
62
+ return vectors;
63
+ }
64
+ async function embedValue(context, value, fieldsOverride) {
65
+ return (await embedValues(context, [value], fieldsOverride))[0];
66
+ }
67
+ async function embedPassages(context, value, fieldsOverride) {
68
+ const index = context.index;
69
+ if (!index)
70
+ return undefined;
71
+ const texts = extractTexts(value, fieldsOverride ?? index.fields ?? ['$']);
72
+ if (texts.length === 0)
73
+ return undefined;
74
+ const vectors = [];
75
+ for (let start = 0; start < texts.length; start += EMBED_BATCH_SIZE) {
76
+ const embedded = await index.embeddings.embedDocuments(texts.slice(start, start + EMBED_BATCH_SIZE));
77
+ for (const vector of embedded) {
78
+ assertVectorDims(index, vector, 'document');
79
+ vectors.push(vector);
80
+ }
81
+ }
82
+ return vectors;
83
+ }
84
+ function prettyText(value) {
85
+ let text;
86
+ try {
87
+ text = JSON.stringify(value, null, 2);
88
+ }
89
+ catch {
90
+ return [];
91
+ }
92
+ return text === undefined ? [] : [text];
93
+ }
94
+ function isScalar(value) {
95
+ return typeof value === 'string' || typeof value === 'number' || typeof value === 'boolean';
96
+ }
97
+ function leafText(value) {
98
+ if (isScalar(value))
99
+ return [String(value)];
100
+ if (value === null)
101
+ return [];
102
+ return prettyText(value);
103
+ }
104
+ function scanGroup(path, start, open, close) {
105
+ let depth = 1;
106
+ let i = start;
107
+ while (i < path.length && depth > 0) {
108
+ if (path[i] === open)
109
+ depth += 1;
110
+ else if (path[i] === close)
111
+ depth -= 1;
112
+ i += 1;
113
+ }
114
+ return i;
115
+ }
116
+ function tokenizePath(path) {
117
+ const tokens = [];
118
+ let current = '';
119
+ const flush = () => {
120
+ if (current.length > 0)
121
+ tokens.push(current);
122
+ current = '';
123
+ };
124
+ let i = 0;
125
+ while (i < path.length) {
126
+ const char = path[i];
127
+ if (char === '[' || char === '{') {
128
+ flush();
129
+ const end = scanGroup(path, i + 1, char, char === '[' ? ']' : '}');
130
+ tokens.push(path.slice(i, end));
131
+ i = end;
132
+ continue;
133
+ }
134
+ if (char === '.')
135
+ flush();
136
+ else
137
+ current += char;
138
+ i += 1;
139
+ }
140
+ flush();
141
+ return tokens;
142
+ }
143
+ function groupFieldText(value, field) {
144
+ let current = value;
145
+ for (const token of tokenizePath(field)) {
146
+ if (current !== null && typeof current === 'object' && token in current) {
147
+ current = current[token];
148
+ }
149
+ else {
150
+ return [];
151
+ }
152
+ }
153
+ return isScalar(current) ? [String(current)] : prettyText(current);
154
+ }
155
+ function indexText(value, token, tokens, pos) {
156
+ if (!Array.isArray(value))
157
+ return [];
158
+ const index = token.slice(1, -1);
159
+ if (index === '*')
160
+ return value.flatMap((item) => extract(item, tokens, pos + 1));
161
+ let idx = Number.parseInt(index, 10);
162
+ if (Number.isNaN(idx))
163
+ return [];
164
+ if (idx < 0)
165
+ idx = value.length + idx;
166
+ return idx >= 0 && idx < value.length ? extract(value[idx], tokens, pos + 1) : [];
167
+ }
168
+ function groupText(value, token) {
169
+ if (typeof value !== 'object' || value === null)
170
+ return [];
171
+ const results = [];
172
+ for (const field of token.slice(1, -1).split(',')) {
173
+ const trimmed = field.trim();
174
+ if (tokenizePath(trimmed).length > 0)
175
+ results.push(...groupFieldText(value, trimmed));
176
+ }
177
+ return results;
178
+ }
179
+ function wildcardText(value, tokens, pos) {
180
+ if (Array.isArray(value))
181
+ return value.flatMap((item) => extract(item, tokens, pos + 1));
182
+ if (typeof value === 'object' && value !== null) {
183
+ return Object.values(value).flatMap((item) => extract(item, tokens, pos + 1));
184
+ }
185
+ return [];
186
+ }
187
+ function memberText(value, token, tokens, pos) {
188
+ if (typeof value !== 'object' || value === null || !(token in value))
189
+ return [];
190
+ return extract(value[token], tokens, pos + 1);
191
+ }
192
+ function extract(value, tokens, pos) {
193
+ if (pos >= tokens.length)
194
+ return leafText(value);
195
+ const token = tokens[pos];
196
+ if (token.startsWith('[') && token.endsWith(']'))
197
+ return indexText(value, token, tokens, pos);
198
+ const results = pos === 0 && token === '$' ? prettyText(value) : [];
199
+ if (token.startsWith('{') && token.endsWith('}'))
200
+ results.push(...groupText(value, token));
201
+ else if (token === '*')
202
+ results.push(...wildcardText(value, tokens, pos));
203
+ else
204
+ results.push(...memberText(value, token, tokens, pos));
205
+ return results;
206
+ }
207
+ function getTextAtPath(value, path) {
208
+ if (path === '' || path === '$')
209
+ return prettyText(value);
210
+ return extract(value, tokenizePath(path), 0);
211
+ }
@@ -10,9 +10,9 @@
10
10
  * defaults filled in.
11
11
  */
12
12
  import type { IndexConfig, SerializerProtocol } from '@langchain/langgraph-checkpoint';
13
- import { type AdapterCore, type AdapterShell } from '../../shared/adapter';
14
- import type { DynamoDBStoreOptions } from '../types';
15
- import { type VectorBackend, type VectorScoreDirection } from '../vector-backend';
13
+ import { type AdapterCore, type AdapterShell } from '../../shared/adapter.js';
14
+ import type { DynamoDBStoreOptions } from '../types.js';
15
+ import { type VectorBackend, type VectorScoreDirection } from '../vector-backend.js';
16
16
  /** Default cap on candidates the in-DB semantic ranker will score. */
17
17
  export declare const DEFAULT_MAX_SEARCH_CANDIDATES = 1000;
18
18
  /**
@@ -36,6 +36,7 @@ export interface StoreContext extends AdapterCore {
36
36
  vectorScoreDirection: VectorScoreDirection;
37
37
  maxSearchCandidates: number;
38
38
  maxScanItems: number;
39
+ maxIterations: number;
39
40
  }
40
41
  /** Result of wiring up a store from its options. */
41
42
  export interface StoreSetup {
@@ -60,20 +61,14 @@ export interface StoreSetup {
60
61
  */
61
62
  export declare function setUpStore(options: DynamoDBStoreOptions): StoreSetup;
62
63
  /**
63
- * The keys of each store option bag, exhaustive in both directions:
64
- * `allKeysOf<T>` makes omitting or inventing one a compile error, so a list
65
- * cannot rot away from the type it guards. They live with the feature because
66
- * the types they are checked against do; `shared/` knows no feature.
64
+ * The keys of the store's constructor options, exhaustive in both directions:
65
+ * `allKeysOf<T>` makes omitting or inventing one a compile error, so the list
66
+ * cannot rot away from the type it guards. It lives with the feature because
67
+ * the type it is checked against does; `shared/` knows no feature. `search`'s
68
+ * and `listNamespaces`' options have no list: LangGraph defines them, so a key
69
+ * it adds is ignored rather than refused (decision record 28).
67
70
  */
68
71
  export declare const STORE_KEYS: readonly string[];
69
- /** See {@link STORE_KEYS}. */
70
- export declare const STORE_SEARCH_KEYS: readonly string[];
71
- /**
72
- * See {@link STORE_KEYS}. `ListNamespacesOptions` is pinned equal to
73
- * `BaseStore.listNamespaces`' own parameter type, so this list is checked
74
- * against upstream's options through it.
75
- */
76
- export declare const STORE_LIST_NAMESPACES_KEYS: readonly string[];
77
72
  /**
78
73
  * Validate the store's own options at construction; the shared ones are
79
74
  * `openAdapter`'s, which checks them before these.
@@ -0,0 +1,103 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.STORE_KEYS = exports.MAX_SCAN_ITEMS = exports.MAX_SEARCH_CANDIDATES = exports.DEFAULT_MAX_SEARCH_CANDIDATES = void 0;
4
+ exports.setUpStore = setUpStore;
5
+ exports.assertStoreOptions = assertStoreOptions;
6
+ const adapter_js_1 = require("../../shared/adapter.js");
7
+ const json_serde_js_1 = require("../../shared/codec/json-serde.js");
8
+ const paginate_js_1 = require("../../shared/dynamodb/paginate.js");
9
+ const errors_js_1 = require("../../shared/errors/errors.js");
10
+ const collaborators_js_1 = require("../../shared/validation/collaborators.js");
11
+ const option_shape_js_1 = require("../../shared/validation/option-shape.js");
12
+ const primitives_js_1 = require("../../shared/validation/primitives.js");
13
+ const vector_backend_js_1 = require("../vector-backend.js");
14
+ exports.DEFAULT_MAX_SEARCH_CANDIDATES = 1000;
15
+ exports.MAX_SEARCH_CANDIDATES = 100_000;
16
+ exports.MAX_SCAN_ITEMS = 1_000_000;
17
+ function setUpStore(options) {
18
+ (0, option_shape_js_1.assertShape)(options, exports.STORE_KEYS, 'options');
19
+ const shell = (0, adapter_js_1.openAdapter)(options, 'store', {
20
+ options: () => assertStoreOptions(options),
21
+ collaborators: () => {
22
+ if (options.vectorBackend !== undefined) {
23
+ (0, collaborators_js_1.assertMembers)(options.vectorBackend, collaborators_js_1.VECTOR_BACKEND_MEMBERS, 'vectorBackend');
24
+ }
25
+ },
26
+ });
27
+ return {
28
+ shell,
29
+ context: {
30
+ ...shell.core,
31
+ serde: options.serde ?? json_serde_js_1.JSON_SERDE,
32
+ index: options.index,
33
+ vectorBackend: options.vectorBackend,
34
+ vectorScoreDirection: options.vectorScoreDirection ?? 'relevance',
35
+ maxSearchCandidates: options.maxSearchCandidates ?? exports.DEFAULT_MAX_SEARCH_CANDIDATES,
36
+ maxScanItems: options.maxScanItems ?? paginate_js_1.MAX_TOTAL_ROWS_IN_MEMORY,
37
+ maxIterations: options.maxIterations ?? paginate_js_1.MAX_LOOP_ITERATIONS,
38
+ },
39
+ };
40
+ }
41
+ exports.STORE_KEYS = (0, option_shape_js_1.allKeysOf)({
42
+ tableName: 'tableName',
43
+ client: 'client',
44
+ clientConfig: 'clientConfig',
45
+ createClient: 'createClient',
46
+ ttl: 'ttl',
47
+ logger: 'logger',
48
+ retry: 'retry',
49
+ readConcurrency: 'readConcurrency',
50
+ compression: 'compression',
51
+ s3: 's3',
52
+ serde: 'serde',
53
+ index: 'index',
54
+ vectorBackend: 'vectorBackend',
55
+ maxSearchCandidates: 'maxSearchCandidates',
56
+ maxScanItems: 'maxScanItems',
57
+ maxIterations: 'maxIterations',
58
+ vectorScoreDirection: 'vectorScoreDirection',
59
+ });
60
+ const INDEX_KEYS = (0, option_shape_js_1.allKeysOf)({
61
+ dims: 'dims',
62
+ embeddings: 'embeddings',
63
+ fields: 'fields',
64
+ });
65
+ function assertUsableIndex(index) {
66
+ if (index === undefined)
67
+ return;
68
+ (0, option_shape_js_1.assertShape)(index, INDEX_KEYS, 'index');
69
+ (0, collaborators_js_1.assertMembers)(index.embeddings, collaborators_js_1.EMBEDDINGS_MEMBERS, 'index.embeddings');
70
+ if (index.fields !== undefined)
71
+ (0, primitives_js_1.assertStringArray)(index.fields, 'index.fields');
72
+ }
73
+ function assertScoreDirection(direction) {
74
+ if (direction === undefined || vector_backend_js_1.VECTOR_SCORE_DIRECTIONS.includes(direction))
75
+ return;
76
+ throw (0, errors_js_1.validationError)(`vectorScoreDirection must be one of ${vector_backend_js_1.VECTOR_SCORE_DIRECTIONS.join(' | ')}; received ` +
77
+ `${JSON.stringify(direction)}, which would be left in the backend's own direction and ` +
78
+ 'could rank a distance backend backwards', 'vectorScoreDirection');
79
+ }
80
+ function assertLimits(options) {
81
+ if (options.maxScanItems !== undefined) {
82
+ (0, primitives_js_1.assertInteger)(options.maxScanItems, 'maxScanItems', { min: 1, max: exports.MAX_SCAN_ITEMS });
83
+ }
84
+ if (options.maxSearchCandidates !== undefined) {
85
+ (0, primitives_js_1.assertInteger)(options.maxSearchCandidates, 'maxSearchCandidates', {
86
+ min: 1,
87
+ max: exports.MAX_SEARCH_CANDIDATES,
88
+ });
89
+ }
90
+ if (options.maxIterations !== undefined && options.maxIterations !== Infinity) {
91
+ (0, primitives_js_1.assertInteger)(options.maxIterations, 'maxIterations', { min: 1 });
92
+ }
93
+ }
94
+ function assertStoreOptions(options) {
95
+ assertLimits(options);
96
+ if (options.vectorBackend && !options.index) {
97
+ throw (0, errors_js_1.validationError)('vectorBackend requires a configured `index` (embeddings); without one no embedding ' +
98
+ 'is computed, every put would clear the item vector, and search would silently return ' +
99
+ 'unranked, score-less results', 'vectorBackend');
100
+ }
101
+ assertUsableIndex(options.index);
102
+ assertScoreDirection(options.vectorScoreDirection);
103
+ }
@@ -8,8 +8,8 @@
8
8
  * last. How far the read goes before it can stop is decided here.
9
9
  */
10
10
  import type { Item, SearchItem } from '@langchain/langgraph-checkpoint';
11
- import type { ParsedSearch } from './parse';
12
- import type { StoreContext } from './setup';
11
+ import type { ParsedSearch } from './parse.js';
12
+ import type { StoreContext } from './setup.js';
13
13
  /**
14
14
  * How far a collection must go. A plain page is complete once `need`
15
15
  * (`offset + limit`) matching items are in hand, so rows past it are never
@@ -40,9 +40,9 @@ export type CollectBound = {
40
40
  *
41
41
  * Throws: `VALIDATION` naming `maxSearchCandidates` before any decode when a
42
42
  * semantic collection exceeds `cap`; `RESULT_TRUNCATED` when
43
- * `maxScanItems` is reached while rows remain — a search never silently answers
44
- * from part of the table; `ABORTED` when the signal fires between pages;
45
- * whatever a decode throws for a corrupt or unreadable row.
43
+ * `maxScanItems` or `maxIterations` is reached while rows remain — a search
44
+ * never silently answers from part of the table; `ABORTED` when the signal
45
+ * fires between pages; whatever a decode throws for a corrupt or unreadable row.
46
46
  *
47
47
  * Guarantees: a page closes the paginator as soon as it is full, so a namespace
48
48
  * far larger than the page costs neither a full decode nor a truncation error.
@@ -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
+ }