@farukada/aws-langgraph-dynamodb-ts 0.6.0 → 0.8.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 (186) hide show
  1. package/README.md +63 -9
  2. package/dist/checkpointer/actions/delete-thread.d.ts +3 -4
  3. package/dist/checkpointer/actions/delete-thread.d.ts.map +1 -1
  4. package/dist/checkpointer/actions/delete-thread.js +21 -41
  5. package/dist/checkpointer/actions/delete-thread.js.map +1 -1
  6. package/dist/checkpointer/actions/list.d.ts.map +1 -1
  7. package/dist/checkpointer/actions/list.js +31 -4
  8. package/dist/checkpointer/actions/list.js.map +1 -1
  9. package/dist/checkpointer/actions/put-writes.d.ts.map +1 -1
  10. package/dist/checkpointer/actions/put-writes.js +14 -24
  11. package/dist/checkpointer/actions/put-writes.js.map +1 -1
  12. package/dist/checkpointer/actions/put.d.ts.map +1 -1
  13. package/dist/checkpointer/actions/put.js +2 -0
  14. package/dist/checkpointer/actions/put.js.map +1 -1
  15. package/dist/checkpointer/internal/item-reader.d.ts +31 -0
  16. package/dist/checkpointer/internal/item-reader.d.ts.map +1 -1
  17. package/dist/checkpointer/internal/item-reader.js +49 -1
  18. package/dist/checkpointer/internal/item-reader.js.map +1 -1
  19. package/dist/checkpointer/internal/item-writer.d.ts +0 -8
  20. package/dist/checkpointer/internal/item-writer.d.ts.map +1 -1
  21. package/dist/checkpointer/internal/item-writer.js +15 -21
  22. package/dist/checkpointer/internal/item-writer.js.map +1 -1
  23. package/dist/checkpointer/internal/keys.d.ts +19 -3
  24. package/dist/checkpointer/internal/keys.d.ts.map +1 -1
  25. package/dist/checkpointer/internal/keys.js +41 -6
  26. package/dist/checkpointer/internal/keys.js.map +1 -1
  27. package/dist/checkpointer/internal/special-write-cleanup.d.ts.map +1 -1
  28. package/dist/checkpointer/internal/special-write-cleanup.js +6 -12
  29. package/dist/checkpointer/internal/special-write-cleanup.js.map +1 -1
  30. package/dist/checkpointer/internal/validation.d.ts +8 -4
  31. package/dist/checkpointer/internal/validation.d.ts.map +1 -1
  32. package/dist/checkpointer/internal/validation.js +12 -10
  33. package/dist/checkpointer/internal/validation.js.map +1 -1
  34. package/dist/checkpointer/internal/write-guard.d.ts +21 -0
  35. package/dist/checkpointer/internal/write-guard.d.ts.map +1 -0
  36. package/dist/checkpointer/internal/write-guard.js +48 -0
  37. package/dist/checkpointer/internal/write-guard.js.map +1 -0
  38. package/dist/checkpointer/internal/write-index.d.ts +29 -0
  39. package/dist/checkpointer/internal/write-index.d.ts.map +1 -0
  40. package/dist/checkpointer/internal/write-index.js +38 -0
  41. package/dist/checkpointer/internal/write-index.js.map +1 -0
  42. package/dist/checkpointer/types.d.ts +2 -0
  43. package/dist/checkpointer/types.d.ts.map +1 -1
  44. package/dist/history/actions/add-messages.d.ts.map +1 -1
  45. package/dist/history/actions/add-messages.js +24 -4
  46. package/dist/history/actions/add-messages.js.map +1 -1
  47. package/dist/history/actions/clear.d.ts +4 -6
  48. package/dist/history/actions/clear.d.ts.map +1 -1
  49. package/dist/history/actions/clear.js +18 -33
  50. package/dist/history/actions/clear.js.map +1 -1
  51. package/dist/history/actions/get-messages.d.ts +2 -1
  52. package/dist/history/actions/get-messages.d.ts.map +1 -1
  53. package/dist/history/actions/get-messages.js +28 -2
  54. package/dist/history/actions/get-messages.js.map +1 -1
  55. package/dist/history/actions/list-sessions.d.ts +2 -1
  56. package/dist/history/actions/list-sessions.d.ts.map +1 -1
  57. package/dist/history/actions/list-sessions.js +21 -2
  58. package/dist/history/actions/list-sessions.js.map +1 -1
  59. package/dist/history/actions/reconcile-count.d.ts.map +1 -1
  60. package/dist/history/actions/reconcile-count.js +2 -2
  61. package/dist/history/actions/reconcile-count.js.map +1 -1
  62. package/dist/history/internal/append-saga.d.ts.map +1 -1
  63. package/dist/history/internal/append-saga.js +2 -78
  64. package/dist/history/internal/append-saga.js.map +1 -1
  65. package/dist/history/internal/compensation.d.ts +21 -0
  66. package/dist/history/internal/compensation.d.ts.map +1 -0
  67. package/dist/history/internal/compensation.js +84 -0
  68. package/dist/history/internal/compensation.js.map +1 -0
  69. package/dist/history/internal/keys.d.ts +10 -2
  70. package/dist/history/internal/keys.d.ts.map +1 -1
  71. package/dist/history/internal/keys.js +32 -5
  72. package/dist/history/internal/keys.js.map +1 -1
  73. package/dist/history/internal/message-chunker.d.ts.map +1 -1
  74. package/dist/history/internal/message-chunker.js +13 -5
  75. package/dist/history/internal/message-chunker.js.map +1 -1
  76. package/dist/history/internal/session-count.d.ts +21 -0
  77. package/dist/history/internal/session-count.d.ts.map +1 -1
  78. package/dist/history/internal/session-count.js +51 -0
  79. package/dist/history/internal/session-count.js.map +1 -1
  80. package/dist/history/internal/session-title.d.ts +20 -0
  81. package/dist/history/internal/session-title.d.ts.map +1 -0
  82. package/dist/history/internal/session-title.js +44 -0
  83. package/dist/history/internal/session-title.js.map +1 -0
  84. package/dist/history/internal/setup.d.ts +2 -1
  85. package/dist/history/internal/setup.d.ts.map +1 -1
  86. package/dist/history/internal/setup.js +1 -0
  87. package/dist/history/internal/setup.js.map +1 -1
  88. package/dist/history/internal/title-generator.d.ts +8 -2
  89. package/dist/history/internal/title-generator.d.ts.map +1 -1
  90. package/dist/history/internal/title-generator.js +12 -3
  91. package/dist/history/internal/title-generator.js.map +1 -1
  92. package/dist/history/internal/validation.d.ts +9 -0
  93. package/dist/history/internal/validation.d.ts.map +1 -0
  94. package/dist/history/internal/validation.js +16 -0
  95. package/dist/history/internal/validation.js.map +1 -0
  96. package/dist/history/types.d.ts +12 -0
  97. package/dist/history/types.d.ts.map +1 -1
  98. package/dist/index.d.ts +1 -1
  99. package/dist/index.d.ts.map +1 -1
  100. package/dist/index.js.map +1 -1
  101. package/dist/shared/codec/s3/offloader.d.ts +7 -1
  102. package/dist/shared/codec/s3/offloader.d.ts.map +1 -1
  103. package/dist/shared/codec/s3/offloader.js +14 -1
  104. package/dist/shared/codec/s3/offloader.js.map +1 -1
  105. package/dist/shared/dynamodb/batch-write.d.ts.map +1 -1
  106. package/dist/shared/dynamodb/batch-write.js +8 -6
  107. package/dist/shared/dynamodb/batch-write.js.map +1 -1
  108. package/dist/shared/dynamodb/drain-unprocessed.d.ts +5 -1
  109. package/dist/shared/dynamodb/drain-unprocessed.d.ts.map +1 -1
  110. package/dist/shared/dynamodb/drain-unprocessed.js +20 -11
  111. package/dist/shared/dynamodb/drain-unprocessed.js.map +1 -1
  112. package/dist/shared/dynamodb/partition-delete.d.ts +33 -0
  113. package/dist/shared/dynamodb/partition-delete.d.ts.map +1 -0
  114. package/dist/shared/dynamodb/partition-delete.js +70 -0
  115. package/dist/shared/dynamodb/partition-delete.js.map +1 -0
  116. package/dist/shared/dynamodb/retry-classifier.d.ts.map +1 -1
  117. package/dist/shared/dynamodb/retry-classifier.js +9 -1
  118. package/dist/shared/dynamodb/retry-classifier.js.map +1 -1
  119. package/dist/shared/errors/errors.d.ts +5 -2
  120. package/dist/shared/errors/errors.d.ts.map +1 -1
  121. package/dist/shared/errors/errors.js +6 -3
  122. package/dist/shared/errors/errors.js.map +1 -1
  123. package/dist/shared/logging/redaction-walk.d.ts +23 -0
  124. package/dist/shared/logging/redaction-walk.d.ts.map +1 -0
  125. package/dist/shared/logging/redaction-walk.js +92 -0
  126. package/dist/shared/logging/redaction-walk.js.map +1 -0
  127. package/dist/shared/logging/redaction.d.ts +22 -10
  128. package/dist/shared/logging/redaction.d.ts.map +1 -1
  129. package/dist/shared/logging/redaction.js +24 -36
  130. package/dist/shared/logging/redaction.js.map +1 -1
  131. package/dist/shared/logging/secret-patterns.d.ts +41 -0
  132. package/dist/shared/logging/secret-patterns.d.ts.map +1 -0
  133. package/dist/shared/logging/secret-patterns.js +74 -0
  134. package/dist/shared/logging/secret-patterns.js.map +1 -0
  135. package/dist/shared/validation/primitives.d.ts +9 -1
  136. package/dist/shared/validation/primitives.d.ts.map +1 -1
  137. package/dist/shared/validation/primitives.js +13 -0
  138. package/dist/shared/validation/primitives.js.map +1 -1
  139. package/dist/store/actions/get.d.ts.map +1 -1
  140. package/dist/store/actions/get.js +15 -1
  141. package/dist/store/actions/get.js.map +1 -1
  142. package/dist/store/actions/list-namespaces.d.ts.map +1 -1
  143. package/dist/store/actions/list-namespaces.js +1 -0
  144. package/dist/store/actions/list-namespaces.js.map +1 -1
  145. package/dist/store/actions/put.d.ts.map +1 -1
  146. package/dist/store/actions/put.js +20 -2
  147. package/dist/store/actions/put.js.map +1 -1
  148. package/dist/store/actions/search.d.ts.map +1 -1
  149. package/dist/store/actions/search.js +4 -35
  150. package/dist/store/actions/search.js.map +1 -1
  151. package/dist/store/internal/backend-search.d.ts +5 -0
  152. package/dist/store/internal/backend-search.d.ts.map +1 -0
  153. package/dist/store/internal/backend-search.js +67 -0
  154. package/dist/store/internal/backend-search.js.map +1 -0
  155. package/dist/store/internal/filter.d.ts.map +1 -1
  156. package/dist/store/internal/filter.js +26 -5
  157. package/dist/store/internal/filter.js.map +1 -1
  158. package/dist/store/internal/index-reconcile.d.ts.map +1 -1
  159. package/dist/store/internal/index-reconcile.js +33 -3
  160. package/dist/store/internal/index-reconcile.js.map +1 -1
  161. package/dist/store/internal/keys.d.ts +1 -1
  162. package/dist/store/internal/keys.d.ts.map +1 -1
  163. package/dist/store/internal/keys.js +8 -2
  164. package/dist/store/internal/keys.js.map +1 -1
  165. package/dist/store/internal/persist.d.ts.map +1 -1
  166. package/dist/store/internal/persist.js +1 -5
  167. package/dist/store/internal/persist.js.map +1 -1
  168. package/dist/store/internal/search-filter.d.ts +4 -0
  169. package/dist/store/internal/search-filter.d.ts.map +1 -0
  170. package/dist/store/internal/search-filter.js +11 -0
  171. package/dist/store/internal/search-filter.js.map +1 -0
  172. package/dist/store/internal/setup.d.ts +11 -1
  173. package/dist/store/internal/setup.d.ts.map +1 -1
  174. package/dist/store/internal/setup.js +17 -1
  175. package/dist/store/internal/setup.js.map +1 -1
  176. package/dist/store/internal/validation.d.ts +8 -2
  177. package/dist/store/internal/validation.d.ts.map +1 -1
  178. package/dist/store/internal/validation.js +15 -6
  179. package/dist/store/internal/validation.js.map +1 -1
  180. package/dist/store/internal/write-verify.d.ts +12 -0
  181. package/dist/store/internal/write-verify.d.ts.map +1 -1
  182. package/dist/store/internal/write-verify.js +27 -0
  183. package/dist/store/internal/write-verify.js.map +1 -1
  184. package/dist/store/vector-backend.d.ts +17 -0
  185. package/dist/store/vector-backend.d.ts.map +1 -1
  186. package/package.json +1 -1
