@farukada/aws-langgraph-dynamodb-ts 0.0.10 → 0.1.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 +353 -242
- package/dist/checkpointer/actions/delete-thread.d.ts +3 -3
- package/dist/checkpointer/actions/delete-thread.d.ts.map +1 -1
- package/dist/checkpointer/actions/delete-thread.js +95 -52
- package/dist/checkpointer/actions/delete-thread.js.map +1 -1
- package/dist/checkpointer/actions/get-tuple.d.ts +8 -1
- package/dist/checkpointer/actions/get-tuple.d.ts.map +1 -1
- package/dist/checkpointer/actions/get-tuple.js +72 -20
- 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 +27 -22
- package/dist/checkpointer/actions/put-writes.js.map +1 -1
- package/dist/checkpointer/actions/put.d.ts +6 -2
- package/dist/checkpointer/actions/put.d.ts.map +1 -1
- package/dist/checkpointer/actions/put.js +80 -19
- package/dist/checkpointer/actions/put.js.map +1 -1
- package/dist/checkpointer/index.d.ts +43 -2
- package/dist/checkpointer/index.d.ts.map +1 -1
- package/dist/checkpointer/index.js +226 -11
- package/dist/checkpointer/index.js.map +1 -1
- package/dist/checkpointer/types/index.d.ts +66 -4
- package/dist/checkpointer/types/index.d.ts.map +1 -1
- package/dist/checkpointer/types/index.js +10 -0
- package/dist/checkpointer/types/index.js.map +1 -1
- package/dist/checkpointer/utils/deserialization.d.ts +8 -3
- package/dist/checkpointer/utils/deserialization.d.ts.map +1 -1
- package/dist/checkpointer/utils/deserialization.js +23 -5
- package/dist/checkpointer/utils/deserialization.js.map +1 -1
- package/dist/checkpointer/utils/validation.d.ts +1 -1
- package/dist/checkpointer/utils/validation.js +1 -1
- package/dist/checkpointer/utils/validation.js.map +1 -1
- package/dist/factory.d.ts +8 -6
- package/dist/factory.d.ts.map +1 -1
- package/dist/factory.js +16 -4
- package/dist/factory.js.map +1 -1
- package/dist/history/actions/add-message.d.ts +2 -1
- package/dist/history/actions/add-message.d.ts.map +1 -1
- package/dist/history/actions/add-message.js +22 -18
- package/dist/history/actions/add-message.js.map +1 -1
- package/dist/history/actions/add-messages.d.ts +3 -2
- package/dist/history/actions/add-messages.d.ts.map +1 -1
- package/dist/history/actions/add-messages.js +30 -20
- package/dist/history/actions/add-messages.js.map +1 -1
- package/dist/history/actions/clear.d.ts +4 -3
- package/dist/history/actions/clear.d.ts.map +1 -1
- package/dist/history/actions/clear.js +47 -12
- package/dist/history/actions/clear.js.map +1 -1
- package/dist/history/actions/get-messages.d.ts +2 -1
- package/dist/history/actions/get-messages.d.ts.map +1 -1
- package/dist/history/actions/get-messages.js +41 -15
- package/dist/history/actions/get-messages.js.map +1 -1
- package/dist/history/actions/list-sessions.d.ts +11 -0
- package/dist/history/actions/list-sessions.d.ts.map +1 -1
- package/dist/history/actions/list-sessions.js +23 -3
- package/dist/history/actions/list-sessions.js.map +1 -1
- package/dist/history/index.d.ts +8 -0
- package/dist/history/index.d.ts.map +1 -1
- package/dist/history/index.js +22 -2
- package/dist/history/index.js.map +1 -1
- package/dist/history/types/index.d.ts +27 -5
- package/dist/history/types/index.d.ts.map +1 -1
- package/dist/history/types/index.js +1 -0
- package/dist/history/types/index.js.map +1 -1
- package/dist/history/utils/title-generator.js.map +1 -1
- package/dist/history/utils/update-expression-builder.d.ts +45 -21
- package/dist/history/utils/update-expression-builder.d.ts.map +1 -1
- package/dist/history/utils/update-expression-builder.js +105 -38
- package/dist/history/utils/update-expression-builder.js.map +1 -1
- package/dist/history/utils/validation.d.ts +8 -0
- package/dist/history/utils/validation.d.ts.map +1 -1
- package/dist/history/utils/validation.js +22 -0
- package/dist/history/utils/validation.js.map +1 -1
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +5 -1
- package/dist/index.js.map +1 -1
- package/dist/shared/utils/batch-write.d.ts +36 -0
- package/dist/shared/utils/batch-write.d.ts.map +1 -0
- package/dist/shared/utils/batch-write.js +62 -0
- package/dist/shared/utils/batch-write.js.map +1 -0
- package/dist/shared/utils/compressor.d.ts +48 -0
- package/dist/shared/utils/compressor.d.ts.map +1 -0
- package/dist/shared/utils/compressor.js +68 -0
- package/dist/shared/utils/compressor.js.map +1 -0
- package/dist/shared/utils/constants.d.ts +2 -0
- package/dist/shared/utils/constants.d.ts.map +1 -1
- package/dist/shared/utils/constants.js +3 -7
- package/dist/shared/utils/constants.js.map +1 -1
- package/dist/shared/utils/index.d.ts +4 -0
- package/dist/shared/utils/index.d.ts.map +1 -1
- package/dist/shared/utils/index.js +4 -0
- package/dist/shared/utils/index.js.map +1 -1
- package/dist/shared/utils/logger.d.ts +48 -0
- package/dist/shared/utils/logger.d.ts.map +1 -0
- package/dist/shared/utils/logger.js +62 -0
- package/dist/shared/utils/logger.js.map +1 -0
- package/dist/shared/utils/retry.d.ts +1 -1
- package/dist/shared/utils/retry.d.ts.map +1 -1
- package/dist/shared/utils/retry.js +13 -6
- package/dist/shared/utils/retry.js.map +1 -1
- package/dist/shared/utils/s3-offloader.d.ts +146 -0
- package/dist/shared/utils/s3-offloader.d.ts.map +1 -0
- package/dist/shared/utils/s3-offloader.js +271 -0
- package/dist/shared/utils/s3-offloader.js.map +1 -0
- package/dist/shared/utils/ttl.d.ts +8 -1
- package/dist/shared/utils/ttl.d.ts.map +1 -1
- package/dist/shared/utils/ttl.js +12 -8
- package/dist/shared/utils/ttl.js.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/put-operation.d.ts.map +1 -1
- package/dist/store/actions/put-operation.js +2 -1
- package/dist/store/actions/put-operation.js.map +1 -1
- package/dist/store/actions/search-operation.d.ts +6 -0
- package/dist/store/actions/search-operation.d.ts.map +1 -1
- package/dist/store/actions/search-operation.js +41 -21
- package/dist/store/actions/search-operation.js.map +1 -1
- package/dist/store/index.d.ts +10 -2
- package/dist/store/index.d.ts.map +1 -1
- package/dist/store/index.js +28 -5
- package/dist/store/index.js.map +1 -1
- package/dist/store/types/index.d.ts +7 -5
- package/dist/store/types/index.d.ts.map +1 -1
- package/dist/store/utils/index.d.ts +0 -1
- package/dist/store/utils/index.d.ts.map +1 -1
- package/dist/store/utils/index.js +0 -1
- package/dist/store/utils/index.js.map +1 -1
- package/dist/store/utils/validation.js +1 -1
- package/dist/store/utils/validation.js.map +1 -1
- package/package.json +41 -24
- package/dist/store/utils/result.d.ts +0 -42
- package/dist/store/utils/result.d.ts.map +0 -1
- package/dist/store/utils/result.js +0 -51
- package/dist/store/utils/result.js.map +0 -1
|
@@ -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;;;;GAIG;;;AAGH,oCAWkB;AAElB;;;;;;GAMG;AACI,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,GAAG,MAAM,CAAC;IAElF,wDAAwD;IACxD,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,4EAA4E;IAC5E,MAAM,YAAY,GAAG,KAAK,IAAI,IAAA,qBAAa,EAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC;IAEzD,mEAAmE;IACnE,MAAM,EAAE,gBAAgB,EAAE,yBAAyB,EAAE,GAAG,IAAA,iCAAyB,EAC/E,YAAY,EACZ,QAAQ,CAAC,MAAM,EAAE,qBAAqB;IACtC,OAAO,CACR,CAAC;IAEF,MAAM,YAAY,GAAG,MAAM,IAAA,yBAAiB,EAAC,KAAK,IAAI,EAAE;QACtD,OAAO,MAAM,MAAM,CAAC,MAAM,CAAC;YACzB,SAAS,EAAE,SAAS;YACpB,GAAG,EAAE,EAAE,MAAM,EAAE,SAAS,EAAE;YAC1B,gBAAgB,EAAE,gBAAgB;YAClC,yBAAyB,EAAE,yBAAyB;YACpD,YAAY,EAAE,SAAS;SACxB,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,0EAA0E;IAC1E,8DAA8D;IAC9D,MAAM,QAAQ,GAAI,YAAY,CAAC,UAAU,EAAE,YAAuB,IAAI,QAAQ,CAAC,MAAM,CAAC;IACtF,MAAM,UAAU,GAAG,QAAQ,GAAG,QAAQ,CAAC,MAAM,CAAC;IAE9C,0BAA0B;IAC1B,MAAM,YAAY,GAAG,IAAA,yBAAiB,EAAC,MAAM,EAAE,SAAS,EAAE,QAAQ,EAAE,UAAU,EAAE,OAAO,CAAC,CAAC;IAEzF,0FAA0F;IAC1F,MAAM,IAAA,yBAAiB,EAAC,KAAK,IAAI,EAAE;QACjC,MAAM,MAAM,CAAC,aAAa,CAAC;YACzB,aAAa,EAAE,YAAY,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;gBACzC,GAAG,EAAE;oBACH,SAAS,EAAE,SAAS;oBACpB,IAAI,EAAE,IAAI;iBACX;aACF,CAAC,CAAC;SACJ,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC,CAAC;AAlDW,QAAA,iBAAiB,qBAkD5B"}
|
|
@@ -1,10 +1,11 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Clear all messages
|
|
2
|
+
* Clear all messages and metadata for a session
|
|
3
|
+
* Deletes both the metadata item and all individual message items
|
|
3
4
|
*/
|
|
4
5
|
import type { ClearActionParams } from '../types';
|
|
5
6
|
/**
|
|
6
|
-
* Clear all messages in a session by deleting
|
|
7
|
-
*
|
|
7
|
+
* Clear all messages in a session by deleting all items (metadata + messages)
|
|
8
|
+
* Queries all items with the session prefix, then batch-deletes them
|
|
8
9
|
*
|
|
9
10
|
* @param params - Parameters for the clear operation
|
|
10
11
|
* @throws Error if the operation fails or validation fails
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"clear.d.ts","sourceRoot":"","sources":["../../../src/history/actions/clear.ts"],"names":[],"mappings":"AAAA
|
|
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,CA4DzE,CAAC"}
|
|
@@ -1,13 +1,15 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
/**
|
|
3
|
-
* Clear all messages
|
|
3
|
+
* Clear all messages and metadata for a session
|
|
4
|
+
* Deletes both the metadata item and all individual message items
|
|
4
5
|
*/
|
|
5
6
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
7
|
exports.clearAction = void 0;
|
|
8
|
+
const shared_1 = require("../../shared");
|
|
7
9
|
const utils_1 = require("../utils");
|
|
8
10
|
/**
|
|
9
|
-
* Clear all messages in a session by deleting
|
|
10
|
-
*
|
|
11
|
+
* Clear all messages in a session by deleting all items (metadata + messages)
|
|
12
|
+
* Queries all items with the session prefix, then batch-deletes them
|
|
11
13
|
*
|
|
12
14
|
* @param params - Parameters for the clear operation
|
|
13
15
|
* @throws Error if the operation fails or validation fails
|
|
@@ -17,16 +19,49 @@ const clearAction = async (params) => {
|
|
|
17
19
|
// Validate inputs
|
|
18
20
|
(0, utils_1.validateUserId)(userId);
|
|
19
21
|
(0, utils_1.validateSessionId)(sessionId);
|
|
20
|
-
//
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
22
|
+
// Collect all item keys to delete: metadata item + all message items
|
|
23
|
+
const keysToDelete = [];
|
|
24
|
+
// Add the metadata item key
|
|
25
|
+
keysToDelete.push({ userId, sessionId });
|
|
26
|
+
// Query all message items by SK prefix
|
|
27
|
+
const messagePrefix = `${sessionId}#msg#`;
|
|
28
|
+
let lastEvaluatedKey;
|
|
29
|
+
let iterationCount = 0;
|
|
30
|
+
do {
|
|
31
|
+
// Prevent infinite loops
|
|
32
|
+
iterationCount++;
|
|
33
|
+
if (iterationCount > shared_1.MAX_LOOP_ITERATIONS) {
|
|
34
|
+
throw new Error('Clear operation exceeded maximum iteration limit');
|
|
35
|
+
}
|
|
36
|
+
const result = await (0, utils_1.withDynamoDBRetry)(async () => {
|
|
37
|
+
return await client.query({
|
|
38
|
+
TableName: tableName,
|
|
39
|
+
KeyConditionExpression: 'userId = :userId AND begins_with(sessionId, :prefix)',
|
|
40
|
+
ExpressionAttributeValues: {
|
|
41
|
+
':userId': userId,
|
|
42
|
+
':prefix': messagePrefix,
|
|
43
|
+
},
|
|
44
|
+
ProjectionExpression: 'userId, sessionId',
|
|
45
|
+
ExclusiveStartKey: lastEvaluatedKey,
|
|
46
|
+
});
|
|
28
47
|
});
|
|
29
|
-
|
|
48
|
+
if (result.Items && result.Items.length > 0) {
|
|
49
|
+
// Prevent memory exhaustion
|
|
50
|
+
if (keysToDelete.length + result.Items.length > shared_1.MAX_TOTAL_ITEMS_IN_MEMORY) {
|
|
51
|
+
throw new Error('Clear operation exceeded maximum items in memory limit');
|
|
52
|
+
}
|
|
53
|
+
keysToDelete.push(...result.Items.map((item) => ({
|
|
54
|
+
userId: item.userId,
|
|
55
|
+
sessionId: item.sessionId,
|
|
56
|
+
})));
|
|
57
|
+
}
|
|
58
|
+
lastEvaluatedKey = result.LastEvaluatedKey;
|
|
59
|
+
} while (lastEvaluatedKey);
|
|
60
|
+
// Batch delete all items (metadata + messages) using shared utility
|
|
61
|
+
const deleteRequests = keysToDelete.map((key) => ({
|
|
62
|
+
DeleteRequest: { Key: key },
|
|
63
|
+
}));
|
|
64
|
+
await (0, shared_1.batchWriteAllWithRetry)(client, tableName, deleteRequests);
|
|
30
65
|
};
|
|
31
66
|
exports.clearAction = clearAction;
|
|
32
67
|
//# sourceMappingURL=clear.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"clear.js","sourceRoot":"","sources":["../../../src/history/actions/clear.ts"],"names":[],"mappings":";AAAA
|
|
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;IAExD,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,EAAC,KAAK,IAAI,EAAE;YAChD,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,CAAC,CAAC;QAEH,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,CAAC,CAAC;AAClE,CAAC,CAAC;AA5DW,QAAA,WAAW,eA4DtB"}
|
|
@@ -1,11 +1,12 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Get all messages for a session
|
|
3
|
+
* Queries individual message items and deserializes to BaseMessage instances
|
|
3
4
|
*/
|
|
4
5
|
import { BaseMessage } from '@langchain/core/messages';
|
|
5
6
|
import type { GetMessagesActionParams } from '../types';
|
|
6
7
|
/**
|
|
7
8
|
* Get all messages for a session from DynamoDB
|
|
8
|
-
*
|
|
9
|
+
* Queries message items by SK prefix and deserializes to proper BaseMessage instances
|
|
9
10
|
*
|
|
10
11
|
* @param params - Parameters for the get messages operation
|
|
11
12
|
* @returns Array of BaseMessage objects in chronological order
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"get-messages.d.ts","sourceRoot":"","sources":["../../../src/history/actions/get-messages.ts"],"names":[],"mappings":"AAAA
|
|
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,CAsDvB,CAAC"}
|
|
@@ -1,13 +1,16 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
/**
|
|
3
3
|
* Get all messages for a session
|
|
4
|
+
* Queries individual message items and deserializes to BaseMessage instances
|
|
4
5
|
*/
|
|
5
6
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
7
|
exports.getMessagesAction = void 0;
|
|
8
|
+
const messages_1 = require("@langchain/core/messages");
|
|
9
|
+
const shared_1 = require("../../shared");
|
|
7
10
|
const utils_1 = require("../utils");
|
|
8
11
|
/**
|
|
9
12
|
* Get all messages for a session from DynamoDB
|
|
10
|
-
*
|
|
13
|
+
* Queries message items by SK prefix and deserializes to proper BaseMessage instances
|
|
11
14
|
*
|
|
12
15
|
* @param params - Parameters for the get messages operation
|
|
13
16
|
* @returns Array of BaseMessage objects in chronological order
|
|
@@ -18,23 +21,46 @@ const getMessagesAction = async (params) => {
|
|
|
18
21
|
// Validate inputs
|
|
19
22
|
(0, utils_1.validateUserId)(userId);
|
|
20
23
|
(0, utils_1.validateSessionId)(sessionId);
|
|
21
|
-
//
|
|
22
|
-
const
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
24
|
+
// Query all message items for the session using SK prefix
|
|
25
|
+
const messagePrefix = `${sessionId}#msg#`;
|
|
26
|
+
const messages = [];
|
|
27
|
+
let lastEvaluatedKey;
|
|
28
|
+
let iterationCount = 0;
|
|
29
|
+
do {
|
|
30
|
+
// Prevent infinite loops
|
|
31
|
+
iterationCount++;
|
|
32
|
+
if (iterationCount > shared_1.MAX_LOOP_ITERATIONS) {
|
|
33
|
+
throw new Error('getMessages operation exceeded maximum iteration limit');
|
|
34
|
+
}
|
|
35
|
+
const result = await (0, utils_1.withDynamoDBRetry)(async () => {
|
|
36
|
+
return await client.query({
|
|
37
|
+
TableName: tableName,
|
|
38
|
+
KeyConditionExpression: 'userId = :userId AND begins_with(sessionId, :prefix)',
|
|
39
|
+
ExpressionAttributeValues: {
|
|
40
|
+
':userId': userId,
|
|
41
|
+
':prefix': messagePrefix,
|
|
42
|
+
},
|
|
43
|
+
ExclusiveStartKey: lastEvaluatedKey,
|
|
44
|
+
});
|
|
29
45
|
});
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
46
|
+
if (result.Items && result.Items.length > 0) {
|
|
47
|
+
// Prevent memory exhaustion
|
|
48
|
+
if (messages.length + result.Items.length > shared_1.MAX_TOTAL_ITEMS_IN_MEMORY) {
|
|
49
|
+
throw new Error('getMessages operation exceeded maximum items in memory limit');
|
|
50
|
+
}
|
|
51
|
+
messages.push(...result.Items);
|
|
52
|
+
}
|
|
53
|
+
lastEvaluatedKey = result.LastEvaluatedKey;
|
|
54
|
+
} while (lastEvaluatedKey);
|
|
55
|
+
// Return empty array if no messages found
|
|
56
|
+
if (messages.length === 0) {
|
|
33
57
|
return [];
|
|
34
58
|
}
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
59
|
+
// Sort by messageIndex to ensure chronological order
|
|
60
|
+
messages.sort((a, b) => a.messageIndex - b.messageIndex);
|
|
61
|
+
// Deserialize StoredMessage objects to proper BaseMessage instances
|
|
62
|
+
const storedMessages = messages.map((item) => item.message);
|
|
63
|
+
return (0, messages_1.mapStoredMessagesToChatMessages)(storedMessages);
|
|
38
64
|
};
|
|
39
65
|
exports.getMessagesAction = getMessagesAction;
|
|
40
66
|
//# sourceMappingURL=get-messages.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"get-messages.js","sourceRoot":"","sources":["../../../src/history/actions/get-messages.ts"],"names":[],"mappings":";AAAA
|
|
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;IAExD,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,EAAC,KAAK,IAAI,EAAE;YAChD,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,CAAC,CAAC;QAEH,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;AAxDW,QAAA,iBAAiB,qBAwD5B"}
|
|
@@ -6,6 +6,17 @@ import type { ListSessionsActionParams, SessionMetadata } from '../types';
|
|
|
6
6
|
* List all sessions for a user, sorted by most recent
|
|
7
7
|
* Uses projection expression to exclude messages for performance
|
|
8
8
|
*
|
|
9
|
+
* @remarks
|
|
10
|
+
* **Performance note:** This action loads all metadata items for a user into memory
|
|
11
|
+
* and sorts client-side by `updatedAt`. DynamoDB sorts by SK (sessionId), so server-side
|
|
12
|
+
* sorted pagination is not possible with the current schema.
|
|
13
|
+
*
|
|
14
|
+
* For users with thousands of sessions, consider adding a GSI on `userId + updatedAt`
|
|
15
|
+
* to enable server-side sorting with DynamoDB `Limit` and `ScanIndexForward`.
|
|
16
|
+
*
|
|
17
|
+
* A safety limit of {@link MAX_TOTAL_ITEMS_IN_MEMORY} is applied to prevent
|
|
18
|
+
* unbounded memory growth.
|
|
19
|
+
*
|
|
9
20
|
* @param params - Parameters for the list sessions operation
|
|
10
21
|
* @returns Array of session metadata, sorted by most recent first
|
|
11
22
|
* @throws Error if the operation fails or validation fails
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"list-sessions.d.ts","sourceRoot":"","sources":["../../../src/history/actions/list-sessions.ts"],"names":[],"mappings":"AAAA;;GAEG;
|
|
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,CAwD3B,CAAC"}
|
|
@@ -4,11 +4,23 @@
|
|
|
4
4
|
*/
|
|
5
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
6
|
exports.listSessionsAction = void 0;
|
|
7
|
+
const shared_1 = require("../../shared");
|
|
7
8
|
const utils_1 = require("../utils");
|
|
8
9
|
/**
|
|
9
10
|
* List all sessions for a user, sorted by most recent
|
|
10
11
|
* Uses projection expression to exclude messages for performance
|
|
11
12
|
*
|
|
13
|
+
* @remarks
|
|
14
|
+
* **Performance note:** This action loads all metadata items for a user into memory
|
|
15
|
+
* and sorts client-side by `updatedAt`. DynamoDB sorts by SK (sessionId), so server-side
|
|
16
|
+
* sorted pagination is not possible with the current schema.
|
|
17
|
+
*
|
|
18
|
+
* For users with thousands of sessions, consider adding a GSI on `userId + updatedAt`
|
|
19
|
+
* to enable server-side sorting with DynamoDB `Limit` and `ScanIndexForward`.
|
|
20
|
+
*
|
|
21
|
+
* A safety limit of {@link MAX_TOTAL_ITEMS_IN_MEMORY} is applied to prevent
|
|
22
|
+
* unbounded memory growth.
|
|
23
|
+
*
|
|
12
24
|
* @param params - Parameters for the list sessions operation
|
|
13
25
|
* @returns Array of session metadata, sorted by most recent first
|
|
14
26
|
* @throws Error if the operation fails or validation fails
|
|
@@ -20,17 +32,20 @@ const listSessionsAction = async (params) => {
|
|
|
20
32
|
(0, utils_1.validateLimit)(limit);
|
|
21
33
|
const sessions = [];
|
|
22
34
|
let lastEvaluatedKey;
|
|
23
|
-
// Paginate through all results
|
|
35
|
+
// Paginate through all results - must fetch ALL sessions before sorting
|
|
36
|
+
// DynamoDB sorts by SK (sessionId), not updatedAt, so we cannot rely on
|
|
37
|
+
// DynamoDB's Limit to return the most recent sessions
|
|
24
38
|
do {
|
|
25
39
|
const result = await (0, utils_1.withDynamoDBRetry)(async () => {
|
|
26
40
|
return await client.query({
|
|
27
41
|
TableName: tableName,
|
|
28
42
|
KeyConditionExpression: 'userId = :userId',
|
|
43
|
+
FilterExpression: 'itemType = :metadata',
|
|
29
44
|
ExpressionAttributeValues: {
|
|
30
45
|
':userId': userId,
|
|
46
|
+
':metadata': 'metadata',
|
|
31
47
|
},
|
|
32
48
|
ProjectionExpression: 'sessionId, title, createdAt, updatedAt, messageCount',
|
|
33
|
-
Limit: limit,
|
|
34
49
|
ExclusiveStartKey: lastEvaluatedKey,
|
|
35
50
|
});
|
|
36
51
|
});
|
|
@@ -46,11 +61,16 @@ const listSessionsAction = async (params) => {
|
|
|
46
61
|
messageCount: item.messageCount,
|
|
47
62
|
}));
|
|
48
63
|
sessions.push(...mappedSessions);
|
|
64
|
+
// Safety limit: prevent unbounded memory growth
|
|
65
|
+
if (sessions.length >= shared_1.MAX_TOTAL_ITEMS_IN_MEMORY) {
|
|
66
|
+
break;
|
|
67
|
+
}
|
|
49
68
|
lastEvaluatedKey = result.LastEvaluatedKey;
|
|
50
69
|
} while (lastEvaluatedKey);
|
|
51
70
|
// Sort by most recent first (updatedAt DESC)
|
|
52
71
|
sessions.sort((a, b) => b.updatedAt - a.updatedAt);
|
|
53
|
-
|
|
72
|
+
// Enforce limit on final result
|
|
73
|
+
return limit ? sessions.slice(0, limit) : sessions;
|
|
54
74
|
};
|
|
55
75
|
exports.listSessionsAction = listSessionsAction;
|
|
56
76
|
//# sourceMappingURL=list-sessions.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"list-sessions.js","sourceRoot":"","sources":["../../../src/history/actions/list-sessions.ts"],"names":[],"mappings":";AAAA;;GAEG;;;
|
|
1
|
+
{"version":3,"file":"list-sessions.js","sourceRoot":"","sources":["../../../src/history/actions/list-sessions.ts"],"names":[],"mappings":";AAAA;;GAEG;;;AAEH,yCAAyD;AAEzD,oCAA4E;AAE5E;;;;;;;;;;;;;;;;;;GAkBG;AACI,MAAM,kBAAkB,GAAG,KAAK,EACrC,MAAgC,EACJ,EAAE;IAC9B,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,MAAM,CAAC;IAEpD,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,EAAC,KAAK,IAAI,EAAE;YAChD,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,CAAC,CAAC;QAEH,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,gDAAgD;QAChD,IAAI,QAAQ,CAAC,MAAM,IAAI,kCAAyB,EAAE,CAAC;YACjD,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;AA1DW,QAAA,kBAAkB,sBA0D7B"}
|
package/dist/history/index.d.ts
CHANGED
|
@@ -9,6 +9,7 @@ export declare class DynamoDBChatMessageHistory {
|
|
|
9
9
|
private readonly client;
|
|
10
10
|
private readonly tableName;
|
|
11
11
|
private readonly ttlDays?;
|
|
12
|
+
private readonly ownsClient;
|
|
12
13
|
/**
|
|
13
14
|
* Create a new DynamoDB chat message history instance
|
|
14
15
|
*
|
|
@@ -16,8 +17,15 @@ export declare class DynamoDBChatMessageHistory {
|
|
|
16
17
|
* @param options.tableName - Name of the DynamoDB table to use
|
|
17
18
|
* @param options.ttlDays - Optional TTL in days for automatic cleanup (1-1825 days)
|
|
18
19
|
* @param options.clientConfig - Optional DynamoDB client configuration
|
|
20
|
+
* @param options.client - Optional pre-built DynamoDBDocument client (takes precedence over clientConfig)
|
|
19
21
|
*/
|
|
20
22
|
constructor(options: DynamoDBChatMessageHistoryOptions);
|
|
23
|
+
/**
|
|
24
|
+
* Release underlying DynamoDB client resources.
|
|
25
|
+
* Call this when the history is no longer needed to prevent resource leaks.
|
|
26
|
+
* Skips cleanup if a shared client was injected via options.
|
|
27
|
+
*/
|
|
28
|
+
destroy(): void;
|
|
21
29
|
/**
|
|
22
30
|
* Get all messages for a session
|
|
23
31
|
* Messages are returned in chronological order
|
|
@@ -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;AASvD,OAAO,KAAK,EAAE,iCAAiC,EAAE,eAAe,EAAE,MAAM,SAAS,CAAC;AAElF,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;IActD;;;;OAIG;IACH,OAAO,IAAI,IAAI;IAMf;;;;;;;;OAQG;IACG,WAAW,CAAC,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC;IAS5E;;;;;;;;;OASG;IACG,UAAU,CACd,MAAM,EAAE,MAAM,EACd,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,WAAW,EACpB,KAAK,CAAC,EAAE,MAAM,GACb,OAAO,CAAC,IAAI,CAAC;IAYhB;;;;;;;;;;OAUG;IACG,WAAW,CACf,MAAM,EAAE,MAAM,EACd,SAAS,EAAE,MAAM,EACjB,QAAQ,EAAE,WAAW,EAAE,EACvB,KAAK,CAAC,EAAE,MAAM,GACb,OAAO,CAAC,IAAI,CAAC;IAYhB;;;;;;;OAOG;IACG,KAAK,CAAC,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAS7D;;;;;;;;OAQG;IACG,YAAY,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,EAAE,CAAC;CAQ/E"}
|
package/dist/history/index.js
CHANGED
|
@@ -13,6 +13,7 @@ class DynamoDBChatMessageHistory {
|
|
|
13
13
|
client;
|
|
14
14
|
tableName;
|
|
15
15
|
ttlDays;
|
|
16
|
+
ownsClient;
|
|
16
17
|
/**
|
|
17
18
|
* Create a new DynamoDB chat message history instance
|
|
18
19
|
*
|
|
@@ -20,13 +21,32 @@ class DynamoDBChatMessageHistory {
|
|
|
20
21
|
* @param options.tableName - Name of the DynamoDB table to use
|
|
21
22
|
* @param options.ttlDays - Optional TTL in days for automatic cleanup (1-1825 days)
|
|
22
23
|
* @param options.clientConfig - Optional DynamoDB client configuration
|
|
24
|
+
* @param options.client - Optional pre-built DynamoDBDocument client (takes precedence over clientConfig)
|
|
23
25
|
*/
|
|
24
26
|
constructor(options) {
|
|
25
|
-
|
|
26
|
-
|
|
27
|
+
if (options.client) {
|
|
28
|
+
this.client = options.client;
|
|
29
|
+
this.ddbClient = undefined;
|
|
30
|
+
this.ownsClient = false;
|
|
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
|
+
}
|
|
27
37
|
this.tableName = options.tableName;
|
|
28
38
|
this.ttlDays = options.ttlDays;
|
|
29
39
|
}
|
|
40
|
+
/**
|
|
41
|
+
* Release underlying DynamoDB client resources.
|
|
42
|
+
* Call this when the history is no longer needed to prevent resource leaks.
|
|
43
|
+
* Skips cleanup if a shared client was injected via options.
|
|
44
|
+
*/
|
|
45
|
+
destroy() {
|
|
46
|
+
if (this.ownsClient && this.ddbClient) {
|
|
47
|
+
this.ddbClient.destroy();
|
|
48
|
+
}
|
|
49
|
+
}
|
|
30
50
|
/**
|
|
31
51
|
* Get all messages for a session
|
|
32
52
|
* Messages are returned in chronological order
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/history/index.ts"],"names":[],"mappings":";AAAA;;;GAGG;;;AAEH,8DAA0D;AAC1D,wDAAyD;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/history/index.ts"],"names":[],"mappings":";AAAA;;;GAGG;;;AAEH,8DAA0D;AAC1D,wDAAyD;AAGzD,uCAMmB;AAGnB,MAAa,0BAA0B;IACpB,SAAS,CAA6B;IACtC,MAAM,CAAmB;IACzB,SAAS,CAAS;IAClB,OAAO,CAAU;IACjB,UAAU,CAAU;IAErC;;;;;;;;OAQG;IACH,YAAY,OAA0C;QACpD,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;YACnB,IAAI,CAAC,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;YAC7B,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;YAC3B,IAAI,CAAC,UAAU,GAAG,KAAK,CAAC;QAC1B,CAAC;aAAM,CAAC;YACN,IAAI,CAAC,SAAS,GAAG,IAAI,gCAAc,CAAC,OAAO,CAAC,YAAY,IAAI,EAAE,CAAC,CAAC;YAChE,IAAI,CAAC,MAAM,GAAG,+BAAgB,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;YACpD,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC;QACzB,CAAC;QACD,IAAI,CAAC,SAAS,GAAG,OAAO,CAAC,SAAS,CAAC;QACnC,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC;IACjC,CAAC;IAED;;;;OAIG;IACH,OAAO;QACL,IAAI,IAAI,CAAC,UAAU,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;YACtC,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,CAAC;QAC3B,CAAC;IACH,CAAC;IAED;;;;;;;;OAQG;IACH,KAAK,CAAC,WAAW,CAAC,MAAc,EAAE,SAAiB;QACjD,OAAO,MAAM,IAAA,2BAAiB,EAAC;YAC7B,MAAM,EAAE,IAAI,CAAC,MAAM;YACnB,SAAS,EAAE,IAAI,CAAC,SAAS;YACzB,MAAM;YACN,SAAS;SACV,CAAC,CAAC;IACL,CAAC;IAED;;;;;;;;;OASG;IACH,KAAK,CAAC,UAAU,CACd,MAAc,EACd,SAAiB,EACjB,OAAoB,EACpB,KAAc;QAEd,MAAM,IAAA,0BAAgB,EAAC;YACrB,MAAM,EAAE,IAAI,CAAC,MAAM;YACnB,SAAS,EAAE,IAAI,CAAC,SAAS;YACzB,MAAM;YACN,SAAS;YACT,OAAO;YACP,KAAK;YACL,OAAO,EAAE,IAAI,CAAC,OAAO;SACtB,CAAC,CAAC;IACL,CAAC;IAED;;;;;;;;;;OAUG;IACH,KAAK,CAAC,WAAW,CACf,MAAc,EACd,SAAiB,EACjB,QAAuB,EACvB,KAAc;QAEd,MAAM,IAAA,2BAAiB,EAAC;YACtB,MAAM,EAAE,IAAI,CAAC,MAAM;YACnB,SAAS,EAAE,IAAI,CAAC,SAAS;YACzB,MAAM;YACN,SAAS;YACT,QAAQ;YACR,KAAK;YACL,OAAO,EAAE,IAAI,CAAC,OAAO;SACtB,CAAC,CAAC;IACL,CAAC;IAED;;;;;;;OAOG;IACH,KAAK,CAAC,KAAK,CAAC,MAAc,EAAE,SAAiB;QAC3C,MAAM,IAAA,qBAAW,EAAC;YAChB,MAAM,EAAE,IAAI,CAAC,MAAM;YACnB,SAAS,EAAE,IAAI,CAAC,SAAS;YACzB,MAAM;YACN,SAAS;SACV,CAAC,CAAC;IACL,CAAC;IAED;;;;;;;;OAQG;IACH,KAAK,CAAC,YAAY,CAAC,MAAc,EAAE,KAAc;QAC/C,OAAO,MAAM,IAAA,4BAAkB,EAAC;YAC9B,MAAM,EAAE,IAAI,CAAC,MAAM;YACnB,SAAS,EAAE,IAAI,CAAC,SAAS;YACzB,MAAM;YACN,KAAK;SACN,CAAC,CAAC;IACL,CAAC;CACF;AApJD,gEAoJC"}
|
|
@@ -1,9 +1,10 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Type definitions for chat message history
|
|
3
|
+
* Uses per-message storage pattern: each message is a separate DynamoDB item
|
|
3
4
|
*/
|
|
4
5
|
import { DynamoDBClientConfig } from '@aws-sdk/client-dynamodb';
|
|
5
6
|
import { DynamoDBDocument } from '@aws-sdk/lib-dynamodb';
|
|
6
|
-
import { BaseMessage } from '@langchain/core/messages';
|
|
7
|
+
import type { BaseMessage, StoredMessage } from '@langchain/core/messages';
|
|
7
8
|
/**
|
|
8
9
|
* Configuration options for DynamoDBChatMessageHistory
|
|
9
10
|
*/
|
|
@@ -14,17 +15,20 @@ export interface DynamoDBChatMessageHistoryOptions {
|
|
|
14
15
|
ttlDays?: number;
|
|
15
16
|
/** Optional DynamoDB client configuration */
|
|
16
17
|
clientConfig?: DynamoDBClientConfig;
|
|
18
|
+
/** Optional pre-built DynamoDBDocument client (takes precedence over clientConfig) */
|
|
19
|
+
client?: DynamoDBDocument;
|
|
17
20
|
}
|
|
18
21
|
/**
|
|
19
|
-
* DynamoDB item
|
|
22
|
+
* DynamoDB item for session metadata
|
|
23
|
+
* PK: userId, SK: sessionId
|
|
20
24
|
*/
|
|
21
|
-
export interface
|
|
25
|
+
export interface DynamoDBSessionMetadataItem {
|
|
22
26
|
/** User identifier (partition key) */
|
|
23
27
|
userId: string;
|
|
24
28
|
/** Session identifier (sort key) */
|
|
25
29
|
sessionId: string;
|
|
26
|
-
/**
|
|
27
|
-
|
|
30
|
+
/** Item type discriminator */
|
|
31
|
+
itemType: 'metadata';
|
|
28
32
|
/** Session title (auto-generated from the first message) */
|
|
29
33
|
title: string;
|
|
30
34
|
/** Timestamp when session was created (milliseconds) */
|
|
@@ -36,6 +40,24 @@ export interface DynamoDBSessionItem {
|
|
|
36
40
|
/** Optional TTL timestamp (Unix timestamp in seconds) */
|
|
37
41
|
ttl?: number;
|
|
38
42
|
}
|
|
43
|
+
/**
|
|
44
|
+
* DynamoDB item for an individual message
|
|
45
|
+
* PK: userId, SK: sessionId#msg#NNNNNN
|
|
46
|
+
*/
|
|
47
|
+
export interface DynamoDBMessageItem {
|
|
48
|
+
/** User identifier (partition key) */
|
|
49
|
+
userId: string;
|
|
50
|
+
/** Composite sort key: sessionId#msg#NNNNNN */
|
|
51
|
+
sessionId: string;
|
|
52
|
+
/** Item type discriminator */
|
|
53
|
+
itemType: 'message';
|
|
54
|
+
/** Zero-based message index */
|
|
55
|
+
messageIndex: number;
|
|
56
|
+
/** Serialized message in LangChain StoredMessage format */
|
|
57
|
+
message: StoredMessage;
|
|
58
|
+
/** Optional TTL timestamp (Unix timestamp in seconds) */
|
|
59
|
+
ttl?: number;
|
|
60
|
+
}
|
|
39
61
|
/**
|
|
40
62
|
* Session metadata for listing (excludes messages)
|
|
41
63
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/history/types/index.ts"],"names":[],"mappings":"AAAA
|
|
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.js","sourceRoot":"","sources":["../../../src/history/types/index.ts"],"names":[],"mappings":";AAAA
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/history/types/index.ts"],"names":[],"mappings":";AAAA;;;GAGG"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"title-generator.js","sourceRoot":"","sources":["../../../src/history/utils/title-generator.ts"],"names":[],"mappings":";AAAA;;GAEG;;AAaH,sCAuCC;AAhDD,MAAM,gBAAgB,GAAG,GAAG,CAAC;AAC7B,MAAM,aAAa,GAAG,kBAAkB,CAAC;AAEzC;;;;;GAKG;AACH,SAAgB,aAAa,CAAC,OAAoB;IAChD,IAAI,CAAC,OAAO,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC;QACjC,OAAO,aAAa,CAAC;IACvB,CAAC;IAED,yEAAyE;IACzE,IAAI,WAAW,GAAG,EAAE,CAAC;IACrB,IAAI,OAAO,OAAO,CAAC,OAAO,KAAK,QAAQ,EAAE,CAAC;QACxC,WAAW,GAAG,OAAO,CAAC,OAAO,CAAC;IAChC,CAAC;SAAM,IAAI,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;QAC1C,mDAAmD;QACnD,WAAW,GAAG,OAAO,CAAC,OAAO;aAC1B,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE;YACZ,IAAI,OAAO,IAAI,KAAK,QAAQ;gBAAE,OAAO,IAAI,CAAC;YAC1C,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,IAAI,KAAK,IAAI,IAAI,MAAM,IAAI,IAAI,EAAE,CAAC;gBAChE,OAAQ,
|
|
1
|
+
{"version":3,"file":"title-generator.js","sourceRoot":"","sources":["../../../src/history/utils/title-generator.ts"],"names":[],"mappings":";AAAA;;GAEG;;AAaH,sCAuCC;AAhDD,MAAM,gBAAgB,GAAG,GAAG,CAAC;AAC7B,MAAM,aAAa,GAAG,kBAAkB,CAAC;AAEzC;;;;;GAKG;AACH,SAAgB,aAAa,CAAC,OAAoB;IAChD,IAAI,CAAC,OAAO,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC;QACjC,OAAO,aAAa,CAAC;IACvB,CAAC;IAED,yEAAyE;IACzE,IAAI,WAAW,GAAG,EAAE,CAAC;IACrB,IAAI,OAAO,OAAO,CAAC,OAAO,KAAK,QAAQ,EAAE,CAAC;QACxC,WAAW,GAAG,OAAO,CAAC,OAAO,CAAC;IAChC,CAAC;SAAM,IAAI,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;QAC1C,mDAAmD;QACnD,WAAW,GAAG,OAAO,CAAC,OAAO;aAC1B,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE;YACZ,IAAI,OAAO,IAAI,KAAK,QAAQ;gBAAE,OAAO,IAAI,CAAC;YAC1C,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,IAAI,KAAK,IAAI,IAAI,MAAM,IAAI,IAAI,EAAE,CAAC;gBAChE,OAAQ,IAAyB,CAAC,IAAI,CAAC;YACzC,CAAC;YACD,OAAO,EAAE,CAAC;QACZ,CAAC,CAAC;aACD,IAAI,CAAC,GAAG,CAAC,CAAC;IACf,CAAC;IAED,+BAA+B;IAC/B,MAAM,OAAO,GAAG,WAAW;SACxB,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,kDAAkD;SACvE,OAAO,CAAC,UAAU,EAAE,GAAG,CAAC,CAAC,8BAA8B;SACvD,IAAI,EAAE,CAAC;IAEV,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,OAAO,aAAa,CAAC;IACvB,CAAC;IAED,yBAAyB;IACzB,IAAI,OAAO,CAAC,MAAM,IAAI,gBAAgB,EAAE,CAAC;QACvC,OAAO,OAAO,CAAC;IACjB,CAAC;IAED,4BAA4B;IAC5B,OAAO,OAAO,CAAC,SAAS,CAAC,CAAC,EAAE,gBAAgB,GAAG,CAAC,CAAC,GAAG,KAAK,CAAC;AAC5D,CAAC"}
|
|
@@ -1,34 +1,58 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
3
|
-
*
|
|
2
|
+
* Item builder utilities for per-message chat history storage
|
|
3
|
+
* Builds DynamoDB items for metadata and individual messages
|
|
4
4
|
*/
|
|
5
5
|
import type { BaseMessage } from '@langchain/core/messages';
|
|
6
|
+
import type { DynamoDBMessageItem } from '../types';
|
|
6
7
|
/**
|
|
7
|
-
*
|
|
8
|
+
* Format a message index as a zero-padded 6-digit string
|
|
9
|
+
* Supports up to 999,999 messages per session while maintaining sort order
|
|
8
10
|
*/
|
|
9
|
-
export
|
|
10
|
-
/** Single message or array of messages to add */
|
|
11
|
-
messages: BaseMessage | BaseMessage[];
|
|
12
|
-
/** Optional session title */
|
|
13
|
-
title?: string;
|
|
14
|
-
/** Optional TTL in days */
|
|
15
|
-
ttlDays?: number;
|
|
16
|
-
}
|
|
11
|
+
export declare function formatMessageIndex(index: number): string;
|
|
17
12
|
/**
|
|
18
|
-
*
|
|
13
|
+
* Build the sort key for a message item
|
|
14
|
+
*
|
|
15
|
+
* @param sessionId - Session identifier
|
|
16
|
+
* @param messageIndex - Zero-based message index
|
|
17
|
+
* @returns Composite SK like "sessionId#msg#000001"
|
|
19
18
|
*/
|
|
20
|
-
export
|
|
21
|
-
|
|
19
|
+
export declare function buildMessageSK(sessionId: string, messageIndex: number): string;
|
|
20
|
+
/**
|
|
21
|
+
* Build DynamoDB message items from BaseMessage array
|
|
22
|
+
*
|
|
23
|
+
* @param userId - User identifier
|
|
24
|
+
* @param sessionId - Session identifier
|
|
25
|
+
* @param messages - Messages to serialize
|
|
26
|
+
* @param startIndex - Starting message index (for appending to existing session)
|
|
27
|
+
* @param ttlDays - Optional TTL in days
|
|
28
|
+
* @returns Array of DynamoDB message items
|
|
29
|
+
*/
|
|
30
|
+
export declare function buildMessageItems(userId: string, sessionId: string, messages: BaseMessage[], startIndex: number, ttlDays?: number): DynamoDBMessageItem[];
|
|
31
|
+
/**
|
|
32
|
+
* Build or update a session metadata item
|
|
33
|
+
*
|
|
34
|
+
* @param userId - User identifier
|
|
35
|
+
* @param sessionId - Session identifier
|
|
36
|
+
* @param title - Session title
|
|
37
|
+
* @param messageCount - New total message count
|
|
38
|
+
* @param ttlDays - Optional TTL in days
|
|
39
|
+
* @param isNew - Whether this is a new session (sets createdAt)
|
|
40
|
+
*/
|
|
41
|
+
export declare function buildMetadataUpdateExpression(title: string, messageCount: number, ttlDays?: number): {
|
|
22
42
|
updateExpression: string;
|
|
23
|
-
/** Expression attribute values */
|
|
24
43
|
expressionAttributeValues: Record<string, any>;
|
|
25
|
-
}
|
|
44
|
+
};
|
|
26
45
|
/**
|
|
27
|
-
* Build
|
|
28
|
-
*
|
|
46
|
+
* Build an atomic metadata update expression using DynamoDB's ADD operation
|
|
47
|
+
* Atomically increments messageCount by incrementBy, preventing race conditions
|
|
29
48
|
*
|
|
30
|
-
* @param
|
|
31
|
-
* @
|
|
49
|
+
* @param title - Session title (only set if not already present via if_not_exists)
|
|
50
|
+
* @param incrementBy - Number to add to messageCount
|
|
51
|
+
* @param ttlDays - Optional TTL in days
|
|
52
|
+
* @returns UpdateExpression and ExpressionAttributeValues for DynamoDB update
|
|
32
53
|
*/
|
|
33
|
-
export declare function
|
|
54
|
+
export declare function buildAtomicMetadataUpdate(title: string, incrementBy: number, ttlDays?: number): {
|
|
55
|
+
updateExpression: string;
|
|
56
|
+
expressionAttributeValues: Record<string, any>;
|
|
57
|
+
};
|
|
34
58
|
//# 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
|
|
1
|
+
{"version":3,"file":"update-expression-builder.d.ts","sourceRoot":"","sources":["../../../src/history/utils/update-expression-builder.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AAI5D,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,UAAU,CAAC;AAEpD;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAExD;AAED;;;;;;GAMG;AACH,wBAAgB,cAAc,CAAC,SAAS,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,GAAG,MAAM,CAE9E;AAED;;;;;;;;;GASG;AACH,wBAAgB,iBAAiB,CAC/B,MAAM,EAAE,MAAM,EACd,SAAS,EAAE,MAAM,EACjB,QAAQ,EAAE,WAAW,EAAE,EACvB,UAAU,EAAE,MAAM,EAClB,OAAO,CAAC,EAAE,MAAM,GACf,mBAAmB,EAAE,CAkBvB;AAED;;;;;;;;;GASG;AACH,wBAAgB,6BAA6B,CAC3C,KAAK,EAAE,MAAM,EACb,YAAY,EAAE,MAAM,EACpB,OAAO,CAAC,EAAE,MAAM,GACf;IACD,gBAAgB,EAAE,MAAM,CAAC;IACzB,yBAAyB,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;CAChD,CA0BA;AAED;;;;;;;;GAQG;AACH,wBAAgB,yBAAyB,CACvC,KAAK,EAAE,MAAM,EACb,WAAW,EAAE,MAAM,EACnB,OAAO,CAAC,EAAE,MAAM,GACf;IACD,gBAAgB,EAAE,MAAM,CAAC;IACzB,yBAAyB,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;CAChD,CAyBA"}
|