@dexto/core 1.5.4 → 1.5.5

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 (96) hide show
  1. package/dist/agent/DextoAgent.cjs +61 -155
  2. package/dist/agent/DextoAgent.d.ts +11 -54
  3. package/dist/agent/DextoAgent.d.ts.map +1 -1
  4. package/dist/agent/DextoAgent.js +61 -155
  5. package/dist/context/compaction/strategies/reactive-overflow.cjs +5 -3
  6. package/dist/context/compaction/strategies/reactive-overflow.d.ts +1 -0
  7. package/dist/context/compaction/strategies/reactive-overflow.d.ts.map +1 -1
  8. package/dist/context/compaction/strategies/reactive-overflow.js +5 -3
  9. package/dist/context/compaction/types.d.ts +13 -1
  10. package/dist/context/compaction/types.d.ts.map +1 -1
  11. package/dist/errors/types.cjs +0 -2
  12. package/dist/errors/types.d.ts +1 -5
  13. package/dist/errors/types.d.ts.map +1 -1
  14. package/dist/errors/types.js +0 -2
  15. package/dist/events/index.cjs +0 -2
  16. package/dist/events/index.d.ts +6 -25
  17. package/dist/events/index.d.ts.map +1 -1
  18. package/dist/events/index.js +0 -2
  19. package/dist/llm/executor/stream-processor.cjs +85 -27
  20. package/dist/llm/executor/stream-processor.d.ts +4 -0
  21. package/dist/llm/executor/stream-processor.d.ts.map +1 -1
  22. package/dist/llm/executor/stream-processor.js +85 -27
  23. package/dist/llm/executor/turn-executor.cjs +58 -130
  24. package/dist/llm/executor/turn-executor.d.ts +9 -43
  25. package/dist/llm/executor/turn-executor.d.ts.map +1 -1
  26. package/dist/llm/executor/turn-executor.js +58 -130
  27. package/dist/llm/executor/types.d.ts +0 -28
  28. package/dist/llm/executor/types.d.ts.map +1 -1
  29. package/dist/llm/services/vercel.cjs +2 -5
  30. package/dist/llm/services/vercel.d.ts +1 -6
  31. package/dist/llm/services/vercel.d.ts.map +1 -1
  32. package/dist/llm/services/vercel.js +2 -5
  33. package/dist/session/chat-session.cjs +19 -12
  34. package/dist/session/chat-session.d.ts +3 -6
  35. package/dist/session/chat-session.d.ts.map +1 -1
  36. package/dist/session/chat-session.js +19 -12
  37. package/dist/session/session-manager.cjs +0 -135
  38. package/dist/session/session-manager.d.ts +0 -43
  39. package/dist/session/session-manager.d.ts.map +1 -1
  40. package/dist/session/session-manager.js +0 -135
  41. package/dist/telemetry/telemetry.cjs +12 -5
  42. package/dist/telemetry/telemetry.d.ts.map +1 -1
  43. package/dist/telemetry/telemetry.js +12 -5
  44. package/package.json +15 -5
  45. package/dist/filesystem/error-codes.cjs +0 -53
  46. package/dist/filesystem/error-codes.d.ts +0 -31
  47. package/dist/filesystem/error-codes.d.ts.map +0 -1
  48. package/dist/filesystem/error-codes.js +0 -30
  49. package/dist/filesystem/errors.cjs +0 -303
  50. package/dist/filesystem/errors.d.ts +0 -109
  51. package/dist/filesystem/errors.d.ts.map +0 -1
  52. package/dist/filesystem/errors.js +0 -280
  53. package/dist/filesystem/filesystem-service.cjs +0 -534
  54. package/dist/filesystem/filesystem-service.d.ts +0 -97
  55. package/dist/filesystem/filesystem-service.d.ts.map +0 -1
  56. package/dist/filesystem/filesystem-service.js +0 -501
  57. package/dist/filesystem/index.cjs +0 -37
  58. package/dist/filesystem/index.d.ts +0 -11
  59. package/dist/filesystem/index.d.ts.map +0 -1
  60. package/dist/filesystem/index.js +0 -11
  61. package/dist/filesystem/path-validator.cjs +0 -250
  62. package/dist/filesystem/path-validator.d.ts +0 -103
  63. package/dist/filesystem/path-validator.d.ts.map +0 -1
  64. package/dist/filesystem/path-validator.js +0 -217
  65. package/dist/filesystem/types.cjs +0 -16
  66. package/dist/filesystem/types.d.ts +0 -175
  67. package/dist/filesystem/types.d.ts.map +0 -1
  68. package/dist/filesystem/types.js +0 -0
  69. package/dist/process/command-validator.cjs +0 -554
  70. package/dist/process/command-validator.d.ts +0 -49
  71. package/dist/process/command-validator.d.ts.map +0 -1
  72. package/dist/process/command-validator.js +0 -531
  73. package/dist/process/error-codes.cjs +0 -47
  74. package/dist/process/error-codes.d.ts +0 -25
  75. package/dist/process/error-codes.d.ts.map +0 -1
  76. package/dist/process/error-codes.js +0 -24
  77. package/dist/process/errors.cjs +0 -244
  78. package/dist/process/errors.d.ts +0 -87
  79. package/dist/process/errors.d.ts.map +0 -1
  80. package/dist/process/errors.js +0 -221
  81. package/dist/process/index.cjs +0 -37
  82. package/dist/process/index.d.ts +0 -11
  83. package/dist/process/index.d.ts.map +0 -1
  84. package/dist/process/index.js +0 -11
  85. package/dist/process/process-service.cjs +0 -497
  86. package/dist/process/process-service.d.ts +0 -69
  87. package/dist/process/process-service.d.ts.map +0 -1
  88. package/dist/process/process-service.js +0 -464
  89. package/dist/process/types.cjs +0 -16
  90. package/dist/process/types.d.ts +0 -107
  91. package/dist/process/types.d.ts.map +0 -1
  92. package/dist/process/types.js +0 -0
  93. package/dist/session/compaction-service.cjs +0 -139
  94. package/dist/session/compaction-service.d.ts +0 -81
  95. package/dist/session/compaction-service.d.ts.map +0 -1
  96. package/dist/session/compaction-service.js +0 -106