@@ -1 +1 @@
1
- {"version":3,"file":"keys.d.ts","sourceRoot":"","sources":["../../../src/store/internal/keys.ts"],"names":[],"mappings":"AAAA,mFAAmF;AACnF,eAAO,MAAM,mBAAmB,MAAM,CAAC;AAEvC,mEAAmE;AACnE,wBAAgB,YAAY,CAAC,SAAS,EAAE,MAAM,EAAE,GAAG,MAAM,CAExD;AAED,0EAA0E;AAC1E,wBAAgB,OAAO,CAAC,SAAS,EAAE,MAAM,EAAE,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,CAEhE;AAED;;;;GAIG;AACH,wBAAgB,aAAa,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,CAGtD;AAED;;;GAGG;AACH,wBAAgB,sBAAsB,CAAC,SAAS,EAAE,MAAM,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,OAAO,CAGrF"}
1
+ {"version":3,"file":"keys.d.ts","sourceRoot":"","sources":["../../../src/store/internal/keys.ts"],"names":[],"mappings":"AAAA,mFAAmF;AACnF,eAAO,MAAM,mBAAmB,MAAM,CAAC;AASvC,8EAA8E;AAC9E,wBAAgB,YAAY,CAAC,SAAS,EAAE,MAAM,EAAE,GAAG,MAAM,CAExD;AAED,0EAA0E;AAC1E,wBAAgB,OAAO,CAAC,SAAS,EAAE,MAAM,EAAE,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,CAEhE;AAED;;;;GAIG;AACH,wBAAgB,aAAa,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,CAGtD;AAED;;;GAGG;AACH,wBAAgB,sBAAsB,CAAC,SAAS,EAAE,MAAM,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,OAAO,CAGrF"}
@@ -7,9 +7,15 @@ exports.sortKeyPrefix = sortKeyPrefix;
7
7
  exports.namespaceMatchesPrefix = namespaceMatchesPrefix;
