@farukada/aws-langgraph-dynamodb-ts 0.1.1 → 0.2.2

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