@@ -47,23 +47,6 @@ export declare class TurnExecutor {
47
47
  * Used to pass approval info from tool execution to result persistence.
48
48
  */
49
49
  private approvalMetadata;
50
- /**
51
- * Tracks whether compaction occurred during this turn.
52
- * Used to signal to the caller that session continuation may be needed.
53
- */
54
- private compactionOccurred;
55
- /**
56
- * Compaction data captured during this turn.
57
- * Contains summary text and preserved messages for session continuation.
58
- * This data is passed up the call chain (NOT persisted to original session).
59
- */
60
- private compactionData;
61
- /**
62
- * Virtual context for remaining iterations after compaction.
63
- * When set, the main loop uses this instead of calling getFormattedMessagesForLLM().
64
- * This provides reduced context to the LLM without persisting to the original session.
65
- */
66
- private virtualContext;
67
50
  constructor(model: LanguageModel, toolManager: ToolManager, contextManager: ContextManager<ModelMessage>, eventBus: SessionEventBus, resourceManager: ResourceManager, sessionId: string, config: {
68
51
  maxSteps?: number | undefined;
69
52
  maxOutputTokens?: number | undefined;
@@ -178,40 +161,23 @@ export declare class TurnExecutor {
178
161
  */
179
162
  private shouldCompactFromActual;
180
163
  /**
181
- * Compact context using ReactiveOverflowStrategy WITHOUT persisting to original session.
164
+ * Compact context by generating a summary and adding it to the same session.
182
165
  *
183
- * Key design: Creates a virtual context (summary + preserved messages) that will be used
184
- * for the remaining iterations of this turn. The compaction data is passed up the call chain
185
- * so the caller can create a continuation session with the summary.
186
- *
187
- * The original session remains UNTOUCHED - no messages are added or modified.
166
+ * The summary message is added to the conversation history with `isSummary: true` metadata.
167
+ * When the context is loaded via getFormattedMessagesForLLM(), filterCompacted() will
168
+ * exclude all messages before the summary, effectively compacting the context.
188
169
  *
189
170
  * @param originalTokens The estimated input token count that triggered overflow
171
+ * @param contributorContext Context for system prompt contributors (needed for accurate token estimation)
172
+ * @param tools Tool definitions (needed for accurate token estimation)
173
+ * @returns true if compaction occurred, false if skipped
190
174
  */
191
- private compactToVirtualContext;
192
- /**
193
- * Extract the summary text from a summary message.
194
- */
195
- private extractSummaryText;
196
- /**
197
- * Build formatted messages from virtual context (after compaction).
198
- *
199
- * This creates LLM-ready messages using:
200
- * - System prompt (same as normal flow)
201
- * - Summary message (as first message)
202
- * - Preserved messages (formatted for LLM)
203
- *
204
- * Uses the same formatting pipeline as getFormattedMessagesForLLM()
205
- * but with our virtual history instead of the stored history.
206
- *
207
- * @param contributorContext Context for system prompt contributors
208
- * @returns Formatted messages ready for LLM call, matching getFormattedMessagesForLLM return type
209
- */
210
- private buildMessagesFromVirtualContext;
175
+ private compactContext;
211
176
  /**
212
177
  * Set telemetry span attributes for token usage.
213
178
  */
214
179
  private setTelemetryAttributes;
180
+ private getContextInputTokens;
215
181
  /**
216
182
  * Map provider errors to DextoRuntimeError.
217
183
  */
@@ -1 +1 @@
1
- {"version":3,"file":"turn-executor.d.ts","sourceRoot":"","sources":["../../../src/llm/executor/turn-executor.ts"],"names":[],"mappings":"AAAA,OAAO,EACH,aAAa,EAMb,KAAK,YAAY,EAEpB,MAAM,IAAI,CAAC;AAEZ,OAAO,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAQ1D,OAAO,EAAE,WAAW,EAAE,MAAM,6BAA6B,CAAC;AAG1D,OAAO,EAAE,cAAc,EAAkB,MAAM,YAAY,CAAC;AAG5D,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAE7D,OAAO,KAAK,EAAE,eAAe,EAAmB,MAAM,uBAAuB,CAAC;AAC9E,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,0BAA0B,CAAC;AAChE,OAAO,EAAE,yBAAyB,EAAE,MAAM,6BAA6B,CAAC;AACxE,OAAO,EAAE,UAAU,EAAoB,MAAM,aAAa,CAAC;AAC3D,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,gCAAgC,CAAC;AAQ1E,OAAO,EAAc,KAAK,WAAW,EAAE,MAAM,sCAAsC,CAAC;AAEpF,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,mCAAmC,CAAC;AAc7E;;;;;;;;;;;GAWG;AACH,qBAAa,YAAY;IAyCjB,OAAO,CAAC,KAAK;IACb,OAAO,CAAC,WAAW;IACnB,OAAO,CAAC,cAAc;IACtB,OAAO,CAAC,QAAQ;IAChB,OAAO,CAAC,eAAe;IACvB,OAAO,CAAC,SAAS;IACjB,OAAO,CAAC,MAAM;IAQd,OAAO,CAAC,UAAU;IAElB,OAAO,CAAC,YAAY;IACpB,OAAO,CAAC,WAAW,CAAC;IACpB,OAAO,CAAC,cAAc,CAAC;IAEvB,OAAO,CAAC,0BAA0B;IA5DtC,OAAO,CAAC,MAAM,CAAe;IAC7B;;;OAGG;IACH,OAAO,CAAC,mBAAmB,CAAkB;IAC7C,OAAO,CAAC,kBAAkB,CAAoC;IAC9D;;;OAGG;IACH,OAAO,CAAC,gBAAgB,CAGpB;IAEJ;;;OAGG;IACH,OAAO,CAAC,kBAAkB,CAAS;IAEnC;;;;OAIG;IACH,OAAO,CAAC,cAAc,CAA+B;IAErD;;;;OAIG;IACH,OAAO,CAAC,cAAc,CAGN;gBAGJ,KAAK,EAAE,aAAa,EACpB,WAAW,EAAE,WAAW,EACxB,cAAc,EAAE,cAAc,CAAC,YAAY,CAAC,EAC5C,QAAQ,EAAE,eAAe,EACzB,eAAe,EAAE,eAAe,EAChC,SAAS,EAAE,MAAM,EACjB,MAAM,EAAE;QACZ,QAAQ,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;QAC9B,eAAe,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;QACrC,WAAW,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;QACjC,OAAO,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;QAE7B,eAAe,CAAC,EAAE,MAAM,GAAG,SAAS,GAAG,KAAK,GAAG,QAAQ,GAAG,MAAM,GAAG,OAAO,GAAG,SAAS,CAAC;KAC1F,EACO,UAAU,EAAE,UAAU,EAC9B,MAAM,EAAE,YAAY,EACZ,YAAY,EAAE,mBAAmB,EACjC,WAAW,CAAC,EAAE,WAAW,YAAA,EACzB,cAAc,CAAC,EAAE,WAAW,YAAA,EACpC,kBAAkB,CAAC,EAAE,mBAAmB,GAAG,IAAI,EACvC,0BAA0B,GAAE,MAAY;IAqBpD;;;OAGG;IACH,OAAO,CAAC,wBAAwB;IAQhC;;;;;;OAMG;IACG,OAAO,CACT,kBAAkB,EAAE,yBAAyB,EAC7C,SAAS,GAAE,OAAc,GAC1B,OAAO,CAAC,cAAc,CAAC;IAwT1B;;;OAGG;IACH,KAAK,IAAI,IAAI;IAIb;;;OAGG;YACW,oBAAoB;IAmBlC;;;;;;OAMG;YACW,mBAAmB;IA0EjC;;;;;;;OAOG;YACW,WAAW;IA0GzB;;;;;OAKG;IACH,OAAO,CAAC,sBAAsB;IAuF9B;;OAEG;IACH,OAAO,CAAC,gBAAgB;IAyBxB;;OAEG;IACH,OAAO,CAAC,eAAe;IAavB;;OAEG;IACH,OAAO,CAAC,oBAAoB;IAS5B;;OAEG;IACH,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,aAAa,CAAU;IAC/C,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,aAAa,CAAU;IAE/C;;;;;;;;;;;OAWG;YACW,mBAAmB;IAkDjC;;;;;;OAMG;IACH,OAAO,CAAC,kBAAkB;IAgB1B;;;OAGG;IACH,OAAO,CAAC,OAAO;IAYf;;;;;;OAMG;IACH,OAAO,CAAC,aAAa;IAYrB;;;;;;OAMG;IACH,OAAO,CAAC,uBAAuB;IAY/B;;;;;;;;;;OAUG;YACW,uBAAuB;IA4HrC;;OAEG;IACH,OAAO,CAAC,kBAAkB;IAa1B;;;;;;;;;;;;;OAaG;YACW,+BAA+B;IAmC7C;;OAEG;IACH,OAAO,CAAC,sBAAsB;IAoB9B;;OAEG;IACH,OAAO,CAAC,gBAAgB;CA0D3B"}
1
+ {"version":3,"file":"turn-executor.d.ts","sourceRoot":"","sources":["../../../src/llm/executor/turn-executor.ts"],"names":[],"mappings":"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"}
@@ -56,23 +56,6 @@ class TurnExecutor {
56
56
  * Used to pass approval info from tool execution to result persistence.
57
57
  */
58
58
  approvalMetadata = /* @__PURE__ */ new Map();
59
- /**
60
- * Tracks whether compaction occurred during this turn.
61
- * Used to signal to the caller that session continuation may be needed.
62
- */
63
- compactionOccurred = false;
64
- /**
65
- * Compaction data captured during this turn.
66
- * Contains summary text and preserved messages for session continuation.
67
- * This data is passed up the call chain (NOT persisted to original session).
68
- */
69
- compactionData = null;
70
- /**
71
- * Virtual context for remaining iterations after compaction.
72
- * When set, the main loop uses this instead of calling getFormattedMessagesForLLM().
73
- * This provides reduced context to the LLM without persisting to the original session.
74
- */
75
- virtualContext = null;
76
59
  /**
77
60
  * Get StreamProcessor config from TurnExecutor state.
78
61
  * @param estimatedInputTokens Optional estimated input tokens for analytics
@@ -138,7 +121,7 @@ class TurnExecutor {
138
121
  await this.injectQueuedMessages(coalesced);
139
122
  }
140
123
  await this.pruneOldToolOutputs();
141
- let prepared = this.virtualContext ? await this.buildMessagesFromVirtualContext(contributorContext) : await this.contextManager.getFormattedMessagesForLLM(
124
+ let prepared = await this.contextManager.getFormattedMessagesForLLM(
142
125
  contributorContext,
143
126
  this.llmContext
144
127
  );
@@ -152,9 +135,16 @@ class TurnExecutor {
152
135
  this.logger.debug(
153
136
  `Pre-check: estimated ${estimatedTokens} tokens exceeds threshold, compacting`
154
137
  );
155
- await this.compactToVirtualContext(estimatedTokens);
156
- if (this.virtualContext) {
157
- prepared = await this.buildMessagesFromVirtualContext(contributorContext);
138
+ const didCompact = await this.compactContext(
139
+ estimatedTokens,
140
+ contributorContext,
141
+ toolDefinitions
142
+ );
143
+ if (didCompact) {
144
+ prepared = await this.contextManager.getFormattedMessagesForLLM(
145
+ contributorContext,
146
+ this.llmContext
147
+ );
158
148
  estimatedTokens = await this.contextManager.getEstimatedNextInputTokens(
159
149
  prepared.systemPrompt,
160
150
  prepared.preparedHistory,
@@ -216,22 +206,29 @@ class TurnExecutor {
216
206
  `Context estimation (cancelled): keeping last known actuals, partial response (${result.text.length} chars) will be estimated`
217
207
  );
218
208
  } else if (result.usage?.inputTokens !== void 0) {
219
- const diff = estimatedTokens - result.usage.inputTokens;
220
- const diffPercent = result.usage.inputTokens > 0 ? (diff / result.usage.inputTokens * 100).toFixed(1) : "0.0";
209
+ const contextInputTokens2 = this.getContextInputTokens(result.usage);
210
+ const actualInputTokens = contextInputTokens2 ?? result.usage.inputTokens;
211
+ const diff = estimatedTokens - actualInputTokens;
212
+ const diffPercent = actualInputTokens > 0 ? (diff / actualInputTokens * 100).toFixed(1) : "0.0";
221
213
  this.logger.info(
222
- `Context estimation accuracy: estimated=${estimatedTokens}, actual=${result.usage.inputTokens}, error=${diff} (${diffPercent}%)`
214
+ `Context estimation accuracy: estimated=${estimatedTokens}, actual=${actualInputTokens}, error=${diff} (${diffPercent}%)`
223
215
  );
224
- this.contextManager.setLastActualInputTokens(result.usage.inputTokens);
216
+ this.contextManager.setLastActualInputTokens(actualInputTokens);
225
217
  if (result.usage?.outputTokens !== void 0) {
226
218
  this.contextManager.setLastActualOutputTokens(result.usage.outputTokens);
227
219
  }
228
220
  await this.contextManager.recordLastCallMessageCount();
229
221
  }
230
- if (!this.virtualContext && result.usage?.inputTokens && this.shouldCompactFromActual(result.usage.inputTokens)) {
222
+ const contextInputTokens = result.usage ? this.getContextInputTokens(result.usage) : null;
223
+ if (contextInputTokens && this.shouldCompactFromActual(contextInputTokens)) {
231
224
  this.logger.debug(
232
- `Post-response: actual ${result.usage.inputTokens} tokens exceeds threshold, compacting`
225
+ `Post-response: actual ${contextInputTokens} tokens exceeds threshold, compacting`
226
+ );
227
+ await this.compactContext(
228
+ contextInputTokens,
229
+ contributorContext,
230
+ toolDefinitions
233
231
  );
234
- await this.compactToVirtualContext(result.usage.inputTokens);
235
232
  }
236
233
  if (result.finishReason !== "tool-calls") {
237
234
  const queuedOnTerminate = this.messageQueue.dequeueAll();
@@ -285,14 +282,7 @@ class TurnExecutor {
285
282
  text: lastText,
286
283
  stepCount,
287
284
  usage: lastStepTokens,
288
- finishReason: lastFinishReason,
289
- // Signal to caller that compaction occurred during this turn
290
- // Caller can use this to trigger session-native continuation
291
- didCompact: this.compactionOccurred,
292
- // Pass compaction data up the chain (NOT persisted to original session)
293
- // Caller uses this to create the continuation session with summary
294
- // Use spread to conditionally include only when data exists (exactOptionalPropertyTypes)
295
- ...this.compactionData && { compaction: this.compactionData }
285
+ finishReason: lastFinishReason
296
286
  };
297
287
  } catch (_2) {
298
288
  var _error = _2, _hasError = true;
@@ -693,27 +683,31 @@ class TurnExecutor {
693
683
  );
694
684
  }
695
685
  /**
696
- * Compact context using ReactiveOverflowStrategy WITHOUT persisting to original session.
697
- *
698
- * Key design: Creates a virtual context (summary + preserved messages) that will be used
699
- * for the remaining iterations of this turn. The compaction data is passed up the call chain
700
- * so the caller can create a continuation session with the summary.
686
+ * Compact context by generating a summary and adding it to the same session.
701
687
  *
702
- * The original session remains UNTOUCHED - no messages are added or modified.
688
+ * The summary message is added to the conversation history with `isSummary: true` metadata.
689
+ * When the context is loaded via getFormattedMessagesForLLM(), filterCompacted() will
690
+ * exclude all messages before the summary, effectively compacting the context.
703
691
  *
704
692
  * @param originalTokens The estimated input token count that triggered overflow
693
+ * @param contributorContext Context for system prompt contributors (needed for accurate token estimation)
694
+ * @param tools Tool definitions (needed for accurate token estimation)
695
+ * @returns true if compaction occurred, false if skipped
705
696
  */
706
- async compactToVirtualContext(originalTokens) {
697
+ async compactContext(originalTokens, contributorContext, tools) {
707
698
  if (!this.compactionStrategy) {
708
- return;
699
+ return false;
709
700
  }
710
701
  this.logger.info(
711
702
  `Context overflow detected (${originalTokens} tokens), checking if compression is possible`
712
703
  );
713
704
  const history = await this.contextManager.getHistory();
705
+ const { filterCompacted } = await import("../../context/utils.js");
706
+ const originalFiltered = filterCompacted(history);
707
+ const originalMessages = originalFiltered.length;
714
708
  if (history.length < 4) {
715
709
  this.logger.debug("Compaction skipped: history too short to summarize");
716
- return;
710
+ return false;
717
711
  }
718
712
  this.eventBus.emit("context:compacting", {
719
713
  estimatedTokens: originalTokens
@@ -727,106 +721,36 @@ class TurnExecutor {
727
721
  originalTokens,
728
722
  compactedTokens: originalTokens,
729
723
  // No change
730
- originalMessages: history.length,
731
- compactedMessages: history.length,
724
+ originalMessages,
725
+ compactedMessages: originalMessages,
732
726
  // No change
733
727
  strategy: this.compactionStrategy.name,
734
728
  reason: "overflow"
735
729
  });
736
- return;
737
- }
738
- const summaryMessage = summaryMessages[0];
739
- if (!summaryMessage) {
740
- this.logger.warn("Compaction returned empty summary message array");
741
- return;
730
+ return false;
742
731
  }
743
- const summaryText = this.extractSummaryText(summaryMessage);
744
- const summarizedCount = summaryMessage.metadata?.originalMessageCount ?? 0;
745
- let existingSummaryIndex = -1;
746
- for (let i = history.length - 1; i >= 0; i--) {
747
- const msg = history[i];
748
- if (msg?.metadata?.isSummary === true || msg?.metadata?.isSessionSummary === true) {
749
- existingSummaryIndex = i;
750
- break;
751
- }
732
+ for (const summary of summaryMessages) {
733
+ await this.contextManager.addMessage(summary);
752
734
  }
753
- const baseIndex = existingSummaryIndex >= 0 ? existingSummaryIndex + 1 : 0;
754
- const preservedMessages = history.slice(baseIndex + summarizedCount);
755
- const firstTimestamp = summaryMessage.metadata?.originalFirstTimestamp;
756
- const lastTimestamp = summaryMessage.metadata?.originalLastTimestamp;
757
- this.compactionData = {
758
- summaryText,
759
- preservedMessages: [...preservedMessages],
760
- // Copy to avoid mutation
761
- summarizedCount,
762
- ...firstTimestamp !== void 0 && { originalFirstTimestamp: firstTimestamp },
763
- ...lastTimestamp !== void 0 && { originalLastTimestamp: lastTimestamp }
764
- };
765
- this.virtualContext = {
766
- summaryMessage,
767
- preservedMessages: [...preservedMessages]
768
- };
769
- this.compactionOccurred = true;
770
735
  this.contextManager.resetActualTokenTracking();
771
- const { estimateMessagesTokens: estimateTokens } = await import("../../context/utils.js");
772
- const virtualMessages = [summaryMessage, ...preservedMessages];
773
- const compactedTokens = estimateTokens(virtualMessages);
736
+ const afterEstimate = await this.contextManager.getContextTokenEstimate(
737
+ contributorContext,
738
+ tools
739
+ );
740
+ const compactedTokens = afterEstimate.estimated;
741
+ const compactedMessages = afterEstimate.stats.filteredMessageCount;
774
742
  this.eventBus.emit("context:compacted", {
775
743
  originalTokens,
776
744
  compactedTokens,
777
- originalMessages: history.length,
778
- compactedMessages: virtualMessages.length,
745
+ originalMessages,
746
+ compactedMessages,
779
747
  strategy: this.compactionStrategy.name,
780
748
  reason: "overflow"
781
749
  });
782
750
  this.logger.info(
783
- `Compaction complete (virtual context): ${originalTokens} \u2192 ~${compactedTokens} tokens (${history.length} \u2192 ${virtualMessages.length} messages). Original session unchanged - summary will be passed to continuation session.`
751
+ `Compaction complete: ${originalTokens} \u2192 ~${compactedTokens} tokens (${originalMessages} \u2192 ${compactedMessages} messages after filtering)`
784
752
  );
785
- }
786
- /**
787
- * Extract the summary text from a summary message.
788
- */
789
- extractSummaryText(summaryMessage) {
790
- if (typeof summaryMessage.content === "string") {
791
- return summaryMessage.content;
792
- }
793
- if (Array.isArray(summaryMessage.content)) {
794
- return summaryMessage.content.filter((part) => part.type === "text").map((part) => part.text).join("\n");
795
- }
796
- return "";
797
- }
798
- /**
799
- * Build formatted messages from virtual context (after compaction).
800
- *
801
- * This creates LLM-ready messages using:
802
- * - System prompt (same as normal flow)
803
- * - Summary message (as first message)
804
- * - Preserved messages (formatted for LLM)
805
- *
806
- * Uses the same formatting pipeline as getFormattedMessagesForLLM()
807
- * but with our virtual history instead of the stored history.
808
- *
809
- * @param contributorContext Context for system prompt contributors
810
- * @returns Formatted messages ready for LLM call, matching getFormattedMessagesForLLM return type
811
- */
812
- async buildMessagesFromVirtualContext(contributorContext) {
813
- if (!this.virtualContext) {
814
- throw new Error("buildMessagesFromVirtualContext called without virtual context");
815
- }
816
- const { summaryMessage, preservedMessages } = this.virtualContext;
817
- const systemPrompt = await this.contextManager.getSystemPrompt(contributorContext);
818
- const virtualHistory = [summaryMessage, ...preservedMessages];
819
- const formattedMessages = await this.contextManager.getFormattedMessages(
820
- contributorContext,
821
- this.llmContext,
822
- systemPrompt,
823
- virtualHistory
824
- );
825
- return {
826
- formattedMessages,
827
- systemPrompt,
828
- preparedHistory: virtualHistory
829
- };
753
+ return true;
830
754
  }
831
755
  /**
832
756
  * Set telemetry span attributes for token usage.
@@ -849,6 +773,10 @@ class TurnExecutor {
849
773
  activeSpan.setAttribute("gen_ai.usage.reasoning_tokens", usage.reasoningTokens);
850
774
  }
851
775
  }
776
+ getContextInputTokens(usage) {
777
+ if (usage.inputTokens === void 0) return null;
778
+ return usage.inputTokens + (usage.cacheReadTokens ?? 0) + (usage.cacheWriteTokens ?? 0);
779
+ }
852
780
  /**
853
781
  * Map provider errors to DextoRuntimeError.
854
782
  */
@@ -1,23 +1,5 @@
1
- import type { InternalMessage } from '../../context/types.js';
2
1
  import { TokenUsage } from '../types.js';
3
2
  import { LLMFinishReason } from '../../events/index.js';
4
- /**
5
- * Data captured during context compaction for session-native continuation.
6
- * This is passed through the call chain so the new session can be created
7
- * with the summary and preserved messages.
8
- */
9
- export interface CompactionData {
10
- /** The generated summary text */
11
- summaryText: string;
12
- /** Messages preserved (not summarized) - typically last N turns */
13
- preservedMessages: InternalMessage[];
14
- /** Number of messages that were summarized */
15
- summarizedCount: number;
16
- /** Timestamp of first summarized message */
17
- originalFirstTimestamp?: number;
18
- /** Timestamp of last summarized message */
19
- originalLastTimestamp?: number;
20
- }
21
3
  export interface ExecutorResult {
22
4
  /**
23
5
  * The accumulated text from assistant responses.
@@ -31,16 +13,6 @@ export interface ExecutorResult {
31
13
  usage: TokenUsage | null;
32
14
  /** Reason the execution finished */
33
15
  finishReason: LLMFinishReason;
34
- /**
35
- * Set to true if context compaction occurred during this turn.
36
- * Caller can use this to trigger session-native continuation (create new session).
37
- */
38
- didCompact: boolean;
39
- /**
40
- * Compaction data when didCompact is true.
41
- * Contains the summary text and preserved messages for creating the continuation session.
42
- */
43
- compaction?: CompactionData;
44
16
  }
45
17
  export interface StreamProcessorResult {
46
18
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/llm/executor/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAC9D,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAExD;;;;GAIG;AACH,MAAM,WAAW,cAAc;IAC3B,iCAAiC;IACjC,WAAW,EAAE,MAAM,CAAC;IACpB,mEAAmE;IACnE,iBAAiB,EAAE,eAAe,EAAE,CAAC;IACrC,8CAA8C;IAC9C,eAAe,EAAE,MAAM,CAAC;IACxB,4CAA4C;IAC5C,sBAAsB,CAAC,EAAE,MAAM,CAAC;IAChC,2CAA2C;IAC3C,qBAAqB,CAAC,EAAE,MAAM,CAAC;CAClC;AAED,MAAM,WAAW,cAAc;IAC3B;;;;OAIG;IACH,IAAI,EAAE,MAAM,CAAC;IACb,+BAA+B;IAC/B,SAAS,EAAE,MAAM,CAAC;IAClB,qCAAqC;IACrC,KAAK,EAAE,UAAU,GAAG,IAAI,CAAC;IACzB,oCAAoC;IACpC,YAAY,EAAE,eAAe,CAAC;IAC9B;;;OAGG;IACH,UAAU,EAAE,OAAO,CAAC;IACpB;;;OAGG;IACH,UAAU,CAAC,EAAE,cAAc,CAAC;CAC/B;AAED,MAAM,WAAW,qBAAqB;IAClC;;;;OAIG;IACH,IAAI,EAAE,MAAM,CAAC;IACb,YAAY,EAAE,eAAe,CAAC;IAC9B,KAAK,EAAE,UAAU,CAAC;CACrB"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/llm/executor/types.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAExD,MAAM,WAAW,cAAc;IAC3B;;;;OAIG;IACH,IAAI,EAAE,MAAM,CAAC;IACb,+BAA+B;IAC/B,SAAS,EAAE,MAAM,CAAC;IAClB,qCAAqC;IACrC,KAAK,EAAE,UAAU,GAAG,IAAI,CAAC;IACzB,oCAAoC;IACpC,YAAY,EAAE,eAAe,CAAC;CACjC;AAED,MAAM,WAAW,qBAAqB;IAClC;;;;OAIG;IACH,IAAI,EAAE,MAAM,CAAC;IACb,YAAY,EAAE,eAAe,CAAC;IAC9B,KAAK,EAAE,UAAU,CAAC;CACrB"}
@@ -178,7 +178,7 @@ class VercelLLMService {
178
178
  *
179
179
  * @param content - String or ContentPart[] (text, images, files)
180
180
  * @param options - { signal?: AbortSignal }
181
- * @returns Object with text response, whether compaction occurred, and compaction data if applicable
181
+ * @returns Object with text response
182
182
  */
183
183
  async stream(content, options) {
184
184
  const activeSpan = import_api.trace.getActiveSpan();
@@ -209,10 +209,7 @@ class VercelLLMService {
209
209
  const contributorContext = { mcpManager: this.toolManager.getMcpManager() };
210
210
  const result = await executor.execute(contributorContext, true);
211
211
  return {
212
- text: result.text ?? "",
213
- didCompact: result.didCompact,
214
- // Use spread to conditionally include compaction (exactOptionalPropertyTypes)
215
- ...result.compaction && { compaction: result.compaction }
212
+ text: result.text ?? ""
216
213
  };
217
214
  });
218
215
  }
@@ -9,7 +9,6 @@ import type { SessionEventBus } from '../../events/index.js';
9
9
  import type { IConversationHistoryProvider } from '../../session/history/types.js';
10
10
  import type { SystemPromptManager } from '../../systemPrompt/manager.js';
11
11
  import type { ValidatedLLMConfig } from '../schemas.js';
12
- import type { CompactionData } from '../executor/types.js';
13
12
  import { MessageQueueService } from '../../session/message-queue.js';
14
13
  import type { ResourceManager } from '../../resources/index.js';
15
14
  import type { ContentInput } from '../../agent/types.js';
@@ -55,8 +54,6 @@ export declare class VercelLLMService {
55
54
  */
56
55
  static StreamResult: {
57
56
  text: string;
58
- didCompact: boolean;
59
- compaction?: CompactionData;
60
57
  };
61
58
  /**
62
59
  * Stream a response for the given content.
@@ -64,14 +61,12 @@ export declare class VercelLLMService {
64
61
  *
65
62
  * @param content - String or ContentPart[] (text, images, files)
66
63
  * @param options - { signal?: AbortSignal }
67
- * @returns Object with text response, whether compaction occurred, and compaction data if applicable
64
+ * @returns Object with text response
68
65
  */
69
66
  stream(content: ContentInput, options?: {
70
67
  signal?: AbortSignal;
71
68
  }): Promise<{
72
69
  text: string;
73
- didCompact: boolean;
74
- compaction?: CompactionData;
75
70
  }>;
76
71
  /**
77
72
  * Get configuration information about the LLM service
@@ -1 +1 @@
1
- {"version":3,"file":"vercel.d.ts","sourceRoot":"","sources":["../../../src/llm/services/vercel.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAqB,MAAM,IAAI,CAAC;AACtD,OAAO,EAAE,WAAW,EAAE,MAAM,6BAA6B,CAAC;AAC1D,OAAO,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAC9C,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAE7D,OAAO,EAAE,OAAO,EAAE,MAAM,sBAAsB,CAAC;AAC/C,OAAO,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAG1D,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,qCAAqC,CAAC;AAEjF,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAC7D,OAAO,KAAK,EAAE,4BAA4B,EAAE,MAAM,gCAAgC,CAAC;AACnF,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,+BAA+B,CAAC;AAEzE,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAC;AAIxD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAC3D,OAAO,EAAE,mBAAmB,EAAE,MAAM,gCAAgC,CAAC;AACrE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,0BAA0B,CAAC;AAGhE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AAEzD;;;;;;;;;;;;;GAaG;AACH,qBAIa,gBAAgB;IACzB,OAAO,CAAC,KAAK,CAAgB;IAC7B,OAAO,CAAC,MAAM,CAAqB;IACnC,OAAO,CAAC,WAAW,CAAc;IACjC,OAAO,CAAC,cAAc,CAA+B;IACrD,OAAO,CAAC,eAAe,CAAkB;IACzC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAS;IACnC,OAAO,CAAC,MAAM,CAAe;IAC7B,OAAO,CAAC,eAAe,CAAkB;IACzC,OAAO,CAAC,YAAY,CAAsB;IAC1C,OAAO,CAAC,kBAAkB,CAEf;IACX,OAAO,CAAC,WAAW,CAAc;IACjC,OAAO,CAAC,0BAA0B,CAAS;IAE3C;;OAEG;IACH,OAAO,CAAC,UAAU;gBAKd,WAAW,EAAE,WAAW,EACxB,KAAK,EAAE,aAAa,EACpB,mBAAmB,EAAE,mBAAmB,EACxC,eAAe,EAAE,4BAA4B,EAC7C,eAAe,EAAE,eAAe,EAChC,MAAM,EAAE,kBAAkB,EAC1B,SAAS,EAAE,MAAM,EACjB,eAAe,EAAE,eAAe,EAChC,MAAM,EAAE,YAAY,EACpB,kBAAkB,CAAC,EAAE,OAAO,mCAAmC,EAAE,mBAAmB,GAAG,IAAI,EAC3F,gBAAgB,CAAC,EAAE,qBAAqB;IAuD5C,WAAW,IAAI,OAAO,CAAC,OAAO,CAAC;IAI/B;;OAEG;IACH,OAAO,CAAC,kBAAkB;IA0B1B;;OAEG;IACH,OAAc,YAAY,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,OAAO,CAAC;QAAC,UAAU,CAAC,EAAE,cAAc,CAAA;KAAE,CAAC;IAE/F;;;;;;;OAOG;IACG,MAAM,CACR,OAAO,EAAE,YAAY,EACrB,OAAO,CAAC,EAAE;QAAE,MAAM,CAAC,EAAE,WAAW,CAAA;KAAE,GACnC,OAAO,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,OAAO,CAAC;QAAC,UAAU,CAAC,EAAE,cAAc,CAAA;KAAE,CAAC;IA2D9E;;;OAGG;IACH,SAAS,IAAI,gBAAgB;IA+B7B;;OAEG;IACH,iBAAiB,IAAI,cAAc,CAAC,OAAO,CAAC;IAI5C;;OAEG;IACH,eAAe,IAAI,mBAAmB;IAItC;;OAEG;IACH,qBAAqB,IACf,OAAO,mCAAmC,EAAE,mBAAmB,GAC/D,IAAI;CAGb"}
1
+ {"version":3,"file":"vercel.d.ts","sourceRoot":"","sources":["../../../src/llm/services/vercel.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAqB,MAAM,IAAI,CAAC;AACtD,OAAO,EAAE,WAAW,EAAE,MAAM,6BAA6B,CAAC;AAC1D,OAAO,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAC9C,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAE7D,OAAO,EAAE,OAAO,EAAE,MAAM,sBAAsB,CAAC;AAC/C,OAAO,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAG1D,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,qCAAqC,CAAC;AAEjF,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAC7D,OAAO,KAAK,EAAE,4BAA4B,EAAE,MAAM,gCAAgC,CAAC;AACnF,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,+BAA+B,CAAC;AAEzE,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAC;AAIxD,OAAO,EAAE,mBAAmB,EAAE,MAAM,gCAAgC,CAAC;AACrE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,0BAA0B,CAAC;AAGhE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AAEzD;;;;;;;;;;;;;GAaG;AACH,qBAIa,gBAAgB;IACzB,OAAO,CAAC,KAAK,CAAgB;IAC7B,OAAO,CAAC,MAAM,CAAqB;IACnC,OAAO,CAAC,WAAW,CAAc;IACjC,OAAO,CAAC,cAAc,CAA+B;IACrD,OAAO,CAAC,eAAe,CAAkB;IACzC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAS;IACnC,OAAO,CAAC,MAAM,CAAe;IAC7B,OAAO,CAAC,eAAe,CAAkB;IACzC,OAAO,CAAC,YAAY,CAAsB;IAC1C,OAAO,CAAC,kBAAkB,CAEf;IACX,OAAO,CAAC,WAAW,CAAc;IACjC,OAAO,CAAC,0BAA0B,CAAS;IAE3C;;OAEG;IACH,OAAO,CAAC,UAAU;gBAKd,WAAW,EAAE,WAAW,EACxB,KAAK,EAAE,aAAa,EACpB,mBAAmB,EAAE,mBAAmB,EACxC,eAAe,EAAE,4BAA4B,EAC7C,eAAe,EAAE,eAAe,EAChC,MAAM,EAAE,kBAAkB,EAC1B,SAAS,EAAE,MAAM,EACjB,eAAe,EAAE,eAAe,EAChC,MAAM,EAAE,YAAY,EACpB,kBAAkB,CAAC,EAAE,OAAO,mCAAmC,EAAE,mBAAmB,GAAG,IAAI,EAC3F,gBAAgB,CAAC,EAAE,qBAAqB;IAuD5C,WAAW,IAAI,OAAO,CAAC,OAAO,CAAC;IAI/B;;OAEG;IACH,OAAO,CAAC,kBAAkB;IA0B1B;;OAEG;IACH,OAAc,YAAY,EAAE;QAAE,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC;IAE7C;;;;;;;OAOG;IACG,MAAM,CACR,OAAO,EAAE,YAAY,EACrB,OAAO,CAAC,EAAE;QAAE,MAAM,CAAC,EAAE,WAAW,CAAA;KAAE,GACnC,OAAO,CAAC;QAAE,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC;IAwD5B;;;OAGG;IACH,SAAS,IAAI,gBAAgB;IA+B7B;;OAEG;IACH,iBAAiB,IAAI,cAAc,CAAC,OAAO,CAAC;IAI5C;;OAEG;IACH,eAAe,IAAI,mBAAmB;IAItC;;OAEG;IACH,qBAAqB,IACf,OAAO,mCAAmC,EAAE,mBAAmB,GAC/D,IAAI;CAGb"}
@@ -115,7 +115,7 @@ class VercelLLMService {
115
115
  *
116
116
  * @param content - String or ContentPart[] (text, images, files)
117
117
  * @param options - { signal?: AbortSignal }
118
- * @returns Object with text response, whether compaction occurred, and compaction data if applicable
118
+ * @returns Object with text response
119
119
  */
120
120
  async stream(content, options) {
121
121
  const activeSpan = trace.getActiveSpan();
@@ -146,10 +146,7 @@ class VercelLLMService {
146
146
  const contributorContext = { mcpManager: this.toolManager.getMcpManager() };
147
147
  const result = await executor.execute(contributorContext, true);
148
148
  return {
149
- text: result.text ?? "",
150
- didCompact: result.didCompact,
151
- // Use spread to conditionally include compaction (exactOptionalPropertyTypes)
152
- ...result.compaction && { compaction: result.compaction }
149
+ text: result.text ?? ""
153
150
  };
154
151
  });
155
152
  }
@@ -212,15 +212,15 @@ class ChatSession {
212
212
  *
213
213
  * @param content - String or ContentPart[] (text, images, files)
214
214
  * @param options - { signal?: AbortSignal }
215
- * @returns Promise that resolves to object with text and compaction status
215
+ * @returns Promise that resolves to object with text response
216
216
  *
217
217
  * @example
218
218
  * ```typescript
219
219
  * // Text only
220
- * const { text, didCompact } = await session.stream('What is the weather?');
220
+ * const { text } = await session.stream('What is the weather?');
221
221
  *
222
222
  * // Multiple images
223
- * const { text, didCompact } = await session.stream([
223
+ * const { text } = await session.stream([
224
224
  * { type: 'text', text: 'Compare these images' },
225
225
  * { type: 'image', image: base64Data1, mimeType: 'image/png' },
226
226
  * { type: 'image', image: base64Data2, mimeType: 'image/png' }
@@ -298,10 +298,7 @@ class ChatSession {
298
298
  }
299
299
  );
300
300
  return {
301
- text: modifiedResponsePayload.content,
302
- didCompact: streamResult.didCompact,
303
- // Use spread to conditionally include compaction (exactOptionalPropertyTypes)
304
- ...streamResult.compaction && { compaction: streamResult.compaction }
301
+ text: modifiedResponsePayload.content
305
302
  };
306
303
  } catch (error) {
307
304
  const aborted = error instanceof Error && error.name === "AbortError" || typeof error === "object" && error !== null && error.aborted === true;
@@ -314,13 +311,23 @@ class ChatSession {
314
311
  try {
315
312
  const history = await this.getHistory();
316
313
  const lastAssistant = history.filter((m) => m.role === "assistant").pop();
317
- if (lastAssistant && typeof lastAssistant.content === "string") {
318
- return { text: lastAssistant.content, didCompact: false };
314
+ if (lastAssistant) {
315
+ if (typeof lastAssistant.content === "string") {
316
+ return { text: lastAssistant.content };
317
+ }
318
+ if (Array.isArray(lastAssistant.content)) {
319
+ const text = lastAssistant.content.filter(
320
+ (part) => part.type === "text"
321
+ ).map((part) => part.text).join("");
322
+ if (text) {
323
+ return { text };
324
+ }
325
+ }
319
326
  }
320
327
  } catch {
321
328
  this.logger.debug("Failed to retrieve partial response from history on cancel");
322
329
  }
323
- return { text: "", didCompact: false };
330
+ return { text: "" };
324
331
  }
325
332
  if (error instanceof import_errors.DextoRuntimeError && error.code === import_error_codes.PluginErrorCode.PLUGIN_BLOCKED_EXECUTION && error.scope === import_errors.ErrorScope.PLUGIN && error.type === import_errors.ErrorType.FORBIDDEN) {
326
333
  const textContent = parts.filter((p) => p.type === "text").map((p) => p.text).join("\n");
@@ -334,7 +341,7 @@ class ChatSession {
334
341
  `Failed to save blocked interaction to history: ${saveError instanceof Error ? saveError.message : String(saveError)}`
335
342
  );
336
343
  }
337
- return { text: error.message, didCompact: false };
344
+ return { text: error.message };
338
345
  }
339
346
  this.logger.error(
340
347
  `Error in ChatSession.stream: ${error instanceof Error ? error.message : String(error)}`
@@ -403,7 +410,7 @@ class ChatSession {
403
410
  * @see {@link ContextManager.resetConversation} for the underlying implementation
404
411
  */
405
412
  async reset() {
406
- await this.historyProvider.clearHistory();
413
+ await this.llmService.getContextManager().resetConversation();
407
414
  this.services.agentEventBus.emit("session:reset", {
408
415
  sessionId: this.id
409
416
  });
@@ -12,7 +12,6 @@ import type { IDextoLogger } from '../logger/v2/types.js';
12
12
  import type { InternalMessage } from '../context/types.js';
13
13
  import type { UserMessageInput } from './message-queue.js';
14
14
  import type { ContentInput } from '../agent/types.js';
15
- import type { CompactionData } from '../llm/executor/types.js';
16
15
  /**
17
16
  * Represents an isolated conversation session within a Dexto agent.
18
17
  *
@@ -163,15 +162,15 @@ export declare class ChatSession {
163
162
  *
164
163
  * @param content - String or ContentPart[] (text, images, files)
165
164
  * @param options - { signal?: AbortSignal }
166
- * @returns Promise that resolves to object with text and compaction status
165
+ * @returns Promise that resolves to object with text response
167
166
  *
168
167
  * @example
169
168
  * ```typescript
170
169
  * // Text only
171
- * const { text, didCompact } = await session.stream('What is the weather?');
170
+ * const { text } = await session.stream('What is the weather?');
172
171
  *
173
172
  * // Multiple images
174
- * const { text, didCompact } = await session.stream([
173
+ * const { text } = await session.stream([
175
174
  * { type: 'text', text: 'Compare these images' },
176
175
  * { type: 'image', image: base64Data1, mimeType: 'image/png' },
177
176
  * { type: 'image', image: base64Data2, mimeType: 'image/png' }
@@ -182,8 +181,6 @@ export declare class ChatSession {
182
181
  signal?: AbortSignal;
183
182
  }): Promise<{
184
183
  text: string;
185
- didCompact: boolean;
186
- compaction?: CompactionData;
187
184
  }>;
188
185
  /**
189
186
  * Combine multiple abort signals into one.
@@ -1 +1 @@
1
- {"version":3,"file":"chat-session.d.ts","sourceRoot":"","sources":["../../src/session/chat-session.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"chat-session.d.ts","sourceRoot":"","sources":["../../src/session/chat-session.ts"],"names":[],"mappings":"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"}