@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.
- package/README.md +131 -5
- package/dist/checkpointer/actions/delete-thread.d.ts.map +1 -1
- package/dist/checkpointer/actions/delete-thread.js +17 -9
- package/dist/checkpointer/actions/delete-thread.js.map +1 -1
- package/dist/checkpointer/actions/get-tuple.d.ts.map +1 -1
- package/dist/checkpointer/actions/get-tuple.js +70 -32
- package/dist/checkpointer/actions/get-tuple.js.map +1 -1
- package/dist/checkpointer/actions/put-writes.d.ts.map +1 -1
- package/dist/checkpointer/actions/put-writes.js +36 -19
- package/dist/checkpointer/actions/put-writes.js.map +1 -1
- package/dist/checkpointer/actions/put.d.ts.map +1 -1
- package/dist/checkpointer/actions/put.js +75 -18
- package/dist/checkpointer/actions/put.js.map +1 -1
- package/dist/checkpointer/actions/writer.d.ts +6 -4
- package/dist/checkpointer/actions/writer.d.ts.map +1 -1
- package/dist/checkpointer/actions/writer.js +12 -12
- package/dist/checkpointer/actions/writer.js.map +1 -1
- package/dist/checkpointer/index.d.ts +11 -4
- package/dist/checkpointer/index.d.ts.map +1 -1
- package/dist/checkpointer/index.js +97 -72
- package/dist/checkpointer/index.js.map +1 -1
- package/dist/checkpointer/types/index.d.ts +8 -0
- package/dist/checkpointer/types/index.d.ts.map +1 -1
- package/dist/checkpointer/utils/deserialization.d.ts.map +1 -1
- package/dist/checkpointer/utils/deserialization.js +28 -4
- package/dist/checkpointer/utils/deserialization.js.map +1 -1
- package/dist/checkpointer/utils/validation.d.ts +8 -8
- package/dist/checkpointer/utils/validation.d.ts.map +1 -1
- package/dist/checkpointer/utils/validation.js +45 -1
- package/dist/checkpointer/utils/validation.js.map +1 -1
- package/dist/factory.d.ts +14 -0
- package/dist/factory.d.ts.map +1 -1
- package/dist/factory.js +39 -20
- package/dist/factory.js.map +1 -1
- package/dist/history/actions/add-message.d.ts +5 -9
- package/dist/history/actions/add-message.d.ts.map +1 -1
- package/dist/history/actions/add-message.js +14 -42
- package/dist/history/actions/add-message.js.map +1 -1
- package/dist/history/actions/add-messages.d.ts +6 -10
- package/dist/history/actions/add-messages.d.ts.map +1 -1
- package/dist/history/actions/add-messages.js +33 -38
- package/dist/history/actions/add-messages.js.map +1 -1
- package/dist/history/actions/clear.d.ts.map +1 -1
- package/dist/history/actions/clear.js +3 -3
- package/dist/history/actions/clear.js.map +1 -1
- package/dist/history/actions/get-messages.d.ts.map +1 -1
- package/dist/history/actions/get-messages.js +2 -2
- package/dist/history/actions/get-messages.js.map +1 -1
- package/dist/history/actions/list-sessions.d.ts.map +1 -1
- package/dist/history/actions/list-sessions.js +6 -3
- package/dist/history/actions/list-sessions.js.map +1 -1
- package/dist/history/index.d.ts +41 -5
- package/dist/history/index.d.ts.map +1 -1
- package/dist/history/index.js +52 -18
- package/dist/history/index.js.map +1 -1
- package/dist/history/session-adapter.d.ts +39 -0
- package/dist/history/session-adapter.d.ts.map +1 -0
- package/dist/history/session-adapter.js +74 -0
- package/dist/history/session-adapter.js.map +1 -0
- package/dist/history/types/index.d.ts +32 -1
- package/dist/history/types/index.d.ts.map +1 -1
- package/dist/history/utils/index.d.ts +1 -0
- package/dist/history/utils/index.d.ts.map +1 -1
- package/dist/history/utils/index.js +1 -0
- package/dist/history/utils/index.js.map +1 -1
- package/dist/history/utils/optimistic-retry.d.ts +31 -0
- package/dist/history/utils/optimistic-retry.d.ts.map +1 -0
- package/dist/history/utils/optimistic-retry.js +74 -0
- package/dist/history/utils/optimistic-retry.js.map +1 -0
- package/dist/history/utils/title-generator.d.ts.map +1 -1
- package/dist/history/utils/title-generator.js +8 -3
- package/dist/history/utils/title-generator.js.map +1 -1
- package/dist/history/utils/update-expression-builder.d.ts +18 -21
- package/dist/history/utils/update-expression-builder.d.ts.map +1 -1
- package/dist/history/utils/update-expression-builder.js +31 -46
- package/dist/history/utils/update-expression-builder.js.map +1 -1
- package/dist/history/utils/validation.d.ts.map +1 -1
- package/dist/history/utils/validation.js +23 -3
- package/dist/history/utils/validation.js.map +1 -1
- package/dist/index.d.ts +6 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +6 -1
- package/dist/index.js.map +1 -1
- package/dist/shared/utils/batch-write.d.ts +44 -6
- package/dist/shared/utils/batch-write.d.ts.map +1 -1
- package/dist/shared/utils/batch-write.js +76 -28
- package/dist/shared/utils/batch-write.js.map +1 -1
- package/dist/shared/utils/client-factory.d.ts +25 -0
- package/dist/shared/utils/client-factory.d.ts.map +1 -0
- package/dist/shared/utils/client-factory.js +23 -0
- package/dist/shared/utils/client-factory.js.map +1 -0
- package/dist/shared/utils/compressor.d.ts +21 -3
- package/dist/shared/utils/compressor.d.ts.map +1 -1
- package/dist/shared/utils/compressor.js +75 -10
- package/dist/shared/utils/compressor.js.map +1 -1
- package/dist/shared/utils/constants.d.ts +1 -1
- package/dist/shared/utils/constants.d.ts.map +1 -1
- package/dist/shared/utils/constants.js +5 -1
- package/dist/shared/utils/constants.js.map +1 -1
- package/dist/shared/utils/index.d.ts +3 -0
- package/dist/shared/utils/index.d.ts.map +1 -1
- package/dist/shared/utils/index.js +3 -0
- package/dist/shared/utils/index.js.map +1 -1
- package/dist/shared/utils/logger.d.ts +27 -0
- package/dist/shared/utils/logger.d.ts.map +1 -1
- package/dist/shared/utils/logger.js +86 -0
- package/dist/shared/utils/logger.js.map +1 -1
- package/dist/shared/utils/retry.d.ts +7 -0
- package/dist/shared/utils/retry.d.ts.map +1 -1
- package/dist/shared/utils/retry.js +75 -17
- package/dist/shared/utils/retry.js.map +1 -1
- package/dist/shared/utils/s3-offloader.d.ts +10 -3
- package/dist/shared/utils/s3-offloader.d.ts.map +1 -1
- package/dist/shared/utils/s3-offloader.js +19 -9
- package/dist/shared/utils/s3-offloader.js.map +1 -1
- package/dist/shared/utils/s3-orphans.d.ts +16 -0
- package/dist/shared/utils/s3-orphans.d.ts.map +1 -0
- package/dist/shared/utils/s3-orphans.js +79 -0
- package/dist/shared/utils/s3-orphans.js.map +1 -0
- package/dist/shared/utils/sleep.d.ts +48 -0
- package/dist/shared/utils/sleep.d.ts.map +1 -0
- package/dist/shared/utils/sleep.js +82 -0
- package/dist/shared/utils/sleep.js.map +1 -0
- package/dist/shared/utils/ttl.d.ts +6 -2
- package/dist/shared/utils/ttl.d.ts.map +1 -1
- package/dist/shared/utils/ttl.js +17 -2
- package/dist/shared/utils/ttl.js.map +1 -1
- package/dist/store/actions/get-operation.d.ts.map +1 -1
- package/dist/store/actions/get-operation.js +2 -2
- package/dist/store/actions/get-operation.js.map +1 -1
- package/dist/store/actions/list-namespaces-operation.d.ts.map +1 -1
- package/dist/store/actions/list-namespaces-operation.js +44 -29
- package/dist/store/actions/list-namespaces-operation.js.map +1 -1
- package/dist/store/actions/put-operation.d.ts.map +1 -1
- package/dist/store/actions/put-operation.js +19 -5
- package/dist/store/actions/put-operation.js.map +1 -1
- package/dist/store/actions/search-operation.d.ts.map +1 -1
- package/dist/store/actions/search-operation.js +54 -21
- package/dist/store/actions/search-operation.js.map +1 -1
- package/dist/store/index.d.ts +1 -0
- package/dist/store/index.d.ts.map +1 -1
- package/dist/store/index.js +24 -20
- package/dist/store/index.js.map +1 -1
- package/dist/store/types/index.d.ts +33 -1
- package/dist/store/types/index.d.ts.map +1 -1
- package/dist/store/utils/filter.d.ts.map +1 -1
- package/dist/store/utils/filter.js +63 -1
- package/dist/store/utils/filter.js.map +1 -1
- package/dist/store/utils/validation.d.ts +6 -2
- package/dist/store/utils/validation.d.ts.map +1 -1
- package/dist/store/utils/validation.js +21 -5
- package/dist/store/utils/validation.js.map +1 -1
- 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
|
-
/**
|
|
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":"AAAA;;;GAGG;AAEH,OAAO,EAAE,oBAAoB,EAAE,MAAM,0BAA0B,CAAC;AAChE,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AACzD,OAAO,KAAK,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AAE3E
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/history/types/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -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;
|
|
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
|
-
|
|
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 <=
|
|
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,
|
|
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;;
|
|
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
|
-
*
|
|
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
|
|
38
|
+
* Build an optimistic-lock metadata update expression.
|
|
33
39
|
*
|
|
34
|
-
*
|
|
35
|
-
*
|
|
36
|
-
*
|
|
37
|
-
*
|
|
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
|
|
50
|
-
* @param
|
|
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
|
|
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
|
|
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.
|
|
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
|
-
*
|
|
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
|
|
65
|
+
* Build an optimistic-lock metadata update expression.
|
|
61
66
|
*
|
|
62
|
-
*
|
|
63
|
-
*
|
|
64
|
-
*
|
|
65
|
-
*
|
|
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
|
|
99
|
-
* @param
|
|
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
|
|
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
|
-
':
|
|
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(', ')}
|
|
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":";AAAA;;;GAGG;;
|
|
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;
|
|
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
|
-
|
|
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
|
-
|
|
187
|
-
|
|
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":";AAAA;;GAEG;;;
|
|
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
|
package/dist/index.d.ts.map
CHANGED
|
@@ -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;
|
|
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,
|
|
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"}
|