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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (608) hide show
  1. package/README.md +1820 -290
  2. package/dist/cjs/backfill/backfill.d.ts +171 -0
  3. package/dist/cjs/backfill/backfill.js +177 -0
  4. package/dist/cjs/checkpointer/actions/delete-thread.d.ts +50 -0
  5. package/dist/cjs/checkpointer/actions/delete-thread.js +26 -0
  6. package/dist/cjs/checkpointer/actions/get-tuple.d.ts +36 -0
  7. package/dist/cjs/checkpointer/actions/get-tuple.js +22 -0
  8. package/dist/cjs/checkpointer/actions/list.d.ts +55 -0
  9. package/dist/cjs/checkpointer/actions/list.js +70 -0
  10. package/dist/cjs/checkpointer/actions/put-writes.d.ts +49 -0
  11. package/dist/cjs/checkpointer/actions/put-writes.js +21 -0
  12. package/dist/cjs/checkpointer/actions/put.d.ts +95 -0
  13. package/dist/cjs/checkpointer/actions/put.js +79 -0
  14. package/dist/cjs/checkpointer/internal/delta-history.d.ts +124 -0
  15. package/dist/cjs/checkpointer/internal/delta-history.js +131 -0
  16. package/dist/cjs/checkpointer/internal/listing.d.ts +149 -0
  17. package/dist/cjs/checkpointer/internal/listing.js +104 -0
  18. package/dist/cjs/checkpointer/internal/parse.d.ts +298 -0
  19. package/dist/cjs/checkpointer/internal/parse.js +184 -0
  20. package/dist/cjs/checkpointer/internal/pending-writes.d.ts +314 -0
  21. package/dist/cjs/checkpointer/internal/pending-writes.js +241 -0
  22. package/dist/cjs/checkpointer/internal/read.d.ts +135 -0
  23. package/dist/cjs/checkpointer/internal/read.js +132 -0
  24. package/dist/cjs/checkpointer/internal/rows.d.ts +644 -0
  25. package/dist/cjs/checkpointer/internal/rows.js +356 -0
  26. package/dist/cjs/checkpointer/internal/setup.d.ts +47 -0
  27. package/dist/cjs/checkpointer/internal/setup.js +25 -0
  28. package/dist/cjs/checkpointer/saver.d.ts +306 -0
  29. package/dist/cjs/checkpointer/saver.js +56 -0
  30. package/dist/cjs/checkpointer/types.d.ts +51 -0
  31. package/dist/cjs/factory/factory.d.ts +154 -0
  32. package/dist/cjs/factory/factory.js +137 -0
  33. package/dist/{factory → cjs/factory}/types.d.ts +33 -14
  34. package/dist/cjs/history/actions/add-messages.d.ts +51 -0
  35. package/dist/cjs/history/actions/add-messages.js +17 -0
  36. package/dist/cjs/history/actions/clear.d.ts +52 -0
  37. package/dist/cjs/history/actions/clear.js +29 -0
  38. package/dist/cjs/history/actions/get-messages.d.ts +60 -0
  39. package/dist/cjs/history/actions/get-messages.js +58 -0
  40. package/dist/cjs/history/actions/list-sessions.d.ts +55 -0
  41. package/dist/cjs/history/actions/list-sessions.js +67 -0
  42. package/dist/cjs/history/actions/reconcile-count.d.ts +49 -0
  43. package/dist/cjs/history/actions/reconcile-count.js +8 -0
  44. package/dist/cjs/history/chat-message-history.d.ts +267 -0
  45. package/dist/cjs/history/chat-message-history.js +61 -0
  46. package/dist/cjs/history/internal/append.d.ts +244 -0
  47. package/dist/cjs/history/internal/append.js +267 -0
  48. package/dist/cjs/history/internal/message-read.d.ts +84 -0
  49. package/dist/cjs/history/internal/message-read.js +93 -0
  50. package/dist/cjs/history/internal/parse.d.ts +153 -0
  51. package/dist/cjs/history/internal/parse.js +113 -0
  52. package/dist/cjs/history/internal/rows.d.ts +196 -0
  53. package/dist/cjs/history/internal/rows.js +96 -0
  54. package/dist/cjs/history/internal/session.d.ts +350 -0
  55. package/dist/cjs/history/internal/session.js +296 -0
  56. package/dist/cjs/history/internal/setup.d.ts +64 -0
  57. package/dist/cjs/history/internal/setup.js +60 -0
  58. package/dist/cjs/history/session-adapter.d.ts +112 -0
  59. package/dist/cjs/history/session-adapter.js +38 -0
  60. package/dist/cjs/history/types.d.ts +102 -0
  61. package/dist/cjs/index.d.ts +53 -0
  62. package/dist/cjs/index.js +25 -0
  63. package/dist/cjs/package.json +1 -0
  64. package/dist/cjs/shared/adapter.d.ts +146 -0
  65. package/dist/cjs/shared/adapter.js +70 -0
  66. package/dist/cjs/shared/clock.d.ts +52 -0
  67. package/dist/cjs/shared/clock.js +14 -0
  68. package/dist/cjs/shared/codec/codec.d.ts +336 -0
  69. package/dist/cjs/shared/codec/codec.js +162 -0
  70. package/dist/cjs/shared/codec/compression.d.ts +66 -0
  71. package/dist/cjs/shared/codec/compression.js +45 -0
  72. package/dist/cjs/shared/codec/json-serde.d.ts +80 -0
  73. package/dist/cjs/shared/codec/json-serde.js +58 -0
  74. package/dist/{shared → cjs/shared}/codec/s3/client-types.d.ts +22 -2
  75. package/dist/{shared → cjs/shared}/codec/s3/client-types.js +0 -1
  76. package/dist/cjs/shared/codec/s3/client.d.ts +63 -0
  77. package/dist/cjs/shared/codec/s3/client.js +78 -0
  78. package/dist/cjs/shared/codec/s3/config.d.ts +260 -0
  79. package/dist/cjs/shared/codec/s3/config.js +92 -0
  80. package/dist/cjs/shared/codec/s3/lifecycle.d.ts +220 -0
  81. package/dist/cjs/shared/codec/s3/lifecycle.js +223 -0
  82. package/dist/cjs/shared/codec/s3/offloader.d.ts +428 -0
  83. package/dist/cjs/shared/codec/s3/offloader.js +289 -0
  84. package/dist/cjs/shared/concurrency.d.ts +43 -0
  85. package/dist/{shared → cjs/shared}/concurrency.js +10 -9
  86. package/dist/cjs/shared/dynamodb/abort.d.ts +47 -0
  87. package/dist/cjs/shared/dynamodb/abort.js +16 -0
  88. package/dist/cjs/shared/dynamodb/batch-write.d.ts +86 -0
  89. package/dist/cjs/shared/dynamodb/batch-write.js +79 -0
  90. package/dist/cjs/shared/dynamodb/cancellation.d.ts +124 -0
  91. package/dist/cjs/shared/dynamodb/cancellation.js +37 -0
  92. package/dist/cjs/shared/dynamodb/client.d.ts +177 -0
  93. package/dist/{shared → cjs/shared}/dynamodb/client.js +12 -14
  94. package/dist/cjs/shared/dynamodb/idempotent-write.d.ts +596 -0
  95. package/dist/cjs/shared/dynamodb/idempotent-write.js +173 -0
  96. package/dist/cjs/shared/dynamodb/paginate.d.ts +111 -0
  97. package/dist/cjs/shared/dynamodb/paginate.js +90 -0
  98. package/dist/cjs/shared/dynamodb/partition-delete.d.ts +204 -0
  99. package/dist/cjs/shared/dynamodb/partition-delete.js +177 -0
  100. package/dist/cjs/shared/dynamodb/recency-index.d.ts +243 -0
  101. package/dist/cjs/shared/dynamodb/recency-index.js +146 -0
  102. package/dist/cjs/shared/dynamodb/retry.d.ts +317 -0
  103. package/dist/cjs/shared/dynamodb/retry.js +193 -0
  104. package/dist/cjs/shared/dynamodb/row-size.d.ts +33 -0
  105. package/dist/cjs/shared/dynamodb/row-size.js +30 -0
  106. package/dist/cjs/shared/dynamodb/table-schema.d.ts +199 -0
  107. package/dist/cjs/shared/dynamodb/table-schema.js +52 -0
  108. package/dist/cjs/shared/errors/base-error.d.ts +231 -0
  109. package/dist/cjs/shared/errors/base-error.js +73 -0
  110. package/dist/cjs/shared/errors/boundary.d.ts +86 -0
  111. package/dist/cjs/shared/errors/boundary.js +61 -0
  112. package/dist/cjs/shared/errors/classify.d.ts +206 -0
  113. package/dist/cjs/shared/errors/classify.js +232 -0
  114. package/dist/cjs/shared/errors/error-code.d.ts +95 -0
  115. package/dist/{shared → cjs/shared}/errors/error-code.js +12 -2
  116. package/dist/cjs/shared/errors/errors.d.ts +233 -0
  117. package/dist/cjs/shared/errors/errors.js +123 -0
  118. package/dist/cjs/shared/logging/logger.d.ts +80 -0
  119. package/dist/cjs/shared/logging/logger.js +30 -0
  120. package/dist/cjs/shared/logging/redaction.d.ts +123 -0
  121. package/dist/cjs/shared/logging/redaction.js +145 -0
  122. package/dist/cjs/shared/logging/secret-patterns.d.ts +227 -0
  123. package/dist/cjs/shared/logging/secret-patterns.js +93 -0
  124. package/dist/cjs/shared/logging/truncate.d.ts +197 -0
  125. package/dist/cjs/shared/logging/truncate.js +31 -0
  126. package/dist/cjs/shared/options.d.ts +100 -0
  127. package/dist/cjs/shared/ulid.d.ts +80 -0
  128. package/dist/{shared → cjs/shared}/ulid.js +7 -21
  129. package/dist/cjs/shared/validation/collaborators.d.ts +160 -0
  130. package/dist/cjs/shared/validation/collaborators.js +79 -0
  131. package/dist/cjs/shared/validation/option-shape.d.ts +91 -0
  132. package/dist/cjs/shared/validation/option-shape.js +31 -0
  133. package/dist/cjs/shared/validation/options.d.ts +145 -0
  134. package/dist/cjs/shared/validation/options.js +166 -0
  135. package/dist/cjs/shared/validation/primitives.d.ts +292 -0
  136. package/dist/cjs/shared/validation/primitives.js +114 -0
  137. package/dist/cjs/shared/validation/ttl.d.ts +94 -0
  138. package/dist/cjs/shared/validation/ttl.js +52 -0
  139. package/dist/cjs/store/actions/list-namespaces.d.ts +79 -0
  140. package/dist/cjs/store/actions/list-namespaces.js +92 -0
  141. package/dist/cjs/store/actions/put.d.ts +43 -0
  142. package/dist/cjs/store/actions/put.js +49 -0
  143. package/dist/cjs/store/actions/reconcile-vector-index.d.ts +38 -0
  144. package/dist/cjs/store/actions/reconcile-vector-index.js +13 -0
  145. package/dist/cjs/store/actions/search.d.ts +38 -0
  146. package/dist/cjs/store/actions/search.js +26 -0
  147. package/dist/cjs/store/internal/batch-plan.d.ts +56 -0
  148. package/dist/cjs/store/internal/batch-plan.js +32 -0
  149. package/dist/cjs/store/internal/filter.d.ts +43 -0
  150. package/dist/cjs/store/internal/filter.js +64 -0
  151. package/dist/cjs/store/internal/get-item.d.ts +77 -0
  152. package/dist/cjs/store/internal/get-item.js +58 -0
  153. package/dist/cjs/store/internal/item-write.d.ts +270 -0
  154. package/dist/cjs/store/internal/item-write.js +181 -0
  155. package/dist/cjs/store/internal/parse.d.ts +230 -0
  156. package/dist/cjs/store/internal/parse.js +180 -0
  157. package/dist/cjs/store/internal/rows.d.ts +359 -0
  158. package/dist/cjs/store/internal/rows.js +166 -0
  159. package/dist/cjs/store/internal/semantic-search.d.ts +168 -0
  160. package/dist/{store/internal/text-path.js → cjs/store/internal/semantic-search.js} +92 -28
  161. package/dist/cjs/store/internal/setup.d.ts +96 -0
  162. package/dist/cjs/store/internal/setup.js +103 -0
  163. package/dist/cjs/store/internal/table-search.d.ts +100 -0
  164. package/dist/cjs/store/internal/table-search.js +123 -0
  165. package/dist/cjs/store/internal/vector-index.d.ts +258 -0
  166. package/dist/cjs/store/internal/vector-index.js +269 -0
  167. package/dist/cjs/store/store.d.ts +329 -0
  168. package/dist/cjs/store/store.js +97 -0
  169. package/dist/cjs/store/types.d.ts +111 -0
  170. package/dist/cjs/store/vector-backend.d.ts +104 -0
  171. package/dist/cjs/store/vector-backend.js +4 -0
  172. package/dist/esm/backfill/backfill.d.ts +171 -0
  173. package/dist/esm/backfill/backfill.js +170 -0
  174. package/dist/esm/checkpointer/actions/delete-thread.d.ts +50 -0
  175. package/dist/esm/checkpointer/actions/delete-thread.js +23 -0
  176. package/dist/esm/checkpointer/actions/get-tuple.d.ts +36 -0
  177. package/dist/esm/checkpointer/actions/get-tuple.js +19 -0
  178. package/dist/esm/checkpointer/actions/list.d.ts +55 -0
  179. package/dist/esm/checkpointer/actions/list.js +67 -0
  180. package/dist/esm/checkpointer/actions/put-writes.d.ts +49 -0
  181. package/dist/esm/checkpointer/actions/put-writes.js +18 -0
  182. package/dist/esm/checkpointer/actions/put.d.ts +95 -0
  183. package/dist/esm/checkpointer/actions/put.js +75 -0
  184. package/dist/esm/checkpointer/internal/delta-history.d.ts +124 -0
  185. package/dist/esm/checkpointer/internal/delta-history.js +126 -0
  186. package/dist/esm/checkpointer/internal/listing.d.ts +149 -0
  187. package/dist/esm/checkpointer/internal/listing.js +95 -0
  188. package/dist/esm/checkpointer/internal/parse.d.ts +298 -0
  189. package/dist/esm/checkpointer/internal/parse.js +169 -0
  190. package/dist/esm/checkpointer/internal/pending-writes.d.ts +314 -0
  191. package/dist/esm/checkpointer/internal/pending-writes.js +229 -0
  192. package/dist/esm/checkpointer/internal/read.d.ts +135 -0
  193. package/dist/esm/checkpointer/internal/read.js +125 -0
  194. package/dist/esm/checkpointer/internal/rows.d.ts +644 -0
  195. package/dist/esm/checkpointer/internal/rows.js +323 -0
  196. package/dist/esm/checkpointer/internal/setup.d.ts +47 -0
  197. package/dist/esm/checkpointer/internal/setup.js +21 -0
  198. package/dist/esm/checkpointer/saver.d.ts +306 -0
  199. package/dist/esm/checkpointer/saver.js +52 -0
  200. package/dist/esm/checkpointer/types.d.ts +51 -0
  201. package/dist/esm/checkpointer/types.js +1 -0
  202. package/dist/esm/factory/factory.d.ts +154 -0
  203. package/dist/esm/factory/factory.js +133 -0
  204. package/dist/esm/factory/types.d.ts +76 -0
  205. package/dist/esm/factory/types.js +1 -0
  206. package/dist/esm/history/actions/add-messages.d.ts +51 -0
  207. package/dist/esm/history/actions/add-messages.js +14 -0
  208. package/dist/esm/history/actions/clear.d.ts +52 -0
  209. package/dist/esm/history/actions/clear.js +26 -0
  210. package/dist/esm/history/actions/get-messages.d.ts +60 -0
  211. package/dist/esm/history/actions/get-messages.js +55 -0
  212. package/dist/esm/history/actions/list-sessions.d.ts +55 -0
  213. package/dist/esm/history/actions/list-sessions.js +64 -0
  214. package/dist/esm/history/actions/reconcile-count.d.ts +49 -0
  215. package/dist/esm/history/actions/reconcile-count.js +5 -0
  216. package/dist/esm/history/chat-message-history.d.ts +267 -0
  217. package/dist/esm/history/chat-message-history.js +57 -0
  218. package/dist/esm/history/internal/append.d.ts +244 -0
  219. package/dist/esm/history/internal/append.js +259 -0
  220. package/dist/esm/history/internal/message-read.d.ts +84 -0
  221. package/dist/esm/history/internal/message-read.js +89 -0
  222. package/dist/esm/history/internal/parse.d.ts +153 -0
  223. package/dist/esm/history/internal/parse.js +105 -0
  224. package/dist/esm/history/internal/rows.d.ts +196 -0
  225. package/dist/esm/history/internal/rows.js +83 -0
  226. package/dist/esm/history/internal/session.d.ts +350 -0
  227. package/dist/esm/history/internal/session.js +285 -0
  228. package/dist/esm/history/internal/setup.d.ts +64 -0
  229. package/dist/esm/history/internal/setup.js +56 -0
  230. package/dist/esm/history/session-adapter.d.ts +112 -0
  231. package/dist/esm/history/session-adapter.js +34 -0
  232. package/dist/esm/history/types.d.ts +102 -0
  233. package/dist/esm/history/types.js +1 -0
  234. package/dist/esm/index.d.ts +53 -0
  235. package/dist/esm/index.js +10 -0
  236. package/dist/esm/shared/adapter.d.ts +146 -0
  237. package/dist/esm/shared/adapter.js +65 -0
  238. package/dist/esm/shared/clock.d.ts +52 -0
  239. package/dist/esm/shared/clock.js +9 -0
  240. package/dist/esm/shared/codec/codec.d.ts +336 -0
  241. package/dist/esm/shared/codec/codec.js +150 -0
  242. package/dist/esm/shared/codec/compression.d.ts +66 -0
  243. package/dist/esm/shared/codec/compression.js +40 -0
  244. package/dist/esm/shared/codec/json-serde.d.ts +80 -0
  245. package/dist/esm/shared/codec/json-serde.js +54 -0
  246. package/dist/esm/shared/codec/s3/client-types.d.ts +54 -0
  247. package/dist/esm/shared/codec/s3/client-types.js +3 -0
  248. package/dist/esm/shared/codec/s3/client.d.ts +63 -0
  249. package/dist/esm/shared/codec/s3/client.js +40 -0
  250. package/dist/esm/shared/codec/s3/config.d.ts +260 -0
  251. package/dist/esm/shared/codec/s3/config.js +79 -0
  252. package/dist/esm/shared/codec/s3/lifecycle.d.ts +220 -0
  253. package/dist/esm/shared/codec/s3/lifecycle.js +214 -0
  254. package/dist/esm/shared/codec/s3/offloader.d.ts +428 -0
  255. package/dist/esm/shared/codec/s3/offloader.js +278 -0
  256. package/dist/esm/shared/concurrency.d.ts +43 -0
  257. package/dist/esm/shared/concurrency.js +27 -0
  258. package/dist/esm/shared/dynamodb/abort.d.ts +47 -0
  259. package/dist/esm/shared/dynamodb/abort.js +12 -0
  260. package/dist/esm/shared/dynamodb/batch-write.d.ts +86 -0
  261. package/dist/esm/shared/dynamodb/batch-write.js +74 -0
  262. package/dist/esm/shared/dynamodb/cancellation.d.ts +124 -0
  263. package/dist/esm/shared/dynamodb/cancellation.js +30 -0
  264. package/dist/esm/shared/dynamodb/client.d.ts +177 -0
  265. package/dist/esm/shared/dynamodb/client.js +35 -0
  266. package/dist/esm/shared/dynamodb/idempotent-write.d.ts +596 -0
  267. package/dist/esm/shared/dynamodb/idempotent-write.js +153 -0
  268. package/dist/esm/shared/dynamodb/paginate.d.ts +111 -0
  269. package/dist/esm/shared/dynamodb/paginate.js +84 -0
  270. package/dist/esm/shared/dynamodb/partition-delete.d.ts +204 -0
  271. package/dist/esm/shared/dynamodb/partition-delete.js +171 -0
  272. package/dist/esm/shared/dynamodb/recency-index.d.ts +243 -0
  273. package/dist/esm/shared/dynamodb/recency-index.js +136 -0
  274. package/dist/esm/shared/dynamodb/retry.d.ts +317 -0
  275. package/dist/esm/shared/dynamodb/retry.js +180 -0
  276. package/dist/esm/shared/dynamodb/row-size.d.ts +33 -0
  277. package/dist/esm/shared/dynamodb/row-size.js +26 -0
  278. package/dist/esm/shared/dynamodb/table-schema.d.ts +199 -0
  279. package/dist/esm/shared/dynamodb/table-schema.js +43 -0
  280. package/dist/esm/shared/errors/base-error.d.ts +231 -0
  281. package/dist/esm/shared/errors/base-error.js +64 -0
  282. package/dist/esm/shared/errors/boundary.d.ts +86 -0
  283. package/dist/esm/shared/errors/boundary.js +54 -0
  284. package/dist/esm/shared/errors/classify.d.ts +206 -0
  285. package/dist/esm/shared/errors/classify.js +220 -0
  286. package/dist/esm/shared/errors/error-code.d.ts +95 -0
  287. package/dist/esm/shared/errors/error-code.js +24 -0
  288. package/dist/esm/shared/errors/errors.d.ts +233 -0
  289. package/dist/esm/shared/errors/errors.js +110 -0
  290. package/dist/esm/shared/logging/logger.d.ts +80 -0
  291. package/dist/esm/shared/logging/logger.js +25 -0
  292. package/dist/esm/shared/logging/redaction.d.ts +123 -0
  293. package/dist/esm/shared/logging/redaction.js +140 -0
  294. package/dist/esm/shared/logging/secret-patterns.d.ts +227 -0
  295. package/dist/esm/shared/logging/secret-patterns.js +83 -0
  296. package/dist/esm/shared/logging/truncate.d.ts +197 -0
  297. package/dist/esm/shared/logging/truncate.js +25 -0
  298. package/dist/esm/shared/options.d.ts +100 -0
  299. package/dist/esm/shared/options.js +1 -0
  300. package/dist/esm/shared/ulid.d.ts +80 -0
  301. package/dist/esm/shared/ulid.js +77 -0
  302. package/dist/esm/shared/validation/collaborators.d.ts +160 -0
  303. package/dist/esm/shared/validation/collaborators.js +70 -0
  304. package/dist/esm/shared/validation/option-shape.d.ts +91 -0
  305. package/dist/esm/shared/validation/option-shape.js +24 -0
  306. package/dist/esm/shared/validation/options.d.ts +145 -0
  307. package/dist/esm/shared/validation/options.js +156 -0
  308. package/dist/esm/shared/validation/primitives.d.ts +292 -0
  309. package/dist/esm/shared/validation/primitives.js +100 -0
  310. package/dist/esm/shared/validation/ttl.d.ts +94 -0
  311. package/dist/esm/shared/validation/ttl.js +46 -0
  312. package/dist/esm/store/actions/list-namespaces.d.ts +79 -0
  313. package/dist/esm/store/actions/list-namespaces.js +86 -0
  314. package/dist/esm/store/actions/put.d.ts +43 -0
  315. package/dist/esm/store/actions/put.js +46 -0
  316. package/dist/esm/store/actions/reconcile-vector-index.d.ts +38 -0
  317. package/dist/esm/store/actions/reconcile-vector-index.js +10 -0
  318. package/dist/esm/store/actions/search.d.ts +38 -0
  319. package/dist/esm/store/actions/search.js +23 -0
  320. package/dist/esm/store/internal/batch-plan.d.ts +56 -0
  321. package/dist/esm/store/internal/batch-plan.js +28 -0
  322. package/dist/esm/store/internal/filter.d.ts +43 -0
  323. package/dist/esm/store/internal/filter.js +60 -0
  324. package/dist/esm/store/internal/get-item.d.ts +77 -0
  325. package/dist/esm/store/internal/get-item.js +54 -0
  326. package/dist/esm/store/internal/item-write.d.ts +270 -0
  327. package/dist/esm/store/internal/item-write.js +173 -0
  328. package/dist/esm/store/internal/parse.d.ts +230 -0
  329. package/dist/esm/store/internal/parse.js +169 -0
  330. package/dist/esm/store/internal/rows.d.ts +359 -0
  331. package/dist/esm/store/internal/rows.js +147 -0
  332. package/dist/esm/store/internal/semantic-search.d.ts +168 -0
  333. package/dist/esm/store/internal/semantic-search.js +200 -0
  334. package/dist/esm/store/internal/setup.d.ts +96 -0
  335. package/dist/esm/store/internal/setup.js +98 -0
  336. package/dist/esm/store/internal/table-search.d.ts +100 -0
  337. package/dist/esm/store/internal/table-search.js +119 -0
  338. package/dist/esm/store/internal/vector-index.d.ts +258 -0
  339. package/dist/esm/store/internal/vector-index.js +256 -0
  340. package/dist/esm/store/store.d.ts +329 -0
  341. package/dist/esm/store/store.js +93 -0
  342. package/dist/esm/store/types.d.ts +111 -0
  343. package/dist/esm/store/types.js +1 -0
  344. package/dist/esm/store/vector-backend.d.ts +104 -0
  345. package/dist/esm/store/vector-backend.js +1 -0
  346. package/package.json +68 -46
  347. package/dist/checkpointer/actions/delete-thread.d.ts +0 -10
  348. package/dist/checkpointer/actions/delete-thread.js +0 -38
  349. package/dist/checkpointer/actions/get-tuple.d.ts +0 -11
  350. package/dist/checkpointer/actions/get-tuple.js +0 -25
  351. package/dist/checkpointer/actions/list.d.ts +0 -20
  352. package/dist/checkpointer/actions/list.js +0 -113
  353. package/dist/checkpointer/actions/put-writes.d.ts +0 -15
  354. package/dist/checkpointer/actions/put-writes.js +0 -62
  355. package/dist/checkpointer/actions/put.d.ts +0 -17
  356. package/dist/checkpointer/actions/put.js +0 -73
  357. package/dist/checkpointer/internal/assemble.d.ts +0 -17
  358. package/dist/checkpointer/internal/assemble.js +0 -38
  359. package/dist/checkpointer/internal/checkpoint-write-verify.d.ts +0 -24
  360. package/dist/checkpointer/internal/checkpoint-write-verify.js +0 -67
  361. package/dist/checkpointer/internal/configurable.d.ts +0 -12
  362. package/dist/checkpointer/internal/configurable.js +0 -24
  363. package/dist/checkpointer/internal/fetch.d.ts +0 -19
  364. package/dist/checkpointer/internal/fetch.js +0 -88
  365. package/dist/checkpointer/internal/filter-match.d.ts +0 -13
  366. package/dist/checkpointer/internal/filter-match.js +0 -15
  367. package/dist/checkpointer/internal/item-reader.d.ts +0 -66
  368. package/dist/checkpointer/internal/item-reader.js +0 -113
  369. package/dist/checkpointer/internal/item-writer.d.ts +0 -35
  370. package/dist/checkpointer/internal/item-writer.js +0 -107
  371. package/dist/checkpointer/internal/keys.d.ts +0 -41
  372. package/dist/checkpointer/internal/keys.js +0 -117
  373. package/dist/checkpointer/internal/list-scope.d.ts +0 -61
  374. package/dist/checkpointer/internal/list-scope.js +0 -108
  375. package/dist/checkpointer/internal/pending-sends.d.ts +0 -13
  376. package/dist/checkpointer/internal/pending-sends.js +0 -29
  377. package/dist/checkpointer/internal/query.d.ts +0 -21
  378. package/dist/checkpointer/internal/query.js +0 -42
  379. package/dist/checkpointer/internal/regular-write.d.ts +0 -28
  380. package/dist/checkpointer/internal/regular-write.js +0 -66
  381. package/dist/checkpointer/internal/setup.d.ts +0 -33
  382. package/dist/checkpointer/internal/setup.js +0 -38
  383. package/dist/checkpointer/internal/special-write-cas.d.ts +0 -29
  384. package/dist/checkpointer/internal/special-write-cas.js +0 -104
  385. package/dist/checkpointer/internal/special-write-cleanup.d.ts +0 -23
  386. package/dist/checkpointer/internal/special-write-cleanup.js +0 -50
  387. package/dist/checkpointer/internal/special-write-verify.d.ts +0 -53
  388. package/dist/checkpointer/internal/special-write-verify.js +0 -80
  389. package/dist/checkpointer/internal/stored-channels.d.ts +0 -31
  390. package/dist/checkpointer/internal/stored-channels.js +0 -70
  391. package/dist/checkpointer/internal/validation.d.ts +0 -18
  392. package/dist/checkpointer/internal/validation.js +0 -40
  393. package/dist/checkpointer/internal/write-guard.d.ts +0 -20
  394. package/dist/checkpointer/internal/write-guard.js +0 -48
  395. package/dist/checkpointer/internal/write-index.d.ts +0 -36
  396. package/dist/checkpointer/internal/write-index.js +0 -41
  397. package/dist/checkpointer/saver.d.ts +0 -70
  398. package/dist/checkpointer/saver.js +0 -105
  399. package/dist/checkpointer/types.d.ts +0 -58
  400. package/dist/factory/factory.d.ts +0 -40
  401. package/dist/factory/factory.js +0 -87
  402. package/dist/history/actions/add-messages.d.ts +0 -15
  403. package/dist/history/actions/add-messages.js +0 -77
  404. package/dist/history/actions/clear.d.ts +0 -10
  405. package/dist/history/actions/clear.js +0 -34
  406. package/dist/history/actions/get-messages.d.ts +0 -17
  407. package/dist/history/actions/get-messages.js +0 -79
  408. package/dist/history/actions/list-sessions.d.ts +0 -13
  409. package/dist/history/actions/list-sessions.js +0 -53
  410. package/dist/history/actions/reconcile-count.d.ts +0 -12
  411. package/dist/history/actions/reconcile-count.js +0 -64
  412. package/dist/history/chat-message-history.d.ts +0 -73
  413. package/dist/history/chat-message-history.js +0 -111
  414. package/dist/history/internal/append-saga.d.ts +0 -25
  415. package/dist/history/internal/append-saga.js +0 -79
  416. package/dist/history/internal/compensation.d.ts +0 -25
  417. package/dist/history/internal/compensation.js +0 -92
  418. package/dist/history/internal/item-mapper.d.ts +0 -9
  419. package/dist/history/internal/item-mapper.js +0 -27
  420. package/dist/history/internal/keys.d.ts +0 -16
  421. package/dist/history/internal/keys.js +0 -48
  422. package/dist/history/internal/message-chunker.d.ts +0 -13
  423. package/dist/history/internal/message-chunker.js +0 -67
  424. package/dist/history/internal/message-transaction.d.ts +0 -25
  425. package/dist/history/internal/message-transaction.js +0 -61
  426. package/dist/history/internal/message-window.d.ts +0 -17
  427. package/dist/history/internal/message-window.js +0 -49
  428. package/dist/history/internal/query.d.ts +0 -23
  429. package/dist/history/internal/query.js +0 -39
  430. package/dist/history/internal/session-count.d.ts +0 -47
  431. package/dist/history/internal/session-count.js +0 -115
  432. package/dist/history/internal/session-title.d.ts +0 -19
  433. package/dist/history/internal/session-title.js +0 -43
  434. package/dist/history/internal/session-update.d.ts +0 -27
  435. package/dist/history/internal/session-update.js +0 -69
  436. package/dist/history/internal/setup.d.ts +0 -31
  437. package/dist/history/internal/setup.js +0 -43
  438. package/dist/history/internal/title-generator.d.ts +0 -12
  439. package/dist/history/internal/title-generator.js +0 -41
  440. package/dist/history/internal/ttl-anchor.d.ts +0 -24
  441. package/dist/history/internal/ttl-anchor.js +0 -38
  442. package/dist/history/internal/validation.d.ts +0 -25
  443. package/dist/history/internal/validation.js +0 -53
  444. package/dist/history/session-adapter.d.ts +0 -29
  445. package/dist/history/session-adapter.js +0 -35
  446. package/dist/history/types.d.ts +0 -69
  447. package/dist/index.d.ts +0 -29
  448. package/dist/index.js +0 -32
  449. package/dist/shared/clock.d.ts +0 -8
  450. package/dist/shared/clock.js +0 -16
  451. package/dist/shared/codec/codec.d.ts +0 -53
  452. package/dist/shared/codec/codec.js +0 -66
  453. package/dist/shared/codec/compression.d.ts +0 -24
  454. package/dist/shared/codec/compression.js +0 -48
  455. package/dist/shared/codec/descriptor-keys.d.ts +0 -12
  456. package/dist/shared/codec/descriptor-keys.js +0 -14
  457. package/dist/shared/codec/encode.d.ts +0 -13
  458. package/dist/shared/codec/encode.js +0 -43
  459. package/dist/shared/codec/json-serde.d.ts +0 -7
  460. package/dist/shared/codec/json-serde.js +0 -17
  461. package/dist/shared/codec/payload-loss.d.ts +0 -12
  462. package/dist/shared/codec/payload-loss.js +0 -38
  463. package/dist/shared/codec/s3/adapter-config.d.ts +0 -13
  464. package/dist/shared/codec/s3/adapter-config.js +0 -22
  465. package/dist/shared/codec/s3/bounded-body.d.ts +0 -14
  466. package/dist/shared/codec/s3/bounded-body.js +0 -47
  467. package/dist/shared/codec/s3/client.d.ts +0 -18
  468. package/dist/shared/codec/s3/client.js +0 -46
  469. package/dist/shared/codec/s3/config.d.ts +0 -51
  470. package/dist/shared/codec/s3/config.js +0 -58
  471. package/dist/shared/codec/s3/delete.d.ts +0 -7
  472. package/dist/shared/codec/s3/delete.js +0 -28
  473. package/dist/shared/codec/s3/key-scope.d.ts +0 -23
  474. package/dist/shared/codec/s3/key-scope.js +0 -44
  475. package/dist/shared/codec/s3/lifecycle.d.ts +0 -14
  476. package/dist/shared/codec/s3/lifecycle.js +0 -63
  477. package/dist/shared/codec/s3/offloader.d.ts +0 -44
  478. package/dist/shared/codec/s3/offloader.js +0 -118
  479. package/dist/shared/codec/s3/orphans.d.ts +0 -23
  480. package/dist/shared/codec/s3/orphans.js +0 -71
  481. package/dist/shared/codec/s3/read-write.d.ts +0 -18
  482. package/dist/shared/codec/s3/read-write.js +0 -51
  483. package/dist/shared/codec/s3/retry.d.ts +0 -5
  484. package/dist/shared/codec/s3/retry.js +0 -22
  485. package/dist/shared/concurrency.d.ts +0 -6
  486. package/dist/shared/constants.d.ts +0 -112
  487. package/dist/shared/constants.js +0 -115
  488. package/dist/shared/dynamodb/abort.d.ts +0 -9
  489. package/dist/shared/dynamodb/abort.js +0 -27
  490. package/dist/shared/dynamodb/backoff.d.ts +0 -15
  491. package/dist/shared/dynamodb/backoff.js +0 -48
  492. package/dist/shared/dynamodb/batch-write.d.ts +0 -22
  493. package/dist/shared/dynamodb/batch-write.js +0 -53
  494. package/dist/shared/dynamodb/cancellation.d.ts +0 -6
  495. package/dist/shared/dynamodb/cancellation.js +0 -7
  496. package/dist/shared/dynamodb/client.d.ts +0 -28
  497. package/dist/shared/dynamodb/conditional-put.d.ts +0 -67
  498. package/dist/shared/dynamodb/conditional-put.js +0 -76
  499. package/dist/shared/dynamodb/drain-unprocessed.d.ts +0 -21
  500. package/dist/shared/dynamodb/drain-unprocessed.js +0 -43
  501. package/dist/shared/dynamodb/expiry.d.ts +0 -16
  502. package/dist/shared/dynamodb/expiry.js +0 -29
  503. package/dist/shared/dynamodb/paginate-core.d.ts +0 -24
  504. package/dist/shared/dynamodb/paginate-core.js +0 -82
  505. package/dist/shared/dynamodb/paginate.d.ts +0 -14
  506. package/dist/shared/dynamodb/paginate.js +0 -19
  507. package/dist/shared/dynamodb/partition-delete.d.ts +0 -39
  508. package/dist/shared/dynamodb/partition-delete.js +0 -71
  509. package/dist/shared/dynamodb/retry-classifier.d.ts +0 -17
  510. package/dist/shared/dynamodb/retry-classifier.js +0 -118
  511. package/dist/shared/dynamodb/retry-policy.d.ts +0 -26
  512. package/dist/shared/dynamodb/retry-policy.js +0 -22
  513. package/dist/shared/dynamodb/retry.d.ts +0 -31
  514. package/dist/shared/dynamodb/retry.js +0 -57
  515. package/dist/shared/dynamodb/scan.d.ts +0 -14
  516. package/dist/shared/dynamodb/scan.js +0 -19
  517. package/dist/shared/dynamodb/types.d.ts +0 -23
  518. package/dist/shared/errors/base-error.d.ts +0 -30
  519. package/dist/shared/errors/base-error.js +0 -27
  520. package/dist/shared/errors/boundary.d.ts +0 -18
  521. package/dist/shared/errors/boundary.js +0 -46
  522. package/dist/shared/errors/error-code.d.ts +0 -13
  523. package/dist/shared/errors/errors.d.ts +0 -68
  524. package/dist/shared/errors/errors.js +0 -114
  525. package/dist/shared/errors/upstream-error.d.ts +0 -16
  526. package/dist/shared/errors/upstream-error.js +0 -27
  527. package/dist/shared/errors/wrap-error.d.ts +0 -7
  528. package/dist/shared/errors/wrap-error.js +0 -15
  529. package/dist/shared/logging/logger.d.ts +0 -18
  530. package/dist/shared/logging/logger.js +0 -15
  531. package/dist/shared/logging/redaction-walk.d.ts +0 -23
  532. package/dist/shared/logging/redaction-walk.js +0 -112
  533. package/dist/shared/logging/redaction.d.ts +0 -39
  534. package/dist/shared/logging/redaction.js +0 -75
  535. package/dist/shared/logging/secret-patterns.d.ts +0 -92
  536. package/dist/shared/logging/secret-patterns.js +0 -133
  537. package/dist/shared/options.d.ts +0 -37
  538. package/dist/shared/ulid.d.ts +0 -23
  539. package/dist/shared/validation/options.d.ts +0 -8
  540. package/dist/shared/validation/options.js +0 -90
  541. package/dist/shared/validation/primitives.d.ts +0 -29
  542. package/dist/shared/validation/primitives.js +0 -82
  543. package/dist/shared/validation/ttl.d.ts +0 -28
  544. package/dist/shared/validation/ttl.js +0 -52
  545. package/dist/store/actions/get.d.ts +0 -13
  546. package/dist/store/actions/get.js +0 -73
  547. package/dist/store/actions/list-namespaces.d.ts +0 -8
  548. package/dist/store/actions/list-namespaces.js +0 -59
  549. package/dist/store/actions/put.d.ts +0 -10
  550. package/dist/store/actions/put.js +0 -96
  551. package/dist/store/actions/reconcile-vector-index.d.ts +0 -18
  552. package/dist/store/actions/reconcile-vector-index.js +0 -26
  553. package/dist/store/actions/search.d.ts +0 -9
  554. package/dist/store/actions/search.js +0 -34
  555. package/dist/store/internal/backend-search.d.ts +0 -4
  556. package/dist/store/internal/backend-search.js +0 -74
  557. package/dist/store/internal/batch-plan.d.ts +0 -11
  558. package/dist/store/internal/batch-plan.js +0 -52
  559. package/dist/store/internal/candidates.d.ts +0 -23
  560. package/dist/store/internal/candidates.js +0 -94
  561. package/dist/store/internal/filter.d.ts +0 -9
  562. package/dist/store/internal/filter.js +0 -85
  563. package/dist/store/internal/index-reconcile.d.ts +0 -21
  564. package/dist/store/internal/index-reconcile.js +0 -118
  565. package/dist/store/internal/index-sync.d.ts +0 -10
  566. package/dist/store/internal/index-sync.js +0 -25
  567. package/dist/store/internal/item-mapper.d.ts +0 -27
  568. package/dist/store/internal/item-mapper.js +0 -61
  569. package/dist/store/internal/keys.d.ts +0 -17
  570. package/dist/store/internal/keys.js +0 -41
  571. package/dist/store/internal/namespace-match.d.ts +0 -11
  572. package/dist/store/internal/namespace-match.js +0 -40
  573. package/dist/store/internal/option-validation.d.ts +0 -13
  574. package/dist/store/internal/option-validation.js +0 -77
  575. package/dist/store/internal/overwrite-swap.d.ts +0 -32
  576. package/dist/store/internal/overwrite-swap.js +0 -68
  577. package/dist/store/internal/persist.d.ts +0 -28
  578. package/dist/store/internal/persist.js +0 -64
  579. package/dist/store/internal/query.d.ts +0 -11
  580. package/dist/store/internal/query.js +0 -48
  581. package/dist/store/internal/ranker.d.ts +0 -18
  582. package/dist/store/internal/ranker.js +0 -39
  583. package/dist/store/internal/read-existing.d.ts +0 -23
  584. package/dist/store/internal/read-existing.js +0 -41
  585. package/dist/store/internal/score-direction.d.ts +0 -31
  586. package/dist/store/internal/score-direction.js +0 -38
  587. package/dist/store/internal/search-filter.d.ts +0 -3
  588. package/dist/store/internal/search-filter.js +0 -10
  589. package/dist/store/internal/semantic-search.d.ts +0 -34
  590. package/dist/store/internal/semantic-search.js +0 -87
  591. package/dist/store/internal/setup.d.ts +0 -36
  592. package/dist/store/internal/setup.js +0 -40
  593. package/dist/store/internal/text-path.d.ts +0 -17
  594. package/dist/store/internal/validation.d.ts +0 -18
  595. package/dist/store/internal/validation.js +0 -51
  596. package/dist/store/internal/write-verify.d.ts +0 -42
  597. package/dist/store/internal/write-verify.js +0 -71
  598. package/dist/store/store.d.ts +0 -61
  599. package/dist/store/store.js +0 -107
  600. package/dist/store/types.d.ts +0 -50
  601. package/dist/store/types.js +0 -2
  602. package/dist/store/vector-backend.d.ts +0 -43
  603. package/dist/store/vector-backend.js +0 -2
  604. /package/dist/{checkpointer → cjs/checkpointer}/types.js +0 -0
  605. /package/dist/{factory → cjs/factory}/types.js +0 -0
  606. /package/dist/{history → cjs/history}/types.js +0 -0
  607. /package/dist/{shared → cjs/shared}/options.js +0 -0
  608. /package/dist/{shared/dynamodb → cjs/store}/types.js +0 -0
