@strands-agents/sdk 1.0.0 → 1.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (284) hide show
  1. package/README.md +6 -0
  2. package/dist/src/__fixtures__/agent-helpers.d.ts +16 -1
  3. package/dist/src/__fixtures__/agent-helpers.d.ts.map +1 -1
  4. package/dist/src/__fixtures__/agent-helpers.js +42 -0
  5. package/dist/src/__fixtures__/agent-helpers.js.map +1 -1
  6. package/dist/src/__fixtures__/tool-helpers.d.ts +2 -1
  7. package/dist/src/__fixtures__/tool-helpers.d.ts.map +1 -1
  8. package/dist/src/__fixtures__/tool-helpers.js +20 -3
  9. package/dist/src/__fixtures__/tool-helpers.js.map +1 -1
  10. package/dist/src/__tests__/interrupt.test.d.ts +2 -0
  11. package/dist/src/__tests__/interrupt.test.d.ts.map +1 -0
  12. package/dist/src/__tests__/interrupt.test.js +264 -0
  13. package/dist/src/__tests__/interrupt.test.js.map +1 -0
  14. package/dist/src/__tests__/mcp.test.js +447 -7
  15. package/dist/src/__tests__/mcp.test.js.map +1 -1
  16. package/dist/src/agent/__tests__/agent.hook.test.js +551 -1
  17. package/dist/src/agent/__tests__/agent.hook.test.js.map +1 -1
  18. package/dist/src/agent/__tests__/agent.interrupt.test.d.ts +2 -0
  19. package/dist/src/agent/__tests__/agent.interrupt.test.d.ts.map +1 -0
  20. package/dist/src/agent/__tests__/agent.interrupt.test.js +779 -0
  21. package/dist/src/agent/__tests__/agent.interrupt.test.js.map +1 -0
  22. package/dist/src/agent/__tests__/agent.model-retry.test.d.ts +2 -0
  23. package/dist/src/agent/__tests__/agent.model-retry.test.d.ts.map +1 -0
  24. package/dist/src/agent/__tests__/agent.model-retry.test.js +161 -0
  25. package/dist/src/agent/__tests__/agent.model-retry.test.js.map +1 -0
  26. package/dist/src/agent/__tests__/agent.test.js +174 -0
  27. package/dist/src/agent/__tests__/agent.test.js.map +1 -1
  28. package/dist/src/agent/__tests__/snapshot.test.js +148 -4
  29. package/dist/src/agent/__tests__/snapshot.test.js.map +1 -1
  30. package/dist/src/agent/agent-as-tool.d.ts.map +1 -1
  31. package/dist/src/agent/agent-as-tool.js +2 -3
  32. package/dist/src/agent/agent-as-tool.js.map +1 -1
  33. package/dist/src/agent/agent.d.ts +94 -4
  34. package/dist/src/agent/agent.d.ts.map +1 -1
  35. package/dist/src/agent/agent.js +625 -223
  36. package/dist/src/agent/agent.js.map +1 -1
  37. package/dist/src/agent/snapshot.d.ts +11 -19
  38. package/dist/src/agent/snapshot.d.ts.map +1 -1
  39. package/dist/src/agent/snapshot.js +23 -19
  40. package/dist/src/agent/snapshot.js.map +1 -1
  41. package/dist/src/conversation-manager/__tests__/conversation-manager.test.js +230 -9
  42. package/dist/src/conversation-manager/__tests__/conversation-manager.test.js.map +1 -1
  43. package/dist/src/conversation-manager/__tests__/null-conversation-manager.test.js +19 -6
  44. package/dist/src/conversation-manager/__tests__/null-conversation-manager.test.js.map +1 -1
  45. package/dist/src/conversation-manager/__tests__/sliding-window-conversation-manager.test.js +422 -41
  46. package/dist/src/conversation-manager/__tests__/sliding-window-conversation-manager.test.js.map +1 -1
  47. package/dist/src/conversation-manager/__tests__/summarizing-conversation-manager.test.js +75 -1
  48. package/dist/src/conversation-manager/__tests__/summarizing-conversation-manager.test.js.map +1 -1
  49. package/dist/src/conversation-manager/conversation-manager.d.ts +67 -22
  50. package/dist/src/conversation-manager/conversation-manager.d.ts.map +1 -1
  51. package/dist/src/conversation-manager/conversation-manager.js +65 -13
  52. package/dist/src/conversation-manager/conversation-manager.js.map +1 -1
  53. package/dist/src/conversation-manager/index.d.ts +1 -1
  54. package/dist/src/conversation-manager/index.d.ts.map +1 -1
  55. package/dist/src/conversation-manager/index.js +1 -1
  56. package/dist/src/conversation-manager/index.js.map +1 -1
  57. package/dist/src/conversation-manager/sliding-window-conversation-manager.d.ts +43 -10
  58. package/dist/src/conversation-manager/sliding-window-conversation-manager.d.ts.map +1 -1
  59. package/dist/src/conversation-manager/sliding-window-conversation-manager.js +202 -45
  60. package/dist/src/conversation-manager/sliding-window-conversation-manager.js.map +1 -1
  61. package/dist/src/conversation-manager/summarizing-conversation-manager.d.ts +23 -1
  62. package/dist/src/conversation-manager/summarizing-conversation-manager.d.ts.map +1 -1
  63. package/dist/src/conversation-manager/summarizing-conversation-manager.js +39 -17
  64. package/dist/src/conversation-manager/summarizing-conversation-manager.js.map +1 -1
  65. package/dist/src/hooks/__tests__/events.test.js +99 -12
  66. package/dist/src/hooks/__tests__/events.test.js.map +1 -1
  67. package/dist/src/hooks/__tests__/registry.test.js +166 -2
  68. package/dist/src/hooks/__tests__/registry.test.js.map +1 -1
  69. package/dist/src/hooks/events.d.ts +125 -32
  70. package/dist/src/hooks/events.d.ts.map +1 -1
  71. package/dist/src/hooks/events.js +111 -8
  72. package/dist/src/hooks/events.js.map +1 -1
  73. package/dist/src/hooks/index.d.ts +4 -3
  74. package/dist/src/hooks/index.d.ts.map +1 -1
  75. package/dist/src/hooks/index.js +2 -1
  76. package/dist/src/hooks/index.js.map +1 -1
  77. package/dist/src/hooks/registry.d.ts +12 -12
  78. package/dist/src/hooks/registry.d.ts.map +1 -1
  79. package/dist/src/hooks/registry.js +55 -15
  80. package/dist/src/hooks/registry.js.map +1 -1
  81. package/dist/src/hooks/types.d.ts +23 -0
  82. package/dist/src/hooks/types.d.ts.map +1 -1
  83. package/dist/src/hooks/types.js +17 -1
  84. package/dist/src/hooks/types.js.map +1 -1
  85. package/dist/src/index.d.ts +12 -6
  86. package/dist/src/index.d.ts.map +1 -1
  87. package/dist/src/index.js +7 -2
  88. package/dist/src/index.js.map +1 -1
  89. package/dist/src/interrupt.d.ts +247 -0
  90. package/dist/src/interrupt.d.ts.map +1 -0
  91. package/dist/src/interrupt.js +316 -0
  92. package/dist/src/interrupt.js.map +1 -0
  93. package/dist/src/mcp.d.ts +61 -4
  94. package/dist/src/mcp.d.ts.map +1 -1
  95. package/dist/src/mcp.js +161 -25
  96. package/dist/src/mcp.js.map +1 -1
  97. package/dist/src/models/__tests__/anthropic.test.js +78 -8
  98. package/dist/src/models/__tests__/anthropic.test.js.map +1 -1
  99. package/dist/src/models/__tests__/bedrock.test.js +156 -18
  100. package/dist/src/models/__tests__/bedrock.test.js.map +1 -1
  101. package/dist/src/models/__tests__/defaults.test.d.ts +2 -0
  102. package/dist/src/models/__tests__/defaults.test.d.ts.map +1 -0
  103. package/dist/src/models/__tests__/defaults.test.js +36 -0
  104. package/dist/src/models/__tests__/defaults.test.js.map +1 -0
  105. package/dist/src/models/__tests__/google.test.js +72 -6
  106. package/dist/src/models/__tests__/google.test.js.map +1 -1
  107. package/dist/src/models/anthropic.d.ts +10 -0
  108. package/dist/src/models/anthropic.d.ts.map +1 -1
  109. package/dist/src/models/anthropic.js +14 -4
  110. package/dist/src/models/anthropic.js.map +1 -1
  111. package/dist/src/models/bedrock.d.ts +17 -3
  112. package/dist/src/models/bedrock.d.ts.map +1 -1
  113. package/dist/src/models/bedrock.js +80 -13
  114. package/dist/src/models/bedrock.js.map +1 -1
  115. package/dist/src/models/defaults.d.ts +10 -0
  116. package/dist/src/models/defaults.d.ts.map +1 -1
  117. package/dist/src/models/defaults.js +129 -0
  118. package/dist/src/models/defaults.js.map +1 -1
  119. package/dist/src/models/google/model.d.ts.map +1 -1
  120. package/dist/src/models/google/model.js +4 -2
  121. package/dist/src/models/google/model.js.map +1 -1
  122. package/dist/src/models/google/types.d.ts +10 -0
  123. package/dist/src/models/google/types.d.ts.map +1 -1
  124. package/dist/src/models/model.d.ts +15 -0
  125. package/dist/src/models/model.d.ts.map +1 -1
  126. package/dist/src/models/model.js +18 -0
  127. package/dist/src/models/model.js.map +1 -1
  128. package/dist/src/models/openai/__tests__/chat.test.js +55 -2
  129. package/dist/src/models/openai/__tests__/chat.test.js.map +1 -1
  130. package/dist/src/models/openai/__tests__/responses.test.js +19 -0
  131. package/dist/src/models/openai/__tests__/responses.test.js.map +1 -1
  132. package/dist/src/models/openai/errors.d.ts.map +1 -1
  133. package/dist/src/models/openai/errors.js +7 -4
  134. package/dist/src/models/openai/errors.js.map +1 -1
  135. package/dist/src/models/openai/model.d.ts.map +1 -1
  136. package/dist/src/models/openai/model.js +2 -2
  137. package/dist/src/models/openai/model.js.map +1 -1
  138. package/dist/src/multiagent/__tests__/graph.test.js +69 -0
  139. package/dist/src/multiagent/__tests__/graph.test.js.map +1 -1
  140. package/dist/src/multiagent/__tests__/graph.tracer.test.js +14 -0
  141. package/dist/src/multiagent/__tests__/graph.tracer.test.js.map +1 -1
  142. package/dist/src/multiagent/__tests__/interrupts.test.d.ts +2 -0
  143. package/dist/src/multiagent/__tests__/interrupts.test.d.ts.map +1 -0
  144. package/dist/src/multiagent/__tests__/interrupts.test.js +390 -0
  145. package/dist/src/multiagent/__tests__/interrupts.test.js.map +1 -0
  146. package/dist/src/multiagent/__tests__/nodes.test.js +13 -0
  147. package/dist/src/multiagent/__tests__/nodes.test.js.map +1 -1
  148. package/dist/src/multiagent/__tests__/state.test.js +139 -1
  149. package/dist/src/multiagent/__tests__/state.test.js.map +1 -1
  150. package/dist/src/multiagent/__tests__/swarm.test.js +77 -0
  151. package/dist/src/multiagent/__tests__/swarm.test.js.map +1 -1
  152. package/dist/src/multiagent/events.d.ts +15 -1
  153. package/dist/src/multiagent/events.d.ts.map +1 -1
  154. package/dist/src/multiagent/events.js +18 -0
  155. package/dist/src/multiagent/events.js.map +1 -1
  156. package/dist/src/multiagent/graph.d.ts +59 -3
  157. package/dist/src/multiagent/graph.d.ts.map +1 -1
  158. package/dist/src/multiagent/graph.js +201 -34
  159. package/dist/src/multiagent/graph.js.map +1 -1
  160. package/dist/src/multiagent/multiagent.d.ts +77 -3
  161. package/dist/src/multiagent/multiagent.d.ts.map +1 -1
  162. package/dist/src/multiagent/multiagent.js +115 -1
  163. package/dist/src/multiagent/multiagent.js.map +1 -1
  164. package/dist/src/multiagent/nodes.d.ts +18 -0
  165. package/dist/src/multiagent/nodes.d.ts.map +1 -1
  166. package/dist/src/multiagent/nodes.js +69 -22
  167. package/dist/src/multiagent/nodes.js.map +1 -1
  168. package/dist/src/multiagent/state.d.ts +39 -3
  169. package/dist/src/multiagent/state.d.ts.map +1 -1
  170. package/dist/src/multiagent/state.js +80 -1
  171. package/dist/src/multiagent/state.js.map +1 -1
  172. package/dist/src/multiagent/swarm.d.ts +30 -1
  173. package/dist/src/multiagent/swarm.d.ts.map +1 -1
  174. package/dist/src/multiagent/swarm.js +166 -33
  175. package/dist/src/multiagent/swarm.js.map +1 -1
  176. package/dist/src/registry/__tests__/tool-registry.test.js +37 -0
  177. package/dist/src/registry/__tests__/tool-registry.test.js.map +1 -1
  178. package/dist/src/registry/tool-registry.d.ts +13 -7
  179. package/dist/src/registry/tool-registry.d.ts.map +1 -1
  180. package/dist/src/registry/tool-registry.js +35 -10
  181. package/dist/src/registry/tool-registry.js.map +1 -1
  182. package/dist/src/retry/__tests__/backoff-strategy.test.d.ts +2 -0
  183. package/dist/src/retry/__tests__/backoff-strategy.test.d.ts.map +1 -0
  184. package/dist/src/retry/__tests__/backoff-strategy.test.js +116 -0
  185. package/dist/src/retry/__tests__/backoff-strategy.test.js.map +1 -0
  186. package/dist/src/retry/__tests__/default-model-retry-strategy.test.d.ts +2 -0
  187. package/dist/src/retry/__tests__/default-model-retry-strategy.test.d.ts.map +1 -0
  188. package/dist/src/retry/__tests__/default-model-retry-strategy.test.js +225 -0
  189. package/dist/src/retry/__tests__/default-model-retry-strategy.test.js.map +1 -0
  190. package/dist/src/retry/backoff-strategy.d.ts +108 -0
  191. package/dist/src/retry/backoff-strategy.d.ts.map +1 -0
  192. package/dist/src/retry/backoff-strategy.js +86 -0
  193. package/dist/src/retry/backoff-strategy.js.map +1 -0
  194. package/dist/src/retry/default-model-retry-strategy.d.ts +76 -0
  195. package/dist/src/retry/default-model-retry-strategy.d.ts.map +1 -0
  196. package/dist/src/retry/default-model-retry-strategy.js +104 -0
  197. package/dist/src/retry/default-model-retry-strategy.js.map +1 -0
  198. package/dist/src/retry/index.d.ts +8 -0
  199. package/dist/src/retry/index.d.ts.map +1 -0
  200. package/dist/src/retry/index.js +7 -0
  201. package/dist/src/retry/index.js.map +1 -0
  202. package/dist/src/retry/model-retry-strategy.d.ts +80 -0
  203. package/dist/src/retry/model-retry-strategy.d.ts.map +1 -0
  204. package/dist/src/retry/model-retry-strategy.js +85 -0
  205. package/dist/src/retry/model-retry-strategy.js.map +1 -0
  206. package/dist/src/retry/retry-strategy.d.ts +34 -0
  207. package/dist/src/retry/retry-strategy.d.ts.map +1 -0
  208. package/dist/src/retry/retry-strategy.js +25 -0
  209. package/dist/src/retry/retry-strategy.js.map +1 -0
  210. package/dist/src/session/__tests__/session-manager.test.js +84 -3
  211. package/dist/src/session/__tests__/session-manager.test.js.map +1 -1
  212. package/dist/src/session/session-manager.d.ts +11 -2
  213. package/dist/src/session/session-manager.d.ts.map +1 -1
  214. package/dist/src/session/session-manager.js +17 -6
  215. package/dist/src/session/session-manager.js.map +1 -1
  216. package/dist/src/telemetry/__tests__/meter.test.js +5 -27
  217. package/dist/src/telemetry/__tests__/meter.test.js.map +1 -1
  218. package/dist/src/telemetry/meter.d.ts +12 -4
  219. package/dist/src/telemetry/meter.d.ts.map +1 -1
  220. package/dist/src/telemetry/meter.js +13 -8
  221. package/dist/src/telemetry/meter.js.map +1 -1
  222. package/dist/src/tools/__tests__/tool.test.js +24 -1
  223. package/dist/src/tools/__tests__/tool.test.js.map +1 -1
  224. package/dist/src/tools/function-tool.d.ts.map +1 -1
  225. package/dist/src/tools/function-tool.js +6 -1
  226. package/dist/src/tools/function-tool.js.map +1 -1
  227. package/dist/src/tools/mcp-tool.d.ts.map +1 -1
  228. package/dist/src/tools/mcp-tool.js +3 -2
  229. package/dist/src/tools/mcp-tool.js.map +1 -1
  230. package/dist/src/tools/tool.d.ts +10 -1
  231. package/dist/src/tools/tool.d.ts.map +1 -1
  232. package/dist/src/tools/tool.js +12 -0
  233. package/dist/src/tools/tool.js.map +1 -1
  234. package/dist/src/tsconfig.tsbuildinfo +1 -1
  235. package/dist/src/types/__tests__/agent.test.js +97 -0
  236. package/dist/src/types/__tests__/agent.test.js.map +1 -1
  237. package/dist/src/types/agent.d.ts +48 -8
  238. package/dist/src/types/agent.d.ts.map +1 -1
  239. package/dist/src/types/agent.js +28 -3
  240. package/dist/src/types/agent.js.map +1 -1
  241. package/dist/src/types/interrupt.d.ts +103 -0
  242. package/dist/src/types/interrupt.d.ts.map +1 -0
  243. package/dist/src/types/interrupt.js +63 -0
  244. package/dist/src/types/interrupt.js.map +1 -0
  245. package/dist/src/types/messages.d.ts +2 -1
  246. package/dist/src/types/messages.d.ts.map +1 -1
  247. package/dist/src/types/messages.js.map +1 -1
  248. package/dist/src/vended-plugins/context-offloader/__tests__/plugin.test.d.ts +2 -0
  249. package/dist/src/vended-plugins/context-offloader/__tests__/plugin.test.d.ts.map +1 -0
  250. package/dist/src/vended-plugins/context-offloader/__tests__/plugin.test.js +292 -0
  251. package/dist/src/vended-plugins/context-offloader/__tests__/plugin.test.js.map +1 -0
  252. package/dist/src/vended-plugins/context-offloader/__tests__/storage.test.d.ts +2 -0
  253. package/dist/src/vended-plugins/context-offloader/__tests__/storage.test.d.ts.map +1 -0
  254. package/dist/src/vended-plugins/context-offloader/__tests__/storage.test.js +148 -0
  255. package/dist/src/vended-plugins/context-offloader/__tests__/storage.test.js.map +1 -0
  256. package/dist/src/vended-plugins/context-offloader/__tests__/storage.test.node.d.ts +2 -0
  257. package/dist/src/vended-plugins/context-offloader/__tests__/storage.test.node.d.ts.map +1 -0
  258. package/dist/src/vended-plugins/context-offloader/__tests__/storage.test.node.js +78 -0
  259. package/dist/src/vended-plugins/context-offloader/__tests__/storage.test.node.js.map +1 -0
  260. package/dist/src/vended-plugins/context-offloader/index.d.ts +23 -0
  261. package/dist/src/vended-plugins/context-offloader/index.d.ts.map +1 -0
  262. package/dist/src/vended-plugins/context-offloader/index.js +21 -0
  263. package/dist/src/vended-plugins/context-offloader/index.js.map +1 -0
  264. package/dist/src/vended-plugins/context-offloader/plugin.d.ts +48 -0
  265. package/dist/src/vended-plugins/context-offloader/plugin.d.ts.map +1 -0
  266. package/dist/src/vended-plugins/context-offloader/plugin.js +244 -0
  267. package/dist/src/vended-plugins/context-offloader/plugin.js.map +1 -0
  268. package/dist/src/vended-plugins/context-offloader/storage.d.ts +114 -0
  269. package/dist/src/vended-plugins/context-offloader/storage.d.ts.map +1 -0
  270. package/dist/src/vended-plugins/context-offloader/storage.js +204 -0
  271. package/dist/src/vended-plugins/context-offloader/storage.js.map +1 -0
  272. package/dist/src/vended-plugins/skills/__tests__/agent-skills.test.node.js +12 -0
  273. package/dist/src/vended-plugins/skills/__tests__/agent-skills.test.node.js.map +1 -1
  274. package/dist/src/vended-tools/bash/__tests__/bash.test.node.js +3 -0
  275. package/dist/src/vended-tools/bash/__tests__/bash.test.node.js.map +1 -1
  276. package/dist/src/vended-tools/bash/bash.d.ts.map +1 -1
  277. package/dist/src/vended-tools/bash/bash.js +0 -3
  278. package/dist/src/vended-tools/bash/bash.js.map +1 -1
  279. package/dist/src/vended-tools/file-editor/__tests__/file-editor.test.node.js +3 -0
  280. package/dist/src/vended-tools/file-editor/__tests__/file-editor.test.node.js.map +1 -1
  281. package/dist/src/vended-tools/notebook/__tests__/notebook.test.js +3 -0
  282. package/dist/src/vended-tools/notebook/__tests__/notebook.test.js.map +1 -1
  283. package/dist/src/vended-tools/notebook/notebook.d.ts +1 -1
  284. package/package.json +9 -5
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/conversation-manager/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,mBAAmB,EAA0D,MAAM,2BAA2B,CAAA;AACvH,OAAO,EAAE,uBAAuB,EAAE,MAAM,gCAAgC,CAAA;AACxE,OAAO,EACL,gCAAgC,GAEjC,MAAM,0CAA0C,CAAA;AACjD,OAAO,EACL,8BAA8B,GAE/B,MAAM,uCAAuC,CAAA"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/conversation-manager/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EACL,mBAAmB,GAIpB,MAAM,2BAA2B,CAAA;AAClC,OAAO,EAAE,uBAAuB,EAAE,MAAM,gCAAgC,CAAA;AACxE,OAAO,EACL,gCAAgC,GAEjC,MAAM,0CAA0C,CAAA;AACjD,OAAO,EACL,8BAA8B,GAE/B,MAAM,uCAAuC,CAAA"}
@@ -5,7 +5,7 @@
5
5
  * that preserves tool usage pairs and avoids invalid window states.
