@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.
Files changed (134) hide show
  1. package/README.md +353 -242
  2. package/dist/checkpointer/actions/delete-thread.d.ts +3 -3
  3. package/dist/checkpointer/actions/delete-thread.d.ts.map +1 -1
  4. package/dist/checkpointer/actions/delete-thread.js +95 -52
  5. package/dist/checkpointer/actions/delete-thread.js.map +1 -1
  6. package/dist/checkpointer/actions/get-tuple.d.ts +8 -1
  7. package/dist/checkpointer/actions/get-tuple.d.ts.map +1 -1
  8. package/dist/checkpointer/actions/get-tuple.js +72 -20
  9. package/dist/checkpointer/actions/get-tuple.js.map +1 -1
  10. package/dist/checkpointer/actions/put-writes.d.ts.map +1 -1
  11. package/dist/checkpointer/actions/put-writes.js +27 -22
  12. package/dist/checkpointer/actions/put-writes.js.map +1 -1
  13. package/dist/checkpointer/actions/put.d.ts +6 -2
  14. package/dist/checkpointer/actions/put.d.ts.map +1 -1
  15. package/dist/checkpointer/actions/put.js +80 -19
  16. package/dist/checkpointer/actions/put.js.map +1 -1
  17. package/dist/checkpointer/index.d.ts +43 -2
  18. package/dist/checkpointer/index.d.ts.map +1 -1
  19. package/dist/checkpointer/index.js +226 -11
  20. package/dist/checkpointer/index.js.map +1 -1
  21. package/dist/checkpointer/types/index.d.ts +66 -4
  22. package/dist/checkpointer/types/index.d.ts.map +1 -1
  23. package/dist/checkpointer/types/index.js +10 -0
  24. package/dist/checkpointer/types/index.js.map +1 -1
  25. package/dist/checkpointer/utils/deserialization.d.ts +8 -3
  26. package/dist/checkpointer/utils/deserialization.d.ts.map +1 -1
  27. package/dist/checkpointer/utils/deserialization.js +23 -5
  28. package/dist/checkpointer/utils/deserialization.js.map +1 -1
  29. package/dist/checkpointer/utils/validation.d.ts +1 -1
  30. package/dist/checkpointer/utils/validation.js +1 -1
  31. package/dist/checkpointer/utils/validation.js.map +1 -1
  32. package/dist/factory.d.ts +8 -6
  33. package/dist/factory.d.ts.map +1 -1
  34. package/dist/factory.js +16 -4
  35. package/dist/factory.js.map +1 -1
  36. package/dist/history/actions/add-message.d.ts +2 -1
  37. package/dist/history/actions/add-message.d.ts.map +1 -1
  38. package/dist/history/actions/add-message.js +22 -18
  39. package/dist/history/actions/add-message.js.map +1 -1
  40. package/dist/history/actions/add-messages.d.ts +3 -2
  41. package/dist/history/actions/add-messages.d.ts.map +1 -1
  42. package/dist/history/actions/add-messages.js +30 -20
  43. package/dist/history/actions/add-messages.js.map +1 -1
  44. package/dist/history/actions/clear.d.ts +4 -3
  45. package/dist/history/actions/clear.d.ts.map +1 -1
  46. package/dist/history/actions/clear.js +47 -12
  47. package/dist/history/actions/clear.js.map +1 -1
  48. package/dist/history/actions/get-messages.d.ts +2 -1
  49. package/dist/history/actions/get-messages.d.ts.map +1 -1
  50. package/dist/history/actions/get-messages.js +41 -15
  51. package/dist/history/actions/get-messages.js.map +1 -1
  52. package/dist/history/actions/list-sessions.d.ts +11 -0
  53. package/dist/history/actions/list-sessions.d.ts.map +1 -1
  54. package/dist/history/actions/list-sessions.js +23 -3
  55. package/dist/history/actions/list-sessions.js.map +1 -1
  56. package/dist/history/index.d.ts +8 -0
  57. package/dist/history/index.d.ts.map +1 -1
  58. package/dist/history/index.js +22 -2
  59. package/dist/history/index.js.map +1 -1
  60. package/dist/history/types/index.d.ts +27 -5
  61. package/dist/history/types/index.d.ts.map +1 -1
  62. package/dist/history/types/index.js +1 -0
  63. package/dist/history/types/index.js.map +1 -1
  64. package/dist/history/utils/title-generator.js.map +1 -1
  65. package/dist/history/utils/update-expression-builder.d.ts +45 -21
  66. package/dist/history/utils/update-expression-builder.d.ts.map +1 -1
  67. package/dist/history/utils/update-expression-builder.js +105 -38
  68. package/dist/history/utils/update-expression-builder.js.map +1 -1
  69. package/dist/history/utils/validation.d.ts +8 -0
  70. package/dist/history/utils/validation.d.ts.map +1 -1
  71. package/dist/history/utils/validation.js +22 -0
  72. package/dist/history/utils/validation.js.map +1 -1
  73. package/dist/index.d.ts +2 -0
  74. package/dist/index.d.ts.map +1 -1
  75. package/dist/index.js +5 -1
  76. package/dist/index.js.map +1 -1
  77. package/dist/shared/utils/batch-write.d.ts +36 -0
  78. package/dist/shared/utils/batch-write.d.ts.map +1 -0
  79. package/dist/shared/utils/batch-write.js +62 -0
  80. package/dist/shared/utils/batch-write.js.map +1 -0
  81. package/dist/shared/utils/compressor.d.ts +48 -0
  82. package/dist/shared/utils/compressor.d.ts.map +1 -0
  83. package/dist/shared/utils/compressor.js +68 -0
  84. package/dist/shared/utils/compressor.js.map +1 -0
  85. package/dist/shared/utils/constants.d.ts +2 -0
  86. package/dist/shared/utils/constants.d.ts.map +1 -1
  87. package/dist/shared/utils/constants.js +3 -7
  88. package/dist/shared/utils/constants.js.map +1 -1
  89. package/dist/shared/utils/index.d.ts +4 -0
  90. package/dist/shared/utils/index.d.ts.map +1 -1
  91. package/dist/shared/utils/index.js +4 -0
  92. package/dist/shared/utils/index.js.map +1 -1
  93. package/dist/shared/utils/logger.d.ts +48 -0
  94. package/dist/shared/utils/logger.d.ts.map +1 -0
  95. package/dist/shared/utils/logger.js +62 -0
  96. package/dist/shared/utils/logger.js.map +1 -0
  97. package/dist/shared/utils/retry.d.ts +1 -1
  98. package/dist/shared/utils/retry.d.ts.map +1 -1
  99. package/dist/shared/utils/retry.js +13 -6
  100. package/dist/shared/utils/retry.js.map +1 -1
  101. package/dist/shared/utils/s3-offloader.d.ts +146 -0
  102. package/dist/shared/utils/s3-offloader.d.ts.map +1 -0
  103. package/dist/shared/utils/s3-offloader.js +271 -0
  104. package/dist/shared/utils/s3-offloader.js.map +1 -0
  105. package/dist/shared/utils/ttl.d.ts +8 -1
  106. package/dist/shared/utils/ttl.d.ts.map +1 -1
  107. package/dist/shared/utils/ttl.js +12 -8
  108. package/dist/shared/utils/ttl.js.map +1 -1
  109. package/dist/store/actions/get-operation.js +2 -2
  110. package/dist/store/actions/get-operation.js.map +1 -1
  111. package/dist/store/actions/put-operation.d.ts.map +1 -1
  112. package/dist/store/actions/put-operation.js +2 -1
  113. package/dist/store/actions/put-operation.js.map +1 -1
  114. package/dist/store/actions/search-operation.d.ts +6 -0
  115. package/dist/store/actions/search-operation.d.ts.map +1 -1
  116. package/dist/store/actions/search-operation.js +41 -21
  117. package/dist/store/actions/search-operation.js.map +1 -1
  118. package/dist/store/index.d.ts +10 -2
  119. package/dist/store/index.d.ts.map +1 -1
  120. package/dist/store/index.js +28 -5
  121. package/dist/store/index.js.map +1 -1
  122. package/dist/store/types/index.d.ts +7 -5
  123. package/dist/store/types/index.d.ts.map +1 -1
  124. package/dist/store/utils/index.d.ts +0 -1
  125. package/dist/store/utils/index.d.ts.map +1 -1
  126. package/dist/store/utils/index.js +0 -1
  127. package/dist/store/utils/index.js.map +1 -1
  128. package/dist/store/utils/validation.js +1 -1
  129. package/dist/store/utils/validation.js.map +1 -1
  130. package/package.json +41 -24
  131. package/dist/store/utils/result.d.ts +0 -42
  132. package/dist/store/utils/result.d.ts.map +0 -1
  133. package/dist/store/utils/result.js +0 -51
  134. 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;;GAEG;;;AAGH,oCASkB;AAElB;;;;;;;GAOG;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,kBAAkB;IAClB,IAAA,sBAAc,EAAC,MAAM,CAAC,CAAC;IACvB,IAAA,yBAAiB,EAAC,SAAS,CAAC,CAAC;IAC7B,IAAA,wBAAgB,EAAC,QAAQ,CAAC,CAAC;IAC3B,IAAA,qBAAa,EAAC,KAAK,CAAC,CAAC;IACrB,IAAA,uBAAe,EAAC,OAAO,CAAC,CAAC;IAEzB,4EAA4E;IAC5E,IAAI,YAAY,GAAG,KAAK,CAAC;IACzB,IAAI,CAAC,YAAY,EAAE,CAAC;QAClB,YAAY,GAAG,IAAA,qBAAa,EAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC;IAC5C,CAAC;IACD,wCAAwC;IACxC,MAAM,EAAE,gBAAgB,EAAE,yBAAyB,EAAE,GAAG,IAAA,oCAA4B,EAAC;QACnF,QAAQ;QACR,KAAK,EAAE,YAAY;QACnB,OAAO;KACR,CAAC,CAAC;IAEH,2BAA2B;IAC3B,MAAM,IAAA,yBAAiB,EAAC,KAAK,IAAI,EAAE;QACjC,MAAM,MAAM,CAAC,MAAM,CAAC;YAClB,SAAS,EAAE,SAAS;YACpB,GAAG,EAAE;gBACH,MAAM;gBACN,SAAS;aACV;YACD,gBAAgB,EAAE,gBAAgB;YAClC,yBAAyB,EAAE,yBAAyB;SACrD,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC,CAAC;AAlCW,QAAA,iBAAiB,qBAkC5B"}
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 in a session
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 the session item
7
- * No error is thrown if the session doesn't exist
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;;GAEG;AAEH,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,UAAU,CAAC;AAGlD;;;;;;GAMG;AACH,eAAO,MAAM,WAAW,GAAU,QAAQ,iBAAiB,KAAG,OAAO,CAAC,IAAI,CAiBzE,CAAC"}
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 in a session
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 the session item
10
- * No error is thrown if the session doesn't exist
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
- // Execute delete with retry logic
21
- await (0, utils_1.withDynamoDBRetry)(async () => {
22
- await client.delete({
23
- TableName: tableName,
24
- Key: {
25
- userId,
26
- sessionId,
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;;GAEG;;;AAGH,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,kCAAkC;IAClC,MAAM,IAAA,yBAAiB,EAAC,KAAK,IAAI,EAAE;QACjC,MAAM,MAAM,CAAC,MAAM,CAAC;YAClB,SAAS,EAAE,SAAS;YACpB,GAAG,EAAE;gBACH,MAAM;gBACN,SAAS;aACV;SACF,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC,CAAC;AAjBW,QAAA,WAAW,eAiBtB"}
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
- * Messages are returned in chronological order
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;;GAEG;AAEH,OAAO,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AAEvD,OAAO,KAAK,EAAE,uBAAuB,EAAuB,MAAM,UAAU,CAAC;AAG7E;;;;;;;GAOG;AACH,eAAO,MAAM,iBAAiB,GAC5B,QAAQ,uBAAuB,KAC9B,OAAO,CAAC,WAAW,EAAE,CA2BvB,CAAC"}
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
- * Messages are returned in chronological order
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
- // Execute with retry logic
22
- const result = await (0, utils_1.withDynamoDBRetry)(async () => {
23
- return await client.get({
24
- TableName: tableName,
25
- Key: {
26
- userId,
27
- sessionId,
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
- // Return empty array if session doesn't exist
32
- if (!result.Item) {
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
- const item = result.Item;
36
- // Return messages array (already in chronological order)
37
- return item.messages || [];
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;;GAEG;;;AAKH,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,2BAA2B;IAC3B,MAAM,MAAM,GAAG,MAAM,IAAA,yBAAiB,EAAC,KAAK,IAAI,EAAE;QAChD,OAAO,MAAM,MAAM,CAAC,GAAG,CAAC;YACtB,SAAS,EAAE,SAAS;YACpB,GAAG,EAAE;gBACH,MAAM;gBACN,SAAS;aACV;SACF,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,8CAA8C;IAC9C,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;QACjB,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,MAAM,IAAI,GAAG,MAAM,CAAC,IAA2B,CAAC;IAEhD,yDAAyD;IACzD,OAAO,IAAI,CAAC,QAAQ,IAAI,EAAE,CAAC;AAC7B,CAAC,CAAC;AA7BW,QAAA,iBAAiB,qBA6B5B"}
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;AAEH,OAAO,KAAK,EAAE,wBAAwB,EAAE,eAAe,EAAE,MAAM,UAAU,CAAC;AAG1E;;;;;;;GAOG;AACH,eAAO,MAAM,kBAAkB,GAC7B,QAAQ,wBAAwB,KAC/B,OAAO,CAAC,eAAe,EAAE,CA8C3B,CAAC"}
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
- return sessions;
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;;;AAGH,oCAA4E;AAE5E;;;;;;;GAOG;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,+BAA+B;IAC/B,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,yBAAyB,EAAE;oBACzB,SAAS,EAAE,MAAM;iBAClB;gBACD,oBAAoB,EAAE,sDAAsD;gBAC5E,KAAK,EAAE,KAAK;gBACZ,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;QACjC,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,OAAO,QAAQ,CAAC;AAClB,CAAC,CAAC;AAhDW,QAAA,kBAAkB,sBAgD7B"}
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"}
@@ -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;AAEvD,OAAO,KAAK,EAAE,iCAAiC,EAAE,eAAe,EAAE,MAAM,SAAS,CAAC;AASlF,qBAAa,0BAA0B;IACrC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAiB;IAC3C,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAmB;IAC1C,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAS;IACnC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAS;IAElC;;;;;;;OAOG;gBACS,OAAO,EAAE,iCAAiC;IAOtD;;;;;;;;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"}
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"}
@@ -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
- this.ddbClient = new client_dynamodb_1.DynamoDBClient(options.clientConfig || {});
26
- this.client = lib_dynamodb_1.DynamoDBDocument.from(this.ddbClient);
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;AAIzD,uCAMmB;AAEnB,MAAa,0BAA0B;IACpB,SAAS,CAAiB;IAC1B,MAAM,CAAmB;IACzB,SAAS,CAAS;IAClB,OAAO,CAAU;IAElC;;;;;;;OAOG;IACH,YAAY,OAA0C;QACpD,IAAI,CAAC,SAAS,GAAG,IAAI,gCAAc,CAAC,OAAO,CAAC,YAAY,IAAI,EAAE,CAAC,CAAC;QAChE,IAAI,CAAC,MAAM,GAAG,+BAAgB,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QACpD,IAAI,CAAC,SAAS,GAAG,OAAO,CAAC,SAAS,CAAC;QACnC,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC;IACjC,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;AAhID,gEAgIC"}
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 structure for a chat session
22
+ * DynamoDB item for session metadata
23
+ * PK: userId, SK: sessionId
20
24
  */
21
- export interface DynamoDBSessionItem {
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
- /** Array of messages in chronological order */
27
- messages: BaseMessage[];
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":"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"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/history/types/index.ts"],"names":[],"mappings":"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"}
@@ -1,6 +1,7 @@
1
1
  "use strict";
2
2
  /**
3
3
  * Type definitions for chat message history
4
+ * Uses per-message storage pattern: each message is a separate DynamoDB item
4
5
  */
5
6
  Object.defineProperty(exports, "__esModule", { value: true });
6
7
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/history/types/index.ts"],"names":[],"mappings":";AAAA;;GAEG"}
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,IAAY,CAAC,IAAI,CAAC;YAC5B,CAAC;YACD,OAAO,EAAE,CAAC;QACZ,CAAC,CAAC;aACD,IAAI,CAAC,GAAG,CAAC,CAAC;IACf,CAAC;IAED,+BAA+B;IAC/B,MAAM,OAAO,GAAG,WAAW;SACxB,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,kDAAkD;SACvE,OAAO,CAAC,UAAU,EAAE,GAAG,CAAC,CAAC,8BAA8B;SACvD,IAAI,EAAE,CAAC;IAEV,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,OAAO,aAAa,CAAC;IACvB,CAAC;IAED,yBAAyB;IACzB,IAAI,OAAO,CAAC,MAAM,IAAI,gBAAgB,EAAE,CAAC;QACvC,OAAO,OAAO,CAAC;IACjB,CAAC;IAED,4BAA4B;IAC5B,OAAO,OAAO,CAAC,SAAS,CAAC,CAAC,EAAE,gBAAgB,GAAG,CAAC,CAAC,GAAG,KAAK,CAAC;AAC5D,CAAC"}
1
+ {"version":3,"file":"title-generator.js","sourceRoot":"","sources":["../../../src/history/utils/title-generator.ts"],"names":[],"mappings":";AAAA;;GAEG;;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
- * Update expression builder for chat message history
3
- * Provides centralized logic for building DynamoDB update expressions
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
- * Parameters for building message update expression
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 interface BuildMessageUpdateExpressionParams {
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
- * Result of building update expression
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 interface UpdateExpressionResult {
21
- /** DynamoDB UpdateExpression string */
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 DynamoDB update expression for adding messages to a session
28
- * Handles both single messages and message arrays
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 params - Parameters for building the expression
31
- * @returns Update expression and attribute values
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 buildMessageUpdateExpression(params: BuildMessageUpdateExpressionParams): UpdateExpressionResult;
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;;GAEG;AACH,MAAM,WAAW,kCAAkC;IACjD,iDAAiD;IACjD,QAAQ,EAAE,WAAW,GAAG,WAAW,EAAE,CAAC;IACtC,6BAA6B;IAC7B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,2BAA2B;IAC3B,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED;;GAEG;AACH,MAAM,WAAW,sBAAsB;IACrC,uCAAuC;IACvC,gBAAgB,EAAE,MAAM,CAAC;IACzB,kCAAkC;IAClC,yBAAyB,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;CAChD;AAED;;;;;;GAMG;AACH,wBAAgB,4BAA4B,CAC1C,MAAM,EAAE,kCAAkC,GACzC,sBAAsB,CAqDxB"}
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"}