@farukada/aws-langgraph-dynamodb-ts 0.1.0 → 0.2.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 (153) hide show
  1. package/README.md +131 -5
  2. package/dist/checkpointer/actions/delete-thread.d.ts.map +1 -1
  3. package/dist/checkpointer/actions/delete-thread.js +17 -9
  4. package/dist/checkpointer/actions/delete-thread.js.map +1 -1
  5. package/dist/checkpointer/actions/get-tuple.d.ts.map +1 -1
  6. package/dist/checkpointer/actions/get-tuple.js +70 -32
  7. package/dist/checkpointer/actions/get-tuple.js.map +1 -1
  8. package/dist/checkpointer/actions/put-writes.d.ts.map +1 -1
  9. package/dist/checkpointer/actions/put-writes.js +36 -19
  10. package/dist/checkpointer/actions/put-writes.js.map +1 -1
  11. package/dist/checkpointer/actions/put.d.ts.map +1 -1
  12. package/dist/checkpointer/actions/put.js +75 -18
  13. package/dist/checkpointer/actions/put.js.map +1 -1
  14. package/dist/checkpointer/actions/writer.d.ts +6 -4
  15. package/dist/checkpointer/actions/writer.d.ts.map +1 -1
  16. package/dist/checkpointer/actions/writer.js +12 -12
  17. package/dist/checkpointer/actions/writer.js.map +1 -1
  18. package/dist/checkpointer/index.d.ts +11 -4
  19. package/dist/checkpointer/index.d.ts.map +1 -1
  20. package/dist/checkpointer/index.js +97 -72
  21. package/dist/checkpointer/index.js.map +1 -1
  22. package/dist/checkpointer/types/index.d.ts +8 -0
  23. package/dist/checkpointer/types/index.d.ts.map +1 -1
  24. package/dist/checkpointer/utils/deserialization.d.ts.map +1 -1
  25. package/dist/checkpointer/utils/deserialization.js +28 -4
  26. package/dist/checkpointer/utils/deserialization.js.map +1 -1
  27. package/dist/checkpointer/utils/validation.d.ts +8 -8
  28. package/dist/checkpointer/utils/validation.d.ts.map +1 -1
  29. package/dist/checkpointer/utils/validation.js +45 -1
  30. package/dist/checkpointer/utils/validation.js.map +1 -1
  31. package/dist/factory.d.ts +14 -0
  32. package/dist/factory.d.ts.map +1 -1
  33. package/dist/factory.js +39 -20
  34. package/dist/factory.js.map +1 -1
  35. package/dist/history/actions/add-message.d.ts +5 -9
  36. package/dist/history/actions/add-message.d.ts.map +1 -1
  37. package/dist/history/actions/add-message.js +14 -42
  38. package/dist/history/actions/add-message.js.map +1 -1
  39. package/dist/history/actions/add-messages.d.ts +6 -10
  40. package/dist/history/actions/add-messages.d.ts.map +1 -1
  41. package/dist/history/actions/add-messages.js +33 -38
  42. package/dist/history/actions/add-messages.js.map +1 -1
  43. package/dist/history/actions/clear.d.ts.map +1 -1
  44. package/dist/history/actions/clear.js +3 -3
  45. package/dist/history/actions/clear.js.map +1 -1
  46. package/dist/history/actions/get-messages.d.ts.map +1 -1
  47. package/dist/history/actions/get-messages.js +2 -2
  48. package/dist/history/actions/get-messages.js.map +1 -1
  49. package/dist/history/actions/list-sessions.d.ts.map +1 -1
  50. package/dist/history/actions/list-sessions.js +6 -3
  51. package/dist/history/actions/list-sessions.js.map +1 -1
  52. package/dist/history/index.d.ts +41 -5
  53. package/dist/history/index.d.ts.map +1 -1
  54. package/dist/history/index.js +52 -18
  55. package/dist/history/index.js.map +1 -1
  56. package/dist/history/session-adapter.d.ts +39 -0
  57. package/dist/history/session-adapter.d.ts.map +1 -0
  58. package/dist/history/session-adapter.js +74 -0
  59. package/dist/history/session-adapter.js.map +1 -0
  60. package/dist/history/types/index.d.ts +32 -1
  61. package/dist/history/types/index.d.ts.map +1 -1
  62. package/dist/history/utils/index.d.ts +1 -0
  63. package/dist/history/utils/index.d.ts.map +1 -1
  64. package/dist/history/utils/index.js +1 -0
  65. package/dist/history/utils/index.js.map +1 -1
  66. package/dist/history/utils/optimistic-retry.d.ts +31 -0
  67. package/dist/history/utils/optimistic-retry.d.ts.map +1 -0
  68. package/dist/history/utils/optimistic-retry.js +74 -0
  69. package/dist/history/utils/optimistic-retry.js.map +1 -0
  70. package/dist/history/utils/title-generator.d.ts.map +1 -1
  71. package/dist/history/utils/title-generator.js +8 -3
  72. package/dist/history/utils/title-generator.js.map +1 -1
  73. package/dist/history/utils/update-expression-builder.d.ts +18 -21
  74. package/dist/history/utils/update-expression-builder.d.ts.map +1 -1
  75. package/dist/history/utils/update-expression-builder.js +31 -46
  76. package/dist/history/utils/update-expression-builder.js.map +1 -1
  77. package/dist/history/utils/validation.d.ts.map +1 -1
  78. package/dist/history/utils/validation.js +23 -3
  79. package/dist/history/utils/validation.js.map +1 -1
  80. package/dist/index.d.ts +6 -2
  81. package/dist/index.d.ts.map +1 -1
  82. package/dist/index.js +6 -1
  83. package/dist/index.js.map +1 -1
  84. package/dist/shared/utils/batch-write.d.ts +44 -6
  85. package/dist/shared/utils/batch-write.d.ts.map +1 -1
  86. package/dist/shared/utils/batch-write.js +76 -28
  87. package/dist/shared/utils/batch-write.js.map +1 -1
  88. package/dist/shared/utils/client-factory.d.ts +25 -0
  89. package/dist/shared/utils/client-factory.d.ts.map +1 -0
  90. package/dist/shared/utils/client-factory.js +23 -0
  91. package/dist/shared/utils/client-factory.js.map +1 -0
  92. package/dist/shared/utils/compressor.d.ts +21 -3
  93. package/dist/shared/utils/compressor.d.ts.map +1 -1
  94. package/dist/shared/utils/compressor.js +75 -10
  95. package/dist/shared/utils/compressor.js.map +1 -1
  96. package/dist/shared/utils/constants.d.ts +1 -1
  97. package/dist/shared/utils/constants.d.ts.map +1 -1
  98. package/dist/shared/utils/constants.js +5 -1
  99. package/dist/shared/utils/constants.js.map +1 -1
  100. package/dist/shared/utils/index.d.ts +3 -0
  101. package/dist/shared/utils/index.d.ts.map +1 -1
  102. package/dist/shared/utils/index.js +3 -0
  103. package/dist/shared/utils/index.js.map +1 -1
  104. package/dist/shared/utils/logger.d.ts +27 -0
  105. package/dist/shared/utils/logger.d.ts.map +1 -1
  106. package/dist/shared/utils/logger.js +86 -0
  107. package/dist/shared/utils/logger.js.map +1 -1
  108. package/dist/shared/utils/retry.d.ts +7 -0
  109. package/dist/shared/utils/retry.d.ts.map +1 -1
  110. package/dist/shared/utils/retry.js +75 -17
  111. package/dist/shared/utils/retry.js.map +1 -1
  112. package/dist/shared/utils/s3-offloader.d.ts +10 -3
  113. package/dist/shared/utils/s3-offloader.d.ts.map +1 -1
  114. package/dist/shared/utils/s3-offloader.js +19 -9
  115. package/dist/shared/utils/s3-offloader.js.map +1 -1
  116. package/dist/shared/utils/s3-orphans.d.ts +16 -0
  117. package/dist/shared/utils/s3-orphans.d.ts.map +1 -0
  118. package/dist/shared/utils/s3-orphans.js +79 -0
  119. package/dist/shared/utils/s3-orphans.js.map +1 -0
  120. package/dist/shared/utils/sleep.d.ts +48 -0
  121. package/dist/shared/utils/sleep.d.ts.map +1 -0
  122. package/dist/shared/utils/sleep.js +82 -0
  123. package/dist/shared/utils/sleep.js.map +1 -0
  124. package/dist/shared/utils/ttl.d.ts +6 -2
  125. package/dist/shared/utils/ttl.d.ts.map +1 -1
  126. package/dist/shared/utils/ttl.js +17 -2
  127. package/dist/shared/utils/ttl.js.map +1 -1
  128. package/dist/store/actions/get-operation.d.ts.map +1 -1
  129. package/dist/store/actions/get-operation.js +2 -2
  130. package/dist/store/actions/get-operation.js.map +1 -1
  131. package/dist/store/actions/list-namespaces-operation.d.ts.map +1 -1
  132. package/dist/store/actions/list-namespaces-operation.js +44 -29
  133. package/dist/store/actions/list-namespaces-operation.js.map +1 -1
  134. package/dist/store/actions/put-operation.d.ts.map +1 -1
  135. package/dist/store/actions/put-operation.js +19 -5
  136. package/dist/store/actions/put-operation.js.map +1 -1
  137. package/dist/store/actions/search-operation.d.ts.map +1 -1
  138. package/dist/store/actions/search-operation.js +54 -21
  139. package/dist/store/actions/search-operation.js.map +1 -1
  140. package/dist/store/index.d.ts +1 -0
  141. package/dist/store/index.d.ts.map +1 -1
  142. package/dist/store/index.js +24 -20
  143. package/dist/store/index.js.map +1 -1
  144. package/dist/store/types/index.d.ts +33 -1
  145. package/dist/store/types/index.d.ts.map +1 -1
  146. package/dist/store/utils/filter.d.ts.map +1 -1
  147. package/dist/store/utils/filter.js +63 -1
  148. package/dist/store/utils/filter.js.map +1 -1
  149. package/dist/store/utils/validation.d.ts +6 -2
  150. package/dist/store/utils/validation.d.ts.map +1 -1
  151. package/dist/store/utils/validation.js +21 -5
  152. package/dist/store/utils/validation.js.map +1 -1
  153. package/package.json +36 -25