6
6
  */
7
7
  import type { LocalAgent } from '../types/agent.js';
8
- import { ConversationManager, type ConversationManagerReduceOptions } from './conversation-manager.js';
8
+ import { ConversationManager, type ProactiveCompressionConfig, type ConversationManagerReduceOptions } from './conversation-manager.js';
9
9
  /**
10
10
  * Configuration for the sliding window conversation manager.
11
11
  */
@@ -20,6 +20,14 @@ export type SlidingWindowConversationManagerConfig = {
20
20
  * Defaults to true.
21
21
  */
22
22
  shouldTruncateResults?: boolean;
23
+ /**
24
+ * Enable proactive context compression before the model call.
25
+ *
26
+ * - `true`: compress when 70% of the context window is used (default threshold).
27
+ * - `{ compressionThreshold: number }`: compress at the specified ratio (0, 1].
28
+ * - `false` or omitted: disabled, only reactive overflow recovery is used.
29
+ */
30
+ proactiveCompression?: boolean | ProactiveCompressionConfig;
23
31
  };
24
32
  /**
25
33
  * Implements a sliding window strategy for managing conversation history.
@@ -32,6 +40,7 @@ export type SlidingWindowConversationManagerConfig = {
32
40
  * Registers hooks for:
33
41
  * - AfterInvocationEvent: Applies sliding window management after each invocation
34
42
  * - AfterModelCallEvent: Reduces context on overflow errors and requests retry (via super)
43
+ * - BeforeModelCallEvent: Proactive compression when threshold is exceeded (via super)
35
44
  */
