@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
@@ -1,132 +0,0 @@
1
- "use strict";
2
- /**
3
- * Hides how a `ttl` option becomes an expiry.
4
- *
5
- * A caller gives days or seconds. The one-unit rule, the five-year cap, the
6
- * epoch second DynamoDB's TTL attribute takes, and the S3 lifecycle days that
7
- * keep an offloaded object alive past its row's sweep lag are all derived
8
- * here, so the two spellings of the `ttl` option are accepted or rejected
9
- * alike and no reader re-derives one unit from the other itself. A stored
10
- * row's own epoch-second `ttl` is converted to milliseconds for `Date` where
11
- * that row is read, not here.
12
- */
13
- Object.defineProperty(exports, "__esModule", { value: true });
14
- exports.S3_LIFECYCLE_SWEEP_MARGIN_DAYS = exports.MAX_TTL_SECONDS = exports.MAX_TTL_DAYS = void 0;
15
- exports.resolveTtlSeconds = resolveTtlSeconds;
16
- exports.calculateTtlTimestamp = calculateTtlTimestamp;
17
- exports.lifecycleExpirationDays = lifecycleExpirationDays;
18
- const errors_1 = require("../errors/errors");
19
- const option_shape_1 = require("./option-shape");
20
- const primitives_1 = require("./primitives");
21
- const SECONDS_PER_DAY = 24 * 60 * 60;
22
- /** Maximum TTL expressed in days (5 years). */
23
- exports.MAX_TTL_DAYS = 365 * 5;
24
- /** Maximum TTL expressed in seconds: the same five years as {@link MAX_TTL_DAYS}. */
25
- exports.MAX_TTL_SECONDS = exports.MAX_TTL_DAYS * 24 * 60 * 60;
26
- /**
27
- * Extra days an S3 lifecycle rule adds over the TTL it backs. DynamoDB's TTL
28
- * sweep can lag up to ~48 h past the `ttl` timestamp; the offloaded object
29
- * must outlive its row, never the other way round.
30
- */
31
- exports.S3_LIFECYCLE_SWEEP_MARGIN_DAYS = 2;
32
- /**
33
- * The units {@link TtlOption} declares. `allKeysOf<TtlOption>` cannot check
34
- * this list: over a union its parameter is itself a union of one key map per
35
- * shape, so `{ days: 'days' }` alone satisfies the first shape and compiles.
36
- * Listing the keys of every shape as one record restores the check, so leaving
37
- * a unit out, inventing one, or adding a shape to the union without listing
38
- * its unit here fails to compile.
39
- */
40
- const TTL_KEYS = (0, option_shape_1.allKeysOf)({
41
- days: 'days',
42
- seconds: 'seconds',
43
- });
44
- /** Positive integer no greater than `max`, with a message that names what the cap means. */
45
- function assertWithinCap(value, field, max) {
46
- (0, primitives_1.assertInteger)(value, field, { min: 1 });
47
- if (value > max) {
48
- throw (0, errors_1.validationError)(`${field} must be <= ${max} (five years)`, field);
49
- }
50
- }
51
- /**
52
- * Reject a `ttl` that is not an object at all, carries a key other than a
53
- * unit, or names neither unit or both. The stray key is checked before the
54
- * units, so `{ day: 1 }` names the key the caller wrote rather than a unit it
55
- * did not.
56
- */
57
- function assertOneUnit(ttl) {
58
- if (typeof ttl !== 'object' || ttl === null) {
59
- throw (0, errors_1.validationError)('ttl must be an object: { days } or { seconds }', 'ttl');
60
- }
61
- (0, option_shape_1.assertShape)(ttl, TTL_KEYS, 'ttl');
62
- const days = 'days' in ttl;
63
- const seconds = 'seconds' in ttl;
64
- if (days && seconds) {
65
- throw (0, errors_1.validationError)('ttl must specify either ttl.days or ttl.seconds, not both', 'ttl');
66
- }
67
- if (!days && !seconds) {
68
- throw (0, errors_1.validationError)('ttl must specify either ttl.days or ttl.seconds', 'ttl');
69
- }
70
- }
71
- /**
72
- * A {@link TtlOption} resolved to a positive number of seconds.
73
- *
74
- * Accepts: `ttl` — declared as the two-shape union; a JavaScript caller, or a
75
- * config built from JSON, can also reach `undefined`, a non-object, `{}`, an
76
- * object carrying both keys and one carrying any other key, and each is
77
- * rejected. Within a shape the value must be an integer of at least 1.
78
- *
79
- * Returns: whole seconds, `days × 86400` for the days form.
80
- *
81
- * Throws: `VALIDATION`, in this order, naming `ttl` for a value that is not
82
- * an object, `ttl.<key>` for a key other than `days` or `seconds`, `ttl` for
83
- * an object naming neither unit or both, and `ttl.days` or `ttl.seconds` for a
84
- * value outside 1..five years. Both forms share that cap, so the two spellings
85
- * of one duration are accepted or rejected alike.
86
- */
87
- function resolveTtlSeconds(ttl) {
88
- assertOneUnit(ttl);
89
- if ('days' in ttl) {
90
- assertWithinCap(ttl.days, 'ttl.days', exports.MAX_TTL_DAYS);
91
- return ttl.days * SECONDS_PER_DAY;
92
- }
93
- assertWithinCap(ttl.seconds, 'ttl.seconds', exports.MAX_TTL_SECONDS);
94
- return ttl.seconds;
95
- }
96
- /**
97
- * The value DynamoDB's TTL attribute takes for an item written now: the Unix
98
- * epoch second at which it expires.
99
- *
100
- * Accepts: `ttl` — as {@link resolveTtlSeconds}. `now` — a clock returning
101
- * epoch **milliseconds**, defaulting to `Date.now`; supplied by tests and by
102
- * the adapters' clock seam.
103
- *
104
- * Returns: `floor(now() / 1000) + resolveTtlSeconds(ttl)`. Whole seconds,
105
- * because DynamoDB reads the attribute as an epoch-second Number
106
- * (https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/time-to-live-ttl-before-you-start.html).
107
- *
108
- * Throws: whatever {@link resolveTtlSeconds} throws.
109
- */
110
- function calculateTtlTimestamp(ttl, now = Date.now) {
111
- return Math.floor(now() / 1000) + resolveTtlSeconds(ttl);
112
- }
113
- /**
114
- * The `Days` of the S3 lifecycle expiration rule that backs a TTL.
115
- *
116
- * Accepts: `ttl` — as {@link resolveTtlSeconds}.
117
- *
118
- * Returns: the TTL rounded **up** to whole days plus
119
- * {@link S3_LIFECYCLE_SWEEP_MARGIN_DAYS}, so always at least
120
- * `1 + margin`.
121
- *
122
- * Throws: whatever {@link resolveTtlSeconds} throws.
123
- *
124
- * Guarantees: the object outlives the row that points at it. S3 expires an
125
- * object at the first midnight UTC at least `Days` after creation, while
126
- * DynamoDB may keep an expired item for up to 48 hours past its `ttl`
127
- * (https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/howitworks-ttl.html);
128
- * the margin covers that lag, which a bare `{ days: N }` did not.
129
- */
130
- function lifecycleExpirationDays(ttl) {
131
- return Math.ceil(resolveTtlSeconds(ttl) / SECONDS_PER_DAY) + exports.S3_LIFECYCLE_SWEEP_MARGIN_DAYS;
132
- }
@@ -1,197 +0,0 @@
1
- "use strict";
2
- /**
3
- * Hides how the distinct namespaces are found and held in one order.
4
- *
5
- * A listing reads every live row it can reach — one partition when its first
6
- * prefix condition opens with concrete labels, the whole table otherwise —
7
- * keeps the namespaces every condition matches, truncates and deduplicates
8
- * them, and sorts them by one pinned collation with its ties settled. A caller
9
- * paging by `offset` gets the same order on every call and every host.
10
- */
11
- Object.defineProperty(exports, "__esModule", { value: true });
12
- exports.matchNamespace = matchNamespace;
13
- exports.truncateDepth = truncateDepth;
14
- exports.prefixRoot = prefixRoot;
15
- exports.listNamespaces = listNamespaces;
16
- const clock_1 = require("../../shared/clock");
17
- const paginate_1 = require("../../shared/dynamodb/paginate");
18
- const table_schema_1 = require("../../shared/dynamodb/table-schema");
19
- const rows_1 = require("../internal/rows");
20
- const WILDCARD = '*';
21
- function segmentMatches(actual, path) {
22
- return path.every((element, index) => element === WILDCARD || element === actual[index]);
23
- }
24
- /**
25
- * Whether `namespace` satisfies one match condition. `condition.matchType` is
26
- * `'prefix'` or `'suffix'`, already refused otherwise by the parser that built
27
- * `condition` (`parseMatchCondition` in `parse.ts`).
28
- *
29
- * Accepts: `condition.path` — elements, where `'*'` matches any one element;
30
- * longer than the namespace never matches, and empty matches every namespace.
31
- *
32
- * Returns: whether the condition holds.
33
- *
34
- * Throws: nothing.
35
- */
36
- function matchNamespace(namespace, condition) {
37
- const { matchType, path } = condition;
38
- if (path.length > namespace.length)
39
- return false;
40
- const slice = matchType === 'prefix'
41
- ? namespace.slice(0, path.length)
42
- : namespace.slice(namespace.length - path.length);
43
- return segmentMatches(slice, path);
44
- }
45
- /**
46
- * Cap a namespace to at most `maxDepth` elements.
47
- *
48
- * Accepts: `maxDepth` — absent returns the namespace unchanged; otherwise a
49
- * parsed positive integer (see `parseListOperation` for what a negative or
50
- * zero value did here).
51
- *
52
- * Returns: the namespace, truncated from the end; shorter than `maxDepth` is
53
- * returned whole.
54
- *
55
- * Throws: nothing.
56
- */
57
- function truncateDepth(namespace, maxDepth) {
58
- return maxDepth === undefined ? namespace : namespace.slice(0, maxDepth);
59
- }
60
- /**
61
- * Leading concrete (non-wildcard) elements of the first prefix condition.
62
- *
63
- * Accepts: `conditions` — absent, empty, suffix-only, or a prefix condition
64
- * starting with `'*'` all yield nothing to scope by.
65
- *
66
- * Returns: the concrete leading elements, which name a partition and a sort-key
67
- * prefix the listing can be read from. An empty result means the listing cannot
68
- * be scoped to one partition and falls back to a Scan.
69
- *
70
- * Throws: nothing.
71
- *
72
- * Guarantees: the root is only ever a *superset* of what the conditions select
73
- * — every condition is still applied to each namespace read — so scoping can
74
- * never drop a namespace that belongs in the answer.
75
- */
76
- function prefixRoot(conditions) {
77
- const prefixCondition = conditions?.find((condition) => condition.matchType === 'prefix');
78
- if (!prefixCondition)
79
- return [];
80
- const root = [];
81
- for (const element of prefixCondition.path) {
82
- if (element === WILDCARD)
83
- break;
84
- root.push(element);
85
- }
86
- return root;
87
- }
88
- function namespaceSource(context, op, now) {
89
- const root = prefixRoot(op.matchConditions);
90
- if (root.length > 0) {
91
- return (0, paginate_1.paginateQuery)({
92
- retry: context.retry,
93
- client: context.client,
94
- params: (0, table_schema_1.withoutExpired)((0, rows_1.projectKeys)((0, rows_1.scopedQuery)(context.tableName, root)), now),
95
- maxItems: context.maxScanItems,
96
- });
97
- }
98
- return (0, paginate_1.paginateScan)({
99
- retry: context.retry,
100
- client: context.client,
101
- params: (0, table_schema_1.withoutExpired)((0, rows_1.projectKeys)((0, rows_1.storeScan)(context.tableName)), now),
102
- maxItems: context.maxScanItems,
103
- });
104
- }
105
- /**
106
- * The collation namespaces are sorted by, pinned to one locale.
107
- *
108
- * `InMemoryStore` sorts with bare `localeCompare`
109
- * (`@langchain/langgraph-checkpoint@1.1.5` `dist/store/memory.js:119`), which
110
- * means "in the host's default locale" — and locales disagree: `'ä'` sorts
111
- * before `'z'` in German and after it in Swedish. A listing paged by `offset`
112
- * is a position a caller holds between two calls, so an order that changes
113
- * with the host answering the call cuts the same listing in two places and the
114
- * caller misses one namespace and sees another twice. Matching the reference
115
- * there is not possible anyway, because the reference's own order varies with
116
- * its host; what is possible is matching it on every host that agrees with
117
- * this locale, and being deterministic on the rest.
118
- *
119
- * `en` is the locale to pin because ICU applies no tailoring to it — its order
120
- * is the untailored root order — and because it is the one locale a Node built
121
- * with small ICU still carries, so this cannot degrade to a different order on
122
- * a minimal runtime.
123
- */
124
- const NAMESPACE_COLLATOR = new Intl.Collator('en');
125
- /**
126
- * Order two namespaces by the reference store's collation, pinned, with its
127
- * ties settled.
128
- *
129
- * The collation is {@link NAMESPACE_COLLATOR} on the joined namespace — the
130
- * comparison `InMemoryStore` makes, held to one locale. Collation calls some
131
- * *distinct* strings equal — `'café'` written precomposed and decomposed is
132
- * one such pair — and the reference then leaves their order to insertion
133
- * order. Here that would be the order DynamoDB happened to return the rows in,
134
- * so the same listing could place a page boundary between them differently on
135
- * two calls and a page could skip one namespace while repeating another. The
136
- * tie-break settles exactly those pairs and never reorders a pair the
137
- * collation itself orders.
138
- */
139
- function compareNamespaces(a, b) {
140
- const left = a.join(table_schema_1.KEY_SEPARATOR);
141
- const right = b.join(table_schema_1.KEY_SEPARATOR);
142
- const collated = NAMESPACE_COLLATOR.compare(left, right);
143
- // `Number(left > right)` keeps the comparator total: 0 for a pair that really is equal.
144
- return collated !== 0 ? collated : left < right ? -1 : Number(left > right);
145
- }
146
- /**
147
- * The distinct namespaces satisfying every match condition.
148
- *
149
- * Accepts: `op` — parsed; every match condition must hold, absent or empty
150
- * matches every namespace. A concrete prefix root scopes the read to one
151
- * partition's Query, and anything else — a suffix condition, a leading `*`, no
152
- * conditions — spans the table and is one of the four reads allowed to Scan
153
- * (`test/static/guards/scan-sites.ts`).
154
- * `op.maxDepth` — namespaces are truncated to it and then
155
- * deduplicated, so `['a','b']` and `['a','c']` list once as `['a']`.
156
- * `op.offset` and `op.limit` — a `limit` of 0 returns an empty listing without reading.
157
- *
158
- * Returns: the namespaces, sorted, then `limit` of them from `offset`.
159
- *
160
- * Throws: `RESULT_TRUNCATED` when `maxScanItems` is reached while rows
161
- * remain, so a partial listing is never returned as a complete one;
162
- * `FORMAT_UNSUPPORTED` for a store item a newer release wrote.
163
- *
164
- * Guarantees: every live row is read — the answer is about which namespaces
165
- * exist, and paging over it must not depend on which rows were read first. That
166
- * is also why the sort is total (see {@link compareNamespaces}), and why a
167
- * `limit` of 0 is answered ahead of the read rather than by slicing one.
168
- */
169
- async function listNamespaces(context, op) {
170
- // A zero page is answered before the read. This listing is the one that can
171
- // never stop early — every live row must be seen before the namespaces can
172
- // be sorted and sliced — so scanning the whole table to slice nothing out of
173
- // it is the entire cost for none of the answer.
174
- if (op.limit === 0)
175
- return [];
176
- const now = (0, clock_1.nowSeconds)();
177
- const seen = new Set();
178
- const namespaces = [];
179
- for await (const raw of namespaceSource(context, op, now)) {
180
- const record = (0, rows_1.parseStoreRow)(raw);
181
- if (!record || (0, table_schema_1.isExpiredRow)(record, now))
182
- continue;
183
- const namespace = record.namespace;
184
- if (op.matchConditions &&
185
- !op.matchConditions.every((condition) => matchNamespace(namespace, condition))) {
186
- continue;
187
- }
188
- const truncated = truncateDepth(namespace, op.maxDepth);
189
- const dedupeKey = truncated.join(table_schema_1.KEY_SEPARATOR);
190
- if (seen.has(dedupeKey))
191
- continue;
192
- seen.add(dedupeKey);
193
- namespaces.push(truncated);
194
- }
195
- namespaces.sort(compareNamespaces);
196
- return namespaces.slice(op.offset, op.offset + op.limit);
197
- }
@@ -1,78 +0,0 @@
1
- "use strict";
2
- /**
3
- * Hides the order a put happens in.
4
- *
5
- * A put reads the row it replaces for its `createdAt`, embeds once — a vector
6
- * per extracted path onto the row, or one vector for the `vectorBackend`,
7
- * never both — writes the row, and only then syncs the backend, best-effort.
8
- * A `null` value takes the delete path instead. A caller hands over an item;
9
- * that the table commits first and the vector copy follows is decided here.
10
- */
11
- Object.defineProperty(exports, "__esModule", { value: true });
12
- exports.putItem = putItem;
13
- const node_crypto_1 = require("node:crypto");
14
- const clock_1 = require("../../shared/clock");
15
- const ttl_1 = require("../../shared/validation/ttl");
16
- const item_write_1 = require("../internal/item-write");
17
- const rows_1 = require("../internal/rows");
18
- const semantic_search_1 = require("../internal/semantic-search");
19
- const vector_index_1 = require("../internal/vector-index");
20
- /**
21
- * The vectors a put stores on the row: one per extracted path, scored by best
22
- * match on read. Not computed when a `vectorBackend` holds the vectors, which
23
- * takes a single vector per item instead (see {@link itemVector}).
24
- */
25
- async function resolvePassages(context, op, value) {
26
- if (op.index === false)
27
- return undefined;
28
- return (0, semantic_search_1.embedPassages)(context, value, op.index);
29
- }
30
- /**
31
- * Store, update or delete an item.
32
- *
33
- * Accepts: `op` — parsed; a `ParsedDelete` removes the item, a `ParsedPut` is
34
- * stored, its value encoded with optional compression and S3 offload under
35
- * this row's own path, in an object named by this put's own id. `op.index` —
36
- * `false` stores the item without indexing it and clears any vector it had, an
37
- * array overrides the configured fields for this put, and absent uses the
38
- * store's configuration.
39
- *
40
- * Returns: nothing. Deleting an item that is not there is not an error.
41
- *
42
- * Throws: `VALIDATION` naming `value` for a value that JSON cannot represent —
43
- * refused at the write rather than stored as a row that can never be read back;
44
- * `S3_OFFLOAD_FAILED`; whatever the write throws.
45
- *
46
- * Guarantees: DynamoDB holds the canonical item — the vector index is synced
47
- * afterwards and best-effort, so a backend outage never fails a put or leaves a
48
- * half-written item. `createdAt` survives every update. The superseded payload
49
- * is deleted only once the new row is committed, and this put's own upload
50
- * only once a read proves its write did not land. Neither release reads the
51
- * row first: each put uploads under a key ending in an id of its own, so the
52
- * object a put uploads is named only by that put's own rows.
53
- */
54
- async function putItem(context, op) {
55
- if (op.kind === 'delete') {
56
- await (0, item_write_1.deleteStoreItem)(context, op.address);
57
- return;
58
- }
59
- const { namespace, key } = op.address;
60
- const value = op.value;
61
- const timestamp = (0, clock_1.nowIso)();
62
- const existing = await (0, rows_1.readExisting)(context, (0, rows_1.itemRowKey)(op.address));
63
- // The two indexing modes are exclusive, so only one of them embeds: the row
64
- // carries a vector per extracted path, while a configured backend takes one
65
- // vector per item because that is what its `upsert` contract addresses.
66
- const embedding = await (0, vector_index_1.itemVector)(context, op);
67
- const embeddings = context.vectorBackend ? undefined : await resolvePassages(context, op, value);
68
- const ttlTimestamp = context.ttl ? (0, ttl_1.calculateTtlTimestamp)(context.ttl) : undefined;
69
- const record = await (0, rows_1.buildStoreRow)(context, { namespace, key }, value, {
70
- createdAt: existing.createdAt ?? timestamp,
71
- updatedAt: timestamp,
72
- embeddings,
73
- ttlTimestamp,
74
- rev: (0, node_crypto_1.randomUUID)(),
75
- });
76
- await (0, item_write_1.persistRow)(context, record, existing);
77
- await (0, vector_index_1.syncItemVector)(context, op.address, embedding);
78
- }
@@ -1,66 +0,0 @@
1
- "use strict";
2
- /**
3
- * Hides which of three paths serves a search.
4
- *
5
- * A query with a `vectorBackend` is answered by the backend; no query, or no
6
- * `index` to embed one with, is a page read from the table that stops once
7
- * full; anything else is ranked in memory over at most `maxSearchCandidates`.
8
- * A page of zero is answered before any of them. A caller gets the same shape
9
- * of page whichever path ran, scored exactly when a query could be ranked.
10
- */
11
- Object.defineProperty(exports, "__esModule", { value: true });
12
- exports.searchItems = searchItems;
13
- const truncate_1 = require("../../shared/logging/truncate");
14
- const semantic_search_1 = require("../internal/semantic-search");
15
- const table_search_1 = require("../internal/table-search");
16
- const vector_index_1 = require("../internal/vector-index");
17
- /**
18
- * Search items under a namespace prefix: metadata filtering plus optional
19
- * semantic ranking.
20
- *
21
- * Accepts: `search` — already parsed, so `namespacePrefix`, `offset` and
22
- * `limit` are resolved; `search.query` absent or empty
23
- * (which is absent: there is no query to embed) ranks nothing and returns the
24
- * page as read, which is what the reference store does
25
- * (`@langchain/langgraph-checkpoint@1.1.5` `dist/store/memory.js:70-80`, where a
26
- * falsy query takes the unscored path). A query without a configured `index`
27
- * does the same, since there is nothing to embed it with.
28
- *
29
- * Returns: at most `limit` items from `offset`. With a query and an index every
30
- * item carries a `score`; without one none does. Scores rank best-first; an item
31
- * that cannot be scored ranks last rather than being dropped.
32
- *
33
- * Throws: `VALIDATION` naming `maxSearchCandidates` or `index.dims`; whatever
34
- * the reads, decodes and the embeddings model throw.
35
- *
36
- * Guarantees: a page of zero costs no request at all, and otherwise only the
37
- * page's own items are decoded on the unranked path — the
38
- * read stops as soon as it is full. A semantic search must read every candidate
39
- * to rank it, which is why it is capped and why a large corpus belongs in a
40
- * `vectorBackend`.
41
- */
42
- async function searchItems(context, search, signal) {
43
- const { offset, limit } = search;
44
- // A zero page is answered here, ahead of all three paths below, because each
45
- // of them pays for it: `collectCandidates` pulls the first row out of the
46
- // paginator before it tests its `offset + limit` bound, so even a page that
47
- // needs nothing costs one Query or Scan, and the two ranked paths embed the
48
- // query as well. Slicing the result to nothing afterwards hid the cost
49
- // rather than avoiding it.
50
- if (limit === 0)
51
- return [];
52
- if (search.query && (0, vector_index_1.hasVectorBackend)(context)) {
53
- const ranked = await (0, vector_index_1.searchViaBackend)(context, search, signal);
54
- return ranked.slice(offset, offset + limit);
55
- }
56
- if (!search.query || !context.index) {
57
- const page = await (0, table_search_1.collectCandidates)(context, search, { kind: 'page', need: offset + limit }, signal);
58
- return page.map(({ item }) => ({ ...item })).slice(offset, offset + limit);
59
- }
60
- const candidates = await (0, table_search_1.collectCandidates)(context, search, { kind: 'semantic', cap: context.maxSearchCandidates }, signal);
61
- const queryVector = await context.index.embeddings.embedQuery(search.query);
62
- (0, semantic_search_1.assertVectorDims)(context.index, queryVector, 'query');
63
- const ranked = (0, table_search_1.rankInMemory)(candidates, queryVector, context.maxSearchCandidates, (count) => context.logger.warn('search: some candidates carry an embedding of a different dimension than the query and ' +
64
- 'were ranked unscored; re-embed them with reconcileVectorIndex or a re-put', { namespacePrefix: (0, truncate_1.truncateLabelsForLog)(search.namespacePrefix), count }));
65
- return ranked.slice(offset, offset + limit);
66
- }
@@ -1,26 +0,0 @@
1
- /**
2
- * Hides how a batch runs concurrently and still in the order it was written.
3
- *
4
- * Operations on different items, and reads of the same item, share a run and
5
- * go in flight together; anything that could observe or overwrite an earlier
6
- * operation's effect starts the next run. A caller sees the order it wrote —
7
- * a `get` after a `put` of the same item sees it, a `search` sees every write
8
- * before it — and how independence is judged can change without the store.
9
- */
10
- import type { ParsedOperation } from './parse';
11
- /**
12
- * Run a batch: each run of independent operations concurrently, at most
13
- * `limit` in flight, and the runs themselves in
14
- * order. Results come back in operation order.
15
- *
16
- * Accepts: `operations` — in caller order, which is the order they are
17
- * observed in; empty returns empty. `limit` — operations in flight within one
18
- * run.
19
- *
20
- * Returns: the results in operation order, not completion order.
21
- *
22
- * Throws: the first failure. Any failure rejects the whole batch: no operation
23
- * in a later run starts, the ones already in flight settle, and that first
24
- * error is the one thrown.
25
- */
26
- export declare function runBatch<R>(operations: readonly ParsedOperation[], dispatch: (operation: ParsedOperation) => Promise<R>, limit?: number): Promise<R[]>;
@@ -1,109 +0,0 @@
1
- "use strict";
2
- /**
3
- * Hides how a batch runs concurrently and still in the order it was written.
4
- *
5
- * Operations on different items, and reads of the same item, share a run and
6
- * go in flight together; anything that could observe or overwrite an earlier
7
- * operation's effect starts the next run. A caller sees the order it wrote —
8
- * a `get` after a `put` of the same item sees it, a `search` sees every write
9
- * before it — and how independence is judged can change without the store.
10
- */
11
- Object.defineProperty(exports, "__esModule", { value: true });
12
- exports.runBatch = runBatch;
13
- const concurrency_1 = require("../../shared/concurrency");
14
- function itemOf(address) {
15
- return JSON.stringify([address.namespace, address.key]);
16
- }
17
- /** What `op` touches, decided by the kind the parser already assigned — the only place that asks. */
18
- function touchOf(op) {
19
- switch (op.kind) {
20
- case 'put':
21
- case 'delete':
22
- return { kind: 'write', item: itemOf(op.address) };
23
- case 'get':
24
- return { kind: 'get', item: itemOf(op.address) };
25
- default:
26
- return { kind: 'broad' };
27
- }
28
- }
29
- /**
30
- * True when `touch` may not join `segment` — because some operation already in
31
- * it addresses the same item, or because a write and a whole-store read would
32
- * then be unordered with respect to each other.
33
- */
34
- function conflicts(segment, touch) {
35
- if (touch.kind === 'broad')
36
- return segment.hasWrite;
37
- if (touch.kind === 'get')
38
- return segment.written.has(touch.item);
39
- return segment.written.has(touch.item) || segment.read.has(touch.item) || segment.hasBroad;
40
- }
41
- function admit(segment, index, touch) {
42
- segment.indices.push(index);
43
- if (touch.kind === 'broad')
44
- segment.hasBroad = true;
45
- if (touch.kind === 'get')
46
- segment.read.add(touch.item);
47
- if (touch.kind === 'write') {
48
- segment.written.add(touch.item);
49
- segment.hasWrite = true;
50
- }
51
- }
52
- function emptySegment() {
53
- return { indices: [], written: new Set(), read: new Set(), hasWrite: false, hasBroad: false };
54
- }
55
- /**
56
- * Split a batch into runs of mutually independent operations, in caller order.
57
- *
58
- * Operations that address different items, and reads that address the same
59
- * item, are independent of each other and share a run. Anything that could
60
- * observe or overwrite an earlier operation's effect starts a new one, so the
61
- * order the caller wrote is the order the caller observes: a `get` after a
62
- * `put` of the same item sees it, a `get` before one does not, and a `search`
63
- * sees every write that precedes it and none that follow.
64
- *
65
- * Running every write before every read — the earlier behaviour — made a
66
- * `[delete, get]` batch return nothing where the reference store returns the
67
- * value, and a `[get, put]` batch return the new value where the reference
68
- * returns null. `AsyncBatchedStore` coalesces everything enqueued in one tick
69
- * into a single `batch()`, so that difference is reachable from ordinary code.
70
- */
71
- function planBatch(operations) {
72
- const runs = [];
73
- let segment = emptySegment();
74
- operations.forEach((op, index) => {
75
- const touch = touchOf(op);
76
- if (segment.indices.length > 0 && conflicts(segment, touch)) {
77
- runs.push(segment.indices);
78
- segment = emptySegment();
79
- }
80
- admit(segment, index, touch);
81
- });
82
- if (segment.indices.length > 0)
83
- runs.push(segment.indices);
84
- return runs;
85
- }
86
- /**
87
- * Run a batch: each run of independent operations concurrently, at most
88
- * `limit` in flight, and the runs themselves in
89
- * order. Results come back in operation order.
90
- *
91
- * Accepts: `operations` — in caller order, which is the order they are
92
- * observed in; empty returns empty. `limit` — operations in flight within one
93
- * run.
94
- *
95
- * Returns: the results in operation order, not completion order.
96
- *
97
- * Throws: the first failure. Any failure rejects the whole batch: no operation
98
- * in a later run starts, the ones already in flight settle, and that first
99
- * error is the one thrown.
100
- */
101
- async function runBatch(operations, dispatch, limit = concurrency_1.DEFAULT_READ_CONCURRENCY) {
102
- const results = [];
103
- for (const run of planBatch(operations)) {
104
- await (0, concurrency_1.mapWithConcurrency)(run, limit, async (index) => {
105
- results[index] = await dispatch(operations[index]);
106
- });
107
- }
108
- return results;
109
- }