@@ -7,11 +7,32 @@ import { DynamoDBDocument } from '@aws-sdk/lib-dynamodb';
7
7
  import type { BaseMessage, StoredMessage } from '@langchain/core/messages';
8
8
  /**
9
9
  * Configuration options for DynamoDBChatMessageHistory
10
+ *
11
+ * @remarks
12
+ * **TTL semantics — important:**
13
+ *
14
+ * - The **session metadata** item's `ttl` attribute is refreshed on every
15
+ * `addMessage` / `addMessages` call, so `listSessions()` reflects a session as
16
+ * live as long as new messages keep arriving within `ttlDays`.
17
+ * - Individual **message items** get a TTL stamped at write time and each
18
+ * expires independently. A long-lived session that ingests new messages every
19
+ * few days can develop gaps where old messages expire while newer ones
20
+ * persist.
21
+ *
22
+ * If you need a strict "keep the whole conversation as long as it is active"
23
+ * contract, set `ttlDays` significantly larger than your expected session
24
+ * lifetime, or manage deletion yourself via `clear()`.
10
25
  */
11
26
  export interface DynamoDBChatMessageHistoryOptions {
12
27
  /** Name of the DynamoDB table to use for storage */
13
28
  tableName: string;
14
- /** Optional TTL in days for stored items (1-1825 days) */
29
+ /**
30
+ * Optional TTL in days for stored items (1-1825 days).
31
+ *
32
+ * Metadata TTL is sliding (refreshed on every write). Per-message TTL is
33
+ * fixed at each message's write time — see the class-level remarks for
34
+ * implications on long-lived sessions.
35
+ */
15
36
  ttlDays?: number;
16
37
  /** Optional DynamoDB client configuration */
17
38
  clientConfig?: DynamoDBClientConfig;
@@ -85,6 +106,8 @@ export interface GetMessagesActionParams {
85
106
  userId: string;
86
107
  /** Session identifier */
87
108
  sessionId: string;
109
+ /** Optional AbortSignal — cancels in-flight retries */
110
+ signal?: AbortSignal;
88
111
  }
89
112
  /**
90
113
  * Parameters for add message action
@@ -104,6 +127,8 @@ export interface AddMessageActionParams {
104
127
  title?: string;
105
128
  /** Optional TTL in days */
106
129
  ttlDays?: number;
130
+ /** Optional AbortSignal — cancels in-flight retries */
131
+ signal?: AbortSignal;
107
132
  }
108
133
  /**
109
134
  * Parameters for add messages action
@@ -123,6 +148,8 @@ export interface AddMessagesActionParams {
123
148
  title?: string;
124
149
  /** Optional TTL in days */
125
150
  ttlDays?: number;
151
+ /** Optional AbortSignal — cancels in-flight retries */
152
+ signal?: AbortSignal;
126
153
  }
127
154
  /**
128
155
  * Parameters for clear action
@@ -136,6 +163,8 @@ export interface ClearActionParams {
136
163
  userId: string;
137
164
  /** Session identifier */
138
165
  sessionId: string;
166
+ /** Optional AbortSignal — cancels in-flight retries */
167
+ signal?: AbortSignal;
139
168
  }
140
169
  /**
141
170
  * Parameters for list sessions action
@@ -149,5 +178,7 @@ export interface ListSessionsActionParams {
149
178
  userId: string;
150
179
  /** Optional maximum number of sessions to return */
151
180
  limit?: number;
181
+ /** Optional AbortSignal — cancels in-flight retries */
182
+ signal?: AbortSignal;
152
183
  }
153
184
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/history/types/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/history/types/index.ts"],"names":[],"mappings":"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"}
@@ -4,5 +4,6 @@
4
4
  export * from './validation';
5
5
  export * from './title-generator';
6
6
  export * from './update-expression-builder';
7
+ export * from './optimistic-retry';
7
8
  export { withDynamoDBRetry } from '../../shared/utils';
8
9
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/history/utils/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,cAAc,cAAc,CAAC;AAC7B,cAAc,mBAAmB,CAAC;AAClC,cAAc,6BAA6B,CAAC;AAC5C,OAAO,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/history/utils/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,cAAc,cAAc,CAAC;AAC7B,cAAc,mBAAmB,CAAC;AAClC,cAAc,6BAA6B,CAAC;AAC5C,cAAc,oBAAoB,CAAC;AACnC,OAAO,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC"}
@@ -21,6 +21,7 @@ exports.withDynamoDBRetry = void 0;
21
21
  __exportStar(require("./validation"), exports);
22
22
  __exportStar(require("./title-generator"), exports);
23
23
  __exportStar(require("./update-expression-builder"), exports);
24
+ __exportStar(require("./optimistic-retry"), exports);
24
25
  var utils_1 = require("../../shared/utils");
25
26
  Object.defineProperty(exports, "withDynamoDBRetry", { enumerable: true, get: function () { return utils_1.withDynamoDBRetry; } });