36
45
  export declare class SlidingWindowConversationManager extends ConversationManager {
37
46
  private readonly _windowSize;
@@ -52,14 +61,19 @@ export declare class SlidingWindowConversationManager extends ConversationManage
52
61
  * Registers:
53
62
  * - AfterInvocationEvent callback to apply sliding window management
54
63
  * - AfterModelCallEvent callback to handle context overflow and request retry (via super)
64
+ * - BeforeModelCallEvent callback for proactive compression (via super)
55
65
  *
56
66
  * @param agent - The agent to register hooks with
57
67
  */
58
68
  initAgent(agent: LocalAgent): void;
59
69
  /**
60
- * Reduce the conversation history in response to a context overflow.
70
+ * Reduce the conversation history.
71
+ *
72
+ * When `error` is set (reactive overflow recovery), attempts to truncate large tool results
73
+ * first before falling back to message trimming.
61
74
  *
62
- * Attempts to truncate large tool results first before falling back to message trimming.
75
+ * When `error` is undefined (proactive compression), only trims messages without attempting
76
+ * tool result truncation.
63
77
  *
64
78
  * @param options - The reduction options
65
79
  * @returns `true` if the history was reduced, `false` otherwise
@@ -91,10 +105,28 @@ export declare class SlidingWindowConversationManager extends ConversationManage
91
105
  */
92
106
  private _reduceContext;
93
107
  /**
94
- * Truncate tool results in a message to reduce context size.
108
+ * Apply head/tail truncation to a string if it exceeds the size threshold.
109
+ *
110
+ * Returns the truncated form (first {@link PRESERVE_CHARS} + marker + last
111
+ * {@link PRESERVE_CHARS}) when the input exceeds {@link TRUNCATION_THRESHOLD},
112
+ * otherwise `undefined`.
113
+ */
114
+ private _truncateLongText;
115
+ /**
116
+ * Truncate tool result content in a message to reduce context size.
117
+ *
118
+ * Rule: preserve head/tail when the payload is plain-text-shaped; replace
119
+ * wholesale when it's binary or remote. Specifically:
120
+ * - Text blocks: partial head/tail truncation if over threshold.
121
+ * - Image, Video blocks: wholesale replacement with a textual placeholder.
122
+ * - Document blocks with bytes/s3 source: wholesale replacement.
123
+ * - Document blocks with text source: partial truncation of the inner text.
124
+ * - Document blocks with content source (TextBlock[]): partial truncation of
125
+ * each nested block.
126
+ * - JSON blocks: wholesale replacement if serialized length is over threshold;
127
+ * mid-structure truncation would produce invalid JSON.
95
128
  *
96
- * When a message contains tool results that are too large for the model's context window,
97
- * this function replaces the content of those tool results with a simple error message.
129
+ * The tool result `status` and `error` fields are preserved.
98
130
  *
99
131
  * @param messages - The conversation message history.
100
132
  * @param msgIdx - Index of the message containing tool results to truncate.
@@ -102,13 +134,14 @@ export declare class SlidingWindowConversationManager extends ConversationManage
102
134
  */
103
135
  private _truncateToolResults;
104
136
  /**
105
- * Find the index of the last message containing tool results.
137
+ * Find the index of the oldest message containing tool results.
106
138
  *
107
- * This is useful for identifying messages that might need to be truncated to reduce context size.
139
+ * Truncation targets the least-recent tool result first so the most relevant
140
+ * recent context is preserved as long as possible.
108
141
  *
109
142
  * @param messages - The conversation message history.
110
- * @returns Index of the last message with tool results, or undefined if no such message exists.
143
+ * @returns Index of the oldest message with tool results, or undefined if no such message exists.
111
144
  */
112
- private _findLastMessageWithToolResults;
145
+ private _findOldestMessageWithToolResults;
113
146
  }
