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

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 (512) hide show
  1. package/README.md +1720 -154
  2. package/dist/backfill/backfill.d.ts +168 -0
  3. package/dist/backfill/backfill.js +393 -0
  4. package/dist/checkpointer/actions/delete-thread.d.ts +47 -6
  5. package/dist/checkpointer/actions/delete-thread.js +58 -21
  6. package/dist/checkpointer/actions/get-tuple.d.ts +29 -4
  7. package/dist/checkpointer/actions/get-tuple.js +44 -10
  8. package/dist/checkpointer/actions/list.d.ts +46 -4
  9. package/dist/checkpointer/actions/list.js +121 -66
  10. package/dist/checkpointer/actions/put-writes.d.ts +41 -9
  11. package/dist/checkpointer/actions/put-writes.js +62 -77
  12. package/dist/checkpointer/actions/put.d.ts +83 -4
  13. package/dist/checkpointer/actions/put.js +177 -25
  14. package/dist/checkpointer/internal/delta-history.d.ts +112 -0
  15. package/dist/checkpointer/internal/delta-history.js +252 -0
  16. package/dist/checkpointer/internal/listing.d.ts +149 -0
  17. package/dist/checkpointer/internal/listing.js +245 -0
  18. package/dist/checkpointer/internal/parse.d.ts +262 -0
  19. package/dist/checkpointer/internal/parse.js +372 -0
  20. package/dist/checkpointer/internal/pending-writes.d.ts +275 -0
  21. package/dist/checkpointer/internal/pending-writes.js +588 -0
  22. package/dist/checkpointer/internal/read.d.ts +130 -0
  23. package/dist/checkpointer/internal/read.js +264 -0
  24. package/dist/checkpointer/internal/rows.d.ts +571 -0
  25. package/dist/checkpointer/internal/rows.js +834 -0
  26. package/dist/checkpointer/internal/setup.d.ts +42 -19
  27. package/dist/checkpointer/internal/setup.js +65 -29
  28. package/dist/checkpointer/saver.d.ts +256 -16
  29. package/dist/checkpointer/saver.js +275 -29
  30. package/dist/checkpointer/types.d.ts +39 -39
  31. package/dist/checkpointer/types.js +10 -1
  32. package/dist/factory/factory.d.ts +134 -28
  33. package/dist/factory/factory.js +240 -21
  34. package/dist/factory/types.d.ts +76 -0
  35. package/dist/factory/types.js +10 -0
  36. package/dist/history/actions/add-messages.d.ts +31 -4
  37. package/dist/history/actions/add-messages.js +38 -58
  38. package/dist/history/actions/clear.d.ts +49 -6
  39. package/dist/history/actions/clear.js +66 -14
  40. package/dist/history/actions/get-messages.d.ts +54 -6
  41. package/dist/history/actions/get-messages.js +126 -43
  42. package/dist/history/actions/list-sessions.d.ts +52 -10
  43. package/dist/history/actions/list-sessions.js +139 -40
  44. package/dist/history/actions/reconcile-count.d.ts +42 -10
  45. package/dist/history/actions/reconcile-count.js +45 -45
  46. package/dist/history/chat-message-history.d.ts +220 -33
  47. package/dist/history/chat-message-history.js +240 -43
  48. package/dist/history/internal/append.d.ts +212 -0
  49. package/dist/history/internal/append.js +500 -0
  50. package/dist/history/internal/message-read.d.ts +84 -0
  51. package/dist/history/internal/message-read.js +204 -0
  52. package/dist/history/internal/parse.d.ts +153 -0
  53. package/dist/history/internal/parse.js +252 -0
  54. package/dist/history/internal/rows.d.ts +195 -0
  55. package/dist/history/internal/rows.js +250 -0
  56. package/dist/history/internal/session.d.ts +331 -0
  57. package/dist/history/internal/session.js +628 -0
  58. package/dist/history/internal/setup.d.ts +52 -17
  59. package/dist/history/internal/setup.js +92 -21
  60. package/dist/history/session-adapter.d.ts +102 -7
  61. package/dist/history/session-adapter.js +103 -9
  62. package/dist/history/types.d.ts +80 -29
  63. package/dist/history/types.js +10 -1
  64. package/dist/index.d.ts +42 -11
  65. package/dist/index.js +33 -12
  66. package/dist/shared/adapter.d.ts +135 -0
  67. package/dist/shared/adapter.js +143 -0
  68. package/dist/shared/clock.d.ts +51 -2
  69. package/dist/shared/clock.js +57 -2
  70. package/dist/shared/codec/codec.d.ts +288 -13
  71. package/dist/shared/codec/codec.js +416 -19
  72. package/dist/shared/codec/compression.d.ts +43 -7
  73. package/dist/shared/codec/compression.js +53 -13
  74. package/dist/shared/codec/json-serde.d.ts +76 -4
  75. package/dist/shared/codec/json-serde.js +181 -8
  76. package/dist/shared/codec/s3/client-types.d.ts +53 -0
  77. package/dist/shared/codec/s3/client-types.js +26 -0
  78. package/dist/shared/codec/s3/client.d.ts +43 -10
  79. package/dist/shared/codec/s3/client.js +82 -9
  80. package/dist/shared/codec/s3/config.d.ts +242 -11
  81. package/dist/shared/codec/s3/config.js +293 -11
  82. package/dist/shared/codec/s3/lifecycle.d.ts +164 -6
  83. package/dist/shared/codec/s3/lifecycle.js +335 -27
  84. package/dist/shared/codec/s3/offloader.d.ts +393 -18
  85. package/dist/shared/codec/s3/offloader.js +595 -37
  86. package/dist/shared/concurrency.d.ts +43 -0
  87. package/dist/shared/concurrency.js +78 -0
  88. package/dist/shared/dynamodb/abort.d.ts +47 -0
  89. package/dist/shared/dynamodb/abort.js +59 -0
  90. package/dist/shared/dynamodb/batch-write.d.ts +77 -14
  91. package/dist/shared/dynamodb/batch-write.js +146 -27
  92. package/dist/shared/dynamodb/cancellation.d.ts +121 -4
  93. package/dist/shared/dynamodb/cancellation.js +147 -3
  94. package/dist/shared/dynamodb/client.d.ts +162 -8
  95. package/dist/shared/dynamodb/client.js +153 -5
  96. package/dist/shared/dynamodb/idempotent-write.d.ts +551 -0
  97. package/dist/shared/dynamodb/idempotent-write.js +593 -0
  98. package/dist/shared/dynamodb/paginate.d.ts +105 -9
  99. package/dist/shared/dynamodb/paginate.js +175 -7
  100. package/dist/shared/dynamodb/partition-delete.d.ts +185 -14
  101. package/dist/shared/dynamodb/partition-delete.js +314 -44
  102. package/dist/shared/dynamodb/recency-index.d.ts +231 -0
  103. package/dist/shared/dynamodb/recency-index.js +377 -0
  104. package/dist/shared/dynamodb/retry.d.ts +276 -8
  105. package/dist/shared/dynamodb/retry.js +433 -23
  106. package/dist/shared/dynamodb/table-schema.d.ts +190 -0
  107. package/dist/shared/dynamodb/table-schema.js +209 -0
  108. package/dist/shared/errors/base-error.d.ts +184 -10
  109. package/dist/shared/errors/base-error.js +160 -14
  110. package/dist/shared/errors/boundary.d.ts +71 -0
  111. package/dist/shared/errors/boundary.js +143 -0
  112. package/dist/shared/errors/classify.d.ts +97 -0
  113. package/dist/shared/errors/classify.js +257 -0
  114. package/dist/shared/errors/error-code.d.ts +77 -2
  115. package/dist/shared/errors/error-code.js +83 -1
  116. package/dist/shared/errors/errors.d.ts +158 -59
  117. package/dist/shared/errors/errors.js +219 -92
  118. package/dist/shared/logging/logger.d.ts +69 -3
  119. package/dist/shared/logging/logger.js +97 -3
  120. package/dist/shared/logging/redaction.d.ts +92 -8
  121. package/dist/shared/logging/redaction.js +273 -17
  122. package/dist/shared/logging/secret-patterns.d.ts +149 -19
  123. package/dist/shared/logging/secret-patterns.js +188 -27
  124. package/dist/shared/logging/truncate.d.ts +197 -0
  125. package/dist/shared/logging/truncate.js +231 -0
  126. package/dist/shared/options.d.ts +59 -7
  127. package/dist/shared/options.js +9 -1
  128. package/dist/shared/ulid.d.ts +77 -7
  129. package/dist/shared/ulid.js +103 -8
  130. package/dist/shared/validation/collaborators.d.ts +141 -0
  131. package/dist/shared/validation/collaborators.js +188 -0
  132. package/dist/shared/validation/option-shape.d.ts +89 -0
  133. package/dist/shared/validation/option-shape.js +113 -0
  134. package/dist/shared/validation/options.d.ts +145 -0
  135. package/dist/shared/validation/options.js +328 -0
  136. package/dist/shared/validation/primitives.d.ts +288 -21
  137. package/dist/shared/validation/primitives.js +353 -50
  138. package/dist/shared/validation/ttl.d.ts +66 -10
  139. package/dist/shared/validation/ttl.js +113 -15
  140. package/dist/store/actions/list-namespaces.d.ts +76 -6
  141. package/dist/store/actions/list-namespaces.js +166 -24
  142. package/dist/store/actions/put.d.ts +33 -8
  143. package/dist/store/actions/put.js +53 -60
  144. package/dist/store/actions/reconcile-vector-index.d.ts +31 -10
  145. package/dist/store/actions/reconcile-vector-index.js +34 -15
  146. package/dist/store/actions/search.d.ts +34 -6
  147. package/dist/store/actions/search.js +56 -51
  148. package/dist/store/internal/batch-plan.d.ts +26 -0
  149. package/dist/store/internal/batch-plan.js +109 -0
  150. package/dist/store/internal/filter.d.ts +36 -3
  151. package/dist/store/internal/filter.js +66 -15
  152. package/dist/store/internal/get-item.d.ts +45 -0
  153. package/dist/store/internal/get-item.js +115 -0
  154. package/dist/store/internal/item-write.d.ts +230 -0
  155. package/dist/store/internal/item-write.js +463 -0
  156. package/dist/store/internal/parse.d.ts +225 -0
  157. package/dist/store/internal/parse.js +350 -0
  158. package/dist/store/internal/rows.d.ts +355 -0
  159. package/dist/store/internal/rows.js +447 -0
  160. package/dist/store/internal/semantic-search.d.ts +161 -6
  161. package/dist/store/internal/semantic-search.js +360 -18
  162. package/dist/store/internal/setup.d.ts +77 -20
  163. package/dist/store/internal/setup.js +178 -47
  164. package/dist/store/internal/table-search.d.ts +100 -0
  165. package/dist/store/internal/table-search.js +213 -0
  166. package/dist/store/internal/vector-index.d.ts +247 -0
  167. package/dist/store/internal/vector-index.js +546 -0
  168. package/dist/store/store.d.ts +270 -17
  169. package/dist/store/store.js +329 -38
  170. package/dist/store/types.d.ts +76 -26
  171. package/dist/store/types.js +13 -1
  172. package/dist/store/vector-backend.d.ts +64 -4
  173. package/dist/store/vector-backend.js +15 -1
  174. package/package.json +58 -36
  175. package/dist/checkpointer/actions/delete-thread.d.ts.map +0 -1
  176. package/dist/checkpointer/actions/delete-thread.js.map +0 -1
  177. package/dist/checkpointer/actions/get-tuple.d.ts.map +0 -1
  178. package/dist/checkpointer/actions/get-tuple.js.map +0 -1
  179. package/dist/checkpointer/actions/list.d.ts.map +0 -1
  180. package/dist/checkpointer/actions/list.js.map +0 -1
  181. package/dist/checkpointer/actions/put-writes.d.ts.map +0 -1
  182. package/dist/checkpointer/actions/put-writes.js.map +0 -1
  183. package/dist/checkpointer/actions/put.d.ts.map +0 -1
  184. package/dist/checkpointer/actions/put.js.map +0 -1
  185. package/dist/checkpointer/internal/assemble.d.ts +0 -10
  186. package/dist/checkpointer/internal/assemble.d.ts.map +0 -1
  187. package/dist/checkpointer/internal/assemble.js +0 -37
  188. package/dist/checkpointer/internal/assemble.js.map +0 -1
  189. package/dist/checkpointer/internal/configurable.d.ts +0 -13
  190. package/dist/checkpointer/internal/configurable.d.ts.map +0 -1
  191. package/dist/checkpointer/internal/configurable.js +0 -23
  192. package/dist/checkpointer/internal/configurable.js.map +0 -1
  193. package/dist/checkpointer/internal/fetch.d.ts +0 -10
  194. package/dist/checkpointer/internal/fetch.d.ts.map +0 -1
  195. package/dist/checkpointer/internal/fetch.js +0 -46
  196. package/dist/checkpointer/internal/fetch.js.map +0 -1
  197. package/dist/checkpointer/internal/filter-match.d.ts +0 -12
  198. package/dist/checkpointer/internal/filter-match.d.ts.map +0 -1
  199. package/dist/checkpointer/internal/filter-match.js +0 -14
  200. package/dist/checkpointer/internal/filter-match.js.map +0 -1
  201. package/dist/checkpointer/internal/item-reader.d.ts +0 -55
  202. package/dist/checkpointer/internal/item-reader.d.ts.map +0 -1
  203. package/dist/checkpointer/internal/item-reader.js +0 -88
  204. package/dist/checkpointer/internal/item-reader.js.map +0 -1
  205. package/dist/checkpointer/internal/item-writer.d.ts +0 -26
  206. package/dist/checkpointer/internal/item-writer.d.ts.map +0 -1
  207. package/dist/checkpointer/internal/item-writer.js +0 -92
  208. package/dist/checkpointer/internal/item-writer.js.map +0 -1
  209. package/dist/checkpointer/internal/keys.d.ts +0 -31
  210. package/dist/checkpointer/internal/keys.d.ts.map +0 -1
  211. package/dist/checkpointer/internal/keys.js +0 -87
  212. package/dist/checkpointer/internal/keys.js.map +0 -1
  213. package/dist/checkpointer/internal/query.d.ts +0 -20
  214. package/dist/checkpointer/internal/query.d.ts.map +0 -1
  215. package/dist/checkpointer/internal/query.js +0 -36
  216. package/dist/checkpointer/internal/query.js.map +0 -1
  217. package/dist/checkpointer/internal/setup.d.ts.map +0 -1
  218. package/dist/checkpointer/internal/setup.js.map +0 -1
  219. package/dist/checkpointer/internal/special-write-cas.d.ts +0 -30
  220. package/dist/checkpointer/internal/special-write-cas.d.ts.map +0 -1
  221. package/dist/checkpointer/internal/special-write-cas.js +0 -104
  222. package/dist/checkpointer/internal/special-write-cas.js.map +0 -1
  223. package/dist/checkpointer/internal/special-write-cleanup.d.ts +0 -24
  224. package/dist/checkpointer/internal/special-write-cleanup.d.ts.map +0 -1
  225. package/dist/checkpointer/internal/special-write-cleanup.js +0 -47
  226. package/dist/checkpointer/internal/special-write-cleanup.js.map +0 -1
  227. package/dist/checkpointer/internal/special-write-verify.d.ts +0 -54
  228. package/dist/checkpointer/internal/special-write-verify.d.ts.map +0 -1
  229. package/dist/checkpointer/internal/special-write-verify.js +0 -65
  230. package/dist/checkpointer/internal/special-write-verify.js.map +0 -1
  231. package/dist/checkpointer/internal/validation.d.ts +0 -13
  232. package/dist/checkpointer/internal/validation.d.ts.map +0 -1
  233. package/dist/checkpointer/internal/validation.js +0 -30
  234. package/dist/checkpointer/internal/validation.js.map +0 -1
  235. package/dist/checkpointer/internal/write-guard.d.ts +0 -13
  236. package/dist/checkpointer/internal/write-guard.d.ts.map +0 -1
  237. package/dist/checkpointer/internal/write-guard.js +0 -39
  238. package/dist/checkpointer/internal/write-guard.js.map +0 -1
  239. package/dist/checkpointer/internal/write-index.d.ts +0 -37
  240. package/dist/checkpointer/internal/write-index.d.ts.map +0 -1
  241. package/dist/checkpointer/internal/write-index.js +0 -42
  242. package/dist/checkpointer/internal/write-index.js.map +0 -1
  243. package/dist/checkpointer/saver.d.ts.map +0 -1
  244. package/dist/checkpointer/saver.js.map +0 -1
  245. package/dist/checkpointer/types.d.ts.map +0 -1
  246. package/dist/checkpointer/types.js.map +0 -1
  247. package/dist/factory/factory.d.ts.map +0 -1
  248. package/dist/factory/factory.js.map +0 -1
  249. package/dist/history/actions/add-messages.d.ts.map +0 -1
  250. package/dist/history/actions/add-messages.js.map +0 -1
  251. package/dist/history/actions/clear.d.ts.map +0 -1
  252. package/dist/history/actions/clear.js.map +0 -1
  253. package/dist/history/actions/get-messages.d.ts.map +0 -1
  254. package/dist/history/actions/get-messages.js.map +0 -1
  255. package/dist/history/actions/list-sessions.d.ts.map +0 -1
  256. package/dist/history/actions/list-sessions.js.map +0 -1
  257. package/dist/history/actions/reconcile-count.d.ts.map +0 -1
  258. package/dist/history/actions/reconcile-count.js.map +0 -1
  259. package/dist/history/chat-message-history.d.ts.map +0 -1
  260. package/dist/history/chat-message-history.js.map +0 -1
  261. package/dist/history/internal/append-saga.d.ts +0 -20
  262. package/dist/history/internal/append-saga.d.ts.map +0 -1
  263. package/dist/history/internal/append-saga.js +0 -35
  264. package/dist/history/internal/append-saga.js.map +0 -1
  265. package/dist/history/internal/compensation.d.ts +0 -21
  266. package/dist/history/internal/compensation.d.ts.map +0 -1
  267. package/dist/history/internal/compensation.js +0 -84
  268. package/dist/history/internal/compensation.js.map +0 -1
  269. package/dist/history/internal/item-mapper.d.ts +0 -12
  270. package/dist/history/internal/item-mapper.d.ts.map +0 -1
  271. package/dist/history/internal/item-mapper.js +0 -33
  272. package/dist/history/internal/item-mapper.js.map +0 -1
  273. package/dist/history/internal/keys.d.ts +0 -17
  274. package/dist/history/internal/keys.d.ts.map +0 -1
  275. package/dist/history/internal/keys.js +0 -49
  276. package/dist/history/internal/keys.js.map +0 -1
  277. package/dist/history/internal/message-chunker.d.ts +0 -14
  278. package/dist/history/internal/message-chunker.d.ts.map +0 -1
  279. package/dist/history/internal/message-chunker.js +0 -68
  280. package/dist/history/internal/message-chunker.js.map +0 -1
  281. package/dist/history/internal/message-transaction.d.ts +0 -26
  282. package/dist/history/internal/message-transaction.d.ts.map +0 -1
  283. package/dist/history/internal/message-transaction.js +0 -60
  284. package/dist/history/internal/message-transaction.js.map +0 -1
  285. package/dist/history/internal/query.d.ts +0 -10
  286. package/dist/history/internal/query.d.ts.map +0 -1
  287. package/dist/history/internal/query.js +0 -31
  288. package/dist/history/internal/query.js.map +0 -1
  289. package/dist/history/internal/session-count.d.ts +0 -41
  290. package/dist/history/internal/session-count.d.ts.map +0 -1
  291. package/dist/history/internal/session-count.js +0 -109
  292. package/dist/history/internal/session-count.js.map +0 -1
  293. package/dist/history/internal/session-title.d.ts +0 -20
  294. package/dist/history/internal/session-title.d.ts.map +0 -1
  295. package/dist/history/internal/session-title.js +0 -44
  296. package/dist/history/internal/session-title.js.map +0 -1
  297. package/dist/history/internal/session-update.d.ts +0 -28
  298. package/dist/history/internal/session-update.d.ts.map +0 -1
  299. package/dist/history/internal/session-update.js +0 -70
  300. package/dist/history/internal/session-update.js.map +0 -1
  301. package/dist/history/internal/setup.d.ts.map +0 -1
  302. package/dist/history/internal/setup.js.map +0 -1
  303. package/dist/history/internal/title-generator.d.ts +0 -13
  304. package/dist/history/internal/title-generator.d.ts.map +0 -1
  305. package/dist/history/internal/title-generator.js +0 -25
  306. package/dist/history/internal/title-generator.js.map +0 -1
  307. package/dist/history/internal/ttl-anchor.d.ts +0 -25
  308. package/dist/history/internal/ttl-anchor.d.ts.map +0 -1
  309. package/dist/history/internal/ttl-anchor.js +0 -38
  310. package/dist/history/internal/ttl-anchor.js.map +0 -1
  311. package/dist/history/internal/validation.d.ts +0 -9
  312. package/dist/history/internal/validation.d.ts.map +0 -1
  313. package/dist/history/internal/validation.js +0 -16
  314. package/dist/history/internal/validation.js.map +0 -1
  315. package/dist/history/session-adapter.d.ts.map +0 -1
  316. package/dist/history/session-adapter.js.map +0 -1
  317. package/dist/history/types.d.ts.map +0 -1
  318. package/dist/history/types.js.map +0 -1
  319. package/dist/index.d.ts.map +0 -1
  320. package/dist/index.js.map +0 -1
  321. package/dist/shared/clock.d.ts.map +0 -1
  322. package/dist/shared/clock.js.map +0 -1
  323. package/dist/shared/codec/codec.d.ts.map +0 -1
  324. package/dist/shared/codec/codec.js.map +0 -1
  325. package/dist/shared/codec/compression.d.ts.map +0 -1
  326. package/dist/shared/codec/compression.js.map +0 -1
  327. package/dist/shared/codec/descriptor-keys.d.ts +0 -4
  328. package/dist/shared/codec/descriptor-keys.d.ts.map +0 -1
  329. package/dist/shared/codec/descriptor-keys.js +0 -14
  330. package/dist/shared/codec/descriptor-keys.js.map +0 -1
  331. package/dist/shared/codec/json-serde.d.ts.map +0 -1
  332. package/dist/shared/codec/json-serde.js.map +0 -1
  333. package/dist/shared/codec/s3/client.d.ts.map +0 -1
  334. package/dist/shared/codec/s3/client.js.map +0 -1
  335. package/dist/shared/codec/s3/config.d.ts.map +0 -1
  336. package/dist/shared/codec/s3/config.js.map +0 -1
  337. package/dist/shared/codec/s3/delete.d.ts +0 -8
  338. package/dist/shared/codec/s3/delete.d.ts.map +0 -1
  339. package/dist/shared/codec/s3/delete.js +0 -29
  340. package/dist/shared/codec/s3/delete.js.map +0 -1
  341. package/dist/shared/codec/s3/lifecycle.d.ts.map +0 -1
  342. package/dist/shared/codec/s3/lifecycle.js.map +0 -1
  343. package/dist/shared/codec/s3/offloader.d.ts.map +0 -1
  344. package/dist/shared/codec/s3/offloader.js.map +0 -1
  345. package/dist/shared/codec/s3/orphans.d.ts +0 -18
  346. package/dist/shared/codec/s3/orphans.d.ts.map +0 -1
  347. package/dist/shared/codec/s3/orphans.js +0 -58
  348. package/dist/shared/codec/s3/orphans.js.map +0 -1
  349. package/dist/shared/codec/s3/read-write.d.ts +0 -14
  350. package/dist/shared/codec/s3/read-write.d.ts.map +0 -1
  351. package/dist/shared/codec/s3/read-write.js +0 -43
  352. package/dist/shared/codec/s3/read-write.js.map +0 -1
  353. package/dist/shared/codec/s3/retry.d.ts +0 -5
  354. package/dist/shared/codec/s3/retry.d.ts.map +0 -1
  355. package/dist/shared/codec/s3/retry.js +0 -25
  356. package/dist/shared/codec/s3/retry.js.map +0 -1
  357. package/dist/shared/constants.d.ts +0 -64
  358. package/dist/shared/constants.d.ts.map +0 -1
  359. package/dist/shared/constants.js +0 -67
  360. package/dist/shared/constants.js.map +0 -1
  361. package/dist/shared/dynamodb/backoff.d.ts +0 -15
  362. package/dist/shared/dynamodb/backoff.d.ts.map +0 -1
  363. package/dist/shared/dynamodb/backoff.js +0 -48
  364. package/dist/shared/dynamodb/backoff.js.map +0 -1
  365. package/dist/shared/dynamodb/batch-write.d.ts.map +0 -1
  366. package/dist/shared/dynamodb/batch-write.js.map +0 -1
  367. package/dist/shared/dynamodb/cancellation.d.ts.map +0 -1
  368. package/dist/shared/dynamodb/cancellation.js.map +0 -1
  369. package/dist/shared/dynamodb/client.d.ts.map +0 -1
  370. package/dist/shared/dynamodb/client.js.map +0 -1
  371. package/dist/shared/dynamodb/conditional-put.d.ts +0 -51
  372. package/dist/shared/dynamodb/conditional-put.d.ts.map +0 -1
  373. package/dist/shared/dynamodb/conditional-put.js +0 -59
  374. package/dist/shared/dynamodb/conditional-put.js.map +0 -1
  375. package/dist/shared/dynamodb/drain-unprocessed.d.ts +0 -19
  376. package/dist/shared/dynamodb/drain-unprocessed.d.ts.map +0 -1
  377. package/dist/shared/dynamodb/drain-unprocessed.js +0 -44
  378. package/dist/shared/dynamodb/drain-unprocessed.js.map +0 -1
  379. package/dist/shared/dynamodb/paginate-core.d.ts +0 -22
  380. package/dist/shared/dynamodb/paginate-core.d.ts.map +0 -1
  381. package/dist/shared/dynamodb/paginate-core.js +0 -52
  382. package/dist/shared/dynamodb/paginate-core.js.map +0 -1
  383. package/dist/shared/dynamodb/paginate.d.ts.map +0 -1
  384. package/dist/shared/dynamodb/paginate.js.map +0 -1
  385. package/dist/shared/dynamodb/partition-delete.d.ts.map +0 -1
  386. package/dist/shared/dynamodb/partition-delete.js.map +0 -1
  387. package/dist/shared/dynamodb/retry-classifier.d.ts +0 -9
  388. package/dist/shared/dynamodb/retry-classifier.d.ts.map +0 -1
  389. package/dist/shared/dynamodb/retry-classifier.js +0 -87
  390. package/dist/shared/dynamodb/retry-classifier.js.map +0 -1
  391. package/dist/shared/dynamodb/retry.d.ts.map +0 -1
  392. package/dist/shared/dynamodb/retry.js.map +0 -1
  393. package/dist/shared/dynamodb/scan.d.ts +0 -15
  394. package/dist/shared/dynamodb/scan.d.ts.map +0 -1
  395. package/dist/shared/dynamodb/scan.js +0 -20
  396. package/dist/shared/dynamodb/scan.js.map +0 -1
  397. package/dist/shared/dynamodb/types.d.ts +0 -24
  398. package/dist/shared/dynamodb/types.d.ts.map +0 -1
  399. package/dist/shared/dynamodb/types.js +0 -3
  400. package/dist/shared/dynamodb/types.js.map +0 -1
  401. package/dist/shared/errors/base-error.d.ts.map +0 -1
  402. package/dist/shared/errors/base-error.js.map +0 -1
  403. package/dist/shared/errors/error-code.d.ts.map +0 -1
  404. package/dist/shared/errors/error-code.js.map +0 -1
  405. package/dist/shared/errors/errors.d.ts.map +0 -1
  406. package/dist/shared/errors/errors.js.map +0 -1
  407. package/dist/shared/errors/wrap-error.d.ts +0 -16
  408. package/dist/shared/errors/wrap-error.d.ts.map +0 -1
  409. package/dist/shared/errors/wrap-error.js +0 -30
  410. package/dist/shared/errors/wrap-error.js.map +0 -1
  411. package/dist/shared/logging/logger.d.ts.map +0 -1
  412. package/dist/shared/logging/logger.js.map +0 -1
  413. package/dist/shared/logging/redaction-walk.d.ts +0 -23
  414. package/dist/shared/logging/redaction-walk.d.ts.map +0 -1
  415. package/dist/shared/logging/redaction-walk.js +0 -92
  416. package/dist/shared/logging/redaction-walk.js.map +0 -1
  417. package/dist/shared/logging/redaction.d.ts.map +0 -1
  418. package/dist/shared/logging/redaction.js.map +0 -1
  419. package/dist/shared/logging/secret-patterns.d.ts.map +0 -1
  420. package/dist/shared/logging/secret-patterns.js.map +0 -1
  421. package/dist/shared/options.d.ts.map +0 -1
  422. package/dist/shared/options.js.map +0 -1
  423. package/dist/shared/ulid.d.ts.map +0 -1
  424. package/dist/shared/ulid.js.map +0 -1
  425. package/dist/shared/validation/primitives.d.ts.map +0 -1
  426. package/dist/shared/validation/primitives.js.map +0 -1
  427. package/dist/shared/validation/ttl.d.ts.map +0 -1
  428. package/dist/shared/validation/ttl.js.map +0 -1
  429. package/dist/store/actions/get.d.ts +0 -5
  430. package/dist/store/actions/get.d.ts.map +0 -1
  431. package/dist/store/actions/get.js +0 -35
  432. package/dist/store/actions/get.js.map +0 -1
  433. package/dist/store/actions/list-namespaces.d.ts.map +0 -1
  434. package/dist/store/actions/list-namespaces.js.map +0 -1
  435. package/dist/store/actions/put.d.ts.map +0 -1
  436. package/dist/store/actions/put.js.map +0 -1
  437. package/dist/store/actions/reconcile-vector-index.d.ts.map +0 -1
  438. package/dist/store/actions/reconcile-vector-index.js.map +0 -1
  439. package/dist/store/actions/search.d.ts.map +0 -1
  440. package/dist/store/actions/search.js.map +0 -1
  441. package/dist/store/internal/backend-search.d.ts +0 -5
  442. package/dist/store/internal/backend-search.d.ts.map +0 -1
  443. package/dist/store/internal/backend-search.js +0 -68
  444. package/dist/store/internal/backend-search.js.map +0 -1
  445. package/dist/store/internal/filter.d.ts.map +0 -1
  446. package/dist/store/internal/filter.js.map +0 -1
  447. package/dist/store/internal/index-reconcile.d.ts +0 -22
  448. package/dist/store/internal/index-reconcile.d.ts.map +0 -1
  449. package/dist/store/internal/index-reconcile.js +0 -105
  450. package/dist/store/internal/index-reconcile.js.map +0 -1
  451. package/dist/store/internal/index-sync.d.ts +0 -11
  452. package/dist/store/internal/index-sync.d.ts.map +0 -1
  453. package/dist/store/internal/index-sync.js +0 -26
  454. package/dist/store/internal/index-sync.js.map +0 -1
  455. package/dist/store/internal/item-mapper.d.ts +0 -25
  456. package/dist/store/internal/item-mapper.d.ts.map +0 -1
  457. package/dist/store/internal/item-mapper.js +0 -53
  458. package/dist/store/internal/item-mapper.js.map +0 -1
  459. package/dist/store/internal/keys.d.ts +0 -18
  460. package/dist/store/internal/keys.d.ts.map +0 -1
  461. package/dist/store/internal/keys.js +0 -42
  462. package/dist/store/internal/keys.js.map +0 -1
  463. package/dist/store/internal/namespace-match.d.ts +0 -12
  464. package/dist/store/internal/namespace-match.d.ts.map +0 -1
  465. package/dist/store/internal/namespace-match.js +0 -41
  466. package/dist/store/internal/namespace-match.js.map +0 -1
  467. package/dist/store/internal/overwrite-swap.d.ts +0 -33
  468. package/dist/store/internal/overwrite-swap.d.ts.map +0 -1
  469. package/dist/store/internal/overwrite-swap.js +0 -62
  470. package/dist/store/internal/overwrite-swap.js.map +0 -1
  471. package/dist/store/internal/persist.d.ts +0 -27
  472. package/dist/store/internal/persist.d.ts.map +0 -1
  473. package/dist/store/internal/persist.js +0 -59
  474. package/dist/store/internal/persist.js.map +0 -1
  475. package/dist/store/internal/query.d.ts +0 -6
  476. package/dist/store/internal/query.d.ts.map +0 -1
  477. package/dist/store/internal/query.js +0 -32
  478. package/dist/store/internal/query.js.map +0 -1
  479. package/dist/store/internal/ranker.d.ts +0 -13
  480. package/dist/store/internal/ranker.d.ts.map +0 -1
  481. package/dist/store/internal/ranker.js +0 -31
  482. package/dist/store/internal/ranker.js.map +0 -1
  483. package/dist/store/internal/read-existing.d.ts +0 -19
  484. package/dist/store/internal/read-existing.d.ts.map +0 -1
  485. package/dist/store/internal/read-existing.js +0 -29
  486. package/dist/store/internal/read-existing.js.map +0 -1
  487. package/dist/store/internal/score-direction.d.ts +0 -32
  488. package/dist/store/internal/score-direction.d.ts.map +0 -1
  489. package/dist/store/internal/score-direction.js +0 -39
  490. package/dist/store/internal/score-direction.js.map +0 -1
  491. package/dist/store/internal/search-filter.d.ts +0 -4
  492. package/dist/store/internal/search-filter.d.ts.map +0 -1
  493. package/dist/store/internal/search-filter.js +0 -11
  494. package/dist/store/internal/search-filter.js.map +0 -1
  495. package/dist/store/internal/semantic-search.d.ts.map +0 -1
  496. package/dist/store/internal/semantic-search.js.map +0 -1
  497. package/dist/store/internal/setup.d.ts.map +0 -1
  498. package/dist/store/internal/setup.js.map +0 -1
  499. package/dist/store/internal/validation.d.ts +0 -13
  500. package/dist/store/internal/validation.d.ts.map +0 -1
  501. package/dist/store/internal/validation.js +0 -35
  502. package/dist/store/internal/validation.js.map +0 -1
  503. package/dist/store/internal/write-verify.d.ts +0 -37
  504. package/dist/store/internal/write-verify.d.ts.map +0 -1
  505. package/dist/store/internal/write-verify.js +0 -68
  506. package/dist/store/internal/write-verify.js.map +0 -1
  507. package/dist/store/store.d.ts.map +0 -1
  508. package/dist/store/store.js.map +0 -1
  509. package/dist/store/types.d.ts.map +0 -1
  510. package/dist/store/types.js.map +0 -1
  511. package/dist/store/vector-backend.d.ts.map +0 -1
  512. package/dist/store/vector-backend.js.map +0 -1