26
27
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/history/utils/index.ts"],"names":[],"mappings":";AAAA;;GAEG;;;;;;;;;;;;;;;;;AAEH,+CAA6B;AAC7B,oDAAkC;AAClC,8DAA4C;AAC5C,4CAAuD;AAA9C,0GAAA,iBAAiB,OAAA"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/history/utils/index.ts"],"names":[],"mappings":";AAAA;;GAEG;;;;;;;;;;;;;;;;;AAEH,+CAA6B;AAC7B,oDAAkC;AAClC,8DAA4C;AAC5C,qDAAmC;AACnC,4CAAuD;AAA9C,0GAAA,iBAAiB,OAAA"}
@@ -0,0 +1,31 @@
1
+ /**
2
+ * Optimistic-concurrency retry helper shared by addMessage / addMessages.
3
+ *
4
+ * These actions read the current messageCount, then run a transaction that writes
5
+ * new items and updates the counter with a ConditionExpression. On concurrent
6
+ * modification the condition fails; we re-read and retry up to N times.
7
+ */
8
+ export declare const MAX_OPTIMISTIC_RETRIES = 5;
9
+ /**
10
+ * Returns true for errors that indicate an optimistic-lock conflict that is
11
+ * safe to retry — either a bare `ConditionalCheckFailedException`, or a
12
+ * `TransactionCanceledException` where every reported `CancellationReason` is
13
+ * either `ConditionalCheckFailed` or `None`.
14
+ *
15
+ * DynamoDB's `CancellationReasons` array pairs 1:1 with the TransactItems it
16
+ * was handed: participants that did not block the transaction report `None`.
17
+ * Mixed-outcome cases — a `ConditionalCheckFailed` in item 0 alongside a
18
+ * `ValidationError` or `ItemCollectionSizeLimitExceeded` in item 1 — are
19
+ * permanent: retrying the whole transaction will never resolve the permanent
20
+ * sub-reason, so we must propagate instead of looping.
21
+ */
22
+ export declare function isConditionalCheckFailure(err: unknown): boolean;
23
+ /**
24
+ * Run `fn` until it succeeds or until MAX_OPTIMISTIC_RETRIES attempts exhaust.
25
+ *
26
+ * - On conditional-check failure (any attempt but the last), `fn` is re-invoked.
27
+ * - On any other error, the error is re-thrown immediately.
28
+ * - On exhaustion, a labelled error is thrown so the caller can identify it.
29
+ */
30
+ export declare function withOptimisticRetry<T>(label: string, fn: (attempt: number) => Promise<T>): Promise<T>;
31
+ //# sourceMappingURL=optimistic-retry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"optimistic-retry.d.ts","sourceRoot":"","sources":["../../../src/history/utils/optimistic-retry.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,eAAO,MAAM,sBAAsB,IAAI,CAAC;AAExC;;;;;;;;;;;;GAYG;AACH,wBAAgB,yBAAyB,CAAC,GAAG,EAAE,OAAO,GAAG,OAAO,CAqB/D;AAED;;;;;;GAMG;AACH,wBAAsB,mBAAmB,CAAC,CAAC,EACzC,KAAK,EAAE,MAAM,EACb,EAAE,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,OAAO,CAAC,CAAC,CAAC,GAClC,OAAO,CAAC,CAAC,CAAC,CAYZ"}
@@ -0,0 +1,74 @@
1
+ "use strict";
2
+ /**
3
+ * Optimistic-concurrency retry helper shared by addMessage / addMessages.
4
+ *
5
+ * These actions read the current messageCount, then run a transaction that writes
6
+ * new items and updates the counter with a ConditionExpression. On concurrent
7
+ * modification the condition fails; we re-read and retry up to N times.
8
+ */
9
+ Object.defineProperty(exports, "__esModule", { value: true });
10
+ exports.MAX_OPTIMISTIC_RETRIES = void 0;
11
+ exports.isConditionalCheckFailure = isConditionalCheckFailure;
12
+ exports.withOptimisticRetry = withOptimisticRetry;
13
+ exports.MAX_OPTIMISTIC_RETRIES = 5;
14
+ /**
15
+ * Returns true for errors that indicate an optimistic-lock conflict that is
16
+ * safe to retry — either a bare `ConditionalCheckFailedException`, or a
17
+ * `TransactionCanceledException` where every reported `CancellationReason` is
18
+ * either `ConditionalCheckFailed` or `None`.
19
+ *
20
+ * DynamoDB's `CancellationReasons` array pairs 1:1 with the TransactItems it
21
+ * was handed: participants that did not block the transaction report `None`.
22
+ * Mixed-outcome cases — a `ConditionalCheckFailed` in item 0 alongside a
23
+ * `ValidationError` or `ItemCollectionSizeLimitExceeded` in item 1 — are
24
+ * permanent: retrying the whole transaction will never resolve the permanent
25
+ * sub-reason, so we must propagate instead of looping.
26
+ */
27
+ function isConditionalCheckFailure(err) {
28
+ if (!err || typeof err !== 'object')
29
+ return false;
30
+ const e = err;
31
+ if (e.name === 'ConditionalCheckFailedException')
32
+ return true;
33
+ if (e.name === 'TransactionCanceledException' && Array.isArray(e.CancellationReasons)) {
34
+ const reasons = e.CancellationReasons;
35
+ if (reasons.length === 0)
36
+ return false;
37
+ // Need at least one ConditionalCheckFailed (otherwise nothing suggests the
38
+ // transaction will differ on retry) and no permanent sub-reason mixed in.
39
+ let sawConditionalFailure = false;
40
+ for (const r of reasons) {
41
+ const code = r?.Code;
42
+ if (code === 'ConditionalCheckFailed') {
43
+ sawConditionalFailure = true;
44
+ }
45
+ else if (code && code !== 'None') {
46
+ return false;
47
+ }
48
+ }
49
+ return sawConditionalFailure;
50
+ }
51
+ return false;
52
+ }
53
+ /**
54
+ * Run `fn` until it succeeds or until MAX_OPTIMISTIC_RETRIES attempts exhaust.
55
+ *
56
+ * - On conditional-check failure (any attempt but the last), `fn` is re-invoked.
57
+ * - On any other error, the error is re-thrown immediately.
58
+ * - On exhaustion, a labelled error is thrown so the caller can identify it.
59
+ */
60
+ async function withOptimisticRetry(label, fn) {
61
+ for (let attempt = 0; attempt < exports.MAX_OPTIMISTIC_RETRIES; attempt++) {
62
+ try {
63
+ return await fn(attempt);
64
+ }
65
+ catch (err) {
66
+ if (isConditionalCheckFailure(err) && attempt < exports.MAX_OPTIMISTIC_RETRIES - 1) {
67
+ continue;
68
+ }
69
+ throw err;
70
+ }
71
+ }
72
+ throw new Error(`${label} failed after ${exports.MAX_OPTIMISTIC_RETRIES} optimistic-lock retries`);
73
+ }
74
+ //# sourceMappingURL=optimistic-retry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"optimistic-retry.js","sourceRoot":"","sources":["../../../src/history/utils/optimistic-retry.ts"],"names":[],"mappings":";AAAA;;;;;;GAMG;;;AAiBH,8DAqBC;AASD,kDAeC;AA5DY,QAAA,sBAAsB,GAAG,CAAC,CAAC;AAExC;;;;;;;;;;;;GAYG;AACH,SAAgB,yBAAyB,CAAC,GAAY;IACpD,IAAI,CAAC,GAAG,IAAI,OAAO,GAAG,KAAK,QAAQ;QAAE,OAAO,KAAK,CAAC;IAClD,MAAM,CAAC,GAAG,GAAwE,CAAC;IACnF,IAAI,CAAC,CAAC,IAAI,KAAK,iCAAiC;QAAE,OAAO,IAAI,CAAC;IAC9D,IAAI,CAAC,CAAC,IAAI,KAAK,8BAA8B,IAAI,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,mBAAmB,CAAC,EAAE,CAAC;QACtF,MAAM,OAAO,GAAG,CAAC,CAAC,mBAAmB,CAAC;QACtC,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,KAAK,CAAC;QACvC,2EAA2E;QAC3E,0EAA0E;QAC1E,IAAI,qBAAqB,GAAG,KAAK,CAAC;QAClC,KAAK,MAAM,CAAC,IAAI,OAAO,EAAE,CAAC;YACxB,MAAM,IAAI,GAAG,CAAC,EAAE,IAAI,CAAC;YACrB,IAAI,IAAI,KAAK,wBAAwB,EAAE,CAAC;gBACtC,qBAAqB,GAAG,IAAI,CAAC;YAC/B,CAAC;iBAAM,IAAI,IAAI,IAAI,IAAI,KAAK,MAAM,EAAE,CAAC;gBACnC,OAAO,KAAK,CAAC;YACf,CAAC;QACH,CAAC;QACD,OAAO,qBAAqB,CAAC;IAC/B,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED;;;;;;GAMG;AACI,KAAK,UAAU,mBAAmB,CACvC,KAAa,EACb,EAAmC;IAEnC,KAAK,IAAI,OAAO,GAAG,CAAC,EAAE,OAAO,GAAG,8BAAsB,EAAE,OAAO,EAAE,EAAE,CAAC;QAClE,IAAI,CAAC;YACH,OAAO,MAAM,EAAE,CAAC,OAAO,CAAC,CAAC;QAC3B,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,IAAI,yBAAyB,CAAC,GAAG,CAAC,IAAI,OAAO,GAAG,8BAAsB,GAAG,CAAC,EAAE,CAAC;gBAC3E,SAAS;YACX,CAAC;YACD,MAAM,GAAG,CAAC;QACZ,CAAC;IACH,CAAC;IACD,MAAM,IAAI,KAAK,CAAC,GAAG,KAAK,iBAAiB,8BAAsB,0BAA0B,CAAC,CAAC;AAC7F,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"title-generator.d.ts","sourceRoot":"","sources":["../../../src/history/utils/title-generator.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AAKvD;;;;;GAKG;AACH,wBAAgB,aAAa,CAAC,OAAO,EAAE,WAAW,GAAG,MAAM,CAuC1D"}
1
+ {"version":3,"file":"title-generator.d.ts","sourceRoot":"","sources":["../../../src/history/utils/title-generator.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AAUvD;;;;;GAKG;AACH,wBAAgB,aAAa,CAAC,OAAO,EAAE,WAAW,GAAG,MAAM,CAuC1D"}
@@ -4,7 +4,12 @@
4
4
  */
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
6
  exports.generateTitle = generateTitle;
7
- const MAX_TITLE_LENGTH = 100;
7
+ /**
8
+ * Cap for *auto-generated* titles. Separate from the user-facing
9
+ * validation cap in utils/validation.ts (MAX_TITLE_LENGTH = 200): we deliberately
10
+ * produce shorter previews when auto-deriving a title from a long first message.
11
+ */
12
+ const GENERATED_TITLE_MAX_LENGTH = 100;
8
13
  const DEFAULT_TITLE = 'New Conversation';
9
14
  /**
10
15
  * Generate a session title from the first message
@@ -43,10 +48,10 @@ function generateTitle(message) {
43
48
  return DEFAULT_TITLE;
44
49
  }
45
50
  // Truncate to max length
46
- if (cleaned.length <= MAX_TITLE_LENGTH) {
51
+ if (cleaned.length <= GENERATED_TITLE_MAX_LENGTH) {
47
52
  return cleaned;
48
53
  }
49
54
  // Truncate and add ellipsis
50
- return cleaned.substring(0, MAX_TITLE_LENGTH - 3) + '...';
55
+ return cleaned.substring(0, GENERATED_TITLE_MAX_LENGTH - 3) + '...';
51
56
  }
52
57
  //# sourceMappingURL=title-generator.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"title-generator.js","sourceRoot":"","sources":["../../../src/history/utils/title-generator.ts"],"names":[],"mappings":";AAAA;;GAEG;;AAaH,sCAuCC;AAhDD,MAAM,gBAAgB,GAAG,GAAG,CAAC;AAC7B,MAAM,aAAa,GAAG,kBAAkB,CAAC;AAEzC;;;;;GAKG;AACH,SAAgB,aAAa,CAAC,OAAoB;IAChD,IAAI,CAAC,OAAO,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC;QACjC,OAAO,aAAa,CAAC;IACvB,CAAC;IAED,yEAAyE;IACzE,IAAI,WAAW,GAAG,EAAE,CAAC;IACrB,IAAI,OAAO,OAAO,CAAC,OAAO,KAAK,QAAQ,EAAE,CAAC;QACxC,WAAW,GAAG,OAAO,CAAC,OAAO,CAAC;IAChC,CAAC;SAAM,IAAI,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;QAC1C,mDAAmD;QACnD,WAAW,GAAG,OAAO,CAAC,OAAO;aAC1B,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE;YACZ,IAAI,OAAO,IAAI,KAAK,QAAQ;gBAAE,OAAO,IAAI,CAAC;YAC1C,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,IAAI,KAAK,IAAI,IAAI,MAAM,IAAI,IAAI,EAAE,CAAC;gBAChE,OAAQ,IAAyB,CAAC,IAAI,CAAC;YACzC,CAAC;YACD,OAAO,EAAE,CAAC;QACZ,CAAC,CAAC;aACD,IAAI,CAAC,GAAG,CAAC,CAAC;IACf,CAAC;IAED,+BAA+B;IAC/B,MAAM,OAAO,GAAG,WAAW;SACxB,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,kDAAkD;SACvE,OAAO,CAAC,UAAU,EAAE,GAAG,CAAC,CAAC,8BAA8B;SACvD,IAAI,EAAE,CAAC;IAEV,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,OAAO,aAAa,CAAC;IACvB,CAAC;IAED,yBAAyB;IACzB,IAAI,OAAO,CAAC,MAAM,IAAI,gBAAgB,EAAE,CAAC;QACvC,OAAO,OAAO,CAAC;IACjB,CAAC;IAED,4BAA4B;IAC5B,OAAO,OAAO,CAAC,SAAS,CAAC,CAAC,EAAE,gBAAgB,GAAG,CAAC,CAAC,GAAG,KAAK,CAAC;AAC5D,CAAC"}
1
+ {"version":3,"file":"title-generator.js","sourceRoot":"","sources":["../../../src/history/utils/title-generator.ts"],"names":[],"mappings":";AAAA;;GAEG;;AAkBH,sCAuCC;AArDD;;;;GAIG;AACH,MAAM,0BAA0B,GAAG,GAAG,CAAC;AACvC,MAAM,aAAa,GAAG,kBAAkB,CAAC;AAEzC;;;;;GAKG;AACH,SAAgB,aAAa,CAAC,OAAoB;IAChD,IAAI,CAAC,OAAO,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC;QACjC,OAAO,aAAa,CAAC;IACvB,CAAC;IAED,yEAAyE;IACzE,IAAI,WAAW,GAAG,EAAE,CAAC;IACrB,IAAI,OAAO,OAAO,CAAC,OAAO,KAAK,QAAQ,EAAE,CAAC;QACxC,WAAW,GAAG,OAAO,CAAC,OAAO,CAAC;IAChC,CAAC;SAAM,IAAI,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;QAC1C,mDAAmD;QACnD,WAAW,GAAG,OAAO,CAAC,OAAO;aAC1B,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE;YACZ,IAAI,OAAO,IAAI,KAAK,QAAQ;gBAAE,OAAO,IAAI,CAAC;YAC1C,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,IAAI,KAAK,IAAI,IAAI,MAAM,IAAI,IAAI,EAAE,CAAC;gBAChE,OAAQ,IAAyB,CAAC,IAAI,CAAC;YACzC,CAAC;YACD,OAAO,EAAE,CAAC;QACZ,CAAC,CAAC;aACD,IAAI,CAAC,GAAG,CAAC,CAAC;IACf,CAAC;IAED,+BAA+B;IAC/B,MAAM,OAAO,GAAG,WAAW;SACxB,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,kDAAkD;SACvE,OAAO,CAAC,UAAU,EAAE,GAAG,CAAC,CAAC,8BAA8B;SACvD,IAAI,EAAE,CAAC;IAEV,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,OAAO,aAAa,CAAC;IACvB,CAAC;IAED,yBAAyB;IACzB,IAAI,OAAO,CAAC,MAAM,IAAI,0BAA0B,EAAE,CAAC;QACjD,OAAO,OAAO,CAAC;IACjB,CAAC;IAED,4BAA4B;IAC5B,OAAO,OAAO,CAAC,SAAS,CAAC,CAAC,EAAE,0BAA0B,GAAG,CAAC,CAAC,GAAG,KAAK,CAAC;AACtE,CAAC"}
@@ -5,8 +5,14 @@
5
5
  import type { BaseMessage } from '@langchain/core/messages';
6
6
  import type { DynamoDBMessageItem } from '../types';
7
7
  /**
8
- * Format a message index as a zero-padded 6-digit string
9
- * Supports up to 999,999 messages per session while maintaining sort order
8
+ * Format a message index as a zero-padded 6-digit string.
9
+ *
10
+ * @remarks
11
+ * The 6-digit width caps a session at **999 999 messages** while preserving
12
+ * lexicographic sort order on the composite SK. Beyond that, index 1 000 000
13
+ * would sort *before* 999 999 as a string, corrupting replay order. If you
14
+ * expect sessions to approach this bound, either shard by sub-session or widen
15
+ * the padding here (and migrate existing data).
10
16
  */
11
17
  export declare function formatMessageIndex(index: number): string;
12
18
  /**
@@ -29,30 +35,21 @@ export declare function buildMessageSK(sessionId: string, messageIndex: number):
29
35
  */
30
36
  export declare function buildMessageItems(userId: string, sessionId: string, messages: BaseMessage[], startIndex: number, ttlDays?: number): DynamoDBMessageItem[];
31
37
  /**
32
- * Build or update a session metadata item
38
+ * Build an optimistic-lock metadata update expression.
33
39
  *
34
- * @param userId - User identifier
35
- * @param sessionId - Session identifier
36
- * @param title - Session title
37
- * @param messageCount - New total message count
38
- * @param ttlDays - Optional TTL in days
39
- * @param isNew - Whether this is a new session (sets createdAt)
40
- */
41
- export declare function buildMetadataUpdateExpression(title: string, messageCount: number, ttlDays?: number): {
42
- updateExpression: string;
43
- expressionAttributeValues: Record<string, any>;
44
- };
45
- /**
46
- * Build an atomic metadata update expression using DynamoDB's ADD operation
47
- * Atomically increments messageCount by incrementBy, preventing race conditions
40
+ * Writes a new messageCount conditional on the caller's observed previous value
41
+ * (or on the metadata item not existing yet). The caller handles the
42
+ * ConditionalCheckFailed case by re-reading and retrying, which prevents the
43
+ * counter from getting ahead of the actual messages on transient put failures.
48
44
  *
49
- * @param title - Session title (only set if not already present via if_not_exists)
50
- * @param incrementBy - Number to add to messageCount
45
+ * @param title - Session title (only set on first write via if_not_exists)
46
+ * @param newCount - Target total messageCount after this write
47
+ * @param expectedCount - Previously observed messageCount (undefined for new session)
51
48
  * @param ttlDays - Optional TTL in days
52
- * @returns UpdateExpression and ExpressionAttributeValues for DynamoDB update
53
49
  */
54
- export declare function buildAtomicMetadataUpdate(title: string, incrementBy: number, ttlDays?: number): {
50
+ export declare function buildOptimisticMetadataUpdate(title: string, newCount: number, expectedCount: number | undefined, ttlDays?: number): {
55
51
  updateExpression: string;
52
+ conditionExpression: string;
56
53
  expressionAttributeValues: Record<string, any>;
57
54
  };
58
55
  //# sourceMappingURL=update-expression-builder.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"update-expression-builder.d.ts","sourceRoot":"","sources":["../../../src/history/utils/update-expression-builder.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AAI5D,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,UAAU,CAAC;AAEpD;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAExD;AAED;;;;;;GAMG;AACH,wBAAgB,cAAc,CAAC,SAAS,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,GAAG,MAAM,CAE9E;AAED;;;;;;;;;GASG;AACH,wBAAgB,iBAAiB,CAC/B,MAAM,EAAE,MAAM,EACd,SAAS,EAAE,MAAM,EACjB,QAAQ,EAAE,WAAW,EAAE,EACvB,UAAU,EAAE,MAAM,EAClB,OAAO,CAAC,EAAE,MAAM,GACf,mBAAmB,EAAE,CAkBvB;AAED;;;;;;;;;GASG;AACH,wBAAgB,6BAA6B,CAC3C,KAAK,EAAE,MAAM,EACb,YAAY,EAAE,MAAM,EACpB,OAAO,CAAC,EAAE,MAAM,GACf;IACD,gBAAgB,EAAE,MAAM,CAAC;IACzB,yBAAyB,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;CAChD,CA0BA;AAED;;;;;;;;GAQG;AACH,wBAAgB,yBAAyB,CACvC,KAAK,EAAE,MAAM,EACb,WAAW,EAAE,MAAM,EACnB,OAAO,CAAC,EAAE,MAAM,GACf;IACD,gBAAgB,EAAE,MAAM,CAAC;IACzB,yBAAyB,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;CAChD,CAyBA"}
1
+ {"version":3,"file":"update-expression-builder.d.ts","sourceRoot":"","sources":["../../../src/history/utils/update-expression-builder.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AAI5D,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,UAAU,CAAC;AAEpD;;;;;;;;;GASG;AACH,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAExD;AAED;;;;;;GAMG;AACH,wBAAgB,cAAc,CAAC,SAAS,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,GAAG,MAAM,CAE9E;AAED;;;;;;;;;GASG;AACH,wBAAgB,iBAAiB,CAC/B,MAAM,EAAE,MAAM,EACd,SAAS,EAAE,MAAM,EACjB,QAAQ,EAAE,WAAW,EAAE,EACvB,UAAU,EAAE,MAAM,EAClB,OAAO,CAAC,EAAE,MAAM,GACf,mBAAmB,EAAE,CAkBvB;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,6BAA6B,CAC3C,KAAK,EAAE,MAAM,EACb,QAAQ,EAAE,MAAM,EAChB,aAAa,EAAE,MAAM,GAAG,SAAS,EACjC,OAAO,CAAC,EAAE,MAAM,GACf;IACD,gBAAgB,EAAE,MAAM,CAAC;IACzB,mBAAmB,EAAE,MAAM,CAAC;IAC5B,yBAAyB,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;CAChD,CAoCA"}
@@ -7,13 +7,18 @@ Object.defineProperty(exports, "__esModule", { value: true });
7
7
  exports.formatMessageIndex = formatMessageIndex;
8
8
  exports.buildMessageSK = buildMessageSK;
9
9
  exports.buildMessageItems = buildMessageItems;
10
- exports.buildMetadataUpdateExpression = buildMetadataUpdateExpression;
11
- exports.buildAtomicMetadataUpdate = buildAtomicMetadataUpdate;
10
+ exports.buildOptimisticMetadataUpdate = buildOptimisticMetadataUpdate;
12
11
  const messages_1 = require("@langchain/core/messages");
13
12
  const shared_1 = require("../../shared");
14
13
  /**
15
- * Format a message index as a zero-padded 6-digit string
16
- * Supports up to 999,999 messages per session while maintaining sort order
14
+ * Format a message index as a zero-padded 6-digit string.
15
+ *
16
+ * @remarks
17
+ * The 6-digit width caps a session at **999 999 messages** while preserving
18
+ * lexicographic sort order on the composite SK. Beyond that, index 1 000 000
19
+ * would sort *before* 999 999 as a string, corrupting replay order. If you
20
+ * expect sessions to approach this bound, either shard by sub-session or widen
21
+ * the padding here (and migrate existing data).
17
22
  */
18
23
  function formatMessageIndex(index) {
19
24
  return String(index).padStart(6, '0');
@@ -57,70 +62,50 @@ function buildMessageItems(userId, sessionId, messages, startIndex, ttlDays) {
57
62
  });
58
63
  }
59
64
  /**
60
- * Build or update a session metadata item
65
+ * Build an optimistic-lock metadata update expression.
61
66
  *
62
- * @param userId - User identifier
63
- * @param sessionId - Session identifier
64
- * @param title - Session title
65
- * @param messageCount - New total message count
66
- * @param ttlDays - Optional TTL in days
67
- * @param isNew - Whether this is a new session (sets createdAt)
68
- */
69
- function buildMetadataUpdateExpression(title, messageCount, ttlDays) {
70
- const now = Date.now();
71
- const updateParts = [
72
- 'updatedAt = :updatedAt',
73
- 'messageCount = :messageCount',
74
- 'itemType = :itemType',
75
- 'title = if_not_exists(title, :title)',
76
- 'createdAt = if_not_exists(createdAt, :createdAt)',
77
- ];
78
- const expressionAttributeValues = {
79
- ':updatedAt': now,
80
- ':createdAt': now,
81
- ':messageCount': messageCount,
82
- ':itemType': 'metadata',
83
- ':title': title,
84
- };
85
- if (ttlDays !== undefined) {
86
- updateParts.push('ttl = :ttl');
87
- expressionAttributeValues[':ttl'] = (0, shared_1.calculateTTLTimestamp)(ttlDays);
88
- }
89
- return {
90
- updateExpression: `SET ${updateParts.join(', ')}`,
91
- expressionAttributeValues,
92
- };
93
- }
94
- /**
95
- * Build an atomic metadata update expression using DynamoDB's ADD operation
96
- * Atomically increments messageCount by incrementBy, preventing race conditions
67
+ * Writes a new messageCount conditional on the caller's observed previous value
68
+ * (or on the metadata item not existing yet). The caller handles the
69
+ * ConditionalCheckFailed case by re-reading and retrying, which prevents the
70
+ * counter from getting ahead of the actual messages on transient put failures.
97
71
  *
98
- * @param title - Session title (only set if not already present via if_not_exists)
99
- * @param incrementBy - Number to add to messageCount
72
+ * @param title - Session title (only set on first write via if_not_exists)
73
+ * @param newCount - Target total messageCount after this write
74
+ * @param expectedCount - Previously observed messageCount (undefined for new session)
100
75
  * @param ttlDays - Optional TTL in days
101
- * @returns UpdateExpression and ExpressionAttributeValues for DynamoDB update
102
76
  */
103
- function buildAtomicMetadataUpdate(title, incrementBy, ttlDays) {
77
+ function buildOptimisticMetadataUpdate(title, newCount, expectedCount, ttlDays) {
104
78
  const now = Date.now();
105
79
  const setParts = [
106
80
  'updatedAt = :updatedAt',
107
81
  'itemType = :itemType',
82
+ 'messageCount = :newCount',
108
83
  'title = if_not_exists(title, :title)',
109
84
  'createdAt = if_not_exists(createdAt, :createdAt)',
110
85
  ];
111
86
  const expressionAttributeValues = {
112
87
  ':updatedAt': now,
113
88
  ':createdAt': now,
114
- ':inc': incrementBy,
89
+ ':newCount': newCount,
115
90
  ':itemType': 'metadata',
116
91
  ':title': title,
117
92
  };
93
+ let conditionExpression;
94
+ if (expectedCount === undefined) {
95
+ // New session: metadata item must not exist yet.
96
+ conditionExpression = 'attribute_not_exists(messageCount)';
97
+ }
98
+ else {
99
+ conditionExpression = 'messageCount = :expectedCount';
100
+ expressionAttributeValues[':expectedCount'] = expectedCount;
101
+ }
118
102
  if (ttlDays !== undefined) {
119
103
  setParts.push('ttl = :ttl');
120
104
  expressionAttributeValues[':ttl'] = (0, shared_1.calculateTTLTimestamp)(ttlDays);
121
105
  }
122
106
  return {
123
- updateExpression: `SET ${setParts.join(', ')} ADD messageCount :inc`,
107
+ updateExpression: `SET ${setParts.join(', ')}`,
108
+ conditionExpression,
124
109
  expressionAttributeValues,
125
110
  };
126
111
  }
@@ -1 +1 @@
1
- {"version":3,"file":"update-expression-builder.js","sourceRoot":"","sources":["../../../src/history/utils/update-expression-builder.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"update-expression-builder.js","sourceRoot":"","sources":["../../../src/history/utils/update-expression-builder.ts"],"names":[],"mappings":";AAAA;;;GAGG;;AAkBH,gDAEC;AASD,wCAEC;AAYD,8CAwBC;AAeD,sEA6CC;AA5HD,uDAA2E;AAE3E,yCAAqD;AAGrD;;;;;;;;;GASG;AACH,SAAgB,kBAAkB,CAAC,KAAa;IAC9C,OAAO,MAAM,CAAC,KAAK,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;AACxC,CAAC;AAED;;;;;;GAMG;AACH,SAAgB,cAAc,CAAC,SAAiB,EAAE,YAAoB;IACpE,OAAO,GAAG,SAAS,QAAQ,kBAAkB,CAAC,YAAY,CAAC,EAAE,CAAC;AAChE,CAAC;AAED;;;;;;;;;GASG;AACH,SAAgB,iBAAiB,CAC/B,MAAc,EACd,SAAiB,EACjB,QAAuB,EACvB,UAAkB,EAClB,OAAgB;IAEhB,MAAM,cAAc,GAAG,IAAA,0CAA+B,EAAC,QAAQ,CAAC,CAAC;IACjE,MAAM,GAAG,GAAG,OAAO,KAAK,SAAS,CAAC,CAAC,CAAC,IAAA,8BAAqB,EAAC,OAAO,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IAE/E,OAAO,cAAc,CAAC,GAAG,CAAC,CAAC,aAAa,EAAE,CAAC,EAAE,EAAE;QAC7C,MAAM,YAAY,GAAG,UAAU,GAAG,CAAC,CAAC;QACpC,MAAM,IAAI,GAAwB;YAChC,MAAM;YACN,SAAS,EAAE,cAAc,CAAC,SAAS,EAAE,YAAY,CAAC;YAClD,QAAQ,EAAE,SAAS;YACnB,YAAY;YACZ,OAAO,EAAE,aAAa;SACvB,CAAC;QACF,IAAI,GAAG,KAAK,SAAS,EAAE,CAAC;YACtB,IAAI,CAAC,GAAG,GAAG,GAAG,CAAC;QACjB,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC,CAAC,CAAC;AACL,CAAC;AAED;;;;;;;;;;;;GAYG;AACH,SAAgB,6BAA6B,CAC3C,KAAa,EACb,QAAgB,EAChB,aAAiC,EACjC,OAAgB;IAMhB,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IACvB,MAAM,QAAQ,GAAG;QACf,wBAAwB;QACxB,sBAAsB;QACtB,0BAA0B;QAC1B,sCAAsC;QACtC,kDAAkD;KACnD,CAAC;IACF,MAAM,yBAAyB,GAAwB;QACrD,YAAY,EAAE,GAAG;QACjB,YAAY,EAAE,GAAG;QACjB,WAAW,EAAE,QAAQ;QACrB,WAAW,EAAE,UAAU;QACvB,QAAQ,EAAE,KAAK;KAChB,CAAC;IAEF,IAAI,mBAA2B,CAAC;IAChC,IAAI,aAAa,KAAK,SAAS,EAAE,CAAC;QAChC,iDAAiD;QACjD,mBAAmB,GAAG,oCAAoC,CAAC;IAC7D,CAAC;SAAM,CAAC;QACN,mBAAmB,GAAG,+BAA+B,CAAC;QACtD,yBAAyB,CAAC,gBAAgB,CAAC,GAAG,aAAa,CAAC;IAC9D,CAAC;IAED,IAAI,OAAO,KAAK,SAAS,EAAE,CAAC;QAC1B,QAAQ,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;QAC5B,yBAAyB,CAAC,MAAM,CAAC,GAAG,IAAA,8BAAqB,EAAC,OAAO,CAAC,CAAC;IACrE,CAAC;IAED,OAAO;QACL,gBAAgB,EAAE,OAAO,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE;QAC9C,mBAAmB;QACnB,yBAAyB;KAC1B,CAAC;AACJ,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"validation.d.ts","sourceRoot":"","sources":["../../../src/history/utils/validation.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AAUvD;;GAEG;AACH,qBAAa,sBAAuB,SAAQ,KAAK;gBACnC,OAAO,EAAE,MAAM;CAI5B;AAED;;;;;GAKG;AACH,wBAAgB,cAAc,CAAC,MAAM,EAAE,GAAG,GAAG,IAAI,CAoBhD;AAED;;;;;GAKG;AACH,wBAAgB,iBAAiB,CAAC,SAAS,EAAE,GAAG,GAAG,IAAI,CAoBtD;AAED;;;;;GAKG;AACH,wBAAgB,eAAe,CAAC,OAAO,EAAE,WAAW,GAAG,IAAI,CAa1D;AAED;;;;;GAKG;AACH,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,WAAW,EAAE,GAAG,IAAI,CAyB9D;AAED;;;;;GAKG;AACH,wBAAgB,aAAa,CAAC,KAAK,EAAE,GAAG,GAAG,IAAI,CAc9C;AAED;;;;;GAKG;AACH,wBAAgB,aAAa,CAAC,KAAK,EAAE,GAAG,GAAG,IAAI,CAgB9C;AAED;;;;;GAKG;AACH,wBAAgB,eAAe,CAAC,OAAO,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI,CAOjE;AAOD;;;;;;GAMG;AACH,wBAAgB,oBAAoB,CAAC,QAAQ,EAAE,WAAW,EAAE,GAAG,IAAI,CAYlE"}
1
+ {"version":3,"file":"validation.d.ts","sourceRoot":"","sources":["../../../src/history/utils/validation.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AAYvD;;GAEG;AACH,qBAAa,sBAAuB,SAAQ,KAAK;gBACnC,OAAO,EAAE,MAAM;CAI5B;AAED;;;;;GAKG;AACH,wBAAgB,cAAc,CAAC,MAAM,EAAE,GAAG,GAAG,IAAI,CA0BhD;AAED;;;;;GAKG;AACH,wBAAgB,iBAAiB,CAAC,SAAS,EAAE,GAAG,GAAG,IAAI,CA2BtD;AAED;;;;;GAKG;AACH,wBAAgB,eAAe,CAAC,OAAO,EAAE,WAAW,GAAG,IAAI,CAa1D;AAED;;;;;GAKG;AACH,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,WAAW,EAAE,GAAG,IAAI,CAyB9D;AAED;;;;;GAKG;AACH,wBAAgB,aAAa,CAAC,KAAK,EAAE,GAAG,GAAG,IAAI,CAc9C;AAED;;;;;GAKG;AACH,wBAAgB,aAAa,CAAC,KAAK,EAAE,GAAG,GAAG,IAAI,CAgB9C;AAED;;;;;GAKG;AACH,wBAAgB,eAAe,CAAC,OAAO,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI,CAOjE;AAOD;;;;;;GAMG;AACH,wBAAgB,oBAAoB,CAAC,QAAQ,EAAE,WAAW,EAAE,GAAG,IAAI,CAmBlE"}
@@ -16,7 +16,9 @@ const utils_1 = require("../../shared/utils");
16
16
  const MAX_USER_ID_LENGTH = 256;
17
17
  const MAX_SESSION_ID_LENGTH = 256;
18
18
  const MAX_TITLE_LENGTH = 200;
19
- const MAX_MESSAGES_PER_BATCH = 100;
19
+ // 99 so that N message Puts + 1 metadata Update still fit in a single
20
+ // 100-item DynamoDB TransactWrite (used for atomic index allocation).
21
+ const MAX_MESSAGES_PER_BATCH = 99;
20
22
  const MAX_LIST_LIMIT = 1000;
21
23
  /**
22
24
  * Custom error class for validation errors in chat message history
@@ -49,6 +51,11 @@ function validateUserId(userId) {
49
51
  if (/[\x00-\x1F\x7F]/.test(userId)) {
50
52
  throw new HistoryValidationError('User ID cannot contain control characters');
51
53
  }
54
+ // Reject '#' to prevent collisions with the composite sort-key separator used for
55
+ // message items ("${sessionId}#msg#<idx>"). Defense in depth — userId is the PK today.
56
+ if (userId.includes('#')) {
57
+ throw new HistoryValidationError('User ID cannot contain "#" character');
58
+ }
52
59
  }
53
60
  /**
54
61
  * Validate session ID
@@ -71,6 +78,12 @@ function validateSessionId(sessionId) {
71
78
  if (/[\x00-\x1F\x7F]/.test(sessionId)) {
72
79
  throw new HistoryValidationError('Session ID cannot contain control characters');
73
80
  }
81
+ // Reject '#' to prevent injection into the composite sort-key format
82
+ // "${sessionId}#msg#<idx>". A sessionId containing "#msg#" could otherwise let
83
+ // getMessages/clear cross into another of the same user's sessions.
84
+ if (sessionId.includes('#')) {
85
+ throw new HistoryValidationError('Session ID cannot contain "#" character');
86
+ }
74
87
  }
75
88
  /**
76
89
  * Validate a single message
@@ -183,8 +196,15 @@ const PER_ITEM_OVERHEAD_BYTES = 500;
183
196
  function validateMessagesSize(messages) {
184
197
  let totalSize = 0;
185
198
  for (const message of messages) {
186
- const content = typeof message.content === 'string' ? message.content : JSON.stringify(message.content);
187
- totalSize += new TextEncoder().encode(content).byteLength + PER_ITEM_OVERHEAD_BYTES;
199
+ // Measure the WHOLE message, not just `content`. additional_kwargs, tool_calls,
200
+ // response_metadata, etc. are stored alongside and can be larger than content.
201
+ // Use `toJSON` when present (BaseMessage subclasses expose it) so we serialize
202
+ // the same shape that mapChatMessagesToStoredMessages produces.
203
+ const serializable = typeof message.toJSON === 'function'
204
+ ? message.toJSON()
205
+ : message;
206
+ const size = new TextEncoder().encode(JSON.stringify(serializable)).byteLength;
207
+ totalSize += size + PER_ITEM_OVERHEAD_BYTES;
188
208
  }
189
209
  if (totalSize > MAX_TRANSACTION_SIZE_BYTES) {
190
210
  throw new HistoryValidationError(`Estimated batch size (~${Math.round(totalSize / 1024)}KB) exceeds DynamoDB transaction limit of 4MB`);
@@ -1 +1 @@
1
- {"version":3,"file":"validation.js","sourceRoot":"","sources":["../../../src/history/utils/validation.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"validation.js","sourceRoot":"","sources":["../../../src/history/utils/validation.ts"],"names":[],"mappings":"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"}
package/dist/index.d.ts CHANGED
@@ -2,9 +2,13 @@ export { DynamoDBSaver } from './checkpointer';
2
2
  export type { DynamoDBSaverOptions } from './checkpointer/types';
3
3
  export { DynamoDBStore } from './store';
4
4
  export type { DynamoDBStoreOptions } from './store/types';
5
- export { DynamoDBChatMessageHistory } from './history';
5
+ export { DynamoDBChatMessageHistory, DynamoDBSessionChatMessageHistory } from './history';
6
6
  export type { DynamoDBChatMessageHistoryOptions, SessionMetadata } from './history/types';
7
7
  export { DynamoDBFactory } from './factory';
8
- export { setGlobalLogger, getLogger, resetLogger } from './shared/utils/logger';
8
+ export { setGlobalLogger, getLogger, resetLogger, redactLogger, redactSecrets, } from './shared/utils/logger';
9
9
  export type { Logger } from './shared/utils/logger';
10
+ export type { CompressionConfig } from './shared/utils/compressor';
11
+ export type { S3OffloadConfig } from './shared/utils/s3-offloader';
12
+ export type { RetryOptions } from './shared/utils/retry';
13
+ export { BatchWriteIncompleteError } from './shared/utils/batch-write';
10
14
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAC/C,YAAY,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAC;AACjE,OAAO,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AACxC,YAAY,EAAE,oBAAoB,EAAE,MAAM,eAAe,CAAC;AAC1D,OAAO,EAAE,0BAA0B,EAAE,MAAM,WAAW,CAAC;AACvD,YAAY,EAAE,iCAAiC,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAC1F,OAAO,EAAE,eAAe,EAAE,MAAM,WAAW,CAAC;AAC5C,OAAO,EAAE,eAAe,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AAChF,YAAY,EAAE,MAAM,EAAE,MAAM,uBAAuB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAC/C,YAAY,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAC;AACjE,OAAO,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AACxC,YAAY,EAAE,oBAAoB,EAAE,MAAM,eAAe,CAAC;AAC1D,OAAO,EAAE,0BAA0B,EAAE,iCAAiC,EAAE,MAAM,WAAW,CAAC;AAC1F,YAAY,EAAE,iCAAiC,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAC1F,OAAO,EAAE,eAAe,EAAE,MAAM,WAAW,CAAC;AAC5C,OAAO,EACL,eAAe,EACf,SAAS,EACT,WAAW,EACX,YAAY,EACZ,aAAa,GACd,MAAM,uBAAuB,CAAC;AAC/B,YAAY,EAAE,MAAM,EAAE,MAAM,uBAAuB,CAAC;AAEpD,YAAY,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;AACnE,YAAY,EAAE,eAAe,EAAE,MAAM,6BAA6B,CAAC;AACnE,YAAY,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AACzD,OAAO,EAAE,yBAAyB,EAAE,MAAM,4BAA4B,CAAC"}
package/dist/index.js CHANGED
@@ -1,16 +1,21 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.resetLogger = exports.getLogger = exports.setGlobalLogger = exports.DynamoDBFactory = exports.DynamoDBChatMessageHistory = exports.DynamoDBStore = exports.DynamoDBSaver = void 0;
3
+ exports.BatchWriteIncompleteError = exports.redactSecrets = exports.redactLogger = exports.resetLogger = exports.getLogger = exports.setGlobalLogger = exports.DynamoDBFactory = exports.DynamoDBSessionChatMessageHistory = exports.DynamoDBChatMessageHistory = exports.DynamoDBStore = exports.DynamoDBSaver = void 0;
4
4
  var checkpointer_1 = require("./checkpointer");
5
5
  Object.defineProperty(exports, "DynamoDBSaver", { enumerable: true, get: function () { return checkpointer_1.DynamoDBSaver; } });
6
6
  var store_1 = require("./store");
7
7
  Object.defineProperty(exports, "DynamoDBStore", { enumerable: true, get: function () { return store_1.DynamoDBStore; } });
8
8
  var history_1 = require("./history");
9
9
  Object.defineProperty(exports, "DynamoDBChatMessageHistory", { enumerable: true, get: function () { return history_1.DynamoDBChatMessageHistory; } });
10
+ Object.defineProperty(exports, "DynamoDBSessionChatMessageHistory", { enumerable: true, get: function () { return history_1.DynamoDBSessionChatMessageHistory; } });
10
11
  var factory_1 = require("./factory");
11
12
  Object.defineProperty(exports, "DynamoDBFactory", { enumerable: true, get: function () { return factory_1.DynamoDBFactory; } });
12
13
  var logger_1 = require("./shared/utils/logger");
13
14
  Object.defineProperty(exports, "setGlobalLogger", { enumerable: true, get: function () { return logger_1.setGlobalLogger; } });
14
15
  Object.defineProperty(exports, "getLogger", { enumerable: true, get: function () { return logger_1.getLogger; } });
15
16
  Object.defineProperty(exports, "resetLogger", { enumerable: true, get: function () { return logger_1.resetLogger; } });
17
+ Object.defineProperty(exports, "redactLogger", { enumerable: true, get: function () { return logger_1.redactLogger; } });
18
+ Object.defineProperty(exports, "redactSecrets", { enumerable: true, get: function () { return logger_1.redactSecrets; } });
19
+ var batch_write_1 = require("./shared/utils/batch-write");
20
+ Object.defineProperty(exports, "BatchWriteIncompleteError", { enumerable: true, get: function () { return batch_write_1.BatchWriteIncompleteError; } });
16
21
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;AAAA,+CAA+C;AAAtC,6GAAA,aAAa,OAAA;AAEtB,iCAAwC;AAA/B,sGAAA,aAAa,OAAA;AAEtB,qCAAuD;AAA9C,qHAAA,0BAA0B,OAAA;AAEnC,qCAA4C;AAAnC,0GAAA,eAAe,OAAA;AACxB,gDAAgF;AAAvE,yGAAA,eAAe,OAAA;AAAE,mGAAA,SAAS,OAAA;AAAE,qGAAA,WAAW,OAAA"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;AAAA,+CAA+C;AAAtC,6GAAA,aAAa,OAAA;AAEtB,iCAAwC;AAA/B,sGAAA,aAAa,OAAA;AAEtB,qCAA0F;AAAjF,qHAAA,0BAA0B,OAAA;AAAE,4HAAA,iCAAiC,OAAA;AAEtE,qCAA4C;AAAnC,0GAAA,eAAe,OAAA;AACxB,gDAM+B;AAL7B,yGAAA,eAAe,OAAA;AACf,mGAAA,SAAS,OAAA;AACT,qGAAA,WAAW,OAAA;AACX,sGAAA,YAAY,OAAA;AACZ,uGAAA,aAAa,OAAA;AAOf,0DAAuE;AAA9D,wHAAA,yBAAyB,OAAA"}