114
147
  //# sourceMappingURL=sliding-window-conversation-manager.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"sliding-window-conversation-manager.d.ts","sourceRoot":"","sources":["../../../src/conversation-manager/sliding-window-conversation-manager.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAA;AAEnD,OAAO,EAAE,mBAAmB,EAAE,KAAK,gCAAgC,EAAE,MAAM,2BAA2B,CAAA;AAGtG;;GAEG;AACH,MAAM,MAAM,sCAAsC,GAAG;IACnD;;;OAGG;IACH,UAAU,CAAC,EAAE,MAAM,CAAA;IAEnB;;;OAGG;IACH,qBAAqB,CAAC,EAAE,OAAO,CAAA;CAChC,CAAA;AAED;;;;;;;;;;;GAWG;AACH,qBAAa,gCAAiC,SAAQ,mBAAmB;IACvE,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAQ;IACpC,OAAO,CAAC,QAAQ,CAAC,sBAAsB,CAAS;IAEhD;;OAEG;IACH,QAAQ,CAAC,IAAI,iDAAgD;IAE7D;;;;OAIG;gBACS,MAAM,CAAC,EAAE,sCAAsC;IAM3D;;;;;;;;OAQG;IACa,SAAS,CAAC,KAAK,EAAE,UAAU,GAAG,IAAI;IAQlD;;;;;;;OAOG;IACH,MAAM,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE,gCAAgC,GAAG,OAAO;IAInE;;;;;;OAMG;IACH,OAAO,CAAC,gBAAgB;IAQxB;;;;;;;;;;;;;;;OAeG;IACH,OAAO,CAAC,cAAc;IAkEtB;;;;;;;;;OASG;IACH,OAAO,CAAC,oBAAoB;IA0D5B;;;;;;;OAOG;IACH,OAAO,CAAC,+BAA+B;CAcxC"}