@@ -0,0 +1,80 @@
1
+ /**
2
+ * Hides the JSON form: writing it, reading it, and recognising it.
3
+ *
4
+ * The default serde writes a value as JSON under the `json` type and reads
5
+ * back only that type; the codec also asks, when a serde refuses stored bytes,
6
+ * whether those bytes are still JSON at all, which tells a corrupt payload from
7
+ * a serde that would not reconstruct it.
8
+ */
9
+ import type { SerializerProtocol } from '@langchain/langgraph-checkpoint';
10
+ /**
11
+ * A plain JSON serializer implementing LangGraph's `SerializerProtocol`:
12
+ * the default `serde` of `DynamoDBStore` and `DynamoDBChatMessageHistory`, and
13
+ * the alternative a `DynamoDBSaver` can be given in place of LangGraph's
14
+ * `JsonPlusSerializer`.
15
+ *
16
+ * It is exported so that choice is available. The checkpointer's default
17
+ * revives a stored `{"lc": …}` record by instantiating the class the record
18
+ * names, so the row selects which constructor runs on read; this serializer
19
+ * runs `JSON.parse` and nothing else, and reconstructs no class at all.
20
+ * Reading with it is the narrower trust boundary, and the price is stated
21
+ * below: it stores the JSON projection of a value, not the value.
22
+ *
23
+ * `dumpsTyped` accepts any value `JSON.stringify` can represent and refuses the
24
+ * rest. A value it cannot represent — `undefined`, a function, a symbol —
25
+ * stringifies to `undefined` and would be stored as **zero bytes**, which reads
26
+ * back as a parse error; a circular structure or a `BigInt` makes it throw. Both
27
+ * are reported as `VALIDATION` naming `value`, at the write, rather than
28
+ * as an unreadable row later — with the refusal attached as `cause` and never
29
+ * quoted into the message, which for a circular structure names the caller's
30
+ * own properties and classes.
31
+ *
32
+ * What it represents, it represents as JSON, which is lossy in ways nothing
33
+ * records: a `Map` or `Set` stores as `{}`, an object key whose value is
34
+ * `undefined` is dropped and an array element is stored as `null`, `NaN` and
35
+ * `Infinity` store as `null`, `-0` as `0`, a `Uint8Array` as an index-keyed
36
+ * object and a `Date` as an ISO string. The README's *Table schema* section
37
+ * holds the whole table, against the checkpointer default column by column.
38
+ *
39
+ * `loadsTyped` reads only the `json` form it writes, and says
40
+ * so before it looks at a byte. Any other declared form is a `VALIDATION` error
41
+ * naming `serde`, because it says what *this* reader may rebuild and not that
42
+ * the payload is damaged. Bytes of that form which do not parse are
43
+ * `PAYLOAD_CORRUPT`, because they can never be read and the caller should
44
+ * report rather than retry; a `data` that is not bytes at all is a
45
+ * `VALIDATION` naming `data`, because that is the caller's mistake and
46
+ * not a row's.
47
+ *
48
+ * Frozen for the reason {@link ErrorCode} is: one object, shared by every
49
+ * adapter in the process that did not pass a `serde` of its own, and
50
+ * reachable from the package root. An assignment to `dumpsTyped` by any one
51
+ * consumer would silently change how every other one writes.
52
+ */
53
+ export declare const JSON_SERDE: SerializerProtocol;
54
+ /**
55
+ * Whether stored bytes are still the form the row that holds them declares.
56
+ *
57
+ * This is the structural question behind the two ways a decode fails —
58
+ * `PAYLOAD_CORRUPT` for bytes no reader can decode, and the `serde` refusal for
59
+ * bytes *this* reader will not rebuild a value from — and it is the only one
60
+ * this package can answer on its own. `SerializerProtocol` offers no way to ask
61
+ * a serde whether it parsed the bytes before deciding not to reconstruct what
62
+ * they name, and the refusal it throws is a caller's object: its class, its
63
+ * fields and its prose are all whatever that caller chose. Classifying a
64
+ * payload by any of those would make the code mean "a third party said so",
65
+ * which is exactly what neither code may mean.
66
+ *
67
+ * Accepts: `serdeType` — the type stamped on the row, as the descriptor carries
68
+ * it. `bytes` — what the row stored, already decompressed.
69
+ *
70
+ * Returns: whether the bytes still parse as the declared form. A type this
71
+ * package has no grammar for is taken at its word and answers `true`, so its
72
+ * serde's refusal is reported rather than written off: dropping a payload this
73
+ * reader merely cannot check would lose data on nothing but its own ignorance.
74
+ *
75
+ * Throws: **nothing**, for any bytes. It is called from inside the `catch` that
76
+ * is classifying a decode failure, where a throw would replace the failure
77
+ * being reported — and the value it is handed came off a row, so it may be
78
+ * anything that row's writer stored.
79
+ */
80
+ export declare function bytesHoldDeclaredForm(serdeType: string, bytes: Uint8Array): boolean;
@@ -0,0 +1,54 @@
1
+ import { DynamoDBLangGraphError, toError } from '../errors/base-error.js';
2
+ import { ErrorCode } from '../errors/error-code.js';
3
+ import { validationError } from '../errors/errors.js';
4
+ import { truncateForLog } from '../logging/truncate.js';
5
+ export const JSON_SERDE = {
6
+ async dumpsTyped(value) {
7
+ let text;
8
+ try {
9
+ text = JSON.stringify(value);
10
+ }
11
+ catch (error) {
12
+ throw validationError('value cannot be serialized as JSON — a circular structure, or a value JSON has no ' +
13
+ 'encoding for such as a BigInt; the refusal itself is attached as `cause`', 'value', toError(error));
14
+ }
15
+ if (text === undefined) {
16
+ throw validationError('value has no JSON representation (undefined, a function or a symbol), so it cannot be ' +
17
+ 'stored; store null instead to record an absent value', 'value');
18
+ }
19
+ return Promise.resolve([JSON_SERDE_TYPE, new TextEncoder().encode(text)]);
20
+ },
21
+ async loadsTyped(type, data) {
22
+ if (type !== JSON_SERDE_TYPE) {
23
+ throw validationError(`this serializer reads only the \`${JSON_SERDE_TYPE}\` form it writes, and this payload ` +
24
+ `declares ${truncateForLog(String(JSON.stringify(type)))}; read the row with the ` +
25
+ 'serializer that wrote it, or rewrite the row', 'serde');
26
+ }
27
+ let text;
28
+ try {
29
+ text = typeof data === 'string' ? data : new TextDecoder().decode(data);
30
+ }
31
+ catch (error) {
32
+ throw validationError('data must be the bytes or text this serializer wrote, as a Uint8Array or a string', 'data', error);
33
+ }
34
+ try {
35
+ return Promise.resolve(JSON.parse(text));
36
+ }
37
+ catch (error) {
38
+ throw new DynamoDBLangGraphError('the stored payload is not the JSON this serializer wrote, so it cannot be decoded', ErrorCode.PAYLOAD_CORRUPT, {}, error);
39
+ }
40
+ },
41
+ };
42
+ Object.freeze(JSON_SERDE);
43
+ const JSON_SERDE_TYPE = 'json';
44
+ export function bytesHoldDeclaredForm(serdeType, bytes) {
45
+ if (serdeType !== JSON_SERDE_TYPE)
46
+ return true;
47
+ try {
48
+ JSON.parse(new TextDecoder().decode(bytes));
49
+ return true;
50
+ }
51
+ catch {
52
+ return false;
53
+ }
54
+ }
@@ -0,0 +1,54 @@
1
+ /**
2
+ * Hides the S3 SDK's own types from this package's declarations.
3
+ *
4
+ * The S3 client, its config and a command are described by the members this
5
+ * package touches, so no shipped declaration imports the optional
6
+ * `@aws-sdk/client-s3` peer and a caller without it installed still compiles
7
+ * (record 1). A real `S3Client` or `S3ClientConfig` satisfies these shapes as
8
+ * it is, so a caller who has the SDK passes its own values unchanged.
9
+ */
10
+ /** A region as the SDK accepts it: a string or a provider resolving to one. */
11
+ export type S3RegionLike = string | (() => Promise<string>);
12
+ /** A value an S3 client option can hold. */
13
+ export type S3ClientOption = string | number | boolean | object | null | undefined;
14
+ /**
15
+ * The S3 client options this library reads (`region`) or sets (`maxAttempts`),
16
+ * open to every other `S3ClientConfig` key.
17
+ */
18
+ export interface S3ClientOptions {
19
+ region?: S3RegionLike;
20
+ maxAttempts?: number;
21
+ [option: string]: S3ClientOption;
22
+ }
23
+ /**
24
+ * Structural stand-in for `S3ClientConfig`, so the shipped declarations compile
25
+ * without the optional `@aws-sdk/client-s3` peer installed. A literal gets
26
+ * completion for the options the library uses; a typed `S3ClientConfig`
27
+ * variable is accepted as it is.
28
+ */
29
+ export type S3ClientConfigLike = S3ClientOptions | object;
30
+ /**
31
+ * The options of a config, read through the structural type.
32
+ *
33
+ * Accepts: a config as the caller gave it, or nothing.
34
+ *
35
+ * Returns: the same object seen as {@link S3ClientOptions} so `region` and
36
+ * `maxAttempts` can be read; an absent config reads as empty rather than
37
+ * needing a guard at every call site.
38
+ *
39
+ * Throws: nothing.
40
+ */
41
+ export declare function s3ClientOptions(config: S3ClientConfigLike | undefined): S3ClientOptions;
42
+ /** What every SDK command object carries: its `input`. */
43
+ interface S3CommandLike {
44
+ input: object;
45
+ }
46
+ /**
47
+ * The S3 client surface this library calls, typed structurally for the same
48
+ * reason. `S3Client` from `@aws-sdk/client-s3` satisfies it.
49
+ */
50
+ export interface S3ClientLike {
51
+ send(command: S3CommandLike, options?: object): Promise<object>;
52
+ destroy(): void;
53
+ }
54
+ export {};
@@ -0,0 +1,3 @@
1
+ export function s3ClientOptions(config) {
2
+ return (config ?? {});
3
+ }
@@ -0,0 +1,63 @@
1
+ /**
2
+ * Hides that the S3 SDK is loaded on first use, and how its client is set up.
3
+ *
4
+ * An adapter without offload never imports the optional peer; the first
5
+ * offload does, once, and a missing install surfaces as `VALIDATION` naming
6
+ * the remedy (record 1). The client built here defaults to no retries of its
7
+ * own — `maxAttempts: 1` — so this package's retry is the only layer unless a
8
+ * caller's own `maxAttempts` overrides it (record 14), and its idle timer
9
+ * bounds a stalled transfer without bounding a slow one.
10
+ */
11
+ import type { S3Client } from '@aws-sdk/client-s3';
12
+ import { type S3ClientConfigLike, type S3ClientOptions } from './client-types.js';
13
+ type S3Sdk = typeof import('@aws-sdk/client-s3');
14
+ /**
15
+ * The optional `@aws-sdk/client-s3` peer, imported on first use.
16
+ *
17
+ * Accepts: nothing. Concurrent callers share one import.
18
+ *
19
+ * Returns: the module, cached for every later call.
20
+ *
21
+ * Throws: `VALIDATION` naming `s3` when the package is not installed,
22
+ * carrying the install command; any other import failure — a broken build, a
23
+ * syntax error inside the package — passes through unchanged. A failure is not
24
+ * cached, so an install or a fixed bundle succeeds on a later call. Each
25
+ * concurrent caller of a failed import gets its own error instance
26
+ * (`copyForCaller`), so the public boundary stamping one's `context.operation`
27
+ * cannot leave it sitting in another caller's error too.
28
+ */
29
+ export declare function loadS3Sdk(): Promise<S3Sdk>;
30
+ /**
31
+ * `config` with the two defaults every S3 client of this library is built
32
+ * with, whichever constructor builds it.
33
+ *
34
+ * Accepts: `config` — the caller's `s3.clientConfig`, or an empty object.
35
+ *
36
+ * Returns: a copy whose `maxAttempts` and `requestHandler` are the caller's
37
+ * own where it gave one and the default where it did not. A key named with
38
+ * `undefined` — a config assembled from settings that were not all set — gave
39
+ * none, and keeps the default.
40
+ *
41
+ * Throws: nothing.
42
+ *
43
+ * Guarantees: `maxAttempts` defaults to 1, so the SDK performs no retries of
44
+ * its own and this library's retry, backoff and classification are the only
45
+ * retry layer — the same default `resolveDynamoDBClient` applies on the
46
+ * DynamoDB side. A default request handler bounds a transfer that has
47
+ * stalled, which `maxAttempts` alone does not; a `requestHandler` in `config`
48
+ * replaces it whole rather than merging with it.
49
+ */
50
+ export declare function withS3ClientDefaults(config: S3ClientConfigLike): S3ClientOptions;
51
+ /**
52
+ * An `S3Client` built from `config` with the lazily-loaded SDK.
53
+ *
54
+ * Accepts: `config` — any `S3ClientConfig`; an explicit `maxAttempts` or
55
+ * `requestHandler` wins over the defaults {@link withS3ClientDefaults} fills
56
+ * in.
57
+ *
58
+ * Returns: the client. The caller owns it and destroys it.
59
+ *
60
+ * Throws: whatever {@link loadS3Sdk} throws.
61
+ */
62
+ export declare function createDefaultS3Client(config: S3ClientConfigLike): Promise<S3Client>;
63
+ export {};
@@ -0,0 +1,40 @@
1
+ import { DEFAULT_SOCKET_TIMEOUT_MS } from '../../dynamodb/client.js';
2
+ import { copyForCaller } from '../../errors/base-error.js';
3
+ import { validationError } from '../../errors/errors.js';
4
+ import { s3ClientOptions } from './client-types.js';
5
+ const MISSING_MODULE_CODES = ['ERR_MODULE_NOT_FOUND', 'MODULE_NOT_FOUND'];
6
+ let sdkPromise;
7
+ function wrapMissingPeer(error) {
8
+ const code = error.code;
9
+ if (code !== undefined && MISSING_MODULE_CODES.includes(code)) {
10
+ throw validationError('S3 offload requires the optional peer @aws-sdk/client-s3 (npm install @aws-sdk/client-s3); ' +
11
+ 'bundlers must keep it installed or external', 's3', error);
12
+ }
13
+ throw error;
14
+ }
15
+ export async function loadS3Sdk() {
16
+ if (!sdkPromise) {
17
+ sdkPromise = import('@aws-sdk/client-s3').catch((error) => {
18
+ sdkPromise = undefined;
19
+ return wrapMissingPeer(error);
20
+ });
21
+ }
22
+ try {
23
+ return await sdkPromise;
24
+ }
25
+ catch (error) {
26
+ throw copyForCaller(error);
27
+ }
28
+ }
29
+ export function withS3ClientDefaults(config) {
30
+ const options = s3ClientOptions(config);
31
+ return {
32
+ ...options,
33
+ maxAttempts: options.maxAttempts ?? 1,
34
+ requestHandler: options.requestHandler ?? { socketTimeout: DEFAULT_SOCKET_TIMEOUT_MS },
35
+ };
36
+ }
37
+ export async function createDefaultS3Client(config) {
38
+ const { S3Client: S3ClientCtor } = await loadS3Sdk();
39
+ return new S3ClientCtor(withS3ClientDefaults(config));
40
+ }
@@ -0,0 +1,260 @@
1
+ /**
2
+ * Hides the S3 key layout: where a row's object lives, and which keys a row may touch.
3
+ *
4
+ * An offloaded object's key is the adapter's prefix, then the row's own
5
+ * identifiers each base64url-encoded, then the id of the write that produced
6
+ * it, so a key read back from a row can be checked against the path that row
7
+ * could have produced before anything is read or deleted. The configuration a
8
+ * caller passes, its checks, the default prefix per adapter and the lifecycle
9
+ * rule ids derived from a prefix are part of the same layout.
10
+ */
11
+ import type { DynamoDBClientConfig } from '@aws-sdk/client-dynamodb';
12
+ import { type S3ClientConfigLike } from './client-types.js';
13
+ /** Default S3 key prefix for offloaded payloads. */
14
+ export declare const DEFAULT_S3_KEY_PREFIX = "langgraph-checkpoints/";
15
+ /** S3 cap on an object key, applied to the produced offload key. */
16
+ export declare const MAX_S3_KEY_BYTES = 1024;
17
+ /** Configuration for offloading large payloads to S3. */
18
+ export interface S3OffloadConfig {
19
+ bucketName: string;
20
+ keyPrefix?: string;
21
+ /**
22
+ * Serialized payloads at or above this size are offloaded (default 350 KB).
23
+ * Only the payload counts: the store's inline vectors live on the same item
24
+ * and are not part of it. The store embeds one vector per text its
25
+ * `index.fields` extract — a wildcard path yields one per element — each up
26
+ * to about 10 bytes per dimension, so three texts at 1024 dims cost roughly
27
+ * 30 KB. A row that payload and those vectors would take past DynamoDB's
28
+ * 400 KB item limit is refused with `VALIDATION` naming `index`.
29
+ */
30
+ thresholdBytes?: number;
31
+ serverSideEncryption?: string;
32
+ sseKmsKeyId?: string;
33
+ /**
34
+ * Largest object this adapter will buffer from S3 (default 50 MiB). An
35
+ * offloaded payload larger than it is refused at the write, and a value
36
+ * below `thresholdBytes` is refused at construction, so an adapter never
37
+ * stores an object it could not read back.
38
+ */
39
+ maxDownloadBytes?: number;
40
+ /**
41
+ * S3 client configuration (an `S3ClientConfig`). `region` defaults to the
42
+ * adapter's DynamoDB region.
43
+ */
44
+ clientConfig?: S3ClientConfigLike;
45
+ }
46
+ /**
47
+ * One key part, base64url-encoded.
48
+ *
49
+ * Accepts: `part` — any string, including empty.
50
+ *
51
+ * Returns: base64url text, whose alphabet (`A-Z a-z 0-9 - _`) contains neither
52
+ * `/` nor `.`, so an encoded part can never be mistaken for a path separator
53
+ * or the `.bin` suffix.
54
+ *
55
+ * Throws: nothing.
56
+ */
57
+ export declare function encodeKeyPart(part: string): string;
58
+ /**
59
+ * Build a fully-qualified S3 key: `${prefix}${parts, each base64url-encoded,
60
+ * joined with '/'}/${objectId}.bin`.
61
+ *
62
+ * `parts` are the identity of the DynamoDB row that will point at the object,
63
+ * and they are encoded rather than rejected: a namespace element or key may
64
+ * contain '/' (only the DynamoDB '#' separator is forbidden at the validation
65
+ * layer), and base64url's output alphabet never contains '/', so two distinct
66
+ * `parts` arrays can never compose one key.
67
+ *
68
+ * `objectId` names the write that uploads the object and is appended as it
69
+ * is, not encoded, so it must be safe in an S3 key and hold no `/`, or its
70
+ * segments would read as parts. The ids this package passes are both: a UUID
71
+ * (hex digits and `-`) and a ULID (Crockford base-32 digits).
72
+ *
73
+ * Accepts: `prefix` — the offloader's, already validated and separator-
74
+ * terminated. `parts` — at least one; the identity of the row that will point
75
+ * at the object. `objectId` — the uploading write's id: key-safe, with no `/`.
76
+ *
77
+ * Returns: the key. Under one prefix, two distinct `(parts, objectId)` pairs
78
+ * never compose one key, and the same prefix, parts and id always compose the
79
+ * same one.
80
+ *
81
+ * Throws: `VALIDATION` naming `s3Key` for an empty `parts` — an object with
82
+ * no row above it is outside every row's scope and could never be read back —
83
+ * and for a key over the 1024-byte cap. The encoding grows every part by a
84
+ * third, so identifiers that each pass their own length rule can still compose
85
+ * a key S3 would reject with a raw error.
86
+ */
87
+ export declare function buildS3Key(prefix: string, parts: readonly string[], objectId: string): string;
88
+ /**
89
+ * Refuse a key prefix that does not scope what it is used for.
90
+ *
91
+ * Accepts: `keyPrefix` — must be a string, non-empty, not `/`, and end in `/`.
92
+ * The type is checked here, before any string method is called, so every
93
+ * caller gets it: a number or `null` escaped as a bare `TypeError` from
94
+ * `keyPrefix.endsWith`. Every segment before that final `/` must be a real
95
+ * name: not empty, not `.`, not `..`. The whole prefix must also be free of
96
+ * control characters and well-formed UTF-16, the rules identifiers already
97
+ * meet, since it is written into log lines and into a lifecycle rule's filter.
98
+ *
99
+ * Returns: nothing: the value is kept under its declared type, and this
100
+ * checks it.
101
+ *
102
+ * Throws: `VALIDATION` naming `s3.keyPrefix`. The shape rule is reported
103
+ * before the segment rule, so a prefix breaking both is named by its shape.
104
+ *
105
+ * Guarantees: the prefix scopes both the objects and the lifecycle rule built
106
+ * from it. An empty or root prefix would make that rule expire the whole
107
+ * bucket, and one without a trailing `/` (`app/langgraph`) would also match
108
+ * every sibling starting with the same characters (`app/langgraph-other/`).
109
+ * An accepted prefix also survives path normalisation unchanged, which is what
110
+ * the segment rule buys. An S3 key is a byte string rather than a path, so
111
+ * `a/../b/x.bin` and `b/x.bin` are two different objects — but the IAM
112
+ * object-key condition a deployment writes, the lifecycle rule's
113
+ * `Filter.Prefix`, the console and every tool that resolves a path before
114
+ * matching one disagree about which. A prefix holding `..`, `.` or an empty
115
+ * segment therefore writes objects outside the path the deployment granted and
116
+ * outside the path the lifecycle rule sweeps, which is the whole job of a
117
+ * prefix.
118
+ */
119
+ export declare function assertScopedKeyPrefix(keyPrefix: string): void;
120
+ /**
121
+ * The lifecycle rule id for `prefix`: `langgraph-ttl-` plus its slug.
122
+ *
123
+ * Accepts: `prefix` — any string; trailing slashes are trimmed, and every
124
+ * character outside `[A-Za-z0-9-]` becomes `-`.
125
+ *
126
+ * Returns: a deterministic id that does not change with the TTL, so raising or
127
+ * lowering the TTL updates one rule rather than adding another. A prefix with
128
+ * no usable characters yields `langgraph-ttl-default`.
129
+ *
130
+ * Throws: nothing.
131
+ *
132
+ * Guarantees: the slug is not injective — `a/b/` and `a-b/` produce one id —
133
+ * and `ensureLifecycleRule` refuses rather than take over a rule that a
134
+ * different prefix already holds.
135
+ */
136
+ export declare function buildLifecycleRuleId(prefix: string): string;
137
+ /**
138
+ * The id of the rule that reclaims this prefix's expired delete markers:
139
+ * {@link buildLifecycleRuleId}'s id with a suffix of its own.
140
+ *
141
+ * Accepts: `prefix` — as {@link buildLifecycleRuleId} takes it.
142
+ *
143
+ * Returns: a second deterministic id, distinct from the expiration rule's.
144
+ * S3 refuses `ExpiredObjectDeleteMarker` inside an `Expiration` that also
145
+ * carries `Days`, so the reclaim cannot be a field on that rule and needs an
146
+ * id to be found by.
147
+ *
148
+ * Throws: nothing.
149
+ *
150
+ * Guarantees: it is *less* injective than the first id rather than merely as
151
+ * injective. On top of the slug collisions that one already has,
152
+ * `buildMarkerRuleId('app/')` and `buildLifecycleRuleId('app-markers/')` are
153
+ * one id — a clash between two prefixes whose letters and digits differ, which
154
+ * the first id alone cannot produce. `ensureLifecycleRule` refuses to take
155
+ * over either id when a different prefix already holds it, and its refusal
156
+ * names the suffix so the remedy fits the case.
157
+ */
158
+ export declare function buildMarkerRuleId(prefix: string): string;
159
+ /**
160
+ * An adapter's default S3 key prefix.
161
+ *
162
+ * Accepts: `base` — the shared prefix, ending in `/`. `adapter` — the adapter's
163
+ * own segment.
164
+ *
165
+ * Returns: `base` + `adapter` + `/`, so three adapters sharing one bucket write
166
+ * under three paths and one adapter's lifecycle rule never sweeps another's
167
+ * objects.
168
+ *
169
+ * Throws: nothing.
170
+ */
171
+ export declare function defaultAdapterKeyPrefix(base: string, adapter: string): string;
172
+ /**
173
+ * The path every key built from `parts` shares.
174
+ *
175
+ * Accepts: `prefix` — the configured key prefix, ending in `/`. `parts` —
176
+ * the row's identifiers; `[]` yields the prefix alone.
177
+ *
178
+ * Returns: the prefix plus the encoded parts joined by `/`, carrying neither
179
+ * `.bin` nor a trailing `/`.
180
+ *
181
+ * Throws: nothing.
182
+ */
183
+ export declare function s3KeyScope(prefix: string, parts: readonly string[]): string;
184
+ /**
185
+ * Whether `key` lies inside the path `parts` produce.
186
+ *
187
+ * Accepts: `key` — a key read back from a row, or one this package built.
188
+ * `parts` — the row's leading identifiers; `[]` degrades to a prefix-only
189
+ * check.
190
+ *
191
+ * Returns: true when the key continues below the scope (`<scope>/…`, which is
192
+ * every key this release writes, since the write's object id is one segment
193
+ * deeper) or equals it (`<scope>.bin`, the key of a store item offloaded by a
194
+ * release that gave the key no per-write segment).
195
+ *
196
+ * Throws: nothing.
197
+ *
198
+ * Guarantees: an identifier sharing a leading substring with another (`t` and
199
+ * `t1`) never matches its scope — the parts are base64url-encoded and joined
200
+ * by `/`, so the comparison is segment-wise, not textual.
201
+ */
202
+ export declare function isKeyInScope(key: string, prefix: string, parts: readonly string[]): boolean;
203
+ /**
204
+ * Refuse a row-sourced `s3Key` outside the path the row's own identifiers
205
+ * produce.
206
+ *
207
+ * Accepts: as {@link isKeyInScope}.
208
+ *
209
+ * Returns: nothing: `key` is kept under its declared type, and this checks it
210
+ * against the scope `prefix` and `parts` compose.
211
+ *
212
+ * Throws: `VALIDATION` naming `s3Key`, quoting the key and the path the
213
+ * row may reference, each bounded by {@link truncateForLog}: the key comes off
214
+ * the row and the path is composed from an `s3.keyPrefix` checked for shape
215
+ * and never for length, so neither is bounded by anything this package ran.
216
+ * The key stays named — a bounded prefix still says which object to go and
217
+ * look at. It reaches the caller on all three adapters, including
218
+ * `history.getMessages` under `onCorruptMessage: 'skip'`, because
219
+ * `isPermanentPayloadLoss` does **not** classify it — an out-of-scope key is
220
+ * not the same kind of thing as an unreadable descriptor. An unreadable
221
+ * descriptor condemns the payload itself: nobody can read those bytes, so
222
+ * skipping the row loses nothing that was ever retrievable. An out-of-scope
223
+ * key says only that *this* reader may not follow it — the object is very
224
+ * likely intact, under the prefix that does own it — and what produced it is a
225
+ * `keyPrefix` pointed at the wrong place, a table shared with another tenant,
226
+ * or a planted row. Every one of those is a condition an operator must see and
227
+ * can fix. Classifying it as loss made only `history` answer with a silently
228
+ * shorter conversation — the one adapter that consults the classifier — which
229
+ * the chain then re-persisted as the truth, while the store and the saver
230
+ * raised on the same row. A short answer is the one failure a caller cannot
231
+ * detect, and one row shape must not mean two things across three adapters.
232
+ *
233
+ * Guarantees: a row is trusted for its shape, never for the object it points
234
+ * at. A writer able to place one row in a partition cannot make this library
235
+ * download or delete another tenant's object, nor make it quietly return less.
236
+ */
237
+ export declare function assertKeyInScope(key: string, prefix: string, parts: readonly string[]): void;
238
+ /** The adapters that share one bucket, each under its own default key prefix. */
239
+ export type AdapterName = 'checkpointer' | 'store' | 'history';
240
+ /**
241
+ * An adapter's `s3` option resolved into the offloader's configuration.
242
+ *
243
+ * Accepts: `s3` — as the caller gave it. `adapter` — names the default key
244
+ * prefix, so three adapters sharing one bucket do not share a path.
245
+ * `clientConfig` — the adapter's DynamoDB client config, read for its region
246
+ * only.
247
+ *
248
+ * Returns: `s3` with `keyPrefix` defaulted to the adapter's own path, and
249
+ * `clientConfig.region` filled in from the DynamoDB side when the S3 config
250
+ * names none. With no region on either side the field is left absent and the
251
+ * SDK resolves it from the environment.
252
+ *
253
+ * Throws: nothing.
254
+ *
255
+ * Guarantees: a bucket reachable only through the region the DynamoDB side was
256
+ * configured with is addressed in that region. The S3 SDK does not follow
257
+ * region redirects, so such a bucket otherwise failed with an opaque
258
+ * `PermanentRedirect` on the first offload.
259
+ */
260
+ export declare function offloaderConfigFor(s3: S3OffloadConfig, adapter: AdapterName, clientConfig?: DynamoDBClientConfig): S3OffloadConfig;
@@ -0,0 +1,79 @@
1
+ import { validationError } from '../../errors/errors.js';
2
+ import { truncateForLog } from '../../logging/truncate.js';
3
+ import { assertNoControlChars, assertWellFormed } from '../../validation/primitives.js';
4
+ import { s3ClientOptions } from './client-types.js';
5
+ export const DEFAULT_S3_KEY_PREFIX = 'langgraph-checkpoints/';
6
+ export const MAX_S3_KEY_BYTES = 1024;
7
+ export function encodeKeyPart(part) {
8
+ return Buffer.from(part, 'utf8').toString('base64url');
9
+ }
10
+ export function buildS3Key(prefix, parts, objectId) {
11
+ if (parts.length === 0) {
12
+ throw validationError('an offloaded object needs the identity of the row that points at it; parts was empty', 's3Key');
13
+ }
14
+ const encoded = [...parts.map(encodeKeyPart), objectId];
15
+ const key = `${prefix}${encoded.join('/')}.bin`;
16
+ const bytes = Buffer.byteLength(key, 'utf8');
17
+ if (bytes > MAX_S3_KEY_BYTES) {
18
+ throw validationError(`the offloaded S3 object key would be ${bytes} bytes; S3 caps keys at ` +
19
+ `${MAX_S3_KEY_BYTES} — shorten the identifiers or the keyPrefix`, 's3Key');
20
+ }
21
+ return key;
22
+ }
23
+ const UNSCOPED_SEGMENTS = new Set(['', '.', '..']);
24
+ export function assertScopedKeyPrefix(keyPrefix) {
25
+ if (typeof keyPrefix !== 'string' ||
26
+ keyPrefix === '' ||
27
+ keyPrefix === '/' ||
28
+ !keyPrefix.endsWith('/')) {
29
+ throw validationError('s3.keyPrefix must be a non-empty path that ends with "/" (for example "langgraph/"): ' +
30
+ 'it scopes both the offloaded objects and the S3 lifecycle rule', 's3.keyPrefix');
31
+ }
32
+ assertNoControlChars(keyPrefix, 's3.keyPrefix');
33
+ assertWellFormed(keyPrefix, 's3.keyPrefix');
34
+ if (keyPrefix
35
+ .slice(0, -1)
36
+ .split('/')
37
+ .some((segment) => UNSCOPED_SEGMENTS.has(segment))) {
38
+ throw validationError('s3.keyPrefix must name a real path: no empty, "." or ".." segment (for example ' +
39
+ '"langgraph/", not "../langgraph/" or "/langgraph/"). Such a prefix addresses object ' +
40
+ 'keys outside the path the IAM policy grants and the lifecycle rule sweeps', 's3.keyPrefix');
41
+ }
42
+ }
43
+ export function buildLifecycleRuleId(prefix) {
44
+ let trimmed = prefix;
45
+ while (trimmed.endsWith('/'))
46
+ trimmed = trimmed.slice(0, -1);
47
+ const slug = trimmed.replace(/[^a-zA-Z0-9-]/g, '-') || 'default';
48
+ return `langgraph-ttl-${slug}`;
49
+ }
50
+ export function buildMarkerRuleId(prefix) {
51
+ return `${buildLifecycleRuleId(prefix)}-markers`;
52
+ }
53
+ export function defaultAdapterKeyPrefix(base, adapter) {
54
+ return `${base}${adapter}/`;
55
+ }
56
+ export function s3KeyScope(prefix, parts) {
57
+ return `${prefix}${parts.map(encodeKeyPart).join('/')}`;
58
+ }
59
+ export function isKeyInScope(key, prefix, parts) {
60
+ const scope = s3KeyScope(prefix, parts);
61
+ if (parts.length === 0)
62
+ return key.startsWith(scope);
63
+ return key === `${scope}.bin` || key.startsWith(`${scope}/`);
64
+ }
65
+ export function assertKeyInScope(key, prefix, parts) {
66
+ if (isKeyInScope(key, prefix, parts))
67
+ return;
68
+ throw validationError(`s3Key "${truncateForLog(key)}" lies outside the S3 path this row may reference ` +
69
+ `("${truncateForLog(s3KeyScope(prefix, parts))}"); refusing to touch an object the row ` +
70
+ 'does not own', 's3Key');
71
+ }
72
+ export function offloaderConfigFor(s3, adapter, clientConfig) {
73
+ const region = s3ClientOptions(s3.clientConfig).region ?? clientConfig?.region;
74
+ return {
75
+ ...s3,
76
+ keyPrefix: s3.keyPrefix ?? defaultAdapterKeyPrefix(DEFAULT_S3_KEY_PREFIX, adapter),
77
+ ...(region === undefined ? {} : { clientConfig: { ...s3.clientConfig, region } }),
78
+ };
79
+ }