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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (608) hide show
  1. package/README.md +1820 -290
  2. package/dist/cjs/backfill/backfill.d.ts +171 -0
  3. package/dist/cjs/backfill/backfill.js +177 -0
  4. package/dist/cjs/checkpointer/actions/delete-thread.d.ts +50 -0
  5. package/dist/cjs/checkpointer/actions/delete-thread.js +26 -0
  6. package/dist/cjs/checkpointer/actions/get-tuple.d.ts +36 -0
  7. package/dist/cjs/checkpointer/actions/get-tuple.js +22 -0
  8. package/dist/cjs/checkpointer/actions/list.d.ts +55 -0
  9. package/dist/cjs/checkpointer/actions/list.js +70 -0
  10. package/dist/cjs/checkpointer/actions/put-writes.d.ts +49 -0
  11. package/dist/cjs/checkpointer/actions/put-writes.js +21 -0
  12. package/dist/cjs/checkpointer/actions/put.d.ts +95 -0
  13. package/dist/cjs/checkpointer/actions/put.js +79 -0
  14. package/dist/cjs/checkpointer/internal/delta-history.d.ts +124 -0
  15. package/dist/cjs/checkpointer/internal/delta-history.js +131 -0
  16. package/dist/cjs/checkpointer/internal/listing.d.ts +149 -0
  17. package/dist/cjs/checkpointer/internal/listing.js +104 -0
  18. package/dist/cjs/checkpointer/internal/parse.d.ts +298 -0
  19. package/dist/cjs/checkpointer/internal/parse.js +184 -0
  20. package/dist/cjs/checkpointer/internal/pending-writes.d.ts +314 -0
  21. package/dist/cjs/checkpointer/internal/pending-writes.js +241 -0
  22. package/dist/cjs/checkpointer/internal/read.d.ts +135 -0
  23. package/dist/cjs/checkpointer/internal/read.js +132 -0
  24. package/dist/cjs/checkpointer/internal/rows.d.ts +644 -0
  25. package/dist/cjs/checkpointer/internal/rows.js +356 -0
  26. package/dist/cjs/checkpointer/internal/setup.d.ts +47 -0
  27. package/dist/cjs/checkpointer/internal/setup.js +25 -0
  28. package/dist/cjs/checkpointer/saver.d.ts +306 -0
  29. package/dist/cjs/checkpointer/saver.js +56 -0
  30. package/dist/cjs/checkpointer/types.d.ts +51 -0
  31. package/dist/cjs/factory/factory.d.ts +154 -0
  32. package/dist/cjs/factory/factory.js +137 -0
  33. package/dist/{factory → cjs/factory}/types.d.ts +33 -14
  34. package/dist/cjs/history/actions/add-messages.d.ts +51 -0
  35. package/dist/cjs/history/actions/add-messages.js +17 -0
  36. package/dist/cjs/history/actions/clear.d.ts +52 -0
  37. package/dist/cjs/history/actions/clear.js +29 -0
  38. package/dist/cjs/history/actions/get-messages.d.ts +60 -0
  39. package/dist/cjs/history/actions/get-messages.js +58 -0
  40. package/dist/cjs/history/actions/list-sessions.d.ts +55 -0
  41. package/dist/cjs/history/actions/list-sessions.js +67 -0
  42. package/dist/cjs/history/actions/reconcile-count.d.ts +49 -0
  43. package/dist/cjs/history/actions/reconcile-count.js +8 -0
  44. package/dist/cjs/history/chat-message-history.d.ts +267 -0
  45. package/dist/cjs/history/chat-message-history.js +61 -0
  46. package/dist/cjs/history/internal/append.d.ts +244 -0
  47. package/dist/cjs/history/internal/append.js +267 -0
  48. package/dist/cjs/history/internal/message-read.d.ts +84 -0
  49. package/dist/cjs/history/internal/message-read.js +93 -0
  50. package/dist/cjs/history/internal/parse.d.ts +153 -0
  51. package/dist/cjs/history/internal/parse.js +113 -0
  52. package/dist/cjs/history/internal/rows.d.ts +196 -0
  53. package/dist/cjs/history/internal/rows.js +96 -0
  54. package/dist/cjs/history/internal/session.d.ts +350 -0
  55. package/dist/cjs/history/internal/session.js +296 -0
  56. package/dist/cjs/history/internal/setup.d.ts +64 -0
  57. package/dist/cjs/history/internal/setup.js +60 -0
  58. package/dist/cjs/history/session-adapter.d.ts +112 -0
  59. package/dist/cjs/history/session-adapter.js +38 -0
  60. package/dist/cjs/history/types.d.ts +102 -0
  61. package/dist/cjs/index.d.ts +53 -0
  62. package/dist/cjs/index.js +25 -0
  63. package/dist/cjs/package.json +1 -0
  64. package/dist/cjs/shared/adapter.d.ts +146 -0
  65. package/dist/cjs/shared/adapter.js +70 -0
  66. package/dist/cjs/shared/clock.d.ts +52 -0
  67. package/dist/cjs/shared/clock.js +14 -0
  68. package/dist/cjs/shared/codec/codec.d.ts +336 -0
  69. package/dist/cjs/shared/codec/codec.js +162 -0
  70. package/dist/cjs/shared/codec/compression.d.ts +66 -0
  71. package/dist/cjs/shared/codec/compression.js +45 -0
  72. package/dist/cjs/shared/codec/json-serde.d.ts +80 -0
  73. package/dist/cjs/shared/codec/json-serde.js +58 -0
  74. package/dist/{shared → cjs/shared}/codec/s3/client-types.d.ts +22 -2
  75. package/dist/{shared → cjs/shared}/codec/s3/client-types.js +0 -1
  76. package/dist/cjs/shared/codec/s3/client.d.ts +63 -0
  77. package/dist/cjs/shared/codec/s3/client.js +78 -0
  78. package/dist/cjs/shared/codec/s3/config.d.ts +260 -0
  79. package/dist/cjs/shared/codec/s3/config.js +92 -0
  80. package/dist/cjs/shared/codec/s3/lifecycle.d.ts +220 -0
  81. package/dist/cjs/shared/codec/s3/lifecycle.js +223 -0
  82. package/dist/cjs/shared/codec/s3/offloader.d.ts +428 -0
  83. package/dist/cjs/shared/codec/s3/offloader.js +289 -0
  84. package/dist/cjs/shared/concurrency.d.ts +43 -0
  85. package/dist/{shared → cjs/shared}/concurrency.js +10 -9
  86. package/dist/cjs/shared/dynamodb/abort.d.ts +47 -0
  87. package/dist/cjs/shared/dynamodb/abort.js +16 -0
  88. package/dist/cjs/shared/dynamodb/batch-write.d.ts +86 -0
  89. package/dist/cjs/shared/dynamodb/batch-write.js +79 -0
  90. package/dist/cjs/shared/dynamodb/cancellation.d.ts +124 -0
  91. package/dist/cjs/shared/dynamodb/cancellation.js +37 -0
  92. package/dist/cjs/shared/dynamodb/client.d.ts +177 -0
  93. package/dist/{shared → cjs/shared}/dynamodb/client.js +12 -14
  94. package/dist/cjs/shared/dynamodb/idempotent-write.d.ts +596 -0
  95. package/dist/cjs/shared/dynamodb/idempotent-write.js +173 -0
  96. package/dist/cjs/shared/dynamodb/paginate.d.ts +111 -0
  97. package/dist/cjs/shared/dynamodb/paginate.js +90 -0
  98. package/dist/cjs/shared/dynamodb/partition-delete.d.ts +204 -0
  99. package/dist/cjs/shared/dynamodb/partition-delete.js +177 -0
  100. package/dist/cjs/shared/dynamodb/recency-index.d.ts +243 -0
  101. package/dist/cjs/shared/dynamodb/recency-index.js +146 -0
  102. package/dist/cjs/shared/dynamodb/retry.d.ts +317 -0
  103. package/dist/cjs/shared/dynamodb/retry.js +193 -0
  104. package/dist/cjs/shared/dynamodb/row-size.d.ts +33 -0
  105. package/dist/cjs/shared/dynamodb/row-size.js +30 -0
  106. package/dist/cjs/shared/dynamodb/table-schema.d.ts +199 -0
  107. package/dist/cjs/shared/dynamodb/table-schema.js +52 -0
  108. package/dist/cjs/shared/errors/base-error.d.ts +231 -0
  109. package/dist/cjs/shared/errors/base-error.js +73 -0
  110. package/dist/cjs/shared/errors/boundary.d.ts +86 -0
  111. package/dist/cjs/shared/errors/boundary.js +61 -0
  112. package/dist/cjs/shared/errors/classify.d.ts +206 -0
  113. package/dist/cjs/shared/errors/classify.js +232 -0
  114. package/dist/cjs/shared/errors/error-code.d.ts +95 -0
  115. package/dist/{shared → cjs/shared}/errors/error-code.js +12 -2
  116. package/dist/cjs/shared/errors/errors.d.ts +233 -0
  117. package/dist/cjs/shared/errors/errors.js +123 -0
  118. package/dist/cjs/shared/logging/logger.d.ts +80 -0
  119. package/dist/cjs/shared/logging/logger.js +30 -0
  120. package/dist/cjs/shared/logging/redaction.d.ts +123 -0
  121. package/dist/cjs/shared/logging/redaction.js +145 -0
  122. package/dist/cjs/shared/logging/secret-patterns.d.ts +227 -0
  123. package/dist/cjs/shared/logging/secret-patterns.js +93 -0
  124. package/dist/cjs/shared/logging/truncate.d.ts +197 -0
  125. package/dist/cjs/shared/logging/truncate.js +31 -0
  126. package/dist/cjs/shared/options.d.ts +100 -0
  127. package/dist/cjs/shared/ulid.d.ts +80 -0
  128. package/dist/{shared → cjs/shared}/ulid.js +7 -21
  129. package/dist/cjs/shared/validation/collaborators.d.ts +160 -0
  130. package/dist/cjs/shared/validation/collaborators.js +79 -0
  131. package/dist/cjs/shared/validation/option-shape.d.ts +91 -0
  132. package/dist/cjs/shared/validation/option-shape.js +31 -0
  133. package/dist/cjs/shared/validation/options.d.ts +145 -0
  134. package/dist/cjs/shared/validation/options.js +166 -0
  135. package/dist/cjs/shared/validation/primitives.d.ts +292 -0
  136. package/dist/cjs/shared/validation/primitives.js +114 -0
  137. package/dist/cjs/shared/validation/ttl.d.ts +94 -0
  138. package/dist/cjs/shared/validation/ttl.js +52 -0
  139. package/dist/cjs/store/actions/list-namespaces.d.ts +79 -0
  140. package/dist/cjs/store/actions/list-namespaces.js +92 -0
  141. package/dist/cjs/store/actions/put.d.ts +43 -0
  142. package/dist/cjs/store/actions/put.js +49 -0
  143. package/dist/cjs/store/actions/reconcile-vector-index.d.ts +38 -0
  144. package/dist/cjs/store/actions/reconcile-vector-index.js +13 -0
  145. package/dist/cjs/store/actions/search.d.ts +38 -0
  146. package/dist/cjs/store/actions/search.js +26 -0
  147. package/dist/cjs/store/internal/batch-plan.d.ts +56 -0
  148. package/dist/cjs/store/internal/batch-plan.js +32 -0
  149. package/dist/cjs/store/internal/filter.d.ts +43 -0
  150. package/dist/cjs/store/internal/filter.js +64 -0
  151. package/dist/cjs/store/internal/get-item.d.ts +77 -0
  152. package/dist/cjs/store/internal/get-item.js +58 -0
  153. package/dist/cjs/store/internal/item-write.d.ts +270 -0
  154. package/dist/cjs/store/internal/item-write.js +181 -0
  155. package/dist/cjs/store/internal/parse.d.ts +230 -0
  156. package/dist/cjs/store/internal/parse.js +180 -0
  157. package/dist/cjs/store/internal/rows.d.ts +359 -0
  158. package/dist/cjs/store/internal/rows.js +166 -0
  159. package/dist/cjs/store/internal/semantic-search.d.ts +168 -0
  160. package/dist/{store/internal/text-path.js → cjs/store/internal/semantic-search.js} +92 -28
  161. package/dist/cjs/store/internal/setup.d.ts +96 -0
  162. package/dist/cjs/store/internal/setup.js +103 -0
  163. package/dist/cjs/store/internal/table-search.d.ts +100 -0
  164. package/dist/cjs/store/internal/table-search.js +123 -0
  165. package/dist/cjs/store/internal/vector-index.d.ts +258 -0
  166. package/dist/cjs/store/internal/vector-index.js +269 -0
  167. package/dist/cjs/store/store.d.ts +329 -0
  168. package/dist/cjs/store/store.js +97 -0
  169. package/dist/cjs/store/types.d.ts +111 -0
  170. package/dist/cjs/store/vector-backend.d.ts +104 -0
  171. package/dist/cjs/store/vector-backend.js +4 -0
  172. package/dist/esm/backfill/backfill.d.ts +171 -0
  173. package/dist/esm/backfill/backfill.js +170 -0
  174. package/dist/esm/checkpointer/actions/delete-thread.d.ts +50 -0
  175. package/dist/esm/checkpointer/actions/delete-thread.js +23 -0
  176. package/dist/esm/checkpointer/actions/get-tuple.d.ts +36 -0
  177. package/dist/esm/checkpointer/actions/get-tuple.js +19 -0
  178. package/dist/esm/checkpointer/actions/list.d.ts +55 -0
  179. package/dist/esm/checkpointer/actions/list.js +67 -0
  180. package/dist/esm/checkpointer/actions/put-writes.d.ts +49 -0
  181. package/dist/esm/checkpointer/actions/put-writes.js +18 -0
  182. package/dist/esm/checkpointer/actions/put.d.ts +95 -0
  183. package/dist/esm/checkpointer/actions/put.js +75 -0
  184. package/dist/esm/checkpointer/internal/delta-history.d.ts +124 -0
  185. package/dist/esm/checkpointer/internal/delta-history.js +126 -0
  186. package/dist/esm/checkpointer/internal/listing.d.ts +149 -0
  187. package/dist/esm/checkpointer/internal/listing.js +95 -0
  188. package/dist/esm/checkpointer/internal/parse.d.ts +298 -0
  189. package/dist/esm/checkpointer/internal/parse.js +169 -0
  190. package/dist/esm/checkpointer/internal/pending-writes.d.ts +314 -0
  191. package/dist/esm/checkpointer/internal/pending-writes.js +229 -0
  192. package/dist/esm/checkpointer/internal/read.d.ts +135 -0
  193. package/dist/esm/checkpointer/internal/read.js +125 -0
  194. package/dist/esm/checkpointer/internal/rows.d.ts +644 -0
  195. package/dist/esm/checkpointer/internal/rows.js +323 -0
  196. package/dist/esm/checkpointer/internal/setup.d.ts +47 -0
  197. package/dist/esm/checkpointer/internal/setup.js +21 -0
  198. package/dist/esm/checkpointer/saver.d.ts +306 -0
  199. package/dist/esm/checkpointer/saver.js +52 -0
  200. package/dist/esm/checkpointer/types.d.ts +51 -0
  201. package/dist/esm/checkpointer/types.js +1 -0
  202. package/dist/esm/factory/factory.d.ts +154 -0
  203. package/dist/esm/factory/factory.js +133 -0
  204. package/dist/esm/factory/types.d.ts +76 -0
  205. package/dist/esm/factory/types.js +1 -0
  206. package/dist/esm/history/actions/add-messages.d.ts +51 -0
  207. package/dist/esm/history/actions/add-messages.js +14 -0
  208. package/dist/esm/history/actions/clear.d.ts +52 -0
  209. package/dist/esm/history/actions/clear.js +26 -0
  210. package/dist/esm/history/actions/get-messages.d.ts +60 -0
  211. package/dist/esm/history/actions/get-messages.js +55 -0
  212. package/dist/esm/history/actions/list-sessions.d.ts +55 -0
  213. package/dist/esm/history/actions/list-sessions.js +64 -0
  214. package/dist/esm/history/actions/reconcile-count.d.ts +49 -0
  215. package/dist/esm/history/actions/reconcile-count.js +5 -0
  216. package/dist/esm/history/chat-message-history.d.ts +267 -0
  217. package/dist/esm/history/chat-message-history.js +57 -0
  218. package/dist/esm/history/internal/append.d.ts +244 -0
  219. package/dist/esm/history/internal/append.js +259 -0
  220. package/dist/esm/history/internal/message-read.d.ts +84 -0
  221. package/dist/esm/history/internal/message-read.js +89 -0
  222. package/dist/esm/history/internal/parse.d.ts +153 -0
  223. package/dist/esm/history/internal/parse.js +105 -0
  224. package/dist/esm/history/internal/rows.d.ts +196 -0
  225. package/dist/esm/history/internal/rows.js +83 -0
  226. package/dist/esm/history/internal/session.d.ts +350 -0
  227. package/dist/esm/history/internal/session.js +285 -0
  228. package/dist/esm/history/internal/setup.d.ts +64 -0
  229. package/dist/esm/history/internal/setup.js +56 -0
  230. package/dist/esm/history/session-adapter.d.ts +112 -0
  231. package/dist/esm/history/session-adapter.js +34 -0
  232. package/dist/esm/history/types.d.ts +102 -0
  233. package/dist/esm/history/types.js +1 -0
  234. package/dist/esm/index.d.ts +53 -0
  235. package/dist/esm/index.js +10 -0
  236. package/dist/esm/shared/adapter.d.ts +146 -0
  237. package/dist/esm/shared/adapter.js +65 -0
  238. package/dist/esm/shared/clock.d.ts +52 -0
  239. package/dist/esm/shared/clock.js +9 -0
  240. package/dist/esm/shared/codec/codec.d.ts +336 -0
  241. package/dist/esm/shared/codec/codec.js +150 -0
  242. package/dist/esm/shared/codec/compression.d.ts +66 -0
  243. package/dist/esm/shared/codec/compression.js +40 -0
  244. package/dist/esm/shared/codec/json-serde.d.ts +80 -0
  245. package/dist/esm/shared/codec/json-serde.js +54 -0
  246. package/dist/esm/shared/codec/s3/client-types.d.ts +54 -0
  247. package/dist/esm/shared/codec/s3/client-types.js +3 -0
  248. package/dist/esm/shared/codec/s3/client.d.ts +63 -0
  249. package/dist/esm/shared/codec/s3/client.js +40 -0
  250. package/dist/esm/shared/codec/s3/config.d.ts +260 -0
  251. package/dist/esm/shared/codec/s3/config.js +79 -0
  252. package/dist/esm/shared/codec/s3/lifecycle.d.ts +220 -0
  253. package/dist/esm/shared/codec/s3/lifecycle.js +214 -0
  254. package/dist/esm/shared/codec/s3/offloader.d.ts +428 -0
  255. package/dist/esm/shared/codec/s3/offloader.js +278 -0
  256. package/dist/esm/shared/concurrency.d.ts +43 -0
  257. package/dist/esm/shared/concurrency.js +27 -0
  258. package/dist/esm/shared/dynamodb/abort.d.ts +47 -0
  259. package/dist/esm/shared/dynamodb/abort.js +12 -0
  260. package/dist/esm/shared/dynamodb/batch-write.d.ts +86 -0
  261. package/dist/esm/shared/dynamodb/batch-write.js +74 -0
  262. package/dist/esm/shared/dynamodb/cancellation.d.ts +124 -0
  263. package/dist/esm/shared/dynamodb/cancellation.js +30 -0
  264. package/dist/esm/shared/dynamodb/client.d.ts +177 -0
  265. package/dist/esm/shared/dynamodb/client.js +35 -0
  266. package/dist/esm/shared/dynamodb/idempotent-write.d.ts +596 -0
  267. package/dist/esm/shared/dynamodb/idempotent-write.js +153 -0
  268. package/dist/esm/shared/dynamodb/paginate.d.ts +111 -0
  269. package/dist/esm/shared/dynamodb/paginate.js +84 -0
  270. package/dist/esm/shared/dynamodb/partition-delete.d.ts +204 -0
  271. package/dist/esm/shared/dynamodb/partition-delete.js +171 -0
  272. package/dist/esm/shared/dynamodb/recency-index.d.ts +243 -0
  273. package/dist/esm/shared/dynamodb/recency-index.js +136 -0
  274. package/dist/esm/shared/dynamodb/retry.d.ts +317 -0
  275. package/dist/esm/shared/dynamodb/retry.js +180 -0
  276. package/dist/esm/shared/dynamodb/row-size.d.ts +33 -0
  277. package/dist/esm/shared/dynamodb/row-size.js +26 -0
  278. package/dist/esm/shared/dynamodb/table-schema.d.ts +199 -0
  279. package/dist/esm/shared/dynamodb/table-schema.js +43 -0
  280. package/dist/esm/shared/errors/base-error.d.ts +231 -0
  281. package/dist/esm/shared/errors/base-error.js +64 -0
  282. package/dist/esm/shared/errors/boundary.d.ts +86 -0
  283. package/dist/esm/shared/errors/boundary.js +54 -0
  284. package/dist/esm/shared/errors/classify.d.ts +206 -0
  285. package/dist/esm/shared/errors/classify.js +220 -0
  286. package/dist/esm/shared/errors/error-code.d.ts +95 -0
  287. package/dist/esm/shared/errors/error-code.js +24 -0
  288. package/dist/esm/shared/errors/errors.d.ts +233 -0
  289. package/dist/esm/shared/errors/errors.js +110 -0
  290. package/dist/esm/shared/logging/logger.d.ts +80 -0
  291. package/dist/esm/shared/logging/logger.js +25 -0
  292. package/dist/esm/shared/logging/redaction.d.ts +123 -0
  293. package/dist/esm/shared/logging/redaction.js +140 -0
  294. package/dist/esm/shared/logging/secret-patterns.d.ts +227 -0
  295. package/dist/esm/shared/logging/secret-patterns.js +83 -0
  296. package/dist/esm/shared/logging/truncate.d.ts +197 -0
  297. package/dist/esm/shared/logging/truncate.js +25 -0
  298. package/dist/esm/shared/options.d.ts +100 -0
  299. package/dist/esm/shared/options.js +1 -0
  300. package/dist/esm/shared/ulid.d.ts +80 -0
  301. package/dist/esm/shared/ulid.js +77 -0
  302. package/dist/esm/shared/validation/collaborators.d.ts +160 -0
  303. package/dist/esm/shared/validation/collaborators.js +70 -0
  304. package/dist/esm/shared/validation/option-shape.d.ts +91 -0
  305. package/dist/esm/shared/validation/option-shape.js +24 -0
  306. package/dist/esm/shared/validation/options.d.ts +145 -0
  307. package/dist/esm/shared/validation/options.js +156 -0
  308. package/dist/esm/shared/validation/primitives.d.ts +292 -0
  309. package/dist/esm/shared/validation/primitives.js +100 -0
  310. package/dist/esm/shared/validation/ttl.d.ts +94 -0
  311. package/dist/esm/shared/validation/ttl.js +46 -0
  312. package/dist/esm/store/actions/list-namespaces.d.ts +79 -0
  313. package/dist/esm/store/actions/list-namespaces.js +86 -0
  314. package/dist/esm/store/actions/put.d.ts +43 -0
  315. package/dist/esm/store/actions/put.js +46 -0
  316. package/dist/esm/store/actions/reconcile-vector-index.d.ts +38 -0
  317. package/dist/esm/store/actions/reconcile-vector-index.js +10 -0
  318. package/dist/esm/store/actions/search.d.ts +38 -0
  319. package/dist/esm/store/actions/search.js +23 -0
  320. package/dist/esm/store/internal/batch-plan.d.ts +56 -0
  321. package/dist/esm/store/internal/batch-plan.js +28 -0
  322. package/dist/esm/store/internal/filter.d.ts +43 -0
  323. package/dist/esm/store/internal/filter.js +60 -0
  324. package/dist/esm/store/internal/get-item.d.ts +77 -0
  325. package/dist/esm/store/internal/get-item.js +54 -0
  326. package/dist/esm/store/internal/item-write.d.ts +270 -0
  327. package/dist/esm/store/internal/item-write.js +173 -0
  328. package/dist/esm/store/internal/parse.d.ts +230 -0
  329. package/dist/esm/store/internal/parse.js +169 -0
  330. package/dist/esm/store/internal/rows.d.ts +359 -0
  331. package/dist/esm/store/internal/rows.js +147 -0
  332. package/dist/esm/store/internal/semantic-search.d.ts +168 -0
  333. package/dist/esm/store/internal/semantic-search.js +200 -0
  334. package/dist/esm/store/internal/setup.d.ts +96 -0
  335. package/dist/esm/store/internal/setup.js +98 -0
  336. package/dist/esm/store/internal/table-search.d.ts +100 -0
  337. package/dist/esm/store/internal/table-search.js +119 -0
  338. package/dist/esm/store/internal/vector-index.d.ts +258 -0
  339. package/dist/esm/store/internal/vector-index.js +256 -0
  340. package/dist/esm/store/store.d.ts +329 -0
  341. package/dist/esm/store/store.js +93 -0
  342. package/dist/esm/store/types.d.ts +111 -0
  343. package/dist/esm/store/types.js +1 -0
  344. package/dist/esm/store/vector-backend.d.ts +104 -0
  345. package/dist/esm/store/vector-backend.js +1 -0
  346. package/package.json +68 -46
  347. package/dist/checkpointer/actions/delete-thread.d.ts +0 -10
  348. package/dist/checkpointer/actions/delete-thread.js +0 -38
  349. package/dist/checkpointer/actions/get-tuple.d.ts +0 -11
  350. package/dist/checkpointer/actions/get-tuple.js +0 -25
  351. package/dist/checkpointer/actions/list.d.ts +0 -20
  352. package/dist/checkpointer/actions/list.js +0 -113
  353. package/dist/checkpointer/actions/put-writes.d.ts +0 -15
  354. package/dist/checkpointer/actions/put-writes.js +0 -62
  355. package/dist/checkpointer/actions/put.d.ts +0 -17
  356. package/dist/checkpointer/actions/put.js +0 -73
  357. package/dist/checkpointer/internal/assemble.d.ts +0 -17
  358. package/dist/checkpointer/internal/assemble.js +0 -38
  359. package/dist/checkpointer/internal/checkpoint-write-verify.d.ts +0 -24
  360. package/dist/checkpointer/internal/checkpoint-write-verify.js +0 -67
  361. package/dist/checkpointer/internal/configurable.d.ts +0 -12
  362. package/dist/checkpointer/internal/configurable.js +0 -24
  363. package/dist/checkpointer/internal/fetch.d.ts +0 -19
  364. package/dist/checkpointer/internal/fetch.js +0 -88
  365. package/dist/checkpointer/internal/filter-match.d.ts +0 -13
  366. package/dist/checkpointer/internal/filter-match.js +0 -15
  367. package/dist/checkpointer/internal/item-reader.d.ts +0 -66
  368. package/dist/checkpointer/internal/item-reader.js +0 -113
  369. package/dist/checkpointer/internal/item-writer.d.ts +0 -35
  370. package/dist/checkpointer/internal/item-writer.js +0 -107
  371. package/dist/checkpointer/internal/keys.d.ts +0 -41
  372. package/dist/checkpointer/internal/keys.js +0 -117
  373. package/dist/checkpointer/internal/list-scope.d.ts +0 -61
  374. package/dist/checkpointer/internal/list-scope.js +0 -108
  375. package/dist/checkpointer/internal/pending-sends.d.ts +0 -13
  376. package/dist/checkpointer/internal/pending-sends.js +0 -29
  377. package/dist/checkpointer/internal/query.d.ts +0 -21
  378. package/dist/checkpointer/internal/query.js +0 -42
  379. package/dist/checkpointer/internal/regular-write.d.ts +0 -28
  380. package/dist/checkpointer/internal/regular-write.js +0 -66
  381. package/dist/checkpointer/internal/setup.d.ts +0 -33
  382. package/dist/checkpointer/internal/setup.js +0 -38
  383. package/dist/checkpointer/internal/special-write-cas.d.ts +0 -29
  384. package/dist/checkpointer/internal/special-write-cas.js +0 -104
  385. package/dist/checkpointer/internal/special-write-cleanup.d.ts +0 -23
  386. package/dist/checkpointer/internal/special-write-cleanup.js +0 -50
  387. package/dist/checkpointer/internal/special-write-verify.d.ts +0 -53
  388. package/dist/checkpointer/internal/special-write-verify.js +0 -80
  389. package/dist/checkpointer/internal/stored-channels.d.ts +0 -31
  390. package/dist/checkpointer/internal/stored-channels.js +0 -70
  391. package/dist/checkpointer/internal/validation.d.ts +0 -18
  392. package/dist/checkpointer/internal/validation.js +0 -40
  393. package/dist/checkpointer/internal/write-guard.d.ts +0 -20
  394. package/dist/checkpointer/internal/write-guard.js +0 -48
  395. package/dist/checkpointer/internal/write-index.d.ts +0 -36
  396. package/dist/checkpointer/internal/write-index.js +0 -41
  397. package/dist/checkpointer/saver.d.ts +0 -70
  398. package/dist/checkpointer/saver.js +0 -105
  399. package/dist/checkpointer/types.d.ts +0 -58
  400. package/dist/factory/factory.d.ts +0 -40
  401. package/dist/factory/factory.js +0 -87
  402. package/dist/history/actions/add-messages.d.ts +0 -15
  403. package/dist/history/actions/add-messages.js +0 -77
  404. package/dist/history/actions/clear.d.ts +0 -10
  405. package/dist/history/actions/clear.js +0 -34
  406. package/dist/history/actions/get-messages.d.ts +0 -17
  407. package/dist/history/actions/get-messages.js +0 -79
  408. package/dist/history/actions/list-sessions.d.ts +0 -13
  409. package/dist/history/actions/list-sessions.js +0 -53
  410. package/dist/history/actions/reconcile-count.d.ts +0 -12
  411. package/dist/history/actions/reconcile-count.js +0 -64
  412. package/dist/history/chat-message-history.d.ts +0 -73
  413. package/dist/history/chat-message-history.js +0 -111
  414. package/dist/history/internal/append-saga.d.ts +0 -25
  415. package/dist/history/internal/append-saga.js +0 -79
  416. package/dist/history/internal/compensation.d.ts +0 -25
  417. package/dist/history/internal/compensation.js +0 -92
  418. package/dist/history/internal/item-mapper.d.ts +0 -9
  419. package/dist/history/internal/item-mapper.js +0 -27
  420. package/dist/history/internal/keys.d.ts +0 -16
  421. package/dist/history/internal/keys.js +0 -48
  422. package/dist/history/internal/message-chunker.d.ts +0 -13
  423. package/dist/history/internal/message-chunker.js +0 -67
  424. package/dist/history/internal/message-transaction.d.ts +0 -25
  425. package/dist/history/internal/message-transaction.js +0 -61
  426. package/dist/history/internal/message-window.d.ts +0 -17
  427. package/dist/history/internal/message-window.js +0 -49
  428. package/dist/history/internal/query.d.ts +0 -23
  429. package/dist/history/internal/query.js +0 -39
  430. package/dist/history/internal/session-count.d.ts +0 -47
  431. package/dist/history/internal/session-count.js +0 -115
  432. package/dist/history/internal/session-title.d.ts +0 -19
  433. package/dist/history/internal/session-title.js +0 -43
  434. package/dist/history/internal/session-update.d.ts +0 -27
  435. package/dist/history/internal/session-update.js +0 -69
  436. package/dist/history/internal/setup.d.ts +0 -31
  437. package/dist/history/internal/setup.js +0 -43
  438. package/dist/history/internal/title-generator.d.ts +0 -12
  439. package/dist/history/internal/title-generator.js +0 -41
  440. package/dist/history/internal/ttl-anchor.d.ts +0 -24
  441. package/dist/history/internal/ttl-anchor.js +0 -38
  442. package/dist/history/internal/validation.d.ts +0 -25
  443. package/dist/history/internal/validation.js +0 -53
  444. package/dist/history/session-adapter.d.ts +0 -29
  445. package/dist/history/session-adapter.js +0 -35
  446. package/dist/history/types.d.ts +0 -69
  447. package/dist/index.d.ts +0 -29
  448. package/dist/index.js +0 -32
  449. package/dist/shared/clock.d.ts +0 -8
  450. package/dist/shared/clock.js +0 -16
  451. package/dist/shared/codec/codec.d.ts +0 -53
  452. package/dist/shared/codec/codec.js +0 -66
  453. package/dist/shared/codec/compression.d.ts +0 -24
  454. package/dist/shared/codec/compression.js +0 -48
  455. package/dist/shared/codec/descriptor-keys.d.ts +0 -12
  456. package/dist/shared/codec/descriptor-keys.js +0 -14
  457. package/dist/shared/codec/encode.d.ts +0 -13
  458. package/dist/shared/codec/encode.js +0 -43
  459. package/dist/shared/codec/json-serde.d.ts +0 -7
  460. package/dist/shared/codec/json-serde.js +0 -17
  461. package/dist/shared/codec/payload-loss.d.ts +0 -12
  462. package/dist/shared/codec/payload-loss.js +0 -38
  463. package/dist/shared/codec/s3/adapter-config.d.ts +0 -13
  464. package/dist/shared/codec/s3/adapter-config.js +0 -22
  465. package/dist/shared/codec/s3/bounded-body.d.ts +0 -14
  466. package/dist/shared/codec/s3/bounded-body.js +0 -47
  467. package/dist/shared/codec/s3/client.d.ts +0 -18
  468. package/dist/shared/codec/s3/client.js +0 -46
  469. package/dist/shared/codec/s3/config.d.ts +0 -51
  470. package/dist/shared/codec/s3/config.js +0 -58
  471. package/dist/shared/codec/s3/delete.d.ts +0 -7
  472. package/dist/shared/codec/s3/delete.js +0 -28
  473. package/dist/shared/codec/s3/key-scope.d.ts +0 -23
  474. package/dist/shared/codec/s3/key-scope.js +0 -44
  475. package/dist/shared/codec/s3/lifecycle.d.ts +0 -14
  476. package/dist/shared/codec/s3/lifecycle.js +0 -63
  477. package/dist/shared/codec/s3/offloader.d.ts +0 -44
  478. package/dist/shared/codec/s3/offloader.js +0 -118
  479. package/dist/shared/codec/s3/orphans.d.ts +0 -23
  480. package/dist/shared/codec/s3/orphans.js +0 -71
  481. package/dist/shared/codec/s3/read-write.d.ts +0 -18
  482. package/dist/shared/codec/s3/read-write.js +0 -51
  483. package/dist/shared/codec/s3/retry.d.ts +0 -5
  484. package/dist/shared/codec/s3/retry.js +0 -22
  485. package/dist/shared/concurrency.d.ts +0 -6
  486. package/dist/shared/constants.d.ts +0 -112
  487. package/dist/shared/constants.js +0 -115
  488. package/dist/shared/dynamodb/abort.d.ts +0 -9
  489. package/dist/shared/dynamodb/abort.js +0 -27
  490. package/dist/shared/dynamodb/backoff.d.ts +0 -15
  491. package/dist/shared/dynamodb/backoff.js +0 -48
  492. package/dist/shared/dynamodb/batch-write.d.ts +0 -22
  493. package/dist/shared/dynamodb/batch-write.js +0 -53
  494. package/dist/shared/dynamodb/cancellation.d.ts +0 -6
  495. package/dist/shared/dynamodb/cancellation.js +0 -7
  496. package/dist/shared/dynamodb/client.d.ts +0 -28
  497. package/dist/shared/dynamodb/conditional-put.d.ts +0 -67
  498. package/dist/shared/dynamodb/conditional-put.js +0 -76
  499. package/dist/shared/dynamodb/drain-unprocessed.d.ts +0 -21
  500. package/dist/shared/dynamodb/drain-unprocessed.js +0 -43
  501. package/dist/shared/dynamodb/expiry.d.ts +0 -16
  502. package/dist/shared/dynamodb/expiry.js +0 -29
  503. package/dist/shared/dynamodb/paginate-core.d.ts +0 -24
  504. package/dist/shared/dynamodb/paginate-core.js +0 -82
  505. package/dist/shared/dynamodb/paginate.d.ts +0 -14
  506. package/dist/shared/dynamodb/paginate.js +0 -19
  507. package/dist/shared/dynamodb/partition-delete.d.ts +0 -39
  508. package/dist/shared/dynamodb/partition-delete.js +0 -71
  509. package/dist/shared/dynamodb/retry-classifier.d.ts +0 -17
  510. package/dist/shared/dynamodb/retry-classifier.js +0 -118
  511. package/dist/shared/dynamodb/retry-policy.d.ts +0 -26
  512. package/dist/shared/dynamodb/retry-policy.js +0 -22
  513. package/dist/shared/dynamodb/retry.d.ts +0 -31
  514. package/dist/shared/dynamodb/retry.js +0 -57
  515. package/dist/shared/dynamodb/scan.d.ts +0 -14
  516. package/dist/shared/dynamodb/scan.js +0 -19
  517. package/dist/shared/dynamodb/types.d.ts +0 -23
  518. package/dist/shared/errors/base-error.d.ts +0 -30
  519. package/dist/shared/errors/base-error.js +0 -27
  520. package/dist/shared/errors/boundary.d.ts +0 -18
  521. package/dist/shared/errors/boundary.js +0 -46
  522. package/dist/shared/errors/error-code.d.ts +0 -13
  523. package/dist/shared/errors/errors.d.ts +0 -68
  524. package/dist/shared/errors/errors.js +0 -114
  525. package/dist/shared/errors/upstream-error.d.ts +0 -16
  526. package/dist/shared/errors/upstream-error.js +0 -27
  527. package/dist/shared/errors/wrap-error.d.ts +0 -7
  528. package/dist/shared/errors/wrap-error.js +0 -15
  529. package/dist/shared/logging/logger.d.ts +0 -18
  530. package/dist/shared/logging/logger.js +0 -15
  531. package/dist/shared/logging/redaction-walk.d.ts +0 -23
  532. package/dist/shared/logging/redaction-walk.js +0 -112
  533. package/dist/shared/logging/redaction.d.ts +0 -39
  534. package/dist/shared/logging/redaction.js +0 -75
  535. package/dist/shared/logging/secret-patterns.d.ts +0 -92
  536. package/dist/shared/logging/secret-patterns.js +0 -133
  537. package/dist/shared/options.d.ts +0 -37
  538. package/dist/shared/ulid.d.ts +0 -23
  539. package/dist/shared/validation/options.d.ts +0 -8
  540. package/dist/shared/validation/options.js +0 -90
  541. package/dist/shared/validation/primitives.d.ts +0 -29
  542. package/dist/shared/validation/primitives.js +0 -82
  543. package/dist/shared/validation/ttl.d.ts +0 -28
  544. package/dist/shared/validation/ttl.js +0 -52
  545. package/dist/store/actions/get.d.ts +0 -13
  546. package/dist/store/actions/get.js +0 -73
  547. package/dist/store/actions/list-namespaces.d.ts +0 -8
  548. package/dist/store/actions/list-namespaces.js +0 -59
  549. package/dist/store/actions/put.d.ts +0 -10
  550. package/dist/store/actions/put.js +0 -96
  551. package/dist/store/actions/reconcile-vector-index.d.ts +0 -18
  552. package/dist/store/actions/reconcile-vector-index.js +0 -26
  553. package/dist/store/actions/search.d.ts +0 -9
  554. package/dist/store/actions/search.js +0 -34
  555. package/dist/store/internal/backend-search.d.ts +0 -4
  556. package/dist/store/internal/backend-search.js +0 -74
  557. package/dist/store/internal/batch-plan.d.ts +0 -11
  558. package/dist/store/internal/batch-plan.js +0 -52
  559. package/dist/store/internal/candidates.d.ts +0 -23
  560. package/dist/store/internal/candidates.js +0 -94
  561. package/dist/store/internal/filter.d.ts +0 -9
  562. package/dist/store/internal/filter.js +0 -85
  563. package/dist/store/internal/index-reconcile.d.ts +0 -21
  564. package/dist/store/internal/index-reconcile.js +0 -118
  565. package/dist/store/internal/index-sync.d.ts +0 -10
  566. package/dist/store/internal/index-sync.js +0 -25
  567. package/dist/store/internal/item-mapper.d.ts +0 -27
  568. package/dist/store/internal/item-mapper.js +0 -61
  569. package/dist/store/internal/keys.d.ts +0 -17
  570. package/dist/store/internal/keys.js +0 -41
  571. package/dist/store/internal/namespace-match.d.ts +0 -11
  572. package/dist/store/internal/namespace-match.js +0 -40
  573. package/dist/store/internal/option-validation.d.ts +0 -13
  574. package/dist/store/internal/option-validation.js +0 -77
  575. package/dist/store/internal/overwrite-swap.d.ts +0 -32
  576. package/dist/store/internal/overwrite-swap.js +0 -68
  577. package/dist/store/internal/persist.d.ts +0 -28
  578. package/dist/store/internal/persist.js +0 -64
  579. package/dist/store/internal/query.d.ts +0 -11
  580. package/dist/store/internal/query.js +0 -48
  581. package/dist/store/internal/ranker.d.ts +0 -18
  582. package/dist/store/internal/ranker.js +0 -39
  583. package/dist/store/internal/read-existing.d.ts +0 -23
  584. package/dist/store/internal/read-existing.js +0 -41
  585. package/dist/store/internal/score-direction.d.ts +0 -31
  586. package/dist/store/internal/score-direction.js +0 -38
  587. package/dist/store/internal/search-filter.d.ts +0 -3
  588. package/dist/store/internal/search-filter.js +0 -10
  589. package/dist/store/internal/semantic-search.d.ts +0 -34
  590. package/dist/store/internal/semantic-search.js +0 -87
  591. package/dist/store/internal/setup.d.ts +0 -36
  592. package/dist/store/internal/setup.js +0 -40
  593. package/dist/store/internal/text-path.d.ts +0 -17
  594. package/dist/store/internal/validation.d.ts +0 -18
  595. package/dist/store/internal/validation.js +0 -51
  596. package/dist/store/internal/write-verify.d.ts +0 -42
  597. package/dist/store/internal/write-verify.js +0 -71
  598. package/dist/store/store.d.ts +0 -61
  599. package/dist/store/store.js +0 -107
  600. package/dist/store/types.d.ts +0 -50
  601. package/dist/store/types.js +0 -2
  602. package/dist/store/vector-backend.d.ts +0 -43
  603. package/dist/store/vector-backend.js +0 -2
  604. /package/dist/{checkpointer → cjs/checkpointer}/types.js +0 -0
  605. /package/dist/{factory → cjs/factory}/types.js +0 -0
  606. /package/dist/{history → cjs/history}/types.js +0 -0
  607. /package/dist/{shared → cjs/shared}/options.js +0 -0
  608. /package/dist/{shared/dynamodb → cjs/store}/types.js +0 -0