8
8
  /** Separator joining namespace elements (and the trailing key) in the sort key. */
9
9
  exports.NAMESPACE_SEPARATOR = '#';
10
- /** Partition key for an item: the scope-root namespace element. */
10
+ /**
11
+ * Adapter tag prefixed to every store partition key — see the equivalent in
12
+ * checkpointer/internal/keys.ts for why the three adapters' partitions must
13
+ * not overlap on a shared table.
14
+ */
15
+ const ADAPTER_PARTITION_PREFIX = `STORE${exports.NAMESPACE_SEPARATOR}`;
16
+ /** Partition key for an item: the adapter tag plus the scope-root element. */
11
17
  function partitionKey(namespace) {
12
- return namespace[0];
18
+ return `${ADAPTER_PARTITION_PREFIX}${namespace[0]}`;
13
19
  }
14
20
  /** Sort key: the rest of the namespace plus the key, separator-joined. */
15
21
  function sortKey(namespace, key) {
@@ -1 +1 @@
1
- {"version":3,"file":"keys.js","sourceRoot":"","sources":["../../../src/store/internal/keys.ts"],"names":[],"mappings":";;;;;;;AAAA,mFAAmF;AACtE,QAAA,mBAAmB,GAAG,GAAG,CAAC;AAEvC,mEAAmE;AACnE,sBAA6B,SAAmB;IAC9C,OAAO,SAAS,CAAC,CAAC,CAAC,CAAC;AACtB,CAAC;AAED,0EAA0E;AAC1E,iBAAwB,SAAmB,EAAE,GAAW;IACtD,OAAO,CAAC,GAAG,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,IAAI,CAAC,QAAA,mBAAmB,CAAC,CAAC;AAChE,CAAC;AAED;;;;GAIG;AACH,uBAA8B,MAAgB;IAC5C,MAAM,IAAI,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IAC7B,OAAO,IAAI,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,QAAA,mBAAmB,CAAC,GAAG,QAAA,mBAAmB,EAAE,CAAC;AAC5F,CAAC;AAED;;;GAGG;AACH,gCAAuC,SAAmB,EAAE,MAAgB;IAC1E,IAAI,MAAM,CAAC,MAAM,GAAG,SAAS,CAAC,MAAM;QAAE,OAAO,KAAK,CAAC;IACnD,OAAO,MAAM,CAAC,KAAK,CAAC,CAAC,OAAO,EAAE,KAAK,EAAE,EAAE,CAAC,SAAS,CAAC,KAAK,CAAC,KAAK,OAAO,CAAC,CAAC;AACxE,CAAC"}
1
+ {"version":3,"file":"keys.js","sourceRoot":"","sources":["../../../src/store/internal/keys.ts"],"names":[],"mappings":";;;;;;;AAAA,mFAAmF;AACtE,QAAA,mBAAmB,GAAG,GAAG,CAAC;AAEvC;;;;GAIG;AACH,MAAM,wBAAwB,GAAG,QAAQ,QAAA,mBAAmB,EAAE,CAAC;AAE/D,8EAA8E;AAC9E,sBAA6B,SAAmB;IAC9C,OAAO,GAAG,wBAAwB,GAAG,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC;AACtD,CAAC;AAED,0EAA0E;AAC1E,iBAAwB,SAAmB,EAAE,GAAW;IACtD,OAAO,CAAC,GAAG,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,IAAI,CAAC,QAAA,mBAAmB,CAAC,CAAC;AAChE,CAAC;AAED;;;;GAIG;AACH,uBAA8B,MAAgB;IAC5C,MAAM,IAAI,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IAC7B,OAAO,IAAI,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,QAAA,mBAAmB,CAAC,GAAG,QAAA,mBAAmB,EAAE,CAAC;AAC5F,CAAC;AAED;;;GAGG;AACH,gCAAuC,SAAmB,EAAE,MAAgB;IAC1E,IAAI,MAAM,CAAC,MAAM,GAAG,SAAS,CAAC,MAAM;QAAE,OAAO,KAAK,CAAC;IACnD,OAAO,MAAM,CAAC,KAAK,CAAC,CAAC,OAAO,EAAE,KAAK,EAAE,EAAE,CAAC,SAAS,CAAC,KAAK,CAAC,KAAK,OAAO,CAAC,CAAC;AACxE,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"persist.d.ts","sourceRoot":"","sources":["../../../src/store/internal/persist.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,iBAAiB,EAAmB,MAAM,0BAA0B,CAAC;AAInF,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,UAAU,CAAC;AAChD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAQ5C;;;;;GAKG;AACH,wBAAsB,aAAa,CACjC,OAAO,EAAE,YAAY,EACrB,MAAM,EAAE,eAAe,EACvB,aAAa,EAAE,iBAAiB,GAAG,SAAS,GAC3C,OAAO,CAAC,IAAI,CAAC,CA8Bf"}
1
+ {"version":3,"file":"persist.d.ts","sourceRoot":"","sources":["../../../src/store/internal/persist.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,iBAAiB,EAAmB,MAAM,0BAA0B,CAAC;AAInF,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,UAAU,CAAC;AAChD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAG5C;;;;;GAKG;AACH,wBAAsB,aAAa,CACjC,OAAO,EAAE,YAAY,EACrB,MAAM,EAAE,eAAe,EACvB,aAAa,EAAE,iBAAiB,GAAG,SAAS,GAC3C,OAAO,CAAC,IAAI,CAAC,CA8Bf"}
@@ -6,10 +6,6 @@ const descriptor_keys_1 = require("../../shared/codec/descriptor-keys");
6
6
  const orphans_1 = require("../../shared/codec/s3/orphans");
7
7
  const retry_1 = require("../../shared/dynamodb/retry");
8
8
  const write_verify_1 = require("./write-verify");
9
- /** True when `error` is a {@link RetryExhaustedError} — checked by name, not `instanceof` (banned repo-wide). */
10
- function isRetryExhausted(error) {
11
- return error.name === 'RetryExhaustedError';
12
- }
13
9
  /**
14
10
  * Put the record: on a definite failure, clean up *this* record's nonced S3
15
11
  * object; on an ambiguous retry-exhaustion failure, verify via
@@ -21,7 +17,7 @@ async function persistRecord(context, record, previousValue) {
21
17
  await (0, retry_1.withDynamoDBRetry)(() => context.client.put({ TableName: context.tableName, Item: record }));
22
18
  }
23
19
  catch (error) {
24
- const landed = isRetryExhausted(error) &&
20
+ const landed = (0, write_verify_1.isRetryExhausted)(error) &&
25
21
  record.value.location === codec_1.PayloadLocation.S3 &&
26
22
  (await (0, write_verify_1.writeLandedAt)(context, record, record.value.s3Key));
27
23
  if (!landed) {
@@ -1 +1 @@
1
- {"version":3,"file":"persist.js","sourceRoot":"","sources":["../../../src/store/internal/persist.ts"],"names":[],"mappings":";;;AAAA,oDAAmF;AACnF,wEAAmE;AACnE,2DAAiE;AACjE,uDAAgE;AAGhE,iDAA+C;AAE/C,iHAAiH;AACjH,SAAS,gBAAgB,CAAC,KAAY;IACpC,OAAO,KAAK,CAAC,IAAI,KAAK,qBAAqB,CAAC;AAC9C,CAAC;AAED;;;;;GAKG;AACI,KAAK,wBACV,OAAqB,EACrB,MAAuB,EACvB,aAA4C;IAE5C,IAAI,CAAC;QACH,MAAM,IAAA,yBAAiB,EAAC,GAAG,EAAE,CAC3B,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,SAAS,EAAE,OAAO,CAAC,SAAS,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CACnE,CAAC;IACJ,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,MAAM,GACV,gBAAgB,CAAC,KAAc,CAAC;YAChC,MAAM,CAAC,KAAK,CAAC,QAAQ,KAAK,uBAAe,CAAC,EAAE;YAC5C,CAAC,MAAM,IAAA,4BAAa,EAAC,OAAO,EAAE,MAAM,EAAE,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC;QAC7D,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,IAAI,OAAO,CAAC,SAAS,EAAE,CAAC;gBACtB,MAAM,IAAA,0BAAgB,EACpB,OAAO,CAAC,SAAS,EACjB,IAAA,+BAAa,EAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,EAC7B,WAAW,EACX,OAAO,CAAC,MAAM,CACf,CAAC;YACJ,CAAC;YACD,MAAM,KAAK,CAAC;QACd,CAAC;IACH,CAAC;IACD,IAAI,OAAO,CAAC,SAAS,IAAI,aAAa,EAAE,CAAC;QACvC,MAAM,IAAA,0BAAgB,EACpB,OAAO,CAAC,SAAS,EACjB,IAAA,+BAAa,EAAC,CAAC,aAAa,CAAC,CAAC,EAC9B,qBAAqB,EACrB,OAAO,CAAC,MAAM,CACf,CAAC;IACJ,CAAC;AACH,CAAC"}
1
+ {"version":3,"file":"persist.js","sourceRoot":"","sources":["../../../src/store/internal/persist.ts"],"names":[],"mappings":";;;AAAA,oDAAmF;AACnF,wEAAmE;AACnE,2DAAiE;AACjE,uDAAgE;AAGhE,iDAAiE;AAEjE;;;;;GAKG;AACI,KAAK,wBACV,OAAqB,EACrB,MAAuB,EACvB,aAA4C;IAE5C,IAAI,CAAC;QACH,MAAM,IAAA,yBAAiB,EAAC,GAAG,EAAE,CAC3B,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,SAAS,EAAE,OAAO,CAAC,SAAS,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CACnE,CAAC;IACJ,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,MAAM,GACV,IAAA,+BAAgB,EAAC,KAAc,CAAC;YAChC,MAAM,CAAC,KAAK,CAAC,QAAQ,KAAK,uBAAe,CAAC,EAAE;YAC5C,CAAC,MAAM,IAAA,4BAAa,EAAC,OAAO,EAAE,MAAM,EAAE,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC;QAC7D,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,IAAI,OAAO,CAAC,SAAS,EAAE,CAAC;gBACtB,MAAM,IAAA,0BAAgB,EACpB,OAAO,CAAC,SAAS,EACjB,IAAA,+BAAa,EAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,EAC7B,WAAW,EACX,OAAO,CAAC,MAAM,CACf,CAAC;YACJ,CAAC;YACD,MAAM,KAAK,CAAC;QACd,CAAC;IACH,CAAC;IACD,IAAI,OAAO,CAAC,SAAS,IAAI,aAAa,EAAE,CAAC;QACvC,MAAM,IAAA,0BAAgB,EACpB,OAAO,CAAC,SAAS,EACjB,IAAA,+BAAa,EAAC,CAAC,aAAa,CAAC,CAAC,EAC9B,qBAAqB,EACrB,OAAO,CAAC,MAAM,CACf,CAAC;IACJ,CAAC;AACH,CAAC"}
@@ -0,0 +1,4 @@
1
+ import type { Item, SearchOperation } from '@langchain/langgraph-checkpoint';
2
+ /** True when `item` satisfies the search operation's optional metadata filter. */
3
+ export declare function passesFilter(item: Item, op: SearchOperation): boolean;
4
+ //# sourceMappingURL=search-filter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"search-filter.d.ts","sourceRoot":"","sources":["../../../src/store/internal/search-filter.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,eAAe,EAAE,MAAM,iCAAiC,CAAC;AAI7E,kFAAkF;AAClF,wBAAgB,YAAY,CAAC,IAAI,EAAE,IAAI,EAAE,EAAE,EAAE,eAAe,GAAG,OAAO,CAMrE"}
@@ -0,0 +1,11 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.passesFilter = passesFilter;
4
+ const filter_1 = require("./filter");
5
+ /** True when `item` satisfies the search operation's optional metadata filter. */
6
+ function passesFilter(item, op) {
7
+ if (!op.filter)
8
+ return true;
9
+ return (0, filter_1.matchesStoreFilter)(item.value, op.filter);
10
+ }
11
+ //# sourceMappingURL=search-filter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"search-filter.js","sourceRoot":"","sources":["../../../src/store/internal/search-filter.ts"],"names":[],"mappings":";;;AAEA,qCAA8D;AAE9D,kFAAkF;AAClF,sBAA6B,IAAU,EAAE,EAAmB;IAC1D,IAAI,CAAC,EAAE,CAAC,MAAM;QAAE,OAAO,IAAI,CAAC;IAC5B,OAAO,IAAA,2BAAkB,EACvB,IAAI,CAAC,KAAkC,EACvC,EAAE,CAAC,MAAmC,CACvC,CAAC;AACJ,CAAC"}
@@ -27,6 +27,16 @@ export interface StoreSetup {
27
27
  ddbClient: DynamoDBClient | undefined;
28
28
  ownsClient: boolean;
29
29
  }
30
- /** Resolve the client, optional S3 offloader, serializer, and index config. */
30
+ /**
31
+ * Resolve the client, optional S3 offloader, serializer, and index config.
32
+ *
33
+ * A `vectorBackend` without an `index` is rejected outright rather than
34
+ * silently degrading: with no embeddings configured, every `put` would compute
35
+ * no vector and instruct the backend to *delete* the item's entry instead of
36
+ * indexing it, and `search()` would fall through to an unranked scan-order
37
+ * listing with no `.score` field and no error — a semantic query returning a
38
+ * normal-looking but meaningless response. `reconcileVectorIndex` already
39
+ * refused this exact misconfiguration.
40
+ */
31
41
  export declare function setUpStore(options: DynamoDBStoreOptions): StoreSetup;
32
42
  //# sourceMappingURL=setup.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"setup.d.ts","sourceRoot":"","sources":["../../../src/store/internal/setup.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAC/D,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAC9D,OAAO,KAAK,EAAE,WAAW,EAAE,kBAAkB,EAAE,MAAM,iCAAiC,CAAC;AAEvF,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,gCAAgC,CAAC;AAGxE,OAAO,EAAE,WAAW,EAAE,MAAM,iCAAiC,CAAC;AAO9D,OAAO,EAAE,KAAK,MAAM,EAAiB,MAAM,6BAA6B,CAAC;AACzE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,6BAA6B,CAAC;AAC7D,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,UAAU,CAAC;AACrD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAEvD,2DAA2D;AAC3D,MAAM,WAAW,YAAY;IAC3B,MAAM,EAAE,gBAAgB,CAAC;IACzB,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,kBAAkB,CAAC;IAC1B,WAAW,CAAC,EAAE,iBAAiB,CAAC;IAChC,SAAS,CAAC,EAAE,WAAW,CAAC;IACxB,GAAG,CAAC,EAAE,SAAS,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,WAAW,CAAC;IACpB,aAAa,CAAC,EAAE,aAAa,CAAC;IAC9B,mBAAmB,EAAE,MAAM,CAAC;IAC5B,YAAY,EAAE,MAAM,CAAC;CACtB;AAED,oDAAoD;AACpD,MAAM,WAAW,UAAU;IACzB,OAAO,EAAE,YAAY,CAAC;IACtB,SAAS,EAAE,cAAc,GAAG,SAAS,CAAC;IACtC,UAAU,EAAE,OAAO,CAAC;CACrB;AAED,+EAA+E;AAC/E,wBAAgB,UAAU,CAAC,OAAO,EAAE,oBAAoB,GAAG,UAAU,CAyBpE"}
1
+ {"version":3,"file":"setup.d.ts","sourceRoot":"","sources":["../../../src/store/internal/setup.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAC/D,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAC9D,OAAO,KAAK,EAAE,WAAW,EAAE,kBAAkB,EAAE,MAAM,iCAAiC,CAAC;AAEvF,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,gCAAgC,CAAC;AAGxE,OAAO,EAAE,WAAW,EAAE,MAAM,iCAAiC,CAAC;AAQ9D,OAAO,EAAE,KAAK,MAAM,EAAiB,MAAM,6BAA6B,CAAC;AACzE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,6BAA6B,CAAC;AAC7D,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,UAAU,CAAC;AACrD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAEvD,2DAA2D;AAC3D,MAAM,WAAW,YAAY;IAC3B,MAAM,EAAE,gBAAgB,CAAC;IACzB,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,kBAAkB,CAAC;IAC1B,WAAW,CAAC,EAAE,iBAAiB,CAAC;IAChC,SAAS,CAAC,EAAE,WAAW,CAAC;IACxB,GAAG,CAAC,EAAE,SAAS,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,WAAW,CAAC;IACpB,aAAa,CAAC,EAAE,aAAa,CAAC;IAC9B,mBAAmB,EAAE,MAAM,CAAC;IAC5B,YAAY,EAAE,MAAM,CAAC;CACtB;AAED,oDAAoD;AACpD,MAAM,WAAW,UAAU;IACzB,OAAO,EAAE,YAAY,CAAC;IACtB,SAAS,EAAE,cAAc,GAAG,SAAS,CAAC;IACtC,UAAU,EAAE,OAAO,CAAC;CACrB;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,UAAU,CAAC,OAAO,EAAE,oBAAoB,GAAG,UAAU,CAiCpE"}
@@ -6,9 +6,25 @@ const config_1 = require("../../shared/codec/s3/config");
6
6
  const offloader_1 = require("../../shared/codec/s3/offloader");
7
7
  const constants_1 = require("../../shared/constants");
8
8
  const client_1 = require("../../shared/dynamodb/client");
9
+ const errors_1 = require("../../shared/errors/errors");
9
10
  const logger_1 = require("../../shared/logging/logger");
10
- /** Resolve the client, optional S3 offloader, serializer, and index config. */
11
+ /**
12
+ * Resolve the client, optional S3 offloader, serializer, and index config.
13
+ *
14
+ * A `vectorBackend` without an `index` is rejected outright rather than
15
+ * silently degrading: with no embeddings configured, every `put` would compute
16
+ * no vector and instruct the backend to *delete* the item's entry instead of
17
+ * indexing it, and `search()` would fall through to an unranked scan-order
18
+ * listing with no `.score` field and no error — a semantic query returning a
19
+ * normal-looking but meaningless response. `reconcileVectorIndex` already
20
+ * refused this exact misconfiguration.
21
+ */
11
22
  function setUpStore(options) {
23
+ if (options.vectorBackend && !options.index) {
24
+ throw new errors_1.ValidationError('vectorBackend requires a configured `index` (dims + embeddings); without one no embedding ' +
25
+ 'is computed, every put would clear the item vector, and search would silently return ' +
26
+ 'unranked, score-less results', 'vectorBackend');
27
+ }
12
28
  const resolved = (0, client_1.resolveDynamoDBClient)(options);
13
29
  return {
14
30
  context: {
@@ -1 +1 @@
1
- {"version":3,"file":"setup.js","sourceRoot":"","sources":["../../../src/store/internal/setup.ts"],"names":[],"mappings":";;;AAKA,8DAA2D;AAC3D,yDAAuE;AACvE,+DAA8D;AAC9D,sDAIgC;AAChC,yDAAqE;AACrE,wDAAyE;AA2BzE,+EAA+E;AAC/E,oBAA2B,OAA6B;IACtD,MAAM,QAAQ,GAAG,IAAA,8BAAqB,EAAC,OAAO,CAAC,CAAC;IAChD,OAAO;QACL,OAAO,EAAE;YACP,MAAM,EAAE,QAAQ,CAAC,MAAM;YACvB,SAAS,EAAE,OAAO,CAAC,SAAS;YAC5B,KAAK,EAAE,OAAO,CAAC,KAAK,IAAI,uBAAU;YAClC,WAAW,EAAE,OAAO,CAAC,WAAW;YAChC,SAAS,EAAE,OAAO,CAAC,EAAE;gBACnB,CAAC,CAAC,IAAI,uBAAW,CAAC;oBACd,GAAG,OAAO,CAAC,EAAE;oBACb,SAAS,EACP,OAAO,CAAC,EAAE,CAAC,SAAS,IAAI,IAAA,gCAAuB,EAAC,iCAAqB,EAAE,OAAO,CAAC;iBAClF,CAAC;gBACJ,CAAC,CAAC,SAAS;YACb,GAAG,EAAE,OAAO,CAAC,GAAG;YAChB,MAAM,EAAE,IAAA,sBAAa,EAAC,OAAO,CAAC,MAAM,CAAC;YACrC,KAAK,EAAE,OAAO,CAAC,KAAK;YACpB,aAAa,EAAE,OAAO,CAAC,aAAa;YACpC,mBAAmB,EAAE,OAAO,CAAC,mBAAmB,IAAI,yCAA6B;YACjF,YAAY,EAAE,OAAO,CAAC,YAAY,IAAI,qCAAyB;SAChE;QACD,SAAS,EAAE,QAAQ,CAAC,SAAS;QAC7B,UAAU,EAAE,QAAQ,CAAC,UAAU;KAChC,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"setup.js","sourceRoot":"","sources":["../../../src/store/internal/setup.ts"],"names":[],"mappings":";;;AAKA,8DAA2D;AAC3D,yDAAuE;AACvE,+DAA8D;AAC9D,sDAIgC;AAChC,yDAAqE;AACrE,uDAA6D;AAC7D,wDAAyE;AA2BzE;;;;;;;;;;GAUG;AACH,oBAA2B,OAA6B;IACtD,IAAI,OAAO,CAAC,aAAa,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;QAC5C,MAAM,IAAI,wBAAe,CACvB,4FAA4F;YAC1F,uFAAuF;YACvF,8BAA8B,EAChC,eAAe,CAChB,CAAC;IACJ,CAAC;IACD,MAAM,QAAQ,GAAG,IAAA,8BAAqB,EAAC,OAAO,CAAC,CAAC;IAChD,OAAO;QACL,OAAO,EAAE;YACP,MAAM,EAAE,QAAQ,CAAC,MAAM;YACvB,SAAS,EAAE,OAAO,CAAC,SAAS;YAC5B,KAAK,EAAE,OAAO,CAAC,KAAK,IAAI,uBAAU;YAClC,WAAW,EAAE,OAAO,CAAC,WAAW;YAChC,SAAS,EAAE,OAAO,CAAC,EAAE;gBACnB,CAAC,CAAC,IAAI,uBAAW,CAAC;oBACd,GAAG,OAAO,CAAC,EAAE;oBACb,SAAS,EACP,OAAO,CAAC,EAAE,CAAC,SAAS,IAAI,IAAA,gCAAuB,EAAC,iCAAqB,EAAE,OAAO,CAAC;iBAClF,CAAC;gBACJ,CAAC,CAAC,SAAS;YACb,GAAG,EAAE,OAAO,CAAC,GAAG;YAChB,MAAM,EAAE,IAAA,sBAAa,EAAC,OAAO,CAAC,MAAM,CAAC;YACrC,KAAK,EAAE,OAAO,CAAC,KAAK;YACpB,aAAa,EAAE,OAAO,CAAC,aAAa;YACpC,mBAAmB,EAAE,OAAO,CAAC,mBAAmB,IAAI,yCAA6B;YACjF,YAAY,EAAE,OAAO,CAAC,YAAY,IAAI,qCAAyB;SAChE;QACD,SAAS,EAAE,QAAQ,CAAC,SAAS;QAC7B,UAAU,EAAE,QAAQ,CAAC,UAAU;KAChC,CAAC;AACJ,CAAC"}
@@ -1,7 +1,13 @@
1
1
  /** Validate search/listNamespaces paging is non-negative integers. */
2
2
  export declare function validatePaging(offset: number, limit: number): void;
3
- /** Validate the namespace is non-empty and each element is separator-free. */
3
+ /** Validate the namespace is non-empty and each element is a valid identifier. */
4
4
  export declare function validateNamespace(namespace: string[]): void;
5
- /** Validate an item key is a non-empty, separator-free string. */
5
+ /** Validate an item key is a non-empty, separator- and control-char-free string. */
6
6
  export declare function validateKey(key: string): void;
7
+ /**
8
+ * Validate an optional namespace depth cap. Left unchecked, a negative value
9
+ * silently inverted truncation via `Array.prototype.slice(0, -n)`, which drops
10
+ * the *last* n elements rather than erroring.
11
+ */
12
+ export declare function validateMaxDepth(maxDepth?: number): void;
7
13
  //# sourceMappingURL=validation.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"validation.d.ts","sourceRoot":"","sources":["../../../src/store/internal/validation.ts"],"names":[],"mappings":"AAQA,sEAAsE;AACtE,wBAAgB,cAAc,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI,CAGlE;AAED,8EAA8E;AAC9E,wBAAgB,iBAAiB,CAAC,SAAS,EAAE,MAAM,EAAE,GAAG,IAAI,CAM3D;AAED,kEAAkE;AAClE,wBAAgB,WAAW,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAG7C"}
1
+ {"version":3,"file":"validation.d.ts","sourceRoot":"","sources":["../../../src/store/internal/validation.ts"],"names":[],"mappings":"AAOA,sEAAsE;AACtE,wBAAgB,cAAc,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI,CAGlE;AAED,kFAAkF;AAClF,wBAAgB,iBAAiB,CAAC,SAAS,EAAE,MAAM,EAAE,GAAG,IAAI,CAK3D;AAED,oFAAoF;AACpF,wBAAgB,WAAW,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAE7C;AAED;;;;GAIG;AACH,wBAAgB,gBAAgB,CAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAGxD"}
@@ -3,6 +3,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.validatePaging = validatePaging;
4
4
  exports.validateNamespace = validateNamespace;
5
5
  exports.validateKey = validateKey;
6
+ exports.validateMaxDepth = validateMaxDepth;
6
7
  const primitives_1 = require("../../shared/validation/primitives");
7
8
  const keys_1 = require("./keys");
8
9
  /** Validate search/listNamespaces paging is non-negative integers. */
@@ -10,17 +11,25 @@ function validatePaging(offset, limit) {
10
11
  (0, primitives_1.validateInteger)(offset, 'offset', { min: 0 });
11
12
  (0, primitives_1.validateInteger)(limit, 'limit', { min: 0 });
12
13
  }
13
- /** Validate the namespace is non-empty and each element is separator-free. */
14
+ /** Validate the namespace is non-empty and each element is a valid identifier. */
14
15
  function validateNamespace(namespace) {
15
16
  (0, primitives_1.validateNonEmptyArray)(namespace, 'namespace');
16
17
  for (const element of namespace) {
17
- (0, primitives_1.validateNonEmptyString)(element, 'namespace element');
18
- (0, primitives_1.assertNoSeparator)(element, keys_1.NAMESPACE_SEPARATOR, 'namespace element');
18
+ (0, primitives_1.validateIdentifier)(element, keys_1.NAMESPACE_SEPARATOR, 'namespace element');
19
19
  }
20
20
  }
21
- /** Validate an item key is a non-empty, separator-free string. */
21
+ /** Validate an item key is a non-empty, separator- and control-char-free string. */
22
22
  function validateKey(key) {
23
- (0, primitives_1.validateNonEmptyString)(key, 'key');
24
- (0, primitives_1.assertNoSeparator)(key, keys_1.NAMESPACE_SEPARATOR, 'key');
23
+ (0, primitives_1.validateIdentifier)(key, keys_1.NAMESPACE_SEPARATOR, 'key');
24
+ }
25
+ /**
26
+ * Validate an optional namespace depth cap. Left unchecked, a negative value
27
+ * silently inverted truncation via `Array.prototype.slice(0, -n)`, which drops
28
+ * the *last* n elements rather than erroring.
29
+ */
30
+ function validateMaxDepth(maxDepth) {
31
+ if (maxDepth === undefined)
32
+ return;
33
+ (0, primitives_1.validateInteger)(maxDepth, 'maxDepth', { min: 1 });
25
34
  }
26
35
  //# sourceMappingURL=validation.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"validation.js","sourceRoot":"","sources":["../../../src/store/internal/validation.ts"],"names":[],"mappings":";;;;;AAAA,mEAK4C;AAC5C,iCAA6C;AAE7C,sEAAsE;AACtE,wBAA+B,MAAc,EAAE,KAAa;IAC1D,IAAA,4BAAe,EAAC,MAAM,EAAE,QAAQ,EAAE,EAAE,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC;IAC9C,IAAA,4BAAe,EAAC,KAAK,EAAE,OAAO,EAAE,EAAE,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC;AAC9C,CAAC;AAED,8EAA8E;AAC9E,2BAAkC,SAAmB;IACnD,IAAA,kCAAqB,EAAC,SAAS,EAAE,WAAW,CAAC,CAAC;IAC9C,KAAK,MAAM,OAAO,IAAI,SAAS,EAAE,CAAC;QAChC,IAAA,mCAAsB,EAAC,OAAO,EAAE,mBAAmB,CAAC,CAAC;QACrD,IAAA,8BAAiB,EAAC,OAAO,EAAE,0BAAmB,EAAE,mBAAmB,CAAC,CAAC;IACvE,CAAC;AACH,CAAC;AAED,kEAAkE;AAClE,qBAA4B,GAAW;IACrC,IAAA,mCAAsB,EAAC,GAAG,EAAE,KAAK,CAAC,CAAC;IACnC,IAAA,8BAAiB,EAAC,GAAG,EAAE,0BAAmB,EAAE,KAAK,CAAC,CAAC;AACrD,CAAC"}
1
+ {"version":3,"file":"validation.js","sourceRoot":"","sources":["../../../src/store/internal/validation.ts"],"names":[],"mappings":";;;;;;AAAA,mEAI4C;AAC5C,iCAA6C;AAE7C,sEAAsE;AACtE,wBAA+B,MAAc,EAAE,KAAa;IAC1D,IAAA,4BAAe,EAAC,MAAM,EAAE,QAAQ,EAAE,EAAE,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC;IAC9C,IAAA,4BAAe,EAAC,KAAK,EAAE,OAAO,EAAE,EAAE,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC;AAC9C,CAAC;AAED,kFAAkF;AAClF,2BAAkC,SAAmB;IACnD,IAAA,kCAAqB,EAAC,SAAS,EAAE,WAAW,CAAC,CAAC;IAC9C,KAAK,MAAM,OAAO,IAAI,SAAS,EAAE,CAAC;QAChC,IAAA,+BAAkB,EAAC,OAAO,EAAE,0BAAmB,EAAE,mBAAmB,CAAC,CAAC;IACxE,CAAC;AACH,CAAC;AAED,oFAAoF;AACpF,qBAA4B,GAAW;IACrC,IAAA,+BAAkB,EAAC,GAAG,EAAE,0BAAmB,EAAE,KAAK,CAAC,CAAC;AACtD,CAAC;AAED;;;;GAIG;AACH,0BAAiC,QAAiB;IAChD,IAAI,QAAQ,KAAK,SAAS;QAAE,OAAO;IACnC,IAAA,4BAAe,EAAC,QAAQ,EAAE,UAAU,EAAE,EAAE,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC;AACpD,CAAC"}
@@ -1,4 +1,16 @@
1
1
  import type { StoreContext } from './setup';
2
+ /** True when `error` is a {@link RetryExhaustedError} — by name, not `instanceof` (banned repo-wide). */
3
+ export declare function isRetryExhausted(error: Error): boolean;
4
+ /**
5
+ * True when the row is confirmed absent — used to resolve an ambiguous
6
+ * retry-exhausted *delete*, where the delete may well have landed server-side
7
+ * and only its acknowledgement was lost. A failure reading this is not treated
8
+ * as confirmation (fail safe), matching {@link writeLandedAt}.
9
+ */
10
+ export declare function rowIsAbsent(context: StoreContext, key: {
11
+ PK: string;
12
+ SK: string;
13
+ }): Promise<boolean>;
2
14
  /**
3
15
  * True when `record`'s row already holds the S3 key `expectedS3Key` — i.e. an
4
16
  * ambiguous retry-exhaustion write actually landed server-side and only its
@@ -1 +1 @@
1
- {"version":3,"file":"write-verify.d.ts","sourceRoot":"","sources":["../../../src/store/internal/write-verify.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAE5C;;;;;GAKG;AACH,wBAAsB,aAAa,CACjC,OAAO,EAAE,YAAY,EACrB,MAAM,EAAE;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,EAAE,EAAE,MAAM,CAAA;CAAE,EAClC,aAAa,EAAE,MAAM,GACpB,OAAO,CAAC,OAAO,CAAC,CAgBlB"}
1
+ {"version":3,"file":"write-verify.d.ts","sourceRoot":"","sources":["../../../src/store/internal/write-verify.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAE5C,yGAAyG;AACzG,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,KAAK,GAAG,OAAO,CAEtD;AAED;;;;;GAKG;AACH,wBAAsB,WAAW,CAC/B,OAAO,EAAE,YAAY,EACrB,GAAG,EAAE;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,EAAE,EAAE,MAAM,CAAA;CAAE,GAC9B,OAAO,CAAC,OAAO,CAAC,CAelB;AAED;;;;;GAKG;AACH,wBAAsB,aAAa,CACjC,OAAO,EAAE,YAAY,EACrB,MAAM,EAAE;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,EAAE,EAAE,MAAM,CAAA;CAAE,EAClC,aAAa,EAAE,MAAM,GACpB,OAAO,CAAC,OAAO,CAAC,CAgBlB"}
@@ -1,8 +1,35 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.isRetryExhausted = isRetryExhausted;
4
+ exports.rowIsAbsent = rowIsAbsent;
3
5
  exports.writeLandedAt = writeLandedAt;
4
6
  const codec_1 = require("../../shared/codec/codec");
5
7
  const retry_1 = require("../../shared/dynamodb/retry");
8
+ /** True when `error` is a {@link RetryExhaustedError} — by name, not `instanceof` (banned repo-wide). */
9
+ function isRetryExhausted(error) {
10
+ return error.name === 'RetryExhaustedError';
11
+ }
12
+ /**
13
+ * True when the row is confirmed absent — used to resolve an ambiguous
14
+ * retry-exhausted *delete*, where the delete may well have landed server-side
15
+ * and only its acknowledgement was lost. A failure reading this is not treated
16
+ * as confirmation (fail safe), matching {@link writeLandedAt}.
17
+ */
18
+ async function rowIsAbsent(context, key) {
19
+ try {
20
+ const result = await (0, retry_1.withDynamoDBRetry)(() => context.client.get({
21
+ TableName: context.tableName,
22
+ Key: key,
23
+ ConsistentRead: true,
24
+ ProjectionExpression: '#v',
25
+ ExpressionAttributeNames: { '#v': 'value' },
26
+ }));
27
+ return result.Item === undefined;
28
+ }
29
+ catch {
30
+ return false;
31
+ }
32
+ }
6
33
  /**
7
34
  * True when `record`'s row already holds the S3 key `expectedS3Key` — i.e. an
8
35
  * ambiguous retry-exhaustion write actually landed server-side and only its
@@ -1 +1 @@
1
- {"version":3,"file":"write-verify.js","sourceRoot":"","sources":["../../../src/store/internal/write-verify.ts"],"names":[],"mappings":";;;AAAA,oDAAmF;AACnF,uDAAgE;AAGhE;;;;;GAKG;AACI,KAAK,wBACV,OAAqB,EACrB,MAAkC,EAClC,aAAqB;IAErB,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,IAAA,yBAAiB,EAAC,GAAG,EAAE,CAC1C,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC;YACjB,SAAS,EAAE,OAAO,CAAC,SAAS;YAC5B,GAAG,EAAE,EAAE,EAAE,EAAE,MAAM,CAAC,EAAE,EAAE,EAAE,EAAE,MAAM,CAAC,EAAE,EAAE;YACrC,cAAc,EAAE,IAAI;YACpB,oBAAoB,EAAE,IAAI;YAC1B,wBAAwB,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE;SAC5C,CAAC,CACH,CAAC;QACF,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,EAAE,KAAsC,CAAC;QAClE,OAAO,KAAK,EAAE,QAAQ,KAAK,uBAAe,CAAC,EAAE,IAAI,KAAK,CAAC,KAAK,KAAK,aAAa,CAAC;IACjF,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC"}
1
+ {"version":3,"file":"write-verify.js","sourceRoot":"","sources":["../../../src/store/internal/write-verify.ts"],"names":[],"mappings":";;;;;AAAA,oDAAmF;AACnF,uDAAgE;AAGhE,yGAAyG;AACzG,0BAAiC,KAAY;IAC3C,OAAO,KAAK,CAAC,IAAI,KAAK,qBAAqB,CAAC;AAC9C,CAAC;AAED;;;;;GAKG;AACI,KAAK,sBACV,OAAqB,EACrB,GAA+B;IAE/B,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,IAAA,yBAAiB,EAAC,GAAG,EAAE,CAC1C,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC;YACjB,SAAS,EAAE,OAAO,CAAC,SAAS;YAC5B,GAAG,EAAE,GAAG;YACR,cAAc,EAAE,IAAI;YACpB,oBAAoB,EAAE,IAAI;YAC1B,wBAAwB,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE;SAC5C,CAAC,CACH,CAAC;QACF,OAAO,MAAM,CAAC,IAAI,KAAK,SAAS,CAAC;IACnC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED;;;;;GAKG;AACI,KAAK,wBACV,OAAqB,EACrB,MAAkC,EAClC,aAAqB;IAErB,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,IAAA,yBAAiB,EAAC,GAAG,EAAE,CAC1C,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC;YACjB,SAAS,EAAE,OAAO,CAAC,SAAS;YAC5B,GAAG,EAAE,EAAE,EAAE,EAAE,MAAM,CAAC,EAAE,EAAE,EAAE,EAAE,MAAM,CAAC,EAAE,EAAE;YACrC,cAAc,EAAE,IAAI;YACpB,oBAAoB,EAAE,IAAI;YAC1B,wBAAwB,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE;SAC5C,CAAC,CACH,CAAC;QACF,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,EAAE,KAAsC,CAAC;QAClE,OAAO,KAAK,EAAE,QAAQ,KAAK,uBAAe,CAAC,EAAE,IAAI,KAAK,CAAC,KAAK,KAAK,aAAa,CAAC;IACjF,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC"}
@@ -2,6 +2,18 @@
2
2
  export interface VectorMatch {
3
3
  namespace: string[];
4
4
  key: string;
5
+ /**
6
+ * Relevance, where **higher means a better match** — the same direction as
7
+ * upstream `SearchItem.score`, which this value is forwarded to verbatim.
8
+ *
9
+ * A backend whose native output is a *distance* (S3 Vectors, FAISS L2,
10
+ * pgvector's `<->`) must convert before returning: a distance ranks the
11
+ * other way, so forwarding one unconverted yields results that are ordered
12
+ * correctly but scored backwards, which silently breaks any caller that
13
+ * thresholds or displays the number. This package cannot tell the two apart
14
+ * and never reorders what a backend returns; it only warns when the scores
15
+ * it sees are not non-increasing.
16
+ */
5
17
  score: number;
6
18
  }
7
19
  /** A stored vector's location, returned by {@link VectorBackend.listKeys}. */
@@ -15,6 +27,11 @@ export interface VectorRef {
15
27
  */
16
28
  export interface VectorBackend {
17
29
  upsert(namespace: string[], key: string, vector: number[]): Promise<void>;
30
+ /**
31
+ * Return up to `topK` matches under `namespacePrefix`, best first. Each
32
+ * match's `score` must be a relevance, not a distance — see
33
+ * {@link VectorMatch.score}.
34
+ */
18
35
  query(namespacePrefix: string[], queryVector: number[], topK: number): Promise<VectorMatch[]>;
19
36
  delete(namespace: string[], key: string): Promise<void>;
20
37
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"vector-backend.d.ts","sourceRoot":"","sources":["../../src/store/vector-backend.ts"],"names":[],"mappings":"AAAA,+EAA+E;AAC/E,MAAM,WAAW,WAAW;IAC1B,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;CACf;AAED,8EAA8E;AAC9E,MAAM,WAAW,SAAS;IACxB,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,GAAG,EAAE,MAAM,CAAC;CACb;AAED;;;GAGG;AACH,MAAM,WAAW,aAAa;IAC5B,MAAM,CAAC,SAAS,EAAE,MAAM,EAAE,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC1E,KAAK,CAAC,eAAe,EAAE,MAAM,EAAE,EAAE,WAAW,EAAE,MAAM,EAAE,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC,CAAC;IAC9F,MAAM,CAAC,SAAS,EAAE,MAAM,EAAE,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACxD;;;;OAIG;IACH,QAAQ,CAAC,CAAC,eAAe,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,SAAS,EAAE,CAAC,CAAC;CAC5D"}
1
+ {"version":3,"file":"vector-backend.d.ts","sourceRoot":"","sources":["../../src/store/vector-backend.ts"],"names":[],"mappings":"AAAA,+EAA+E;AAC/E,MAAM,WAAW,WAAW;IAC1B,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,GAAG,EAAE,MAAM,CAAC;IACZ;;;;;;;;;;;OAWG;IACH,KAAK,EAAE,MAAM,CAAC;CACf;AAED,8EAA8E;AAC9E,MAAM,WAAW,SAAS;IACxB,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,GAAG,EAAE,MAAM,CAAC;CACb;AAED;;;GAGG;AACH,MAAM,WAAW,aAAa;IAC5B,MAAM,CAAC,SAAS,EAAE,MAAM,EAAE,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC1E;;;;OAIG;IACH,KAAK,CAAC,eAAe,EAAE,MAAM,EAAE,EAAE,WAAW,EAAE,MAAM,EAAE,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC,CAAC;IAC9F,MAAM,CAAC,SAAS,EAAE,MAAM,EAAE,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACxD;;;;OAIG;IACH,QAAQ,CAAC,CAAC,eAAe,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,SAAS,EAAE,CAAC,CAAC;CAC5D"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@farukada/aws-langgraph-dynamodb-ts",
3
- "version": "0.6.0",
3
+ "version": "0.8.0",
4
4
  "license": "MIT",
5
5
  "description": "AWS DynamoDB implementation for LangGraph Memory Store and Checkpoint Saver in TypeScript",
6
6
  "keywords": [