@farukada/aws-langgraph-dynamodb-ts 0.1.1 → 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 +33 -22
|
@@ -1,57 +1,52 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
/**
|
|
3
|
-
* Add multiple messages to a session
|
|
4
|
-
*
|
|
5
|
-
*
|
|
3
|
+
* Add multiple messages to a session using optimistic concurrency control.
|
|
4
|
+
*
|
|
5
|
+
* Reads the current messageCount, writes N message items and the updated counter
|
|
6
|
+
* in a single TransactWrite (N ≤ 99, leaving room for the metadata item in the
|
|
7
|
+
* 100-item transaction limit). The metadata update has a conditional check on the
|
|
8
|
+
* observed count; on concurrent modification we re-read and retry.
|
|
6
9
|
*/
|
|
7
10
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
8
11
|
exports.addMessagesAction = void 0;
|
|
9
12
|
const utils_1 = require("../utils");
|
|
10
|
-
/**
|
|
11
|
-
* Add multiple messages to a session
|
|
12
|
-
* Atomically claims message indices via DynamoDB's ADD operation, then writes message items
|
|
13
|
-
*
|
|
14
|
-
* @param params - Parameters for the add messages operation
|
|
15
|
-
* @throws Error if the operation fails or validation fails
|
|
16
|
-
*/
|
|
17
13
|
const addMessagesAction = async (params) => {
|
|
18
|
-
const { client, tableName, userId, sessionId, messages, title, ttlDays } = params;
|
|
19
|
-
// Validate inputs (enforces max 100 messages per batch)
|
|
14
|
+
const { client, tableName, userId, sessionId, messages, title, ttlDays, signal } = params;
|
|
20
15
|
(0, utils_1.validateUserId)(userId);
|
|
21
16
|
(0, utils_1.validateSessionId)(sessionId);
|
|
22
17
|
(0, utils_1.validateMessages)(messages);
|
|
23
18
|
(0, utils_1.validateMessagesSize)(messages);
|
|
24
19
|
(0, utils_1.validateTitle)(title);
|
|
25
20
|
(0, utils_1.validateTTLDays)(ttlDays);
|
|
26
|
-
// Generate a title if this is the first message batch and no title provided
|
|
27
21
|
const sessionTitle = title ?? (0, utils_1.generateTitle)(messages[0]);
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
const startIndex = newCount - messages.length;
|
|
44
|
-
// Build all message items
|
|
45
|
-
const messageItems = (0, utils_1.buildMessageItems)(userId, sessionId, messages, startIndex, ttlDays);
|
|
46
|
-
// Write all message items in a single transaction (max 100 items, enforced by validation)
|
|
47
|
-
await (0, utils_1.withDynamoDBRetry)(async () => {
|
|
22
|
+
await (0, utils_1.withOptimisticRetry)(`addMessages:${sessionId}`, async () => {
|
|
23
|
+
signal?.throwIfAborted();
|
|
24
|
+
const existing = await (0, utils_1.withDynamoDBRetry)(async () => {
|
|
25
|
+
return await client.get({
|
|
26
|
+
TableName: tableName,
|
|
27
|
+
Key: { userId, sessionId },
|
|
28
|
+
ConsistentRead: true,
|
|
29
|
+
ProjectionExpression: 'messageCount',
|
|
30
|
+
});
|
|
31
|
+
}, { signal });
|
|
32
|
+
const expectedCount = existing.Item?.messageCount;
|
|
33
|
+
const currentCount = expectedCount ?? 0;
|
|
34
|
+
const newCount = currentCount + messages.length;
|
|
35
|
+
const messageItems = (0, utils_1.buildMessageItems)(userId, sessionId, messages, currentCount, ttlDays);
|
|
36
|
+
const { updateExpression, conditionExpression, expressionAttributeValues } = (0, utils_1.buildOptimisticMetadataUpdate)(sessionTitle, newCount, expectedCount, ttlDays);
|
|
48
37
|
await client.transactWrite({
|
|
49
|
-
TransactItems:
|
|
50
|
-
Put: {
|
|
51
|
-
|
|
52
|
-
|
|
38
|
+
TransactItems: [
|
|
39
|
+
...messageItems.map((item) => ({ Put: { TableName: tableName, Item: item } })),
|
|
40
|
+
{
|
|
41
|
+
Update: {
|
|
42
|
+
TableName: tableName,
|
|
43
|
+
Key: { userId, sessionId },
|
|
44
|
+
UpdateExpression: updateExpression,
|
|
45
|
+
ConditionExpression: conditionExpression,
|
|
46
|
+
ExpressionAttributeValues: expressionAttributeValues,
|
|
47
|
+
},
|
|
53
48
|
},
|
|
54
|
-
|
|
49
|
+
],
|
|
55
50
|
});
|
|
56
51
|
});
|
|
57
52
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"add-messages.js","sourceRoot":"","sources":["../../../src/history/actions/add-messages.ts"],"names":[],"mappings":";AAAA
|
|
1
|
+
{"version":3,"file":"add-messages.js","sourceRoot":"","sources":["../../../src/history/actions/add-messages.ts"],"names":[],"mappings":";AAAA;;;;;;;GAOG;;;AAGH,oCAYkB;AAEX,MAAM,iBAAiB,GAAG,KAAK,EAAE,MAA+B,EAAiB,EAAE;IACxF,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,QAAQ,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,MAAM,CAAC;IAE1F,IAAA,sBAAc,EAAC,MAAM,CAAC,CAAC;IACvB,IAAA,yBAAiB,EAAC,SAAS,CAAC,CAAC;IAC7B,IAAA,wBAAgB,EAAC,QAAQ,CAAC,CAAC;IAC3B,IAAA,4BAAoB,EAAC,QAAQ,CAAC,CAAC;IAC/B,IAAA,qBAAa,EAAC,KAAK,CAAC,CAAC;IACrB,IAAA,uBAAe,EAAC,OAAO,CAAC,CAAC;IAEzB,MAAM,YAAY,GAAG,KAAK,IAAI,IAAA,qBAAa,EAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC;IAEzD,MAAM,IAAA,2BAAmB,EAAC,eAAe,SAAS,EAAE,EAAE,KAAK,IAAI,EAAE;QAC/D,MAAM,EAAE,cAAc,EAAE,CAAC;QACzB,MAAM,QAAQ,GAAG,MAAM,IAAA,yBAAiB,EACtC,KAAK,IAAI,EAAE;YACT,OAAO,MAAM,MAAM,CAAC,GAAG,CAAC;gBACtB,SAAS,EAAE,SAAS;gBACpB,GAAG,EAAE,EAAE,MAAM,EAAE,SAAS,EAAE;gBAC1B,cAAc,EAAE,IAAI;gBACpB,oBAAoB,EAAE,cAAc;aACrC,CAAC,CAAC;QACL,CAAC,EACD,EAAE,MAAM,EAAE,CACX,CAAC;QAEF,MAAM,aAAa,GAAG,QAAQ,CAAC,IAAI,EAAE,YAAkC,CAAC;QACxE,MAAM,YAAY,GAAG,aAAa,IAAI,CAAC,CAAC;QACxC,MAAM,QAAQ,GAAG,YAAY,GAAG,QAAQ,CAAC,MAAM,CAAC;QAEhD,MAAM,YAAY,GAAG,IAAA,yBAAiB,EAAC,MAAM,EAAE,SAAS,EAAE,QAAQ,EAAE,YAAY,EAAE,OAAO,CAAC,CAAC;QAC3F,MAAM,EAAE,gBAAgB,EAAE,mBAAmB,EAAE,yBAAyB,EAAE,GACxE,IAAA,qCAA6B,EAAC,YAAY,EAAE,QAAQ,EAAE,aAAa,EAAE,OAAO,CAAC,CAAC;QAEhF,MAAM,MAAM,CAAC,aAAa,CAAC;YACzB,aAAa,EAAE;gBACb,GAAG,YAAY,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,EAAE,GAAG,EAAE,EAAE,SAAS,EAAE,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,CAAC,CAAC;gBAC9E;oBACE,MAAM,EAAE;wBACN,SAAS,EAAE,SAAS;wBACpB,GAAG,EAAE,EAAE,MAAM,EAAE,SAAS,EAAE;wBAC1B,gBAAgB,EAAE,gBAAgB;wBAClC,mBAAmB,EAAE,mBAAmB;wBACxC,yBAAyB,EAAE,yBAAyB;qBACrD;iBACF;aACF;SACF,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC,CAAC;AAjDW,QAAA,iBAAiB,qBAiD5B"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"clear.d.ts","sourceRoot":"","sources":["../../../src/history/actions/clear.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAOH,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,UAAU,CAAC;AAGlD;;;;;;GAMG;AACH,eAAO,MAAM,WAAW,GAAU,QAAQ,iBAAiB,KAAG,OAAO,CAAC,IAAI,
|
|
1
|
+
{"version":3,"file":"clear.d.ts","sourceRoot":"","sources":["../../../src/history/actions/clear.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAOH,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,UAAU,CAAC;AAGlD;;;;;;GAMG;AACH,eAAO,MAAM,WAAW,GAAU,QAAQ,iBAAiB,KAAG,OAAO,CAAC,IAAI,CA+DzE,CAAC"}
|
|
@@ -15,7 +15,7 @@ const utils_1 = require("../utils");
|
|
|
15
15
|
* @throws Error if the operation fails or validation fails
|
|
16
16
|
*/
|
|
17
17
|
const clearAction = async (params) => {
|
|
18
|
-
const { client, tableName, userId, sessionId } = params;
|
|
18
|
+
const { client, tableName, userId, sessionId, signal } = params;
|
|
19
19
|
// Validate inputs
|
|
20
20
|
(0, utils_1.validateUserId)(userId);
|
|
21
21
|
(0, utils_1.validateSessionId)(sessionId);
|
|
@@ -44,7 +44,7 @@ const clearAction = async (params) => {
|
|
|
44
44
|
ProjectionExpression: 'userId, sessionId',
|
|
45
45
|
ExclusiveStartKey: lastEvaluatedKey,
|
|
46
46
|
});
|
|
47
|
-
});
|
|
47
|
+
}, { signal });
|
|
48
48
|
if (result.Items && result.Items.length > 0) {
|
|
49
49
|
// Prevent memory exhaustion
|
|
50
50
|
if (keysToDelete.length + result.Items.length > shared_1.MAX_TOTAL_ITEMS_IN_MEMORY) {
|
|
@@ -61,7 +61,7 @@ const clearAction = async (params) => {
|
|
|
61
61
|
const deleteRequests = keysToDelete.map((key) => ({
|
|
62
62
|
DeleteRequest: { Key: key },
|
|
63
63
|
}));
|
|
64
|
-
await (0, shared_1.batchWriteAllWithRetry)(client, tableName, deleteRequests);
|
|
64
|
+
await (0, shared_1.batchWriteAllWithRetry)(client, tableName, deleteRequests, { signal });
|
|
65
65
|
};
|
|
66
66
|
exports.clearAction = clearAction;
|
|
67
67
|
//# sourceMappingURL=clear.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"clear.js","sourceRoot":"","sources":["../../../src/history/actions/clear.ts"],"names":[],"mappings":";AAAA;;;GAGG;;;AAEH,yCAIsB;AAEtB,oCAAgF;AAEhF;;;;;;GAMG;AACI,MAAM,WAAW,GAAG,KAAK,EAAE,MAAyB,EAAiB,EAAE;IAC5E,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,GAAG,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"clear.js","sourceRoot":"","sources":["../../../src/history/actions/clear.ts"],"names":[],"mappings":";AAAA;;;GAGG;;;AAEH,yCAIsB;AAEtB,oCAAgF;AAEhF;;;;;;GAMG;AACI,MAAM,WAAW,GAAG,KAAK,EAAE,MAAyB,EAAiB,EAAE;IAC5E,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,GAAG,MAAM,CAAC;IAEhE,kBAAkB;IAClB,IAAA,sBAAc,EAAC,MAAM,CAAC,CAAC;IACvB,IAAA,yBAAiB,EAAC,SAAS,CAAC,CAAC;IAE7B,qEAAqE;IACrE,MAAM,YAAY,GAAiD,EAAE,CAAC;IAEtE,4BAA4B;IAC5B,YAAY,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC,CAAC;IAEzC,uCAAuC;IACvC,MAAM,aAAa,GAAG,GAAG,SAAS,OAAO,CAAC;IAC1C,IAAI,gBAAiD,CAAC;IACtD,IAAI,cAAc,GAAG,CAAC,CAAC;IAEvB,GAAG,CAAC;QACF,yBAAyB;QACzB,cAAc,EAAE,CAAC;QACjB,IAAI,cAAc,GAAG,4BAAmB,EAAE,CAAC;YACzC,MAAM,IAAI,KAAK,CAAC,kDAAkD,CAAC,CAAC;QACtE,CAAC;QAED,MAAM,MAAM,GAAG,MAAM,IAAA,yBAAiB,EACpC,KAAK,IAAI,EAAE;YACT,OAAO,MAAM,MAAM,CAAC,KAAK,CAAC;gBACxB,SAAS,EAAE,SAAS;gBACpB,sBAAsB,EAAE,sDAAsD;gBAC9E,yBAAyB,EAAE;oBACzB,SAAS,EAAE,MAAM;oBACjB,SAAS,EAAE,aAAa;iBACzB;gBACD,oBAAoB,EAAE,mBAAmB;gBACzC,iBAAiB,EAAE,gBAAgB;aACpC,CAAC,CAAC;QACL,CAAC,EACD,EAAE,MAAM,EAAE,CACX,CAAC;QAEF,IAAI,MAAM,CAAC,KAAK,IAAI,MAAM,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC5C,4BAA4B;YAC5B,IAAI,YAAY,CAAC,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC,MAAM,GAAG,kCAAyB,EAAE,CAAC;gBAC1E,MAAM,IAAI,KAAK,CAAC,wDAAwD,CAAC,CAAC;YAC5E,CAAC;YACD,YAAY,CAAC,IAAI,CACf,GAAG,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;gBAC7B,MAAM,EAAE,IAAI,CAAC,MAAgB;gBAC7B,SAAS,EAAE,IAAI,CAAC,SAAmB;aACpC,CAAC,CAAC,CACJ,CAAC;QACJ,CAAC;QAED,gBAAgB,GAAG,MAAM,CAAC,gBAAgB,CAAC;IAC7C,CAAC,QAAQ,gBAAgB,EAAE;IAE3B,oEAAoE;IACpE,MAAM,cAAc,GAAG,YAAY,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;QAChD,aAAa,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE;KAC5B,CAAC,CAAC,CAAC;IAEJ,MAAM,IAAA,+BAAsB,EAAC,MAAM,EAAE,SAAS,EAAE,cAAc,EAAE,EAAE,MAAM,EAAE,CAAC,CAAC;AAC9E,CAAC,CAAC;AA/DW,QAAA,WAAW,eA+DtB"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"get-messages.d.ts","sourceRoot":"","sources":["../../../src/history/actions/get-messages.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,WAAW,EAAmC,MAAM,0BAA0B,CAAC;AAGxF,OAAO,KAAK,EAAE,uBAAuB,EAAuB,MAAM,UAAU,CAAC;AAG7E;;;;;;;GAOG;AACH,eAAO,MAAM,iBAAiB,GAC5B,QAAQ,uBAAuB,KAC9B,OAAO,CAAC,WAAW,EAAE,
|
|
1
|
+
{"version":3,"file":"get-messages.d.ts","sourceRoot":"","sources":["../../../src/history/actions/get-messages.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,WAAW,EAAmC,MAAM,0BAA0B,CAAC;AAGxF,OAAO,KAAK,EAAE,uBAAuB,EAAuB,MAAM,UAAU,CAAC;AAG7E;;;;;;;GAOG;AACH,eAAO,MAAM,iBAAiB,GAC5B,QAAQ,uBAAuB,KAC9B,OAAO,CAAC,WAAW,EAAE,CAyDvB,CAAC"}
|
|
@@ -17,7 +17,7 @@ const utils_1 = require("../utils");
|
|
|
17
17
|
* @throws Error if the operation fails or validation fails
|
|
18
18
|
*/
|
|
19
19
|
const getMessagesAction = async (params) => {
|
|
20
|
-
const { client, tableName, userId, sessionId } = params;
|
|
20
|
+
const { client, tableName, userId, sessionId, signal } = params;
|
|
21
21
|
// Validate inputs
|
|
22
22
|
(0, utils_1.validateUserId)(userId);
|
|
23
23
|
(0, utils_1.validateSessionId)(sessionId);
|
|
@@ -42,7 +42,7 @@ const getMessagesAction = async (params) => {
|
|
|
42
42
|
},
|
|
43
43
|
ExclusiveStartKey: lastEvaluatedKey,
|
|
44
44
|
});
|
|
45
|
-
});
|
|
45
|
+
}, { signal });
|
|
46
46
|
if (result.Items && result.Items.length > 0) {
|
|
47
47
|
// Prevent memory exhaustion
|
|
48
48
|
if (messages.length + result.Items.length > shared_1.MAX_TOTAL_ITEMS_IN_MEMORY) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"get-messages.js","sourceRoot":"","sources":["../../../src/history/actions/get-messages.ts"],"names":[],"mappings":";AAAA;;;GAGG;;;AAEH,uDAAwF;AAExF,yCAA8E;AAE9E,oCAAgF;AAEhF;;;;;;;GAOG;AACI,MAAM,iBAAiB,GAAG,KAAK,EACpC,MAA+B,EACP,EAAE;IAC1B,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,GAAG,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"get-messages.js","sourceRoot":"","sources":["../../../src/history/actions/get-messages.ts"],"names":[],"mappings":";AAAA;;;GAGG;;;AAEH,uDAAwF;AAExF,yCAA8E;AAE9E,oCAAgF;AAEhF;;;;;;;GAOG;AACI,MAAM,iBAAiB,GAAG,KAAK,EACpC,MAA+B,EACP,EAAE;IAC1B,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,GAAG,MAAM,CAAC;IAEhE,kBAAkB;IAClB,IAAA,sBAAc,EAAC,MAAM,CAAC,CAAC;IACvB,IAAA,yBAAiB,EAAC,SAAS,CAAC,CAAC;IAE7B,0DAA0D;IAC1D,MAAM,aAAa,GAAG,GAAG,SAAS,OAAO,CAAC;IAC1C,MAAM,QAAQ,GAA0B,EAAE,CAAC;IAC3C,IAAI,gBAAiD,CAAC;IACtD,IAAI,cAAc,GAAG,CAAC,CAAC;IAEvB,GAAG,CAAC;QACF,yBAAyB;QACzB,cAAc,EAAE,CAAC;QACjB,IAAI,cAAc,GAAG,4BAAmB,EAAE,CAAC;YACzC,MAAM,IAAI,KAAK,CAAC,wDAAwD,CAAC,CAAC;QAC5E,CAAC;QAED,MAAM,MAAM,GAAG,MAAM,IAAA,yBAAiB,EACpC,KAAK,IAAI,EAAE;YACT,OAAO,MAAM,MAAM,CAAC,KAAK,CAAC;gBACxB,SAAS,EAAE,SAAS;gBACpB,sBAAsB,EAAE,sDAAsD;gBAC9E,yBAAyB,EAAE;oBACzB,SAAS,EAAE,MAAM;oBACjB,SAAS,EAAE,aAAa;iBACzB;gBACD,iBAAiB,EAAE,gBAAgB;aACpC,CAAC,CAAC;QACL,CAAC,EACD,EAAE,MAAM,EAAE,CACX,CAAC;QAEF,IAAI,MAAM,CAAC,KAAK,IAAI,MAAM,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC5C,4BAA4B;YAC5B,IAAI,QAAQ,CAAC,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC,MAAM,GAAG,kCAAyB,EAAE,CAAC;gBACtE,MAAM,IAAI,KAAK,CAAC,8DAA8D,CAAC,CAAC;YAClF,CAAC;YACD,QAAQ,CAAC,IAAI,CAAC,GAAI,MAAM,CAAC,KAA+B,CAAC,CAAC;QAC5D,CAAC;QAED,gBAAgB,GAAG,MAAM,CAAC,gBAAgB,CAAC;IAC7C,CAAC,QAAQ,gBAAgB,EAAE;IAE3B,0CAA0C;IAC1C,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC1B,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,qDAAqD;IACrD,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,YAAY,GAAG,CAAC,CAAC,YAAY,CAAC,CAAC;IAEzD,oEAAoE;IACpE,MAAM,cAAc,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IAC5D,OAAO,IAAA,0CAA+B,EAAC,cAAc,CAAC,CAAC;AACzD,CAAC,CAAC;AA3DW,QAAA,iBAAiB,qBA2D5B"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"list-sessions.d.ts","sourceRoot":"","sources":["../../../src/history/actions/list-sessions.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,KAAK,EAAE,wBAAwB,EAAE,eAAe,EAAE,MAAM,UAAU,CAAC;AAG1E;;;;;;;;;;;;;;;;;;GAkBG;AACH,eAAO,MAAM,kBAAkB,GAC7B,QAAQ,wBAAwB,KAC/B,OAAO,CAAC,eAAe,EAAE,
|
|
1
|
+
{"version":3,"file":"list-sessions.d.ts","sourceRoot":"","sources":["../../../src/history/actions/list-sessions.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,KAAK,EAAE,wBAAwB,EAAE,eAAe,EAAE,MAAM,UAAU,CAAC;AAG1E;;;;;;;;;;;;;;;;;;GAkBG;AACH,eAAO,MAAM,kBAAkB,GAC7B,QAAQ,wBAAwB,KAC/B,OAAO,CAAC,eAAe,EAAE,CAgE3B,CAAC"}
|
|
@@ -26,7 +26,7 @@ const utils_1 = require("../utils");
|
|
|
26
26
|
* @throws Error if the operation fails or validation fails
|
|
27
27
|
*/
|
|
28
28
|
const listSessionsAction = async (params) => {
|
|
29
|
-
const { client, tableName, userId, limit } = params;
|
|
29
|
+
const { client, tableName, userId, limit, signal } = params;
|
|
30
30
|
// Validate inputs
|
|
31
31
|
(0, utils_1.validateUserId)(userId);
|
|
32
32
|
(0, utils_1.validateLimit)(limit);
|
|
@@ -48,7 +48,7 @@ const listSessionsAction = async (params) => {
|
|
|
48
48
|
ProjectionExpression: 'sessionId, title, createdAt, updatedAt, messageCount',
|
|
49
49
|
ExclusiveStartKey: lastEvaluatedKey,
|
|
50
50
|
});
|
|
51
|
-
});
|
|
51
|
+
}, { signal });
|
|
52
52
|
if (!result.Items || result.Items.length === 0) {
|
|
53
53
|
break;
|
|
54
54
|
}
|
|
@@ -61,8 +61,11 @@ const listSessionsAction = async (params) => {
|
|
|
61
61
|
messageCount: item.messageCount,
|
|
62
62
|
}));
|
|
63
63
|
sessions.push(...mappedSessions);
|
|
64
|
-
// Safety limit: prevent unbounded memory growth
|
|
64
|
+
// Safety limit: prevent unbounded memory growth. Users near this bound should
|
|
65
|
+
// add a (userId, updatedAt) GSI — see method JSDoc.
|
|
65
66
|
if (sessions.length >= shared_1.MAX_TOTAL_ITEMS_IN_MEMORY) {
|
|
67
|
+
(0, shared_1.getLogger)().warn(`listSessions truncated at ${shared_1.MAX_TOTAL_ITEMS_IN_MEMORY} items for userId="${userId}"; ` +
|
|
68
|
+
`older sessions are not returned. Add a GSI on (userId, updatedAt) for full coverage.`);
|
|
66
69
|
break;
|
|
67
70
|
}
|
|
68
71
|
lastEvaluatedKey = result.LastEvaluatedKey;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"list-sessions.js","sourceRoot":"","sources":["../../../src/history/actions/list-sessions.ts"],"names":[],"mappings":";AAAA;;GAEG;;;AAEH,
|
|
1
|
+
{"version":3,"file":"list-sessions.js","sourceRoot":"","sources":["../../../src/history/actions/list-sessions.ts"],"names":[],"mappings":";AAAA;;GAEG;;;AAEH,yCAAoE;AAEpE,oCAA4E;AAE5E;;;;;;;;;;;;;;;;;;GAkBG;AACI,MAAM,kBAAkB,GAAG,KAAK,EACrC,MAAgC,EACJ,EAAE;IAC9B,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,MAAM,CAAC;IAE5D,kBAAkB;IAClB,IAAA,sBAAc,EAAC,MAAM,CAAC,CAAC;IACvB,IAAA,qBAAa,EAAC,KAAK,CAAC,CAAC;IAErB,MAAM,QAAQ,GAAsB,EAAE,CAAC;IACvC,IAAI,gBAAiD,CAAC;IAEtD,wEAAwE;IACxE,wEAAwE;IACxE,sDAAsD;IACtD,GAAG,CAAC;QACF,MAAM,MAAM,GAAG,MAAM,IAAA,yBAAiB,EACpC,KAAK,IAAI,EAAE;YACT,OAAO,MAAM,MAAM,CAAC,KAAK,CAAC;gBACxB,SAAS,EAAE,SAAS;gBACpB,sBAAsB,EAAE,kBAAkB;gBAC1C,gBAAgB,EAAE,sBAAsB;gBACxC,yBAAyB,EAAE;oBACzB,SAAS,EAAE,MAAM;oBACjB,WAAW,EAAE,UAAU;iBACxB;gBACD,oBAAoB,EAAE,sDAAsD;gBAC5E,iBAAiB,EAAE,gBAAgB;aACpC,CAAC,CAAC;QACL,CAAC,EACD,EAAE,MAAM,EAAE,CACX,CAAC;QAEF,IAAI,CAAC,MAAM,CAAC,KAAK,IAAI,MAAM,CAAC,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC/C,MAAM;QACR,CAAC;QAED,+BAA+B;QAC/B,MAAM,cAAc,GAAsB,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;YACpE,SAAS,EAAE,IAAI,CAAC,SAAmB;YACnC,KAAK,EAAE,IAAI,CAAC,KAAe;YAC3B,SAAS,EAAE,IAAI,CAAC,SAAmB;YACnC,SAAS,EAAE,IAAI,CAAC,SAAmB;YACnC,YAAY,EAAE,IAAI,CAAC,YAAsB;SAC1C,CAAC,CAAC,CAAC;QAEJ,QAAQ,CAAC,IAAI,CAAC,GAAG,cAAc,CAAC,CAAC;QAEjC,8EAA8E;QAC9E,oDAAoD;QACpD,IAAI,QAAQ,CAAC,MAAM,IAAI,kCAAyB,EAAE,CAAC;YACjD,IAAA,kBAAS,GAAE,CAAC,IAAI,CACd,6BAA6B,kCAAyB,sBAAsB,MAAM,KAAK;gBACrF,sFAAsF,CACzF,CAAC;YACF,MAAM;QACR,CAAC;QAED,gBAAgB,GAAG,MAAM,CAAC,gBAAgB,CAAC;IAC7C,CAAC,QAAQ,gBAAgB,EAAE;IAE3B,6CAA6C;IAC7C,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,GAAG,CAAC,CAAC,SAAS,CAAC,CAAC;IAEnD,gCAAgC;IAChC,OAAO,KAAK,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC;AACrD,CAAC,CAAC;AAlEW,QAAA,kBAAkB,sBAkE7B"}
|
package/dist/history/index.d.ts
CHANGED
|
@@ -3,7 +3,16 @@
|
|
|
3
3
|
* Provides persistent storage for chat messages with automatic title generation
|
|
4
4
|
*/
|
|
5
5
|
import { BaseMessage } from '@langchain/core/messages';
|
|
6
|
+
import { DynamoDBSessionChatMessageHistory } from './session-adapter';
|
|
6
7
|
import type { DynamoDBChatMessageHistoryOptions, SessionMetadata } from './types';
|
|
8
|
+
/**
|
|
9
|
+
* DynamoDB-backed chat message history with per-message-item storage.
|
|
10
|
+
*
|
|
11
|
+
* @remarks
|
|
12
|
+
* Each session is capped at ~999 999 messages by the 6-digit message-index
|
|
13
|
+
* sort-key padding. Sessions approaching this bound should be sharded by the
|
|
14
|
+
* caller; see `formatMessageIndex` for details.
|
|
15
|
+
*/
|
|
7
16
|
export declare class DynamoDBChatMessageHistory {
|
|
8
17
|
private readonly ddbClient;
|
|
9
18
|
private readonly client;
|
|
@@ -35,7 +44,9 @@ export declare class DynamoDBChatMessageHistory {
|
|
|
35
44
|
* @returns Array of BaseMessage objects in chronological order
|
|
36
45
|
* @throws Error if the operation fails or validation fails
|
|
37
46
|
*/
|
|
38
|
-
getMessages(userId: string, sessionId: string
|
|
47
|
+
getMessages(userId: string, sessionId: string, options?: {
|
|
48
|
+
signal?: AbortSignal;
|
|
49
|
+
}): Promise<BaseMessage[]>;
|
|
39
50
|
/**
|
|
40
51
|
* Add a single message to a session
|
|
41
52
|
* Generates title from the first message if this is a new session
|
|
@@ -46,7 +57,9 @@ export declare class DynamoDBChatMessageHistory {
|
|
|
46
57
|
* @param title - Optional session title (auto-generated from the first message if not provided)
|
|
47
58
|
* @throws Error if the operation fails or validation fails
|
|
48
59
|
*/
|
|
49
|
-
addMessage(userId: string, sessionId: string, message: BaseMessage, title?: string
|
|
60
|
+
addMessage(userId: string, sessionId: string, message: BaseMessage, title?: string, options?: {
|
|
61
|
+
signal?: AbortSignal;
|
|
62
|
+
}): Promise<void>;
|
|
50
63
|
/**
|
|
51
64
|
* Add multiple messages to a session
|
|
52
65
|
* Generates title from the first message if this is a new session
|
|
@@ -58,7 +71,9 @@ export declare class DynamoDBChatMessageHistory {
|
|
|
58
71
|
* @param title - Optional session title (auto-generated from the first message if not provided)
|
|
59
72
|
* @throws Error if the operation fails or validation fails
|
|
60
73
|
*/
|
|
61
|
-
addMessages(userId: string, sessionId: string, messages: BaseMessage[], title?: string
|
|
74
|
+
addMessages(userId: string, sessionId: string, messages: BaseMessage[], title?: string, options?: {
|
|
75
|
+
signal?: AbortSignal;
|
|
76
|
+
}): Promise<void>;
|
|
62
77
|
/**
|
|
63
78
|
* Clear all messages in a session
|
|
64
79
|
* Deletes the session item from DynamoDB
|
|
@@ -67,7 +82,9 @@ export declare class DynamoDBChatMessageHistory {
|
|
|
67
82
|
* @param sessionId - Session identifier
|
|
68
83
|
* @throws Error if the operation fails or validation fails
|
|
69
84
|
*/
|
|
70
|
-
clear(userId: string, sessionId: string
|
|
85
|
+
clear(userId: string, sessionId: string, options?: {
|
|
86
|
+
signal?: AbortSignal;
|
|
87
|
+
}): Promise<void>;
|
|
71
88
|
/**
|
|
72
89
|
* List all sessions for a user, sorted by most recent
|
|
73
90
|
* Returns metadata only (excludes messages for performance)
|
|
@@ -77,6 +94,25 @@ export declare class DynamoDBChatMessageHistory {
|
|
|
77
94
|
* @returns Array of session metadata, sorted by most recent first
|
|
78
95
|
* @throws Error if the operation fails or validation fails
|
|
79
96
|
*/
|
|
80
|
-
listSessions(userId: string, limit?: number
|
|
97
|
+
listSessions(userId: string, limit?: number, options?: {
|
|
98
|
+
signal?: AbortSignal;
|
|
99
|
+
}): Promise<SessionMetadata[]>;
|
|
100
|
+
/**
|
|
101
|
+
* Bind this store to a single `(userId, sessionId)` pair and return a
|
|
102
|
+
* `BaseListChatMessageHistory` compatible instance — the shape LangChain's
|
|
103
|
+
* `RunnableWithMessageHistory` expects from `getMessageHistory(sessionId)`.
|
|
104
|
+
*
|
|
105
|
+
* @example
|
|
106
|
+
* ```ts
|
|
107
|
+
* const store = new DynamoDBChatMessageHistory({ tableName });
|
|
108
|
+
* new RunnableWithMessageHistory({
|
|
109
|
+
* runnable,
|
|
110
|
+
* getMessageHistory: (sessionId) => store.forSession(userId, sessionId),
|
|
111
|
+
* // ...
|
|
112
|
+
* });
|
|
113
|
+
* ```
|
|
114
|
+
*/
|
|
115
|
+
forSession(userId: string, sessionId: string): DynamoDBSessionChatMessageHistory;
|
|
81
116
|
}
|
|
117
|
+
export { DynamoDBSessionChatMessageHistory } from './session-adapter';
|
|
82
118
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/history/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH,OAAO,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/history/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH,OAAO,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AAUvD,OAAO,EAAE,iCAAiC,EAAE,MAAM,mBAAmB,CAAC;AACtE,OAAO,KAAK,EAAE,iCAAiC,EAAE,eAAe,EAAE,MAAM,SAAS,CAAC;AAElF;;;;;;;GAOG;AACH,qBAAa,0BAA0B;IACrC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAA6B;IACvD,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAmB;IAC1C,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAS;IACnC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAS;IAClC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAU;IAErC;;;;;;;;OAQG;gBACS,OAAO,EAAE,iCAAiC;IAUtD;;;;OAIG;IACH,OAAO,IAAI,IAAI;IAMf;;;;;;;;OAQG;IACG,WAAW,CACf,MAAM,EAAE,MAAM,EACd,SAAS,EAAE,MAAM,EACjB,OAAO,GAAE;QAAE,MAAM,CAAC,EAAE,WAAW,CAAA;KAAO,GACrC,OAAO,CAAC,WAAW,EAAE,CAAC;IAUzB;;;;;;;;;OASG;IACG,UAAU,CACd,MAAM,EAAE,MAAM,EACd,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,WAAW,EACpB,KAAK,CAAC,EAAE,MAAM,EACd,OAAO,GAAE;QAAE,MAAM,CAAC,EAAE,WAAW,CAAA;KAAO,GACrC,OAAO,CAAC,IAAI,CAAC;IAahB;;;;;;;;;;OAUG;IACG,WAAW,CACf,MAAM,EAAE,MAAM,EACd,SAAS,EAAE,MAAM,EACjB,QAAQ,EAAE,WAAW,EAAE,EACvB,KAAK,CAAC,EAAE,MAAM,EACd,OAAO,GAAE;QAAE,MAAM,CAAC,EAAE,WAAW,CAAA;KAAO,GACrC,OAAO,CAAC,IAAI,CAAC;IAahB;;;;;;;OAOG;IACG,KAAK,CACT,MAAM,EAAE,MAAM,EACd,SAAS,EAAE,MAAM,EACjB,OAAO,GAAE;QAAE,MAAM,CAAC,EAAE,WAAW,CAAA;KAAO,GACrC,OAAO,CAAC,IAAI,CAAC;IAUhB;;;;;;;;OAQG;IACG,YAAY,CAChB,MAAM,EAAE,MAAM,EACd,KAAK,CAAC,EAAE,MAAM,EACd,OAAO,GAAE;QAAE,MAAM,CAAC,EAAE,WAAW,CAAA;KAAO,GACrC,OAAO,CAAC,eAAe,EAAE,CAAC;IAU7B;;;;;;;;;;;;;;OAcG;IACH,UAAU,CAAC,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,iCAAiC;CASjF;AAED,OAAO,EAAE,iCAAiC,EAAE,MAAM,mBAAmB,CAAC"}
|
package/dist/history/index.js
CHANGED
|
@@ -4,10 +4,18 @@
|
|
|
4
4
|
* Provides persistent storage for chat messages with automatic title generation
|
|
5
5
|
*/
|
|
6
6
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
|
-
exports.DynamoDBChatMessageHistory = void 0;
|
|
8
|
-
const
|
|
9
|
-
const lib_dynamodb_1 = require("@aws-sdk/lib-dynamodb");
|
|
7
|
+
exports.DynamoDBSessionChatMessageHistory = exports.DynamoDBChatMessageHistory = void 0;
|
|
8
|
+
const shared_1 = require("../shared");
|
|
10
9
|
const actions_1 = require("./actions");
|
|
10
|
+
const session_adapter_1 = require("./session-adapter");
|
|
11
|
+
/**
|
|
12
|
+
* DynamoDB-backed chat message history with per-message-item storage.
|
|
13
|
+
*
|
|
14
|
+
* @remarks
|
|
15
|
+
* Each session is capped at ~999 999 messages by the 6-digit message-index
|
|
16
|
+
* sort-key padding. Sessions approaching this bound should be sharded by the
|
|
17
|
+
* caller; see `formatMessageIndex` for details.
|
|
18
|
+
*/
|
|
11
19
|
class DynamoDBChatMessageHistory {
|
|
12
20
|
ddbClient;
|
|
13
21
|
client;
|
|
@@ -24,16 +32,11 @@ class DynamoDBChatMessageHistory {
|
|
|
24
32
|
* @param options.client - Optional pre-built DynamoDBDocument client (takes precedence over clientConfig)
|
|
25
33
|
*/
|
|
26
34
|
constructor(options) {
|
|
27
|
-
|
|
28
|
-
this.
|
|
29
|
-
this.
|
|
30
|
-
this.ownsClient
|
|
31
|
-
}
|
|
32
|
-
else {
|
|
33
|
-
this.ddbClient = new client_dynamodb_1.DynamoDBClient(options.clientConfig || {});
|
|
34
|
-
this.client = lib_dynamodb_1.DynamoDBDocument.from(this.ddbClient);
|
|
35
|
-
this.ownsClient = true;
|
|
36
|
-
}
|
|
35
|
+
({
|
|
36
|
+
ddbClient: this.ddbClient,
|
|
37
|
+
client: this.client,
|
|
38
|
+
ownsClient: this.ownsClient,
|
|
39
|
+
} = (0, shared_1.resolveDynamoDBClient)(options));
|
|
37
40
|
this.tableName = options.tableName;
|
|
38
41
|
this.ttlDays = options.ttlDays;
|
|
39
42
|
}
|
|
@@ -56,12 +59,13 @@ class DynamoDBChatMessageHistory {
|
|
|
56
59
|
* @returns Array of BaseMessage objects in chronological order
|
|
57
60
|
* @throws Error if the operation fails or validation fails
|
|
58
61
|
*/
|
|
59
|
-
async getMessages(userId, sessionId) {
|
|
62
|
+
async getMessages(userId, sessionId, options = {}) {
|
|
60
63
|
return await (0, actions_1.getMessagesAction)({
|
|
61
64
|
client: this.client,
|
|
62
65
|
tableName: this.tableName,
|
|
63
66
|
userId,
|
|
64
67
|
sessionId,
|
|
68
|
+
signal: options.signal,
|
|
65
69
|
});
|
|
66
70
|
}
|
|
67
71
|
/**
|
|
@@ -74,7 +78,7 @@ class DynamoDBChatMessageHistory {
|
|
|
74
78
|
* @param title - Optional session title (auto-generated from the first message if not provided)
|
|
75
79
|
* @throws Error if the operation fails or validation fails
|
|
76
80
|
*/
|
|
77
|
-
async addMessage(userId, sessionId, message, title) {
|
|
81
|
+
async addMessage(userId, sessionId, message, title, options = {}) {
|
|
78
82
|
await (0, actions_1.addMessageAction)({
|
|
79
83
|
client: this.client,
|
|
80
84
|
tableName: this.tableName,
|
|
@@ -83,6 +87,7 @@ class DynamoDBChatMessageHistory {
|
|
|
83
87
|
message,
|
|
84
88
|
title,
|
|
85
89
|
ttlDays: this.ttlDays,
|
|
90
|
+
signal: options.signal,
|
|
86
91
|
});
|
|
87
92
|
}
|
|
88
93
|
/**
|
|
@@ -96,7 +101,7 @@ class DynamoDBChatMessageHistory {
|
|
|
96
101
|
* @param title - Optional session title (auto-generated from the first message if not provided)
|
|
97
102
|
* @throws Error if the operation fails or validation fails
|
|
98
103
|
*/
|
|
99
|
-
async addMessages(userId, sessionId, messages, title) {
|
|
104
|
+
async addMessages(userId, sessionId, messages, title, options = {}) {
|
|
100
105
|
await (0, actions_1.addMessagesAction)({
|
|
101
106
|
client: this.client,
|
|
102
107
|
tableName: this.tableName,
|
|
@@ -105,6 +110,7 @@ class DynamoDBChatMessageHistory {
|
|
|
105
110
|
messages,
|
|
106
111
|
title,
|
|
107
112
|
ttlDays: this.ttlDays,
|
|
113
|
+
signal: options.signal,
|
|
108
114
|
});
|
|
109
115
|
}
|
|
110
116
|
/**
|
|
@@ -115,12 +121,13 @@ class DynamoDBChatMessageHistory {
|
|
|
115
121
|
* @param sessionId - Session identifier
|
|
116
122
|
* @throws Error if the operation fails or validation fails
|
|
117
123
|
*/
|
|
118
|
-
async clear(userId, sessionId) {
|
|
124
|
+
async clear(userId, sessionId, options = {}) {
|
|
119
125
|
await (0, actions_1.clearAction)({
|
|
120
126
|
client: this.client,
|
|
121
127
|
tableName: this.tableName,
|
|
122
128
|
userId,
|
|
123
129
|
sessionId,
|
|
130
|
+
signal: options.signal,
|
|
124
131
|
});
|
|
125
132
|
}
|
|
126
133
|
/**
|
|
@@ -132,14 +139,41 @@ class DynamoDBChatMessageHistory {
|
|
|
132
139
|
* @returns Array of session metadata, sorted by most recent first
|
|
133
140
|
* @throws Error if the operation fails or validation fails
|
|
134
141
|
*/
|
|
135
|
-
async listSessions(userId, limit) {
|
|
142
|
+
async listSessions(userId, limit, options = {}) {
|
|
136
143
|
return await (0, actions_1.listSessionsAction)({
|
|
137
144
|
client: this.client,
|
|
138
145
|
tableName: this.tableName,
|
|
139
146
|
userId,
|
|
140
147
|
limit,
|
|
148
|
+
signal: options.signal,
|
|
149
|
+
});
|
|
150
|
+
}
|
|
151
|
+
/**
|
|
152
|
+
* Bind this store to a single `(userId, sessionId)` pair and return a
|
|
153
|
+
* `BaseListChatMessageHistory` compatible instance — the shape LangChain's
|
|
154
|
+
* `RunnableWithMessageHistory` expects from `getMessageHistory(sessionId)`.
|
|
155
|
+
*
|
|
156
|
+
* @example
|
|
157
|
+
* ```ts
|
|
158
|
+
* const store = new DynamoDBChatMessageHistory({ tableName });
|
|
159
|
+
* new RunnableWithMessageHistory({
|
|
160
|
+
* runnable,
|
|
161
|
+
* getMessageHistory: (sessionId) => store.forSession(userId, sessionId),
|
|
162
|
+
* // ...
|
|
163
|
+
* });
|
|
164
|
+
* ```
|
|
165
|
+
*/
|
|
166
|
+
forSession(userId, sessionId) {
|
|
167
|
+
return new session_adapter_1.DynamoDBSessionChatMessageHistory({
|
|
168
|
+
client: this.client,
|
|
169
|
+
tableName: this.tableName,
|
|
170
|
+
userId,
|
|
171
|
+
sessionId,
|
|
172
|
+
ttlDays: this.ttlDays,
|
|
141
173
|
});
|
|
142
174
|
}
|
|
143
175
|
}
|
|
144
176
|
exports.DynamoDBChatMessageHistory = DynamoDBChatMessageHistory;
|
|
177
|
+
var session_adapter_2 = require("./session-adapter");
|
|
178
|
+
Object.defineProperty(exports, "DynamoDBSessionChatMessageHistory", { enumerable: true, get: function () { return session_adapter_2.DynamoDBSessionChatMessageHistory; } });
|
|
145
179
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/history/index.ts"],"names":[],"mappings":";AAAA;;;GAGG;;;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/history/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Adapter that exposes a single (userId, sessionId) pair through the
|
|
3
|
+
* LangChain `BaseListChatMessageHistory` contract so the DynamoDB-backed
|
|
4
|
+
* history can be plugged into `RunnableWithMessageHistory` and anywhere else
|
|
5
|
+
* that expects the standard interface.
|
|
6
|
+
*
|
|
7
|
+
* Use {@link DynamoDBChatMessageHistory.forSession} to obtain one; see that
|
|
8
|
+
* method's JSDoc for the LangChain integration pattern.
|
|
9
|
+
*/
|
|
10
|
+
import type { DynamoDBDocument } from '@aws-sdk/lib-dynamodb';
|
|
11
|
+
import { BaseListChatMessageHistory } from '@langchain/core/chat_history';
|
|
12
|
+
import type { BaseMessage } from '@langchain/core/messages';
|
|
13
|
+
export interface DynamoDBSessionChatMessageHistoryParams {
|
|
14
|
+
client: DynamoDBDocument;
|
|
15
|
+
tableName: string;
|
|
16
|
+
userId: string;
|
|
17
|
+
sessionId: string;
|
|
18
|
+
ttlDays?: number;
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Single-session LangChain `BaseListChatMessageHistory` backed by the same
|
|
22
|
+
* DynamoDB table used by `DynamoDBChatMessageHistory`. Instances close over a
|
|
23
|
+
* specific `(userId, sessionId)` pair; pass through
|
|
24
|
+
* `RunnableWithMessageHistory` via a `GetSessionHistoryCallable`.
|
|
25
|
+
*/
|
|
26
|
+
export declare class DynamoDBSessionChatMessageHistory extends BaseListChatMessageHistory {
|
|
27
|
+
lc_namespace: string[];
|
|
28
|
+
private readonly client;
|
|
29
|
+
private readonly tableName;
|
|
30
|
+
private readonly userId;
|
|
31
|
+
private readonly sessionId;
|
|
32
|
+
private readonly ttlDays?;
|
|
33
|
+
constructor(params: DynamoDBSessionChatMessageHistoryParams);
|
|
34
|
+
getMessages(): Promise<BaseMessage[]>;
|
|
35
|
+
addMessage(message: BaseMessage): Promise<void>;
|
|
36
|
+
addMessages(messages: BaseMessage[]): Promise<void>;
|
|
37
|
+
clear(): Promise<void>;
|
|
38
|
+
}
|
|
39
|
+
//# sourceMappingURL=session-adapter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session-adapter.d.ts","sourceRoot":"","sources":["../../src/history/session-adapter.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAC9D,OAAO,EAAE,0BAA0B,EAAE,MAAM,8BAA8B,CAAC;AAC1E,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AAI5D,MAAM,WAAW,uCAAuC;IACtD,MAAM,EAAE,gBAAgB,CAAC;IACzB,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED;;;;;GAKG;AACH,qBAAa,iCAAkC,SAAQ,0BAA0B;IAC/E,YAAY,WAAkD;IAE9D,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAmB;IAC1C,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAS;IACnC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAS;IAChC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAS;IACnC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAS;gBAEtB,MAAM,EAAE,uCAAuC;IASrD,WAAW,IAAI,OAAO,CAAC,WAAW,EAAE,CAAC;IASrC,UAAU,CAAC,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC;IAW/C,WAAW,CAAC,QAAQ,EAAE,WAAW,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAWnD,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;CAQ7B"}
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Adapter that exposes a single (userId, sessionId) pair through the
|
|
4
|
+
* LangChain `BaseListChatMessageHistory` contract so the DynamoDB-backed
|
|
5
|
+
* history can be plugged into `RunnableWithMessageHistory` and anywhere else
|
|
6
|
+
* that expects the standard interface.
|
|
7
|
+
*
|
|
8
|
+
* Use {@link DynamoDBChatMessageHistory.forSession} to obtain one; see that
|
|
9
|
+
* method's JSDoc for the LangChain integration pattern.
|
|
10
|
+
*/
|
|
11
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
|
+
exports.DynamoDBSessionChatMessageHistory = void 0;
|
|
13
|
+
const chat_history_1 = require("@langchain/core/chat_history");
|
|
14
|
+
const actions_1 = require("./actions");
|
|
15
|
+
/**
|
|
16
|
+
* Single-session LangChain `BaseListChatMessageHistory` backed by the same
|
|
17
|
+
* DynamoDB table used by `DynamoDBChatMessageHistory`. Instances close over a
|
|
18
|
+
* specific `(userId, sessionId)` pair; pass through
|
|
19
|
+
* `RunnableWithMessageHistory` via a `GetSessionHistoryCallable`.
|
|
20
|
+
*/
|
|
21
|
+
class DynamoDBSessionChatMessageHistory extends chat_history_1.BaseListChatMessageHistory {
|
|
22
|
+
lc_namespace = ['langchain', 'stores', 'message', 'dynamodb'];
|
|
23
|
+
client;
|
|
24
|
+
tableName;
|
|
25
|
+
userId;
|
|
26
|
+
sessionId;
|
|
27
|
+
ttlDays;
|
|
28
|
+
constructor(params) {
|
|
29
|
+
super();
|
|
30
|
+
this.client = params.client;
|
|
31
|
+
this.tableName = params.tableName;
|
|
32
|
+
this.userId = params.userId;
|
|
33
|
+
this.sessionId = params.sessionId;
|
|
34
|
+
this.ttlDays = params.ttlDays;
|
|
35
|
+
}
|
|
36
|
+
async getMessages() {
|
|
37
|
+
return await (0, actions_1.getMessagesAction)({
|
|
38
|
+
client: this.client,
|
|
39
|
+
tableName: this.tableName,
|
|
40
|
+
userId: this.userId,
|
|
41
|
+
sessionId: this.sessionId,
|
|
42
|
+
});
|
|
43
|
+
}
|
|
44
|
+
async addMessage(message) {
|
|
45
|
+
await (0, actions_1.addMessageAction)({
|
|
46
|
+
client: this.client,
|
|
47
|
+
tableName: this.tableName,
|
|
48
|
+
userId: this.userId,
|
|
49
|
+
sessionId: this.sessionId,
|
|
50
|
+
message,
|
|
51
|
+
ttlDays: this.ttlDays,
|
|
52
|
+
});
|
|
53
|
+
}
|
|
54
|
+
async addMessages(messages) {
|
|
55
|
+
await (0, actions_1.addMessagesAction)({
|
|
56
|
+
client: this.client,
|
|
57
|
+
tableName: this.tableName,
|
|
58
|
+
userId: this.userId,
|
|
59
|
+
sessionId: this.sessionId,
|
|
60
|
+
messages,
|
|
61
|
+
ttlDays: this.ttlDays,
|
|
62
|
+
});
|
|
63
|
+
}
|
|
64
|
+
async clear() {
|
|
65
|
+
await (0, actions_1.clearAction)({
|
|
66
|
+
client: this.client,
|
|
67
|
+
tableName: this.tableName,
|
|
68
|
+
userId: this.userId,
|
|
69
|
+
sessionId: this.sessionId,
|
|
70
|
+
});
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
exports.DynamoDBSessionChatMessageHistory = DynamoDBSessionChatMessageHistory;
|
|
74
|
+
//# sourceMappingURL=session-adapter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session-adapter.js","sourceRoot":"","sources":["../../src/history/session-adapter.ts"],"names":[],"mappings":";AAAA;;;;;;;;GAQG;;;AAGH,+DAA0E;AAG1E,uCAAgG;AAUhG;;;;;GAKG;AACH,MAAa,iCAAkC,SAAQ,yCAA0B;IAC/E,YAAY,GAAG,CAAC,WAAW,EAAE,QAAQ,EAAE,SAAS,EAAE,UAAU,CAAC,CAAC;IAE7C,MAAM,CAAmB;IACzB,SAAS,CAAS;IAClB,MAAM,CAAS;IACf,SAAS,CAAS;IAClB,OAAO,CAAU;IAElC,YAAY,MAA+C;QACzD,KAAK,EAAE,CAAC;QACR,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC;QAC5B,IAAI,CAAC,SAAS,GAAG,MAAM,CAAC,SAAS,CAAC;QAClC,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC;QAC5B,IAAI,CAAC,SAAS,GAAG,MAAM,CAAC,SAAS,CAAC;QAClC,IAAI,CAAC,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC;IAChC,CAAC;IAED,KAAK,CAAC,WAAW;QACf,OAAO,MAAM,IAAA,2BAAiB,EAAC;YAC7B,MAAM,EAAE,IAAI,CAAC,MAAM;YACnB,SAAS,EAAE,IAAI,CAAC,SAAS;YACzB,MAAM,EAAE,IAAI,CAAC,MAAM;YACnB,SAAS,EAAE,IAAI,CAAC,SAAS;SAC1B,CAAC,CAAC;IACL,CAAC;IAED,KAAK,CAAC,UAAU,CAAC,OAAoB;QACnC,MAAM,IAAA,0BAAgB,EAAC;YACrB,MAAM,EAAE,IAAI,CAAC,MAAM;YACnB,SAAS,EAAE,IAAI,CAAC,SAAS;YACzB,MAAM,EAAE,IAAI,CAAC,MAAM;YACnB,SAAS,EAAE,IAAI,CAAC,SAAS;YACzB,OAAO;YACP,OAAO,EAAE,IAAI,CAAC,OAAO;SACtB,CAAC,CAAC;IACL,CAAC;IAED,KAAK,CAAC,WAAW,CAAC,QAAuB;QACvC,MAAM,IAAA,2BAAiB,EAAC;YACtB,MAAM,EAAE,IAAI,CAAC,MAAM;YACnB,SAAS,EAAE,IAAI,CAAC,SAAS;YACzB,MAAM,EAAE,IAAI,CAAC,MAAM;YACnB,SAAS,EAAE,IAAI,CAAC,SAAS;YACzB,QAAQ;YACR,OAAO,EAAE,IAAI,CAAC,OAAO;SACtB,CAAC,CAAC;IACL,CAAC;IAED,KAAK,CAAC,KAAK;QACT,MAAM,IAAA,qBAAW,EAAC;YAChB,MAAM,EAAE,IAAI,CAAC,MAAM;YACnB,SAAS,EAAE,IAAI,CAAC,SAAS;YACzB,MAAM,EAAE,IAAI,CAAC,MAAM;YACnB,SAAS,EAAE,IAAI,CAAC,SAAS;SAC1B,CAAC,CAAC;IACL,CAAC;CACF;AAzDD,8EAyDC"}
|