@@ -1,118 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.collectReconcileTargets = collectReconcileTargets;
4
- exports.pushEmbeddings = pushEmbeddings;
5
- exports.selectOrphans = selectOrphans;
6
- exports.pruneOrphans = pruneOrphans;
7
- const clock_1 = require("../../shared/clock");
8
- const expiry_1 = require("../../shared/dynamodb/expiry");
9
- const paginate_1 = require("../../shared/dynamodb/paginate");
10
- const retry_policy_1 = require("../../shared/dynamodb/retry-policy");
11
- const item_mapper_1 = require("./item-mapper");
12
- const keys_1 = require("./keys");
13
- const query_1 = require("./query");
14
- const semantic_search_1 = require("./semantic-search");
15
- const write_verify_1 = require("./write-verify");
16
- /** Stable, collision-free identity for a (namespace, key) pair. */
17
- function refIdentity(namespace, key) {
18
- return JSON.stringify([...namespace, key]);
19
- }
20
- /**
21
- * Enumerate the live (unexpired) items under `prefix`, then recompute their
22
- * embeddings in batches. A failed embedding rejects the whole reconcile: a
23
- * skipped item would leave the live set and {@link selectOrphans} would prune
24
- * its still-valid vector.
25
- */
26
- async function collectReconcileTargets(context, prefix, signal) {
27
- const now = (0, clock_1.nowSeconds)();
28
- const live = [];
29
- const source = (0, paginate_1.paginateQuery)({
30
- retry: (0, retry_policy_1.retryFor)(context, signal),
31
- signal,
32
- client: context.client,
33
- params: (0, expiry_1.withoutExpired)((0, query_1.scopedQuery)(context.tableName, prefix), now),
34
- maxItems: context.maxScanItems,
35
- });
36
- for await (const raw of source) {
37
- const record = (0, item_mapper_1.narrowStoreRecord)(raw);
38
- if (!record) {
39
- context.logger.warn('reconcileVectorIndex: skipped a row that is not a store item', {
40
- sortKey: raw.SK,
41
- });
42
- continue;
43
- }
44
- if ((0, expiry_1.isExpiredRow)(record, now) || !(0, keys_1.namespaceMatchesPrefix)(record.namespace, prefix))
45
- continue;
46
- const item = await (0, item_mapper_1.readStoreItem)(context, record);
47
- live.push({
48
- namespace: record.namespace,
49
- key: record.key,
50
- value: item.value,
51
- });
52
- }
53
- const embeddings = await (0, semantic_search_1.embedValues)(context, live.map((entry) => entry.value));
54
- return live.map((entry, i) => ({
55
- namespace: entry.namespace,
56
- key: entry.key,
57
- embedding: embeddings[i],
58
- }));
59
- }
60
- /** Re-push every live embedding to the backend; returns the upsert count. */
61
- async function pushEmbeddings(backend, targets) {
62
- let upserted = 0;
63
- for (const target of targets) {
64
- if (!target.embedding)
65
- continue;
66
- await backend.upsert(target.namespace, target.key, target.embedding);
67
- upserted += 1;
68
- }
69
- return upserted;
70
- }
71
- /** Refs present in the backend but absent from `live` — orphans to prune. */
72
- function selectOrphans(backendRefs, live) {
73
- const liveKeys = new Set(live
74
- .filter((target) => target.embedding !== undefined)
75
- .map((target) => refIdentity(target.namespace, target.key)));
76
- return backendRefs.filter((ref) => !liveKeys.has(refIdentity(ref.namespace, ref.key)));
77
- }
78
- /**
79
- * True when a candidate's canonical item is confirmed absent right now. The
80
- * live-set snapshot and this read are not one point in time, so an item
81
- * written between them looks orphaned even though it is live — and deleting
82
- * its vector would silently drop a just-written item out of semantic search.
83
- */
84
- async function confirmedGone(context, ref) {
85
- return (0, write_verify_1.rowIsAbsent)(context, {
86
- PK: (0, keys_1.partitionKey)(ref.namespace),
87
- SK: (0, keys_1.sortKey)(ref.namespace, ref.key),
88
- });
89
- }
90
- /** Delete backend vectors with no canonical item; returns the prune count. */
91
- async function pruneOrphans(context, backend, prefix, live) {
92
- if (!backend.listKeys) {
93
- context.logger.info('reconcileVectorIndex prune skipped: backend has no listKeys', { prefix });
94
- return 0;
95
- }
96
- const candidates = selectOrphans(await backend.listKeys(prefix), live);
97
- /**
98
- * Every item the snapshot actually saw, embedded or not. A candidate in here
99
- * is prunable on the evidence already gathered — its item exists but yields
100
- * no embedding (its indexable text became empty), so its vector really is
101
- * stale. Only a candidate the snapshot never saw at all is ambiguous.
102
- */
103
- const observed = new Set(live.map((target) => refIdentity(target.namespace, target.key)));
104
- let pruned = 0;
105
- for (const ref of candidates) {
106
- if (!observed.has(refIdentity(ref.namespace, ref.key)) &&
107
- !(await confirmedGone(context, ref))) {
108
- context.logger.info('reconcileVectorIndex: kept a vector whose item reappeared', {
109
- namespace: ref.namespace,
110
- key: ref.key,
111
- });
112
- continue;
113
- }
114
- await backend.delete(ref.namespace, ref.key);
115
- pruned += 1;
116
- }
117
- return pruned;
118
- }
@@ -1,10 +0,0 @@
1
- import type { Logger } from '../../shared/logging/logger';
2
- import type { VectorBackend } from '../vector-backend';
3
- /**
4
- * Best-effort sync of one item's embedding to the vector backend after the
5
- * canonical DynamoDB write has already succeeded. A present embedding upserts;
6
- * its absence deletes any stale vector. Failures are logged at `warn` and
7
- * swallowed — the canonical item stands and `reconcileVectorIndex` repairs any
8
- * drift — so a backend hiccup never fails an otherwise-successful put.
9
- */
10
- export declare function syncVectorIndex(backend: VectorBackend, namespace: string[], key: string, embedding: number[] | undefined, logger: Logger): Promise<void>;
@@ -1,25 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.syncVectorIndex = syncVectorIndex;
4
- /**
5
- * Best-effort sync of one item's embedding to the vector backend after the
6
- * canonical DynamoDB write has already succeeded. A present embedding upserts;
7
- * its absence deletes any stale vector. Failures are logged at `warn` and
8
- * swallowed — the canonical item stands and `reconcileVectorIndex` repairs any
9
- * drift — so a backend hiccup never fails an otherwise-successful put.
10
- */
11
- async function syncVectorIndex(backend, namespace, key, embedding, logger) {
12
- try {
13
- if (embedding)
14
- await backend.upsert(namespace, key, embedding);
15
- else
16
- await backend.delete(namespace, key);
17
- }
18
- catch (error) {
19
- logger.warn('store.put vector-index sync failed; reconcileVectorIndex will repair', {
20
- namespace,
21
- key,
22
- message: error.message,
23
- });
24
- }
25
- }
@@ -1,27 +0,0 @@
1
- import type { Item } from '@langchain/langgraph-checkpoint';
2
- import type { DocItem } from '../../shared/dynamodb/types';
3
- import type { StoreItemRecord } from '../types';
4
- import type { JsonValue } from './filter';
5
- import type { StoreContext } from './setup';
6
- /**
7
- * Narrow a raw scanned row to a {@link StoreItemRecord}, or `undefined` for a
8
- * foreign row on a shared table (no `namespace`) — and for a row whose
9
- * `namespace`/`key` attributes disagree with the DynamoDB key it was found at.
10
- * The attributes name the S3 path the row may reference, so they must be bound
11
- * to the partition the row actually lives in: a writer confined to its own
12
- * partition can then never make a row speak for another tenant's objects.
13
- */
14
- export declare function narrowStoreRecord(raw: DocItem): StoreItemRecord | undefined;
15
- /** Fields controlling a stored item's timestamps, embedding, ttl, and S3 key nonce. */
16
- export interface BuildItemOptions {
17
- createdAt: string;
18
- updatedAt: string;
19
- embedding?: number[];
20
- ttlTimestamp?: number;
21
- /** Per-call nonce: uniquifies the S3 key and becomes the row's revision token. */
22
- nonce?: string;
23
- }
24
- /** Encode a value into the DynamoDB record for a stored item. */
25
- export declare function buildStoreItem(context: StoreContext, namespace: string[], key: string, value: Record<string, JsonValue>, options: BuildItemOptions): Promise<StoreItemRecord>;
26
- /** Decode a DynamoDB record back into a store {@link Item}. */
27
- export declare function readStoreItem(context: StoreContext, record: StoreItemRecord): Promise<Item>;
@@ -1,61 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.narrowStoreRecord = narrowStoreRecord;
4
- exports.buildStoreItem = buildStoreItem;
5
- exports.readStoreItem = readStoreItem;
6
- const codec_1 = require("../../shared/codec/codec");
7
- const encode_1 = require("../../shared/codec/encode");
8
- const keys_1 = require("./keys");
9
- /**
10
- * Narrow a raw scanned row to a {@link StoreItemRecord}, or `undefined` for a
11
- * foreign row on a shared table (no `namespace`) — and for a row whose
12
- * `namespace`/`key` attributes disagree with the DynamoDB key it was found at.
13
- * The attributes name the S3 path the row may reference, so they must be bound
14
- * to the partition the row actually lives in: a writer confined to its own
15
- * partition can then never make a row speak for another tenant's objects.
16
- */
17
- function narrowStoreRecord(raw) {
18
- if (!Array.isArray(raw.namespace) || typeof raw.key !== 'string')
19
- return undefined;
20
- const record = raw;
21
- const consistent = record.PK === (0, keys_1.partitionKey)(record.namespace) &&
22
- record.SK === (0, keys_1.sortKey)(record.namespace, record.key);
23
- return consistent ? record : undefined;
24
- }
25
- /** Map a store context to the codec collaborators. */
26
- function storeCodecDeps(context) {
27
- return { serde: context.serde, compression: context.compression, offloader: context.offloader };
28
- }
29
- /** Encode a value into the DynamoDB record for a stored item. */
30
- async function buildStoreItem(context, namespace, key, value, options) {
31
- const descriptor = await (0, encode_1.encodePayload)(value, storeCodecDeps(context), {
32
- keyParts: options.nonce === undefined ? [...namespace, key] : [...namespace, key, options.nonce],
33
- });
34
- const record = {
35
- PK: (0, keys_1.partitionKey)(namespace),
36
- SK: (0, keys_1.sortKey)(namespace, key),
37
- namespace,
38
- key,
39
- value: descriptor,
40
- createdAt: options.createdAt,
41
- updatedAt: options.updatedAt,
42
- };
43
- if (options.embedding)
44
- record.embedding = options.embedding;
45
- if (options.ttlTimestamp !== undefined)
46
- record.ttl = options.ttlTimestamp;
47
- if (options.nonce !== undefined)
48
- record.rev = options.nonce;
49
- return record;
50
- }
51
- /** Decode a DynamoDB record back into a store {@link Item}. */
52
- async function readStoreItem(context, record) {
53
- const value = await (0, codec_1.decodePayload)(record.value, storeCodecDeps(context), [...record.namespace, record.key]);
54
- return {
55
- namespace: record.namespace,
56
- key: record.key,
57
- value,
58
- createdAt: new Date(record.createdAt),
59
- updatedAt: new Date(record.updatedAt),
60
- };
61
- }
@@ -1,17 +0,0 @@
1
- /** Separator joining namespace elements (and the trailing key) in the sort key. */
2
- export declare const NAMESPACE_SEPARATOR = "#";
3
- /** Partition key for an item: the adapter tag plus the scope-root element. */
4
- export declare function partitionKey(namespace: string[]): string;
5
- /** Sort key: the rest of the namespace plus the key, separator-joined. */
6
- export declare function sortKey(namespace: string[], key: string): string;
7
- /**
8
- * `begins_with` prefix selecting a scoped subtree within `prefix[0]`'s
9
- * partition. Terminated with the separator so `['users','u1']` does not match a
10
- * sibling like `u10`. An empty rest yields '' (matches the whole partition).
11
- */
12
- export declare function sortKeyPrefix(prefix: string[]): string;
13
- /**
14
- * True when `namespace` starts with `prefix`, compared element-by-element (not
15
- * as a string prefix, so ["userspace"] does not match prefix ["users"]).
16
- */
17
- export declare function namespaceMatchesPrefix(namespace: string[], prefix: string[]): boolean;
@@ -1,41 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.NAMESPACE_SEPARATOR = void 0;
4
- exports.partitionKey = partitionKey;
5
- exports.sortKey = sortKey;
6
- exports.sortKeyPrefix = sortKeyPrefix;
7
- exports.namespaceMatchesPrefix = namespaceMatchesPrefix;
8
- /** Separator joining namespace elements (and the trailing key) in the sort key. */
9
- exports.NAMESPACE_SEPARATOR = '#';
10
- /**
11
- * Adapter tag prefixed to every store partition key — see the equivalent in
12
- * checkpointer/internal/keys.ts for why the three adapters' partitions must
13
- * not overlap on a shared table.
14
- */
15
- const ADAPTER_PARTITION_PREFIX = `STORE${exports.NAMESPACE_SEPARATOR}`;
16
- /** Partition key for an item: the adapter tag plus the scope-root element. */
17
- function partitionKey(namespace) {
18
- return `${ADAPTER_PARTITION_PREFIX}${namespace[0]}`;
19
- }
20
- /** Sort key: the rest of the namespace plus the key, separator-joined. */
21
- function sortKey(namespace, key) {
22
- return [...namespace.slice(1), key].join(exports.NAMESPACE_SEPARATOR);
23
- }
24
- /**
25
- * `begins_with` prefix selecting a scoped subtree within `prefix[0]`'s
26
- * partition. Terminated with the separator so `['users','u1']` does not match a
27
- * sibling like `u10`. An empty rest yields '' (matches the whole partition).
28
- */
29
- function sortKeyPrefix(prefix) {
30
- const rest = prefix.slice(1);
31
- return rest.length === 0 ? '' : `${rest.join(exports.NAMESPACE_SEPARATOR)}${exports.NAMESPACE_SEPARATOR}`;
32
- }
33
- /**
34
- * True when `namespace` starts with `prefix`, compared element-by-element (not
35
- * as a string prefix, so ["userspace"] does not match prefix ["users"]).
36
- */
37
- function namespaceMatchesPrefix(namespace, prefix) {
38
- if (prefix.length > namespace.length)
39
- return false;
40
- return prefix.every((element, index) => namespace[index] === element);
41
- }
@@ -1,11 +0,0 @@
1
- import type { MatchCondition } from '@langchain/langgraph-checkpoint';
2
- /** True when `namespace` satisfies a prefix/suffix match condition (with `*`). */
3
- export declare function matchNamespace(namespace: string[], condition: MatchCondition): boolean;
4
- /** Cap a namespace to at most `maxDepth` elements (no-op when undefined). */
5
- export declare function truncateDepth(namespace: string[], maxDepth?: number): string[];
6
- /**
7
- * Leading concrete (non-wildcard) elements of the first prefix condition. An
8
- * empty result means the listing cannot be scoped to a single partition and
9
- * must fall back to a Scan.
10
- */
11
- export declare function prefixRoot(conditions?: MatchCondition[]): string[];
@@ -1,40 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.matchNamespace = matchNamespace;
4
- exports.truncateDepth = truncateDepth;
5
- exports.prefixRoot = prefixRoot;
6
- const WILDCARD = '*';
7
- function segmentMatches(actual, path) {
8
- return path.every((element, index) => element === WILDCARD || element === actual[index]);
9
- }
10
- /** True when `namespace` satisfies a prefix/suffix match condition (with `*`). */
11
- function matchNamespace(namespace, condition) {
12
- const { matchType, path } = condition;
13
- if (path.length > namespace.length)
14
- return false;
15
- const slice = matchType === 'prefix'
16
- ? namespace.slice(0, path.length)
17
- : namespace.slice(namespace.length - path.length);
18
- return segmentMatches(slice, path);
19
- }
20
- /** Cap a namespace to at most `maxDepth` elements (no-op when undefined). */
21
- function truncateDepth(namespace, maxDepth) {
22
- return maxDepth === undefined ? namespace : namespace.slice(0, maxDepth);
23
- }
24
- /**
25
- * Leading concrete (non-wildcard) elements of the first prefix condition. An
26
- * empty result means the listing cannot be scoped to a single partition and
27
- * must fall back to a Scan.
28
- */
29
- function prefixRoot(conditions) {
30
- const prefixCondition = conditions?.find((condition) => condition.matchType === 'prefix');
31
- if (!prefixCondition)
32
- return [];
33
- const root = [];
34
- for (const element of prefixCondition.path) {
35
- if (element === WILDCARD)
36
- break;
37
- root.push(element);
38
- }
39
- return root;
40
- }
@@ -1,13 +0,0 @@
1
- import type { DynamoDBStoreOptions } from '../types';
2
- /**
3
- * Validate every store option at construction, shared options first.
4
- *
5
- * A `vectorBackend` without an `index` is rejected outright rather than
6
- * silently degrading: with no embeddings configured, every `put` would compute
7
- * no vector and instruct the backend to *delete* the item's entry instead of
8
- * indexing it, and `search()` would fall through to an unranked scan-order
9
- * listing with no `.score` field and no error — a semantic query returning a
10
- * normal-looking but meaningless response. `reconcileVectorIndex` already
11
- * refused this exact misconfiguration.
12
- */
13
- export declare function validateStoreOptions(options: DynamoDBStoreOptions): void;
@@ -1,77 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.validateStoreOptions = validateStoreOptions;
4
- const errors_1 = require("../../shared/errors/errors");
5
- const options_1 = require("../../shared/validation/options");
6
- const primitives_1 = require("../../shared/validation/primitives");
7
- const score_direction_1 = require("./score-direction");
8
- /**
9
- * Reject an `index` that cannot actually embed. `IndexConfig` mandates
10
- * `embeddings`, but a JavaScript caller can omit it or pass the wrong shape,
11
- * and the failure then surfaced as a raw `TypeError` deep inside the first
12
- * `put()`/`search()` rather than this library's typed error at construction.
13
- *
14
- * Both methods are required: documents are embedded with `embedDocuments()`
15
- * on `put()` and queries with `embedQuery()` on `search()`. `dims` is only
16
- * compared against returned vectors when it is a positive integer, so a
17
- * configuration that omits it keeps working.
18
- */
19
- function assertUsableIndex(index) {
20
- if (!index)
21
- return;
22
- const embeddings = index.embeddings;
23
- const missing = ['embedQuery', 'embedDocuments'].find((method) => typeof embeddings?.[method] !== 'function');
24
- if (missing === undefined)
25
- return;
26
- throw new errors_1.ValidationError(`\`index.embeddings\` must be an Embeddings implementation exposing ${missing}(); ` +
27
- 'documents are embedded with embedDocuments() on put() and queries with embedQuery() ' +
28
- 'on search()', 'index');
29
- }
30
- /**
31
- * Reject a `vectorScoreDirection` outside the declared union.
32
- *
33
- * {@link toRelevanceScores} treats anything it does not recognise as a no-op —
34
- * the only safe default, since guessing would invert a ranking — so a mistyped
35
- * or config-file-sourced value would otherwise leave a distance backend ranked
36
- * backwards with no error and no warning anywhere. Same premise as
37
- * {@link assertUsableIndex}: a JavaScript caller can pass a string the type
38
- * never admits.
39
- */
40
- function assertScoreDirection(direction) {
41
- if (direction === undefined || score_direction_1.VECTOR_SCORE_DIRECTIONS.includes(direction))
42
- return;
43
- throw new errors_1.ValidationError(`vectorScoreDirection must be one of ${score_direction_1.VECTOR_SCORE_DIRECTIONS.join(' | ')}; received ` +
44
- `${JSON.stringify(direction)}, which would be left in the backend's own direction and ` +
45
- 'could rank a distance backend backwards', 'vectorScoreDirection');
46
- }
47
- /** Both in-memory caps must be positive integers; 0 would silently return nothing. */
48
- function validateLimits(options) {
49
- if (options.maxScanItems !== undefined) {
50
- (0, primitives_1.validateInteger)(options.maxScanItems, 'maxScanItems', { min: 1 });
51
- }
52
- if (options.maxSearchCandidates !== undefined) {
53
- (0, primitives_1.validateInteger)(options.maxSearchCandidates, 'maxSearchCandidates', { min: 1 });
54
- }
55
- }
56
- /**
57
- * Validate every store option at construction, shared options first.
58
- *
59
- * A `vectorBackend` without an `index` is rejected outright rather than
60
- * silently degrading: with no embeddings configured, every `put` would compute
61
- * no vector and instruct the backend to *delete* the item's entry instead of
62
- * indexing it, and `search()` would fall through to an unranked scan-order
63
- * listing with no `.score` field and no error — a semantic query returning a
64
- * normal-looking but meaningless response. `reconcileVectorIndex` already
65
- * refused this exact misconfiguration.
66
- */
67
- function validateStoreOptions(options) {
68
- (0, options_1.validateBaseAdapterOptions)(options);
69
- validateLimits(options);
70
- if (options.vectorBackend && !options.index) {
71
- throw new errors_1.ValidationError('vectorBackend requires a configured `index` (embeddings); without one no embedding ' +
72
- 'is computed, every put would clear the item vector, and search would silently return ' +
73
- 'unranked, score-less results', 'vectorBackend');
74
- }
75
- assertUsableIndex(options.index);
76
- assertScoreDirection(options.vectorScoreDirection);
77
- }
@@ -1,32 +0,0 @@
1
- import type { StoreItemRecord } from '../types';
2
- import { type ExistingRecordMeta } from './read-existing';
3
- import type { StoreContext } from './setup';
4
- /**
5
- * Commit `record`, re-reading and retrying while another writer holds the row,
6
- * and return the state this write actually superseded — the only descriptor
7
- * safe to delete afterwards.
8
- *
9
- * Without the swap both racers read the same previous descriptor, both commit,
10
- * and both delete it, orphaning the loser's own upload. Retrying against the
11
- * *re-read* state is what makes each writer supersede exactly one payload.
12
- *
13
- * A rejection is not proof a competitor won: `withDynamoDBRetry` retries
14
- * transient errors, so an attempt can commit server-side, its response can be
15
- * lost, and the retried put can hit the row it just wrote and fail the same
16
- * guard — indistinguishable from a competitor's win by the rejection alone.
17
- * Each attempt's pinned observation is captured in `attempted` before the
18
- * put, so that when a re-read finds the row already holding *this call's
19
- * own* `rev`, the swap returns whatever `attempted` held — never this
20
- * record's own just-committed value, which would strand the live row
21
- * pointing at a deleted object. That comparison is guarded on `rev` being
22
- * set: `rev` is optional on the record type, and an unnonced record against a
23
- * pre-0.9.0 revision-less row would otherwise match `undefined === undefined`
24
- * and claim a race it never entered.
25
- *
26
- * On exhaustion the write proceeds unconditionally and warns. That is
27
- * deliberate: the fallback is precisely the pre-0.9.0 behaviour — one possible
28
- * orphan, reclaimed by a lifecycle rule — so pathological contention degrades
29
- * instead of turning a working put into an error. `createdAt` is refreshed from
30
- * each re-read so a row created by whoever won keeps its true creation time.
31
- */
32
- export declare function putWithRevisionSwap(context: StoreContext, record: StoreItemRecord, existing: ExistingRecordMeta): Promise<ExistingRecordMeta>;
@@ -1,68 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.putWithRevisionSwap = putWithRevisionSwap;
4
- const conditional_put_1 = require("../../shared/dynamodb/conditional-put");
5
- const retry_1 = require("../../shared/dynamodb/retry");
6
- const read_existing_1 = require("./read-existing");
7
- /** Put the record, optionally pinned to the revision the caller observed. */
8
- async function put(context, record, observed) {
9
- const guard = observed ? (0, conditional_put_1.revisionGuard)(conditional_put_1.REVISION_ATTRIBUTE, observed) : {};
10
- await (0, retry_1.withDynamoDBRetry)(() => context.client.put({ TableName: context.tableName, Item: record, ...guard }), context.retry);
11
- }
12
- /**
13
- * Commit `record`, re-reading and retrying while another writer holds the row,
14
- * and return the state this write actually superseded — the only descriptor
15
- * safe to delete afterwards.
16
- *
17
- * Without the swap both racers read the same previous descriptor, both commit,
18
- * and both delete it, orphaning the loser's own upload. Retrying against the
19
- * *re-read* state is what makes each writer supersede exactly one payload.
20
- *
21
- * A rejection is not proof a competitor won: `withDynamoDBRetry` retries
22
- * transient errors, so an attempt can commit server-side, its response can be
23
- * lost, and the retried put can hit the row it just wrote and fail the same
24
- * guard — indistinguishable from a competitor's win by the rejection alone.
25
- * Each attempt's pinned observation is captured in `attempted` before the
26
- * put, so that when a re-read finds the row already holding *this call's
27
- * own* `rev`, the swap returns whatever `attempted` held — never this
28
- * record's own just-committed value, which would strand the live row
29
- * pointing at a deleted object. That comparison is guarded on `rev` being
30
- * set: `rev` is optional on the record type, and an unnonced record against a
31
- * pre-0.9.0 revision-less row would otherwise match `undefined === undefined`
32
- * and claim a race it never entered.
33
- *
34
- * On exhaustion the write proceeds unconditionally and warns. That is
35
- * deliberate: the fallback is precisely the pre-0.9.0 behaviour — one possible
36
- * orphan, reclaimed by a lifecycle rule — so pathological contention degrades
37
- * instead of turning a working put into an error. `createdAt` is refreshed from
38
- * each re-read so a row created by whoever won keeps its true creation time.
39
- */
40
- async function putWithRevisionSwap(context, record, existing) {
41
- let observed = existing;
42
- for (let attempt = 1; attempt <= conditional_put_1.OVERWRITE_CAS_MAX_ATTEMPTS; attempt++) {
43
- const attempted = observed;
44
- try {
45
- await put(context, record, attempted);
46
- return attempted;
47
- }
48
- catch (error) {
49
- if (!(0, conditional_put_1.isConditionalCheckFailed)(error))
50
- throw error;
51
- /** The rejection carries the row that turned it away; the read is spent only when it does not. */
52
- const rejected = (0, conditional_put_1.rejectedItem)(error);
53
- observed = rejected
54
- ? (0, read_existing_1.existingFrom)(rejected)
55
- : await (0, read_existing_1.readExisting)(context, record.PK, record.SK);
56
- if (record.rev !== undefined && observed.revision === record.rev)
57
- return attempted;
58
- /** A row that vanished between attempts (a concurrent delete) makes this a fresh creation. */
59
- record.createdAt = observed.exists
60
- ? (observed.createdAt ?? record.createdAt)
61
- : record.updatedAt;
62
- }
63
- }
64
- context.logger.warn('store.put: compare-and-swap exhausted; overwriting unconditionally, which can orphan one ' +
65
- 'S3 object under a concurrent put (reclaimed by ensureS3LifecycleRule)', { namespace: record.namespace, key: record.key, attempts: conditional_put_1.OVERWRITE_CAS_MAX_ATTEMPTS });
66
- await put(context, record);
67
- return observed;
68
- }
@@ -1,28 +0,0 @@
1
- import type { StoreItemRecord } from '../types';
2
- import type { ExistingRecordMeta } from './read-existing';
3
- import type { StoreContext } from './setup';
4
- /**
5
- * Put the record and clean up whichever side is now dead.
6
- *
7
- * The compare-and-swap path runs **only when an offloader is configured**:
8
- * without one there is no S3 object to orphan, so a plain last-write-wins put
9
- * stays correct and costs no extra write capacity (DynamoDB charges for a
10
- * failed conditional write too). With one, the swap is what lets this call
11
- * delete exactly the payload it superseded rather than a descriptor a racer may
12
- * already have replaced.
13
- *
14
- * Every failure reaching the catch arrives after at least one put was issued —
15
- * `putWithRevisionSwap` only re-reads from inside its own catch — so none of
16
- * them proves a non-commit on its own: a put can commit server-side and lose
17
- * its response, and a `ConditionalCheckFailedException` is as consistent with
18
- * hitting the row this call just wrote as with a competitor's win. The row is
19
- * therefore read back (`verifyWriteLanded`) before anything is deleted. Only a
20
- * confirmed `'not-landed'` deletes this record's own nonced object; a confirmed
21
- * `'landed'` cleans up the previous object like the success path and swallows
22
- * the error, and an `'unverified'` read deletes nothing and rethrows — leaking
23
- * one object at worst rather than stranding a live row pointing at a deleted
24
- * one. The verification compares the per-call `rev`, so an inline record is
25
- * verified too: a lost acknowledgement of an inline overwrite used to be
26
- * reported as a failure while the previous offloaded object was never cleaned.
27
- */
28
- export declare function persistRecord(context: StoreContext, record: StoreItemRecord, existing: ExistingRecordMeta): Promise<void>;
@@ -1,64 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.persistRecord = persistRecord;
4
- const descriptor_keys_1 = require("../../shared/codec/descriptor-keys");
5
- const orphans_1 = require("../../shared/codec/s3/orphans");
6
- const retry_1 = require("../../shared/dynamodb/retry");
7
- const overwrite_swap_1 = require("./overwrite-swap");
8
- const write_verify_1 = require("./write-verify");
9
- /**
10
- * Best-effort delete of one descriptor's S3 object. `scope` is passed for a
11
- * descriptor read back from the row (the superseded value) and omitted for
12
- * this call's own upload.
13
- */
14
- async function cleanUp(context, descriptor, label, scope) {
15
- if (!context.offloader || !descriptor)
16
- return;
17
- await (0, orphans_1.cleanUpS3Orphans)(context.offloader, (0, descriptor_keys_1.collectS3Keys)([descriptor]), label, context.logger, scope === undefined ? {} : { scope });
18
- }
19
- /**
20
- * Put the record and clean up whichever side is now dead.
21
- *
22
- * The compare-and-swap path runs **only when an offloader is configured**:
23
- * without one there is no S3 object to orphan, so a plain last-write-wins put
24
- * stays correct and costs no extra write capacity (DynamoDB charges for a
25
- * failed conditional write too). With one, the swap is what lets this call
26
- * delete exactly the payload it superseded rather than a descriptor a racer may
27
- * already have replaced.
28
- *
29
- * Every failure reaching the catch arrives after at least one put was issued —
30
- * `putWithRevisionSwap` only re-reads from inside its own catch — so none of
31
- * them proves a non-commit on its own: a put can commit server-side and lose
32
- * its response, and a `ConditionalCheckFailedException` is as consistent with
33
- * hitting the row this call just wrote as with a competitor's win. The row is
34
- * therefore read back (`verifyWriteLanded`) before anything is deleted. Only a
35
- * confirmed `'not-landed'` deletes this record's own nonced object; a confirmed
36
- * `'landed'` cleans up the previous object like the success path and swallows
37
- * the error, and an `'unverified'` read deletes nothing and rethrows — leaking
38
- * one object at worst rather than stranding a live row pointing at a deleted
39
- * one. The verification compares the per-call `rev`, so an inline record is
40
- * verified too: a lost acknowledgement of an inline overwrite used to be
41
- * reported as a failure while the previous offloaded object was never cleaned.
42
- */
43
- async function persistRecord(context, record, existing) {
44
- let superseded = existing;
45
- try {
46
- if (context.offloader) {
47
- superseded = await (0, overwrite_swap_1.putWithRevisionSwap)(context, record, existing);
48
- }
49
- else {
50
- await (0, retry_1.withDynamoDBRetry)(() => context.client.put({ TableName: context.tableName, Item: record }), context.retry);
51
- }
52
- }
53
- catch (error) {
54
- const verdict = await (0, write_verify_1.verifyWriteLanded)(context, record);
55
- if (verdict === 'not-landed')
56
- await cleanUp(context, record.value, 'store.put');
57
- if (verdict !== 'landed')
58
- throw error;
59
- }
60
- await cleanUp(context, superseded.value, 'store.put.overwrite', [
61
- ...record.namespace,
62
- record.key,
63
- ]);
64
- }