@@ -0,0 +1,204 @@
1
+ "use strict";
2
+ /**
3
+ * Hides how a session's message key space is read.
4
+ *
5
+ * A read admits only rows this package wrote as a message of this session,
6
+ * refusing any other row in the key space rather than skipping it, treats an
7
+ * expired row as absent however long the sweep lags, walks newest-first when
8
+ * it wants the latest few and restores chronological order, and counts the
9
+ * rows the same way it reads them, so a repaired count is the number a read
10
+ * returns.
11
+ */
12
+ Object.defineProperty(exports, "__esModule", { value: true });
13
+ exports.readWindow = readWindow;
14
+ exports.countLiveMessages = countLiveMessages;
15
+ const clock_1 = require("../../shared/clock");
16
+ const paginate_1 = require("../../shared/dynamodb/paginate");
17
+ const retry_1 = require("../../shared/dynamodb/retry");
18
+ const table_schema_1 = require("../../shared/dynamodb/table-schema");
19
+ const errors_1 = require("../../shared/errors/errors");
20
+ const truncate_1 = require("../../shared/logging/truncate");
21
+ const ulid_1 = require("../../shared/ulid");
22
+ const rows_1 = require("./rows");
23
+ /**
24
+ * The row as one of this adapter's messages, or a refusal naming it.
25
+ *
26
+ * The version is checked first, so a row a newer release wrote is reported as
27
+ * newer rather than judged against attribute types it may no longer use. What
28
+ * survives that is narrowed rather than cast: a shared table's message key
29
+ * space is this adapter's, and a row in it is not necessarily.
30
+ *
31
+ * Reported and never dropped, whatever `onCorruptMessage` says. That policy
32
+ * exists for a payload no reader could recover, and a row this adapter cannot
33
+ * account for is not one — skipping it handed the caller a shorter
34
+ * conversation that `RunnableWithMessageHistory` then re-persists as the whole
35
+ * truth. The `warn` carries the sort key, cut like every other row-sourced
36
+ * one, because the error can only say that such a row exists and an operator
37
+ * has to go and look at it.
38
+ */
39
+ function parseSessionMessageRow(context, sessionId, raw) {
40
+ (0, table_schema_1.assertReadableRow)(raw, 'message');
41
+ const item = (0, rows_1.parseMessageRow)(raw);
42
+ if (item)
43
+ return item;
44
+ context.logger.warn('getMessages: refused a row that is not a chat message item', {
45
+ sessionId,
46
+ sortKey: (0, truncate_1.truncateForLog)(raw.SK),
47
+ });
48
+ throw (0, errors_1.validationError)('a row in the message key space of this session is not a chat message item this package ' +
49
+ 'wrote: its `sessionId` or `message` attribute is absent, is of the wrong type, or names ' +
50
+ 'another session. The `warn` logged alongside this names the row', 'message');
51
+ }
52
+ /**
53
+ * Read the live message items a window selects, in chronological order.
54
+ *
55
+ * Without `limit` the query walks the session oldest-first. With it the query
56
+ * walks newest-first with a matching page cap and stops as soon as `limit`
57
+ * live items are in hand — rows past their TTL are skipped here, so a page can
58
+ * come back short and the walk simply continues — and the tail is then
59
+ * reversed back into chronological order. `before` becomes an exclusive upper
60
+ * sort-key bound: the message prefix plus the ULID time characters of that
61
+ * instant, which every message id from that millisecond onwards sorts after.
62
+ *
63
+ * Accepts: `window.limit` — absent asks for the whole session, which is what
64
+ * `getMessages()` with no arguments means; otherwise at least 1, which is why
65
+ * no zero case is handled below. `parseMessageWindow` refuses `0` for its
66
+ * own reason, and that refusal is also what keeps `Limit: 0` — which DynamoDB
67
+ * rejects outright with a raw `ValidationException` — out of the query built
68
+ * here. `window.before` — already parsed as a real date. `signal` — aborts
69
+ * between pages.
70
+ *
71
+ * Returns: the live messages in chronological order, oldest first, whichever
72
+ * direction the query walked.
73
+ *
74
+ * Throws: `FORMAT_UNSUPPORTED` for a row a newer version wrote — checked before
75
+ * the row's ttl, so the answer does not depend on the reading machine's clock;
76
+ * `VALIDATION` naming `message` for a row in this session's message key
77
+ * space that this adapter did not write, checked before the ttl for the same
78
+ * reason; `ABORTED`; whatever the query throws.
79
+ *
80
+ * Guarantees: strongly consistent, so the turn just appended is visible to the
81
+ * very next read. An unlimited window is deliberately uncapped — silently
82
+ * truncating a conversation is worse than a slow read, and a caller that wants
83
+ * a bound passes `limit` — so past {@link LIST_SCAN_WARN_THRESHOLD} messages
84
+ * the read still succeeds and an operator is told the session is unusually
85
+ * large.
86
+ */
87
+ async function readWindow(context, sessionId, window, signal) {
88
+ const now = (0, clock_1.nowSeconds)();
89
+ const limit = window.limit ?? Number.POSITIVE_INFINITY;
90
+ const items = [];
91
+ for await (const raw of (0, paginate_1.paginateQuery)({
92
+ retry: (0, retry_1.retryFor)(context, signal),
93
+ signal,
94
+ client: context.client,
95
+ params: (0, rows_1.messageQuery)(context.tableName, sessionId, {
96
+ consistent: true,
97
+ descending: window.limit !== undefined,
98
+ limit: window.limit,
99
+ beforeSortKey: window.before && (0, rows_1.messageSortKey)((0, ulid_1.ulidTimePrefix)(window.before.getTime())),
100
+ }),
101
+ maxItems: Number.POSITIVE_INFINITY,
102
+ maxIterations: Number.POSITIVE_INFINITY,
103
+ })) {
104
+ // A message newer than this version reads, and a row that is not one of
105
+ // this adapter's at all, both fail loudly rather than vanishing from the
106
+ // window.
107
+ const item = parseSessionMessageRow(context, sessionId, raw);
108
+ if ((0, table_schema_1.isExpiredRow)(item, now))
109
+ continue;
110
+ items.push(item);
111
+ if (items.length >= limit)
112
+ break;
113
+ }
114
+ if (items.length >= paginate_1.LIST_SCAN_WARN_THRESHOLD) {
115
+ context.logger.warn('getMessages: a session holds very many messages; the read is complete but slow. Pass a ' +
116
+ '`limit` to read only the newest turns', { sessionId, messages: items.length });
117
+ }
118
+ return window.limit === undefined ? items : items.reverse();
119
+ }
120
+ /**
121
+ * The row as one of this session's messages, or a refusal naming it — the same
122
+ * test the read makes, on the same order: the version first, so a row a newer
123
+ * release wrote is reported as newer rather than judged against attribute
124
+ * types it may no longer use.
125
+ *
126
+ * The count is a definition rather than a tally, and the definition is "what
127
+ * `getMessages` would return". A row in the message key space that this
128
+ * adapter did not write makes that read refuse the whole session, so counting
129
+ * it would write a repaired `messageCount` back onto a session no reader can
130
+ * open — a number that is not merely stale but describes nothing. The repair
131
+ * refuses instead, and the read's own `warn` is what names the row.
132
+ */
133
+ function parseCountableRow(raw, sessionId) {
134
+ (0, table_schema_1.assertReadableRow)(raw, 'message');
135
+ const item = (0, rows_1.parseMessageRow)(raw);
136
+ if (item)
137
+ return item;
138
+ throw (0, errors_1.validationError)(`session "${sessionId}" holds a row in its message key space that is not a chat message ` +
139
+ 'item this package wrote, so its messages cannot be counted: a read of the session ' +
140
+ 'reports the same row and names it. Remove or repair the row, then reconcile again', 'message');
141
+ }
142
+ /**
143
+ * The number of message rows a session holds, counted the way the read path
144
+ * counts them.
145
+ *
146
+ * Only rows `getMessages` would return are counted: an expired message that
147
+ * DynamoDB's TTL sweep has not yet removed is invisible to every reader, so
148
+ * counting it would "repair" `messageCount` to a number nobody ever sees. The
149
+ * count is therefore a definition, not an implementation detail — it is what
150
+ * makes the repaired value agree with what the session returns. For the same
151
+ * reason a message a newer release wrote, and a row in the message key space
152
+ * that this adapter did not write, are both refused rather than counted:
153
+ * `getMessages` refuses them.
154
+ *
155
+ * Accepts: `sessionId` — validated by the caller. `signal` — aborts the reads.
156
+ *
157
+ * Returns: how many messages a reader would actually see right now.
158
+ *
159
+ * Throws: `FORMAT_UNSUPPORTED` for a message row a newer release wrote, checked
160
+ * before the row's ttl as `getMessages` checks it; `VALIDATION` naming
161
+ * `message` for a row in the message key space that is not one of this
162
+ * adapter's, which `getMessages` refuses too; whatever the query throws
163
+ * after retries; `ABORTED`.
164
+ *
165
+ * Guarantees: each row comes back projected to its identity, its format
166
+ * version and its ttl, so no message payload is transferred however large the
167
+ * session is — the descriptor is projected by the one nested path
168
+ * `message.location` that every descriptor this package has written carries,
169
+ * which proves the attribute is there and a map without reading the bytes it
170
+ * holds. Every check runs here rather than in a filter, because a filter would
171
+ * drop an expired row before its version could be checked. The pages are
172
+ * walked by the shared paginator with both of its caps lifted: a partial count
173
+ * is not a repair, it is a new and wrong number, so the count either completes
174
+ * or fails.
175
+ */
176
+ async function countLiveMessages(context, sessionId, signal) {
177
+ const now = (0, clock_1.nowSeconds)();
178
+ const query = (0, rows_1.messageQuery)(context.tableName, sessionId);
179
+ let total = 0;
180
+ for await (const raw of (0, paginate_1.paginateQuery)({
181
+ retry: (0, retry_1.retryFor)(context, signal),
182
+ signal,
183
+ client: context.client,
184
+ params: {
185
+ ...query,
186
+ ProjectionExpression: '#pk, #sid, #msg.#loc, #v, #ttl',
187
+ ExpressionAttributeNames: {
188
+ ...query.ExpressionAttributeNames,
189
+ '#sid': 'sessionId',
190
+ '#msg': 'message',
191
+ '#loc': 'location',
192
+ '#v': 'v',
193
+ '#ttl': 'ttl',
194
+ },
195
+ },
196
+ maxItems: Number.POSITIVE_INFINITY,
197
+ maxIterations: Number.POSITIVE_INFINITY,
198
+ })) {
199
+ const row = parseCountableRow(raw, sessionId);
200
+ if (!(0, table_schema_1.isExpiredRow)(row, now))
201
+ total += 1;
202
+ }
203
+ return total;
204
+ }
@@ -0,0 +1,153 @@
1
+ /**
2
+ * Hides the rules chat-history input must meet before anything reads it.
3
+ *
4
+ * A session id, an append's messages, a read window and the listing options
5
+ * are each parsed once into a type only this module can build (record 21), so
6
+ * an action that holds one never checks it again. Which messages may be
7
+ * stored is decided by the read side's own rebuild, so write and read agree
8
+ * by construction, and which instants a `before` may name follows from the
9
+ * range a message id can express.
10
+ */
11
+ import { type BaseMessage, type StoredMessage } from '@langchain/core/messages';
12
+ import { type PageLimit } from '../../shared/validation/primitives';
13
+ import type { GetMessagesOptions, ListSessionsOptions, MessageWindow } from '../types';
14
+ declare const sessionIdBrand: unique symbol;
15
+ declare const storableMessagesBrand: unique symbol;
16
+ declare const parsedWindowBrand: unique symbol;
17
+ /**
18
+ * A session id checked as the partition key it becomes. {@link parseSessionId}
19
+ * is the only way to obtain one, so an internal function that asks for a
20
+ * `SessionId` cannot be handed one nobody checked, and does not check it again.
21
+ * Each of the four history actions that take one — add, clear, get and
22
+ * reconcile — parses it on every call, and the session adapter parses the id
23
+ * it is bound to when it is built. The brand is phantom: at run time it is the
24
+ * caller's string.
25
+ */
26
+ export type SessionId = string & {
27
+ readonly [sessionIdBrand]: true;
28
+ };
29
+ /**
30
+ * Messages in their stored form, each one proven to rebuild on the read side.
31
+ * Built only by {@link parseStoredMessages}; the array is the one
32
+ * {@link parseMessages} made, which no caller holds.
33
+ */
34
+ export type StorableMessages = StoredMessage[] & {
35
+ readonly [storableMessagesBrand]: true;
36
+ };
37
+ /**
38
+ * A conversation window checked against the page rule and the range a message
39
+ * id can express, holding only the keys the caller gave. Built only by
40
+ * {@link parseMessageWindow}; its `before` is a copy, so a caller moving its own
41
+ * `Date` afterwards moves nothing this package reads.
42
+ */
43
+ export type ParsedWindow = {
44
+ readonly limit?: PageLimit;
45
+ readonly before?: Date;
46
+ } & {
47
+ readonly [parsedWindowBrand]: true;
48
+ };
49
+ /**
50
+ * Parse a session id.
51
+ *
52
+ * Accepts: `value` — anything; a session id reaches the partition key, so it is
53
+ * held to every identifier rule at {@link MAX_PARTITION_ID_BYTES}.
54
+ *
55
+ * Returns: `value` as a {@link SessionId}.
56
+ *
57
+ * Throws: `VALIDATION` naming `sessionId`.
58
+ */
59
+ export declare function parseSessionId(value: unknown): SessionId;
60
+ /**
61
+ * Parse stored messages: prove each one rebuilds on the read side.
62
+ *
63
+ * Accepts: `stored` — the stored form of one call's messages. The check *is*
64
+ * the read side's own rebuild (`mapStoredMessagesToChatMessages`), so write and
65
+ * read agree by construction rather than by two lists of types kept in step by
66
+ * hand.
67
+ *
68
+ * Returns: `stored`, as {@link StorableMessages}.
69
+ *
70
+ * Throws: `VALIDATION` naming `messages`, carrying the offending index and
71
+ * type. The type comes off the caller's own object and nothing length-checked
72
+ * it, so the message names it bounded by {@link truncateForLog}, and so is
73
+ * what LangChain says about it — that text renders the same unchecked value
74
+ * into itself, so bounding only the type bounds nothing. The two take
75
+ * different caps because they are different things: the type is an identifier,
76
+ * while what LangChain threw is prose, cut once by `redactedMessage` and not
77
+ * again here. `context` still names `messages`, which is what a caller
78
+ * branches on. A `RemoveMessage`, or a tool, function or generic message
79
+ * missing its required field, is refused here instead of being persisted and
80
+ * then skipped or thrown by `getMessages`. A hole in a sparse array is refused
81
+ * as missing, naming its index: the array is walked by index, where
82
+ * `Array.prototype.forEach` would skip the hole and let it through.
83
+ */
84
+ export declare function parseStoredMessages(stored: StoredMessage[]): StorableMessages;
85
+ /**
86
+ * Parse the messages of one append, in two passes: to the stored form, then
87
+ * proof that each rebuilds.
88
+ *
89
+ * Accepts: `messages` — declared `BaseMessage[]`; a non-array is refused, and
90
+ * so is an entry LangChain cannot serialize.
91
+ *
92
+ * Returns: a fresh array of stored messages, as {@link StorableMessages}.
93
+ *
94
+ * Throws: `VALIDATION` naming `messages`, with the offending index for an
95
+ * entry.
96
+ */
97
+ export declare function parseMessages(messages: BaseMessage[]): StorableMessages;
98
+ /**
99
+ * Parse a conversation window.
100
+ *
101
+ * Accepts: `window.limit` — an integer from 1 to the page ceiling; the only
102
+ * floor of 1 in the package, because a window feeds a model, and an empty
103
+ * conversation is not a visibly empty answer but an invented one.
104
+ * `window.before` — a valid `Date` inside the range a message id can express.
105
+ *
106
+ * Returns: a fresh window holding only the keys the caller gave, as a
107
+ * {@link ParsedWindow}.
108
+ *
109
+ * Throws: `VALIDATION` naming `limit` or `before`.
110
+ */
111
+ export declare function parseMessageWindow(window: MessageWindow): ParsedWindow;
112
+ /** The arguments of `getMessages`, parsed. */
113
+ export interface GetMessagesRequest {
114
+ readonly sessionId: SessionId;
115
+ readonly window: ParsedWindow;
116
+ readonly signal: AbortSignal | undefined;
117
+ }
118
+ /**
119
+ * Parse the arguments of `getMessages`.
120
+ *
121
+ * Accepts: `sessionId` — as {@link parseSessionId}. `options` — an object with
122
+ * only `limit`, `before` and `signal`; the window as {@link parseMessageWindow}.
123
+ *
124
+ * Returns: the request the read works from.
125
+ *
126
+ * Throws: `VALIDATION`, in this order: `options.<key>`, `signal`, `sessionId`,
127
+ * `limit`, `before`.
128
+ */
129
+ export declare function parseGetMessagesRequest(sessionId: string, options: GetMessagesOptions): GetMessagesRequest;
130
+ /** The options of `listSessions`, parsed. */
131
+ export interface ListSessionsRequest {
132
+ readonly limit: PageLimit | undefined;
133
+ readonly maxItems: number | undefined;
134
+ readonly maxIterations: number | undefined;
135
+ readonly cursor: string | undefined;
136
+ readonly signal: AbortSignal | undefined;
137
+ }
138
+ /**
139
+ * Parse the options of `listSessions`.
140
+ *
141
+ * Accepts: `options` — only `limit`, `cursor`, `maxIterations`, `maxItems` and
142
+ * `signal`. `limit` — 0 to the page ceiling; `0` is answered with an empty page.
143
+ * `maxItems`, `maxIterations` — an integer of at least 1, or `Infinity`.
144
+ * `cursor` — a string, and only with `indexName`. `indexName` — the adapter's
145
+ * configured recency index, if any.
146
+ *
147
+ * Returns: the request the listing works from.
148
+ *
149
+ * Throws: `VALIDATION`, in this order: `options.<key>`, `signal`, `limit`,
150
+ * `maxItems`, `maxIterations`, `cursor`.
151
+ */
152
+ export declare function parseListSessionsRequest(options: ListSessionsOptions, indexName: string | undefined): ListSessionsRequest;
153
+ export {};
@@ -0,0 +1,252 @@
1
+ "use strict";
2
+ /**
3
+ * Hides the rules chat-history input must meet before anything reads it.
4
+ *
5
+ * A session id, an append's messages, a read window and the listing options
6
+ * are each parsed once into a type only this module can build (record 21), so
7
+ * an action that holds one never checks it again. Which messages may be
8
+ * stored is decided by the read side's own rebuild, so write and read agree
9
+ * by construction, and which instants a `before` may name follows from the
10
+ * range a message id can express.
11
+ */
12
+ Object.defineProperty(exports, "__esModule", { value: true });
13
+ exports.parseSessionId = parseSessionId;
14
+ exports.parseStoredMessages = parseStoredMessages;
15
+ exports.parseMessages = parseMessages;
16
+ exports.parseMessageWindow = parseMessageWindow;
17
+ exports.parseGetMessagesRequest = parseGetMessagesRequest;
18
+ exports.parseListSessionsRequest = parseListSessionsRequest;
19
+ const messages_1 = require("@langchain/core/messages");
20
+ const table_schema_1 = require("../../shared/dynamodb/table-schema");
21
+ const errors_1 = require("../../shared/errors/errors");
22
+ const secret_patterns_1 = require("../../shared/logging/secret-patterns");
23
+ const truncate_1 = require("../../shared/logging/truncate");
24
+ const ulid_1 = require("../../shared/ulid");
25
+ const collaborators_1 = require("../../shared/validation/collaborators");
26
+ const option_shape_1 = require("../../shared/validation/option-shape");
27
+ const primitives_1 = require("../../shared/validation/primitives");
28
+ const setup_1 = require("./setup");
29
+ /**
30
+ * Parse a session id.
31
+ *
32
+ * Accepts: `value` — anything; a session id reaches the partition key, so it is
33
+ * held to every identifier rule at {@link MAX_PARTITION_ID_BYTES}.
34
+ *
35
+ * Returns: `value` as a {@link SessionId}.
36
+ *
37
+ * Throws: `VALIDATION` naming `sessionId`.
38
+ */
39
+ function parseSessionId(value) {
40
+ return (0, primitives_1.parseIdentifier)(value, table_schema_1.KEY_SEPARATOR, 'sessionId', table_schema_1.MAX_PARTITION_ID_BYTES);
41
+ }
42
+ /**
43
+ * Serialize the caller's messages, reporting a value that is not a message.
44
+ *
45
+ * Accepts: `messages` — LangChain messages. The type says so; this runs for the
46
+ * JavaScript caller it does not bind, and for the `any` that reaches an
47
+ * `addMessages` through a chain. Empty is empty.
48
+ *
49
+ * Returns: the messages in their stored form, in order.
50
+ *
51
+ * Throws: `VALIDATION` naming `messages` and the offending index. Serializing
52
+ * one message at a time is what makes that index knowable: mapping the array in
53
+ * one call failed with `TypeError: message.toDict is not a function` from inside
54
+ * LangChain, naming neither the message nor this library. What LangChain says
55
+ * is quoted bounded: that text renders the offending value into itself, so it
56
+ * is exactly as long as the caller's own object makes it, and bounding the
57
+ * index while relaying it whole would bound nothing at all. The bound is
58
+ * `redactedMessage`'s own and is not applied again here — a second cut would
59
+ * mark the length of the first cut's output instead of the length the caller's
60
+ * text really had, which is the one thing the mark exists to state.
61
+ *
62
+ * Walked by index rather than with `Array.prototype.map`, which keeps a hole
63
+ * in a sparse array without visiting it: a hole is read as the `undefined` it
64
+ * is and refused like any other value that is not a message.
65
+ */
66
+ function toStoredMessages(messages) {
67
+ const stored = [];
68
+ for (let index = 0; index < messages.length; index += 1) {
69
+ try {
70
+ stored.push((0, messages_1.mapChatMessagesToStoredMessages)([messages[index]])[0]);
71
+ }
72
+ catch (error) {
73
+ throw (0, errors_1.validationError)(`messages[${index}] is not a LangChain message: ` + (0, secret_patterns_1.redactedMessage)(error), 'messages');
74
+ }
75
+ }
76
+ return stored;
77
+ }
78
+ /**
79
+ * Parse stored messages: prove each one rebuilds on the read side.
80
+ *
81
+ * Accepts: `stored` — the stored form of one call's messages. The check *is*
82
+ * the read side's own rebuild (`mapStoredMessagesToChatMessages`), so write and
83
+ * read agree by construction rather than by two lists of types kept in step by
84
+ * hand.
85
+ *
86
+ * Returns: `stored`, as {@link StorableMessages}.
87
+ *
88
+ * Throws: `VALIDATION` naming `messages`, carrying the offending index and
89
+ * type. The type comes off the caller's own object and nothing length-checked
90
+ * it, so the message names it bounded by {@link truncateForLog}, and so is
91
+ * what LangChain says about it — that text renders the same unchecked value
92
+ * into itself, so bounding only the type bounds nothing. The two take
93
+ * different caps because they are different things: the type is an identifier,
94
+ * while what LangChain threw is prose, cut once by `redactedMessage` and not
95
+ * again here. `context` still names `messages`, which is what a caller
96
+ * branches on. A `RemoveMessage`, or a tool, function or generic message
97
+ * missing its required field, is refused here instead of being persisted and
98
+ * then skipped or thrown by `getMessages`. A hole in a sparse array is refused
99
+ * as missing, naming its index: the array is walked by index, where
100
+ * `Array.prototype.forEach` would skip the hole and let it through.
101
+ */
102
+ function parseStoredMessages(stored) {
103
+ for (let index = 0; index < stored.length; index += 1) {
104
+ const message = stored[index];
105
+ if (message === undefined) {
106
+ throw (0, errors_1.validationError)(`messages[${index}] is missing`, 'messages');
107
+ }
108
+ try {
109
+ (0, messages_1.mapStoredMessagesToChatMessages)([message]);
110
+ }
111
+ catch (error) {
112
+ throw (0, errors_1.validationError)(`messages[${index}] of type "${(0, truncate_1.truncateForLog)(message.type)}" cannot be stored: ` +
113
+ (0, secret_patterns_1.redactedMessage)(error), 'messages');
114
+ }
115
+ }
116
+ return stored;
117
+ }
118
+ /**
119
+ * Parse the messages of one append, in two passes: to the stored form, then
120
+ * proof that each rebuilds.
121
+ *
122
+ * Accepts: `messages` — declared `BaseMessage[]`; a non-array is refused, and
123
+ * so is an entry LangChain cannot serialize.
124
+ *
125
+ * Returns: a fresh array of stored messages, as {@link StorableMessages}.
126
+ *
127
+ * Throws: `VALIDATION` naming `messages`, with the offending index for an
128
+ * entry.
129
+ */
130
+ function parseMessages(messages) {
131
+ if (!Array.isArray(messages)) {
132
+ throw (0, errors_1.validationError)('messages must be an array', 'messages');
133
+ }
134
+ return parseStoredMessages(toStoredMessages(messages));
135
+ }
136
+ /**
137
+ * A window's `before`, as a copy, when a message id can express it: the bound
138
+ * is the message id of that instant, and a message id holds its millisecond in
139
+ * ten base-32 characters.
140
+ *
141
+ * `null` is refused, naming `before`, rather than read as "up to now". A
142
+ * `Date` is duck-typed, since one from another realm is still a date.
143
+ * Unchecked, `before: null` would reach `null.getTime`, a property access the
144
+ * boundary brands `UNEXPECTED_ERROR` instead of naming the caller's mistake;
145
+ * an invalid `Date` would otherwise derive a NaN sort key that matches nothing
146
+ * and read as an empty conversation. A pre-epoch `Date` would be worse than
147
+ * either: the bound built from it sorts above every real id, so the window
148
+ * would come back holding the entire conversation the caller asked to exclude.
149
+ * Past the range the bound would wrap to the lowest prefix and the window would
150
+ * come back empty.
151
+ */
152
+ function windowBound(before) {
153
+ const hasGetTime = before !== null && typeof before.getTime === 'function';
154
+ const time = hasGetTime ? before.getTime() : Number.NaN;
155
+ if (!Number.isFinite(time))
156
+ throw (0, errors_1.validationError)('before must be a valid Date', 'before');
157
+ if (time < 0 || time >= ulid_1.ULID_TIME_RANGE_MS) {
158
+ throw (0, errors_1.validationError)('before must be a Date from the epoch onwards and before the year 37648: the bound is ' +
159
+ 'the message id of that instant, and a message id encodes its millisecond in ten ' +
160
+ 'base-32 characters, which hold no instant outside that range', 'before');
161
+ }
162
+ return new Date(time);
163
+ }
164
+ /**
165
+ * Parse a conversation window.
166
+ *
167
+ * Accepts: `window.limit` — an integer from 1 to the page ceiling; the only
168
+ * floor of 1 in the package, because a window feeds a model, and an empty
169
+ * conversation is not a visibly empty answer but an invented one.
170
+ * `window.before` — a valid `Date` inside the range a message id can express.
171
+ *
172
+ * Returns: a fresh window holding only the keys the caller gave, as a
173
+ * {@link ParsedWindow}.
174
+ *
175
+ * Throws: `VALIDATION` naming `limit` or `before`.
176
+ */
177
+ function parseMessageWindow(window) {
178
+ const parsed = {};
179
+ if (window.limit !== undefined)
180
+ parsed.limit = (0, primitives_1.parseLimit)(window.limit, 1);
181
+ if (window.before !== undefined)
182
+ parsed.before = windowBound(window.before);
183
+ return parsed;
184
+ }
185
+ /**
186
+ * Parse the arguments of `getMessages`.
187
+ *
188
+ * Accepts: `sessionId` — as {@link parseSessionId}. `options` — an object with
189
+ * only `limit`, `before` and `signal`; the window as {@link parseMessageWindow}.
190
+ *
191
+ * Returns: the request the read works from.
192
+ *
193
+ * Throws: `VALIDATION`, in this order: `options.<key>`, `signal`, `sessionId`,
194
+ * `limit`, `before`.
195
+ */
196
+ function parseGetMessagesRequest(sessionId, options) {
197
+ (0, option_shape_1.assertShape)(options, setup_1.GET_MESSAGES_KEYS, 'options');
198
+ (0, collaborators_1.assertSignalLike)(options.signal);
199
+ const parsedSessionId = parseSessionId(sessionId);
200
+ return {
201
+ sessionId: parsedSessionId,
202
+ window: parseMessageWindow(options),
203
+ signal: options.signal,
204
+ };
205
+ }
206
+ /** A scan cap: absent and `Infinity` both mean none; anything else is an integer of at least 1. */
207
+ function scanCap(value, field) {
208
+ if (value === undefined || value === Infinity)
209
+ return value;
210
+ return (0, primitives_1.parseInteger)(value, field, { min: 1 });
211
+ }
212
+ /**
213
+ * The paging cursor, which only the recency index can honour: without it a
214
+ * listing is one table scan, which has no position to resume from.
215
+ */
216
+ function pageCursor(cursor, indexName) {
217
+ if (cursor === undefined)
218
+ return undefined;
219
+ if (indexName === undefined) {
220
+ throw (0, errors_1.validationError)('paging by cursor needs a configured `indexName`: without the recency index a listing is ' +
221
+ 'one table scan, which has no position to resume from', 'cursor');
222
+ }
223
+ return (0, primitives_1.parseString)(cursor, 'cursor');
224
+ }
225
+ /**
226
+ * Parse the options of `listSessions`.
227
+ *
228
+ * Accepts: `options` — only `limit`, `cursor`, `maxIterations`, `maxItems` and
229
+ * `signal`. `limit` — 0 to the page ceiling; `0` is answered with an empty page.
230
+ * `maxItems`, `maxIterations` — an integer of at least 1, or `Infinity`.
231
+ * `cursor` — a string, and only with `indexName`. `indexName` — the adapter's
232
+ * configured recency index, if any.
233
+ *
234
+ * Returns: the request the listing works from.
235
+ *
236
+ * Throws: `VALIDATION`, in this order: `options.<key>`, `signal`, `limit`,
237
+ * `maxItems`, `maxIterations`, `cursor`.
238
+ */
239
+ function parseListSessionsRequest(options, indexName) {
240
+ (0, option_shape_1.assertShape)(options, setup_1.LIST_SESSIONS_KEYS, 'options');
241
+ (0, collaborators_1.assertSignalLike)(options.signal);
242
+ const limit = options.limit === undefined ? undefined : (0, primitives_1.parseLimit)(options.limit, 0);
243
+ const maxItems = scanCap(options.maxItems, 'maxItems');
244
+ const maxIterations = scanCap(options.maxIterations, 'maxIterations');
245
+ return {
246
+ limit,
247
+ maxItems,
248
+ maxIterations,
249
+ cursor: pageCursor(options.cursor, indexName),
250
+ signal: options.signal,
251
+ };
252
+ }