1
+ {"version":3,"file":"sliding-window-conversation-manager.d.ts","sourceRoot":"","sources":["../../../src/conversation-manager/sliding-window-conversation-manager.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAA;AAEnD,OAAO,EACL,mBAAmB,EACnB,KAAK,0BAA0B,EAC/B,KAAK,gCAAgC,EACtC,MAAM,2BAA2B,CAAA;AAkElC;;GAEG;AACH,MAAM,MAAM,sCAAsC,GAAG;IACnD;;;OAGG;IACH,UAAU,CAAC,EAAE,MAAM,CAAA;IAEnB;;;OAGG;IACH,qBAAqB,CAAC,EAAE,OAAO,CAAA;IAE/B;;;;;;OAMG;IACH,oBAAoB,CAAC,EAAE,OAAO,GAAG,0BAA0B,CAAA;CAC5D,CAAA;AAED;;;;;;;;;;;;GAYG;AACH,qBAAa,gCAAiC,SAAQ,mBAAmB;IACvE,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAQ;IACpC,OAAO,CAAC,QAAQ,CAAC,sBAAsB,CAAS;IAEhD;;OAEG;IACH,QAAQ,CAAC,IAAI,iDAAgD;IAE7D;;;;OAIG;gBACS,MAAM,CAAC,EAAE,sCAAsC;IAM3D;;;;;;;;;OASG;IACa,SAAS,CAAC,KAAK,EAAE,UAAU,GAAG,IAAI;IAQlD;;;;;;;;;;;OAWG;IACH,MAAM,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE,gCAAgC,GAAG,OAAO;IAInE;;;;;;OAMG;IACH,OAAO,CAAC,gBAAgB;IAQxB;;;;;;;;;;;;;;;OAeG;IACH,OAAO,CAAC,cAAc;IAkEtB;;;;;;OAMG;IACH,OAAO,CAAC,iBAAiB;IAUzB;;;;;;;;;;;;;;;;;;;OAmBG;IACH,OAAO,CAAC,oBAAoB;IAoI5B;;;;;;;;OAQG;IACH,OAAO,CAAC,iCAAiC;CAa1C"}
@@ -5,9 +5,68 @@
5
5
  * that preserves tool usage pairs and avoids invalid window states.
6
6
  */
7
7
  import { Message, TextBlock, ToolResultBlock } from '../types/messages.js';
8
+ import { DocumentBlock, ImageBlock, VideoBlock } from '../types/media.js';
8
9
  import { AfterInvocationEvent } from '../hooks/events.js';
9
- import { ConversationManager } from './conversation-manager.js';
10
+ import { ConversationManager, } from './conversation-manager.js';
10
11
  import { logger } from '../logging/logger.js';
12
+ const PRESERVE_CHARS = 200;
13
+ // Max plausible marker length, including newlines. Used as the minimum reduction
14
+ // a re-truncation would need to produce in order to be worth running.
15
+ const MIN_TRUNCATION_GAIN = 50;
16
+ // Text payloads at or below this length aren't worth truncating: the savings
17
+ // would be smaller than the marker itself, and already-truncated output (which
18
+ // lands just above `2 * PRESERVE_CHARS`) falls under this threshold so a
19
+ // second pass is a natural no-op.
20
+ const TRUNCATION_THRESHOLD = 2 * PRESERVE_CHARS + MIN_TRUNCATION_GAIN;
21
+ /**
22
+ * Build a short textual stand-in for an image block, used when truncating tool
23
+ * results. The placeholder identifies the image format and its source kind
24
+ * (bytes/url/s3) so the model can reason about what was dropped. For inline
25
+ * bytes the size is included; URL and S3 sources only report the kind since
26
+ * their byte count isn't known locally.
27
+ */
28
+ function imagePlaceholder(image) {
29
+ const source = image.source;
30
+ if (source.type === 'imageSourceBytes') {
31
+ return `[image: ${image.format}, source: bytes, ${source.bytes.byteLength} bytes]`;
32
+ }
33
+ if (source.type === 'imageSourceUrl') {
34
+ return `[image: ${image.format}, source: url]`;
35
+ }
36
+ return `[image: ${image.format}, source: s3]`;
37
+ }
38
+ /**
39
+ * Build a short textual stand-in for a video block. Binary payloads can't be
40
+ * partially inspected, so videos are replaced wholesale. The placeholder
41
+ * reports format and source kind; byte count is included for inline bytes.
42
+ */
43
+ function videoPlaceholder(video) {
44
+ const source = video.source;
45
+ if (source.type === 'videoSourceBytes') {
46
+ return `[video: ${video.format}, source: bytes, ${source.bytes.byteLength} bytes]`;
47
+ }
48
+ return `[video: ${video.format}, source: s3]`;
49
+ }
50
+ /**
51
+ * Build a short textual stand-in for a document block with a binary or remote
52
+ * source. Text-based document sources (text / content) are truncated in place
53
+ * instead of replaced, so this is only called for bytes / s3.
54
+ */
55
+ function documentPlaceholder(doc) {
56
+ const source = doc.source;
57
+ if (source.type === 'documentSourceBytes') {
58
+ return `[document: ${doc.name}, ${doc.format}, source: bytes, ${source.bytes.byteLength} bytes]`;
59
+ }
60
+ return `[document: ${doc.name}, ${doc.format}, source: s3]`;
61
+ }
62
+ /**
63
+ * Build a short textual stand-in for a JSON block. The serialized length is
64
+ * reported so the model knows how much was dropped; truncating JSON
65
+ * mid-structure would produce invalid output, so the whole block is replaced.
66
+ */
67
+ function jsonPlaceholder(serializedLength) {
68
+ return `[json: ${serializedLength} chars]`;
69
+ }
11
70
  /**
12
71
  * Implements a sliding window strategy for managing conversation history.
13
72
  *
@@ -19,6 +78,7 @@ import { logger } from '../logging/logger.js';
19
78
  * Registers hooks for:
20
79
  * - AfterInvocationEvent: Applies sliding window management after each invocation
21
80
  * - AfterModelCallEvent: Reduces context on overflow errors and requests retry (via super)
81
+ * - BeforeModelCallEvent: Proactive compression when threshold is exceeded (via super)
22
82
  */
23
83
  export class SlidingWindowConversationManager extends ConversationManager {
24
84
  _windowSize;
@@ -33,7 +93,7 @@ export class SlidingWindowConversationManager extends ConversationManager {
33
93
  * @param config - Configuration options for the sliding window manager.
34
94
  */
35
95
  constructor(config) {
36
- super();
96
+ super(config);
37
97
  this._windowSize = config?.windowSize ?? 40;
38
98
  this._shouldTruncateResults = config?.shouldTruncateResults ?? true;
39
99
  }
@@ -43,6 +103,7 @@ export class SlidingWindowConversationManager extends ConversationManager {
43
103
  * Registers:
44
104
  * - AfterInvocationEvent callback to apply sliding window management
45
105
  * - AfterModelCallEvent callback to handle context overflow and request retry (via super)
106
+ * - BeforeModelCallEvent callback for proactive compression (via super)
46
107
  *
47
108
  * @param agent - The agent to register hooks with
48
109
  */
@@ -53,9 +114,13 @@ export class SlidingWindowConversationManager extends ConversationManager {
53
114
  });
54
115
  }
55
116
  /**
56
- * Reduce the conversation history in response to a context overflow.
117
+ * Reduce the conversation history.
118
+ *
119
+ * When `error` is set (reactive overflow recovery), attempts to truncate large tool results
120
+ * first before falling back to message trimming.
57
121
  *
58
- * Attempts to truncate large tool results first before falling back to message trimming.
122
+ * When `error` is undefined (proactive compression), only trims messages without attempting
123
+ * tool result truncation.
59
124
  *
60
125
  * @param options - The reduction options
61
126
  * @returns `true` if the history was reduced, `false` otherwise
@@ -94,9 +159,9 @@ export class SlidingWindowConversationManager extends ConversationManager {
94
159
  */
95
160
  _reduceContext(messages, _error) {
96
161
  // Only truncate tool results when handling a context overflow error, not for window size enforcement
97
- const lastMessageIdxWithToolResults = this._findLastMessageWithToolResults(messages);
98
- if (_error && lastMessageIdxWithToolResults !== undefined && this._shouldTruncateResults) {
99
- const resultsTruncated = this._truncateToolResults(messages, lastMessageIdxWithToolResults);
162
+ const oldestMessageIdxWithToolResults = this._findOldestMessageWithToolResults(messages);
163
+ if (_error && oldestMessageIdxWithToolResults !== undefined && this._shouldTruncateResults) {
164
+ const resultsTruncated = this._truncateToolResults(messages, oldestMessageIdxWithToolResults);
100
165
  if (resultsTruncated) {
101
166
  return true;
102
167
  }
@@ -148,10 +213,36 @@ export class SlidingWindowConversationManager extends ConversationManager {
148
213
  return true;
149
214
  }
150
215
  /**
151
- * Truncate tool results in a message to reduce context size.
216
+ * Apply head/tail truncation to a string if it exceeds the size threshold.
217
+ *
218
+ * Returns the truncated form (first {@link PRESERVE_CHARS} + marker + last
219
+ * {@link PRESERVE_CHARS}) when the input exceeds {@link TRUNCATION_THRESHOLD},
220
+ * otherwise `undefined`.
221
+ */
222
+ _truncateLongText(text) {
223
+ if (text.length <= TRUNCATION_THRESHOLD) {
224
+ return undefined;
225
+ }
226
+ const prefix = text.slice(0, PRESERVE_CHARS);
227
+ const suffix = text.slice(-PRESERVE_CHARS);
228
+ const removed = text.length - 2 * PRESERVE_CHARS;
229
+ return `${prefix}\n<truncated chars="${removed}"/>\n${suffix}`;
230
+ }
231
+ /**
232
+ * Truncate tool result content in a message to reduce context size.
233
+ *
234
+ * Rule: preserve head/tail when the payload is plain-text-shaped; replace
235
+ * wholesale when it's binary or remote. Specifically:
236
+ * - Text blocks: partial head/tail truncation if over threshold.
237
+ * - Image, Video blocks: wholesale replacement with a textual placeholder.
238
+ * - Document blocks with bytes/s3 source: wholesale replacement.
239
+ * - Document blocks with text source: partial truncation of the inner text.
240
+ * - Document blocks with content source (TextBlock[]): partial truncation of
241
+ * each nested block.
242
+ * - JSON blocks: wholesale replacement if serialized length is over threshold;
243
+ * mid-structure truncation would produce invalid JSON.
152
244
  *
153
- * When a message contains tool results that are too large for the model's context window,
154
- * this function replaces the content of those tool results with a simple error message.
245
+ * The tool result `status` and `error` fields are preserved.
155
246
  *
156
247
  * @param messages - The conversation message history.
157
248
  * @param msgIdx - Index of the message containing tool results to truncate.
@@ -165,39 +256,105 @@ export class SlidingWindowConversationManager extends ConversationManager {
165
256
  if (!message) {
166
257
  return false;
167
258
  }
168
- const toolResultTooLargeMessage = 'The tool result was too large!';
169
- let foundToolResultToTruncate = false;
170
- // First, check if there's a tool result that needs truncation
171
- for (const block of message.content) {
172
- if (block.type === 'toolResultBlock') {
173
- const toolResultBlock = block;
174
- // Check if already truncated
175
- const firstContent = toolResultBlock.content[0];
176
- const contentText = firstContent && firstContent.type === 'textBlock' ? firstContent.text : '';
177
- if (toolResultBlock.status === 'error' && contentText === toolResultTooLargeMessage) {
178
- return false;
259
+ let changesMade = false;
260
+ const newContent = message.content.map((block) => {
261
+ if (block.type !== 'toolResultBlock') {
262
+ return block;
263
+ }
264
+ const toolResultBlock = block;
265
+ const newItems = [];
266
+ let itemChanged = false;
267
+ for (const item of toolResultBlock.content) {
268
+ if (item.type === 'imageBlock') {
269
+ newItems.push(new TextBlock(imagePlaceholder(item)));
270
+ itemChanged = true;
271
+ continue;
179
272
  }
180
- foundToolResultToTruncate = true;
181
- break;
273
+ if (item.type === 'videoBlock') {
274
+ newItems.push(new TextBlock(videoPlaceholder(item)));
275
+ itemChanged = true;
276
+ continue;
277
+ }
278
+ if (item.type === 'documentBlock') {
279
+ const source = item.source;
280
+ if (source.type === 'documentSourceBytes' || source.type === 'documentSourceS3Location') {
281
+ newItems.push(new TextBlock(documentPlaceholder(item)));
282
+ itemChanged = true;
283
+ continue;
284
+ }
285
+ if (source.type === 'documentSourceText') {
286
+ const truncated = this._truncateLongText(source.text);
287
+ if (truncated !== undefined) {
288
+ newItems.push(new DocumentBlock({
289
+ name: item.name,
290
+ format: item.format,
291
+ source: { text: truncated },
292
+ ...(item.citations !== undefined ? { citations: item.citations } : {}),
293
+ ...(item.context !== undefined ? { context: item.context } : {}),
294
+ }));
295
+ itemChanged = true;
296
+ continue;
297
+ }
298
+ }
299
+ if (source.type === 'documentSourceContentBlock') {
300
+ let nestedChanged = false;
301
+ const newContentBlocks = source.content.map((nested) => {
302
+ const truncated = this._truncateLongText(nested.text);
303
+ if (truncated !== undefined) {
304
+ nestedChanged = true;
305
+ return new TextBlock(truncated);
306
+ }
307
+ return nested;
308
+ });
309
+ if (nestedChanged) {
310
+ newItems.push(new DocumentBlock({
311
+ name: item.name,
312
+ format: item.format,
313
+ source: { content: newContentBlocks },
314
+ ...(item.citations !== undefined ? { citations: item.citations } : {}),
315
+ ...(item.context !== undefined ? { context: item.context } : {}),
316
+ }));
317
+ itemChanged = true;
318
+ continue;
319
+ }
320
+ }
321
+ newItems.push(item);
322
+ continue;
323
+ }
324
+ if (item.type === 'jsonBlock') {
325
+ const serializedLength = JSON.stringify(item.json).length;
326
+ if (serializedLength > TRUNCATION_THRESHOLD) {
327
+ newItems.push(new TextBlock(jsonPlaceholder(serializedLength)));
328
+ itemChanged = true;
329
+ continue;
330
+ }
331
+ newItems.push(item);
332
+ continue;
333
+ }
334
+ if (item.type === 'textBlock') {
335
+ const truncated = this._truncateLongText(item.text);
336
+ if (truncated !== undefined) {
337
+ newItems.push(new TextBlock(truncated));
338
+ itemChanged = true;
339
+ continue;
340
+ }
341
+ }
342
+ newItems.push(item);
182
343
  }
183
- }
184
- if (!foundToolResultToTruncate) {
185
- return false;
186
- }
187
- // Create new content array with truncated tool results
188
- const newContent = message.content.map((block) => {
189
- if (block.type === 'toolResultBlock') {
190
- const toolResultBlock = block;
191
- // Create new ToolResultBlock with truncated content
192
- return new ToolResultBlock({
193
- toolUseId: toolResultBlock.toolUseId,
194
- status: 'error',
195
- content: [new TextBlock(toolResultTooLargeMessage)],
196
- });
344
+ if (!itemChanged) {
345
+ return block;
197
346
  }
198
- return block;
347
+ changesMade = true;
348
+ return new ToolResultBlock({
349
+ toolUseId: toolResultBlock.toolUseId,
350
+ status: toolResultBlock.status,
351
+ content: newItems,
352
+ ...(toolResultBlock.error !== undefined ? { error: toolResultBlock.error } : {}),
353
+ });
199
354
  });
200
- // Replace the message in the array with a new message containing the modified content
355
+ if (!changesMade) {
356
+ return false;
357
+ }
201
358
  messages[msgIdx] = new Message({
202
359
  role: message.role,
203
360
  content: newContent,
@@ -205,16 +362,16 @@ export class SlidingWindowConversationManager extends ConversationManager {
205
362
  return true;
206
363
  }
207
364
  /**
208
- * Find the index of the last message containing tool results.
365
+ * Find the index of the oldest message containing tool results.
209
366
  *
210
- * This is useful for identifying messages that might need to be truncated to reduce context size.
367
+ * Truncation targets the least-recent tool result first so the most relevant
368
+ * recent context is preserved as long as possible.
211
369
  *
212
370
  * @param messages - The conversation message history.
213
- * @returns Index of the last message with tool results, or undefined if no such message exists.
371
+ * @returns Index of the oldest message with tool results, or undefined if no such message exists.
214
372
  */
215
- _findLastMessageWithToolResults(messages) {
216
- // Iterate backwards through all messages (from newest to oldest)
217
- for (let idx = messages.length - 1; idx >= 0; idx--) {
373
+ _findOldestMessageWithToolResults(messages) {
374
+ for (let idx = 0; idx < messages.length; idx++) {
218
375
  const currentMessage = messages[idx];
219
376
  const hasToolResult = currentMessage.content.some((block) => block.type === 'toolResultBlock');
220
377
  if (hasToolResult) {
@@ -1 +1 @@
1
- {"version":3,"file":"sliding-window-conversation-manager.js","sourceRoot":"","sources":["../../../src/conversation-manager/sliding-window-conversation-manager.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"sliding-window-conversation-manager.js","sourceRoot":"","sources":["../../../src/conversation-manager/sliding-window-conversation-manager.ts"],"names":[],"mappings":"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"}
@@ -5,7 +5,7 @@
5
5
  * when the context window overflows, preserving important information rather
6
6
  * than simply discarding it.
7
7
  */
8
- import { ConversationManager, type ConversationManagerReduceOptions } from './conversation-manager.js';
8
+ import { ConversationManager, type ProactiveCompressionConfig, type ConversationManagerReduceOptions } from './conversation-manager.js';
9
9
  import type { Model } from '../models/model.js';
10
10
  /**
11
11
  * Configuration for the summarization conversation manager.
@@ -32,6 +32,14 @@ export type SummarizingConversationManagerConfig = {
32
32
  * prompt that produces structured bullet-point summaries.
33
33
  */
34
34
  summarizationSystemPrompt?: string;
35
+ /**
36
+ * Enable proactive context compression before the model call.
37
+ *
38
+ * - `true`: compress when 70% of the context window is used (default threshold).
39
+ * - `{ compressionThreshold: number }`: compress at the specified ratio (0, 1].
40
+ * - `false` or omitted: disabled, only reactive overflow recovery is used.
41
+ */
42
+ proactiveCompression?: boolean | ProactiveCompressionConfig;
35
43
  };
36
44
  /**
37
45
  * Implements a summarization strategy for managing conversation history.
@@ -50,10 +58,24 @@ export declare class SummarizingConversationManager extends ConversationManager
50
58
  /**
51
59
  * Reduce the conversation history by summarizing older messages.
52
60
  *
61
+ * When `error` is set (reactive overflow recovery), summarization failure is rethrown
62
+ * with the original error as cause — the agent loop must not proceed with an overflow.
63
+ *
64
+ * When `error` is undefined (proactive compression), summarization failure is logged
65
+ * and returns `false` — the model call proceeds regardless.
66
+ *
53
67
  * @param options - The reduction options
54
68
  * @returns `true` if the history was reduced, `false` otherwise
55
69
  */
56
70
  reduce({ agent, model, error }: ConversationManagerReduceOptions): Promise<boolean>;
71
+ /**
72
+ * Summarize the oldest messages and replace them with a summary.
73
+ *
74
+ * @param agent - The agent instance
75
+ * @param model - The model to use for summarization
76
+ * @returns `true` if the history was reduced, `false` otherwise
77
+ */
78
+ private _summarizeOldest;
57
79
  /**
58
80
  * Generate a summary of the provided messages by calling the model directly.
59
81
  *
@@ -1 +1 @@
1
- {"version":3,"file":"summarizing-conversation-manager.d.ts","sourceRoot":"","sources":["../../../src/conversation-manager/summarizing-conversation-manager.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAGH,OAAO,EAAE,mBAAmB,EAAE,KAAK,gCAAgC,EAAE,MAAM,2BAA2B,CAAA;AAEtG,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAA;AA+B/C;;GAEG;AACH,MAAM,MAAM,oCAAoC,GAAG;IACjD;;;;OAIG;IACH,KAAK,CAAC,EAAE,KAAK,CAAA;IAEb;;;OAGG;IACH,YAAY,CAAC,EAAE,MAAM,CAAA;IAErB;;;OAGG;IACH,sBAAsB,CAAC,EAAE,MAAM,CAAA;IAE/B;;;OAGG;IACH,yBAAyB,CAAC,EAAE,MAAM,CAAA;CACnC,CAAA;AAED;;;;;;GAMG;AACH,qBAAa,8BAA+B,SAAQ,mBAAmB;IACrE,QAAQ,CAAC,IAAI,8CAA6C;IAE1D,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAmB;IAC1C,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAQ;IACtC,OAAO,CAAC,QAAQ,CAAC,uBAAuB,CAAQ;IAChD,OAAO,CAAC,QAAQ,CAAC,0BAA0B,CAAQ;gBAEvC,MAAM,CAAC,EAAE,oCAAoC;IASzD;;;;;OAKG;IACG,MAAM,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE,gCAAgC,GAAG,OAAO,CAAC,OAAO,CAAC;IAuCzF;;;;;OAKG;YACW,gBAAgB;IAgC9B;;;;;;;;;;OAUG;IACH,OAAO,CAAC,6BAA6B;CAoCtC"}
1
+ {"version":3,"file":"summarizing-conversation-manager.d.ts","sourceRoot":"","sources":["../../../src/conversation-manager/summarizing-conversation-manager.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAIH,OAAO,EACL,mBAAmB,EACnB,KAAK,0BAA0B,EAC/B,KAAK,gCAAgC,EACtC,MAAM,2BAA2B,CAAA;AAGlC,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAA;AA+B/C;;GAEG;AACH,MAAM,MAAM,oCAAoC,GAAG;IACjD;;;;OAIG;IACH,KAAK,CAAC,EAAE,KAAK,CAAA;IAEb;;;OAGG;IACH,YAAY,CAAC,EAAE,MAAM,CAAA;IAErB;;;OAGG;IACH,sBAAsB,CAAC,EAAE,MAAM,CAAA;IAE/B;;;OAGG;IACH,yBAAyB,CAAC,EAAE,MAAM,CAAA;IAElC;;;;;;OAMG;IACH,oBAAoB,CAAC,EAAE,OAAO,GAAG,0BAA0B,CAAA;CAC5D,CAAA;AAED;;;;;;GAMG;AACH,qBAAa,8BAA+B,SAAQ,mBAAmB;IACrE,QAAQ,CAAC,IAAI,8CAA6C;IAE1D,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAmB;IAC1C,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAQ;IACtC,OAAO,CAAC,QAAQ,CAAC,uBAAuB,CAAQ;IAChD,OAAO,CAAC,QAAQ,CAAC,0BAA0B,CAAQ;gBAEvC,MAAM,CAAC,EAAE,oCAAoC;IASzD;;;;;;;;;;;OAWG;IACG,MAAM,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE,gCAAgC,GAAG,OAAO,CAAC,OAAO,CAAC;IAiBzF;;;;;;OAMG;YACW,gBAAgB;IA8B9B;;;;;OAKG;YACW,gBAAgB;IAgC9B;;;;;;;;;;OAUG;IACH,OAAO,CAAC,6BAA6B;CAoCtC"}
@@ -6,8 +6,9 @@
6
6
  * than simply discarding it.
7
7
  */
8
8
  import { Message, TextBlock } from '../types/messages.js';
9
- import { ConversationManager } from './conversation-manager.js';
9
+ import { ConversationManager, } from './conversation-manager.js';
10
10
  import { logger } from '../logging/logger.js';
11
+ import { normalizeError } from '../errors.js';
11
12
  const DEFAULT_SUMMARIZATION_PROMPT = `You are a conversation summarizer. Provide a concise summary of the conversation \
12
13
  history.
13
14
 
@@ -50,7 +51,7 @@ export class SummarizingConversationManager extends ConversationManager {
50
51
  _preserveRecentMessages;
51
52
  _summarizationSystemPrompt;
52
53
  constructor(config) {
53
- super();
54
+ super(config);
54
55
  this._model = config?.model;
55
56
  // clamped [0.1, 0.8]
56
57
  this._summaryRatio = Math.max(0.1, Math.min(0.8, config?.summaryRatio ?? 0.3));
@@ -60,11 +61,40 @@ export class SummarizingConversationManager extends ConversationManager {
60
61
  /**
61
62
  * Reduce the conversation history by summarizing older messages.
62
63
  *
64
+ * When `error` is set (reactive overflow recovery), summarization failure is rethrown
65
+ * with the original error as cause — the agent loop must not proceed with an overflow.
66
+ *
67
+ * When `error` is undefined (proactive compression), summarization failure is logged
68
+ * and returns `false` — the model call proceeds regardless.
69
+ *
63
70
  * @param options - The reduction options
64
71
  * @returns `true` if the history was reduced, `false` otherwise
65
72
  */
66
73
  async reduce({ agent, model, error }) {
67
- const resolvedModel = this._model ?? model;
74
+ try {
75
+ return await this._summarizeOldest(agent, this._model ?? model);
76
+ }
77
+ catch (summarizationError) {
78
+ if (error) {
79
+ // Reactive: rethrow so the ContextWindowOverflowError propagates
80
+ logger.error(`error=<${summarizationError}> | summarization failed`);
81
+ const wrapped = normalizeError(summarizationError);
82
+ wrapped.cause = error;
83
+ throw wrapped;
84
+ }
85
+ // Proactive: best-effort, swallow errors so the model call can still proceed.
86
+ logger.warn(`error=<${summarizationError}> | proactive summarization failed, continuing`);
87
+ return false;
88
+ }
89
+ }
90
+ /**
91
+ * Summarize the oldest messages and replace them with a summary.
92
+ *
93
+ * @param agent - The agent instance
94
+ * @param model - The model to use for summarization
95
+ * @returns `true` if the history was reduced, `false` otherwise
96
+ */
97
+ async _summarizeOldest(agent, model) {
68
98
  const messages = agent.messages;
69
99
  // Calculate how many messages to summarize
70
100
  let messagesToSummarizeCount = Math.max(1, Math.floor(messages.length * this._summaryRatio));
@@ -76,20 +106,12 @@ export class SummarizingConversationManager extends ConversationManager {
76
106
  }
77
107
  // Adjust split point to avoid breaking tool use/result pairs
78
108
  messagesToSummarizeCount = this._adjustSplitPointForToolPairs(messages, messagesToSummarizeCount);
79
- try {
80
- const messagesToSummarize = messages.slice(0, messagesToSummarizeCount);
81
- // Generate summary via model call
82
- const summaryMessage = await this._generateSummary(messagesToSummarize, resolvedModel);
83
- // Replace summarized messages with the summary
84
- messages.splice(0, messagesToSummarizeCount, summaryMessage);
85
- return true;
86
- }
87
- catch (summarizationError) {
88
- logger.error(`error=<${summarizationError}> | summarization failed`);
89
- const wrapped = summarizationError instanceof Error ? summarizationError : new Error(String(summarizationError));
90
- wrapped.cause = error;
91
- throw wrapped;
92
- }
109
+ const messagesToSummarize = messages.slice(0, messagesToSummarizeCount);
110
+ // Generate summary via model call
111
+ const summaryMessage = await this._generateSummary(messagesToSummarize, model);
112
+ // Replace summarized messages with the summary
113
+ messages.splice(0, messagesToSummarizeCount, summaryMessage);
114
+ return true;
93
115
  }
94
116
  /**
95
117
  * Generate a summary of the provided messages by calling the model directly.