@bastani/atomic 0.8.26-alpha.6 → 0.8.26-alpha.7

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 (240) hide show
  1. package/CHANGELOG.md +18 -0
  2. package/README.md +7 -4
  3. package/dist/builtin/intercom/CHANGELOG.md +6 -0
  4. package/dist/builtin/intercom/package.json +2 -2
  5. package/dist/builtin/mcp/CHANGELOG.md +6 -0
  6. package/dist/builtin/mcp/package.json +3 -3
  7. package/dist/builtin/subagents/CHANGELOG.md +6 -0
  8. package/dist/builtin/subagents/agents/codebase-online-researcher.md +9 -9
  9. package/dist/builtin/subagents/agents/debugger.md +6 -6
  10. package/dist/builtin/subagents/package.json +4 -4
  11. package/dist/builtin/subagents/prompts/parallel-handoff-plan.md +1 -1
  12. package/dist/builtin/subagents/skills/browser/EXAMPLES.md +151 -0
  13. package/dist/builtin/subagents/skills/browser/LICENSE.txt +21 -0
  14. package/dist/builtin/subagents/skills/browser/REFERENCE.md +451 -0
  15. package/dist/builtin/subagents/skills/browser/SKILL.md +170 -0
  16. package/dist/builtin/subagents/skills/subagent/SKILL.md +4 -4
  17. package/dist/builtin/web-access/CHANGELOG.md +6 -0
  18. package/dist/builtin/web-access/package.json +2 -2
  19. package/dist/builtin/workflows/CHANGELOG.md +11 -0
  20. package/dist/builtin/workflows/builtin/deep-research-codebase.ts +4 -1
  21. package/dist/builtin/workflows/builtin/goal.ts +127 -99
  22. package/dist/builtin/workflows/builtin/open-claude-design.ts +224 -147
  23. package/dist/builtin/workflows/builtin/ralph.ts +160 -197
  24. package/dist/builtin/workflows/package.json +2 -2
  25. package/dist/builtin/workflows/skills/research-codebase/SKILL.md +1 -1
  26. package/dist/builtin/workflows/src/tui/stage-chat-view.ts +9 -0
  27. package/dist/core/agent-session.d.ts +28 -1
  28. package/dist/core/agent-session.d.ts.map +1 -1
  29. package/dist/core/agent-session.js +110 -28
  30. package/dist/core/agent-session.js.map +1 -1
  31. package/dist/core/compaction/branch-summarization.d.ts +1 -1
  32. package/dist/core/compaction/branch-summarization.d.ts.map +1 -1
  33. package/dist/core/compaction/branch-summarization.js +6 -3
  34. package/dist/core/compaction/branch-summarization.js.map +1 -1
  35. package/dist/core/compaction/compaction.d.ts.map +1 -1
  36. package/dist/core/compaction/compaction.js +23 -10
  37. package/dist/core/compaction/compaction.js.map +1 -1
  38. package/dist/core/compaction/context-compaction.d.ts +61 -0
  39. package/dist/core/compaction/context-compaction.d.ts.map +1 -0
  40. package/dist/core/compaction/context-compaction.js +602 -0
  41. package/dist/core/compaction/context-compaction.js.map +1 -0
  42. package/dist/core/compaction/index.d.ts +1 -0
  43. package/dist/core/compaction/index.d.ts.map +1 -1
  44. package/dist/core/compaction/index.js +1 -0
  45. package/dist/core/compaction/index.js.map +1 -1
  46. package/dist/core/index.d.ts +1 -1
  47. package/dist/core/index.d.ts.map +1 -1
  48. package/dist/core/index.js.map +1 -1
  49. package/dist/core/session-manager.d.ts +41 -1
  50. package/dist/core/session-manager.d.ts.map +1 -1
  51. package/dist/core/session-manager.js +146 -7
  52. package/dist/core/session-manager.js.map +1 -1
  53. package/dist/core/slash-commands.d.ts.map +1 -1
  54. package/dist/core/slash-commands.js +1 -0
  55. package/dist/core/slash-commands.js.map +1 -1
  56. package/dist/index.d.ts +3 -3
  57. package/dist/index.d.ts.map +1 -1
  58. package/dist/index.js +2 -2
  59. package/dist/index.js.map +1 -1
  60. package/dist/modes/index.d.ts +1 -1
  61. package/dist/modes/index.d.ts.map +1 -1
  62. package/dist/modes/index.js.map +1 -1
  63. package/dist/modes/interactive/components/chat-session-host.d.ts.map +1 -1
  64. package/dist/modes/interactive/components/chat-session-host.js +17 -0
  65. package/dist/modes/interactive/components/chat-session-host.js.map +1 -1
  66. package/dist/modes/interactive/interactive-mode.d.ts +1 -0
  67. package/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
  68. package/dist/modes/interactive/interactive-mode.js +74 -0
  69. package/dist/modes/interactive/interactive-mode.js.map +1 -1
  70. package/dist/modes/rpc/rpc-client.d.ts +12 -7
  71. package/dist/modes/rpc/rpc-client.d.ts.map +1 -1
  72. package/dist/modes/rpc/rpc-client.js +8 -1
  73. package/dist/modes/rpc/rpc-client.js.map +1 -1
  74. package/dist/modes/rpc/rpc-mode.d.ts.map +1 -1
  75. package/dist/modes/rpc/rpc-mode.js +4 -0
  76. package/dist/modes/rpc/rpc-mode.js.map +1 -1
  77. package/dist/modes/rpc/rpc-types.d.ts +13 -2
  78. package/dist/modes/rpc/rpc-types.d.ts.map +1 -1
  79. package/dist/modes/rpc/rpc-types.js.map +1 -1
  80. package/docs/compaction.md +42 -23
  81. package/docs/custom-provider.md +11 -9
  82. package/docs/extensions.md +35 -35
  83. package/docs/index.md +1 -8
  84. package/docs/json.md +14 -11
  85. package/docs/packages.md +2 -0
  86. package/docs/providers.md +4 -1
  87. package/docs/quickstart.md +5 -12
  88. package/docs/rpc.md +44 -8
  89. package/docs/sdk.md +1 -8
  90. package/docs/session-format.md +25 -12
  91. package/docs/sessions.md +2 -1
  92. package/docs/skills.md +1 -15
  93. package/docs/termux.md +9 -10
  94. package/docs/themes.md +2 -2
  95. package/docs/tmux.md +3 -3
  96. package/docs/tui.md +19 -32
  97. package/docs/usage.md +2 -0
  98. package/docs/workflows.md +44 -2
  99. package/package.json +4 -12
  100. package/dist/builtin/subagents/skills/browser-use/SKILL.md +0 -234
  101. package/dist/builtin/subagents/skills/browser-use/references/cdp-python.md +0 -76
  102. package/dist/builtin/subagents/skills/browser-use/references/multi-session.md +0 -92
  103. package/node_modules/@earendil-works/pi-tui/README.md +0 -779
  104. package/node_modules/@earendil-works/pi-tui/dist/autocomplete.d.ts +0 -54
  105. package/node_modules/@earendil-works/pi-tui/dist/autocomplete.d.ts.map +0 -1
  106. package/node_modules/@earendil-works/pi-tui/dist/autocomplete.js +0 -632
  107. package/node_modules/@earendil-works/pi-tui/dist/autocomplete.js.map +0 -1
  108. package/node_modules/@earendil-works/pi-tui/dist/components/box.d.ts +0 -22
  109. package/node_modules/@earendil-works/pi-tui/dist/components/box.d.ts.map +0 -1
  110. package/node_modules/@earendil-works/pi-tui/dist/components/box.js +0 -104
  111. package/node_modules/@earendil-works/pi-tui/dist/components/box.js.map +0 -1
  112. package/node_modules/@earendil-works/pi-tui/dist/components/cancellable-loader.d.ts +0 -22
  113. package/node_modules/@earendil-works/pi-tui/dist/components/cancellable-loader.d.ts.map +0 -1
  114. package/node_modules/@earendil-works/pi-tui/dist/components/cancellable-loader.js +0 -35
  115. package/node_modules/@earendil-works/pi-tui/dist/components/cancellable-loader.js.map +0 -1
  116. package/node_modules/@earendil-works/pi-tui/dist/components/editor.d.ts +0 -249
  117. package/node_modules/@earendil-works/pi-tui/dist/components/editor.d.ts.map +0 -1
  118. package/node_modules/@earendil-works/pi-tui/dist/components/editor.js +0 -1857
  119. package/node_modules/@earendil-works/pi-tui/dist/components/editor.js.map +0 -1
  120. package/node_modules/@earendil-works/pi-tui/dist/components/image.d.ts +0 -28
  121. package/node_modules/@earendil-works/pi-tui/dist/components/image.d.ts.map +0 -1
  122. package/node_modules/@earendil-works/pi-tui/dist/components/image.js +0 -89
  123. package/node_modules/@earendil-works/pi-tui/dist/components/image.js.map +0 -1
  124. package/node_modules/@earendil-works/pi-tui/dist/components/input.d.ts +0 -37
  125. package/node_modules/@earendil-works/pi-tui/dist/components/input.d.ts.map +0 -1
  126. package/node_modules/@earendil-works/pi-tui/dist/components/input.js +0 -378
  127. package/node_modules/@earendil-works/pi-tui/dist/components/input.js.map +0 -1
  128. package/node_modules/@earendil-works/pi-tui/dist/components/loader.d.ts +0 -31
  129. package/node_modules/@earendil-works/pi-tui/dist/components/loader.d.ts.map +0 -1
  130. package/node_modules/@earendil-works/pi-tui/dist/components/loader.js +0 -69
  131. package/node_modules/@earendil-works/pi-tui/dist/components/loader.js.map +0 -1
  132. package/node_modules/@earendil-works/pi-tui/dist/components/markdown.d.ts +0 -96
  133. package/node_modules/@earendil-works/pi-tui/dist/components/markdown.d.ts.map +0 -1
  134. package/node_modules/@earendil-works/pi-tui/dist/components/markdown.js +0 -644
  135. package/node_modules/@earendil-works/pi-tui/dist/components/markdown.js.map +0 -1
  136. package/node_modules/@earendil-works/pi-tui/dist/components/select-list.d.ts +0 -50
  137. package/node_modules/@earendil-works/pi-tui/dist/components/select-list.d.ts.map +0 -1
  138. package/node_modules/@earendil-works/pi-tui/dist/components/select-list.js +0 -159
  139. package/node_modules/@earendil-works/pi-tui/dist/components/select-list.js.map +0 -1
  140. package/node_modules/@earendil-works/pi-tui/dist/components/settings-list.d.ts +0 -50
  141. package/node_modules/@earendil-works/pi-tui/dist/components/settings-list.d.ts.map +0 -1
  142. package/node_modules/@earendil-works/pi-tui/dist/components/settings-list.js +0 -185
  143. package/node_modules/@earendil-works/pi-tui/dist/components/settings-list.js.map +0 -1
  144. package/node_modules/@earendil-works/pi-tui/dist/components/spacer.d.ts +0 -12
  145. package/node_modules/@earendil-works/pi-tui/dist/components/spacer.d.ts.map +0 -1
  146. package/node_modules/@earendil-works/pi-tui/dist/components/spacer.js +0 -23
  147. package/node_modules/@earendil-works/pi-tui/dist/components/spacer.js.map +0 -1
  148. package/node_modules/@earendil-works/pi-tui/dist/components/text.d.ts +0 -19
  149. package/node_modules/@earendil-works/pi-tui/dist/components/text.d.ts.map +0 -1
  150. package/node_modules/@earendil-works/pi-tui/dist/components/text.js +0 -89
  151. package/node_modules/@earendil-works/pi-tui/dist/components/text.js.map +0 -1
  152. package/node_modules/@earendil-works/pi-tui/dist/components/truncated-text.d.ts +0 -13
  153. package/node_modules/@earendil-works/pi-tui/dist/components/truncated-text.d.ts.map +0 -1
  154. package/node_modules/@earendil-works/pi-tui/dist/components/truncated-text.js +0 -51
  155. package/node_modules/@earendil-works/pi-tui/dist/components/truncated-text.js.map +0 -1
  156. package/node_modules/@earendil-works/pi-tui/dist/editor-component.d.ts +0 -39
  157. package/node_modules/@earendil-works/pi-tui/dist/editor-component.d.ts.map +0 -1
  158. package/node_modules/@earendil-works/pi-tui/dist/editor-component.js +0 -2
  159. package/node_modules/@earendil-works/pi-tui/dist/editor-component.js.map +0 -1
  160. package/node_modules/@earendil-works/pi-tui/dist/fuzzy.d.ts +0 -16
  161. package/node_modules/@earendil-works/pi-tui/dist/fuzzy.d.ts.map +0 -1
  162. package/node_modules/@earendil-works/pi-tui/dist/fuzzy.js +0 -110
  163. package/node_modules/@earendil-works/pi-tui/dist/fuzzy.js.map +0 -1
  164. package/node_modules/@earendil-works/pi-tui/dist/index.d.ts +0 -23
  165. package/node_modules/@earendil-works/pi-tui/dist/index.d.ts.map +0 -1
  166. package/node_modules/@earendil-works/pi-tui/dist/index.js +0 -32
  167. package/node_modules/@earendil-works/pi-tui/dist/index.js.map +0 -1
  168. package/node_modules/@earendil-works/pi-tui/dist/keybindings.d.ts +0 -193
  169. package/node_modules/@earendil-works/pi-tui/dist/keybindings.d.ts.map +0 -1
  170. package/node_modules/@earendil-works/pi-tui/dist/keybindings.js +0 -174
  171. package/node_modules/@earendil-works/pi-tui/dist/keybindings.js.map +0 -1
  172. package/node_modules/@earendil-works/pi-tui/dist/keys.d.ts +0 -184
  173. package/node_modules/@earendil-works/pi-tui/dist/keys.d.ts.map +0 -1
  174. package/node_modules/@earendil-works/pi-tui/dist/keys.js +0 -1173
  175. package/node_modules/@earendil-works/pi-tui/dist/keys.js.map +0 -1
  176. package/node_modules/@earendil-works/pi-tui/dist/kill-ring.d.ts +0 -28
  177. package/node_modules/@earendil-works/pi-tui/dist/kill-ring.d.ts.map +0 -1
  178. package/node_modules/@earendil-works/pi-tui/dist/kill-ring.js +0 -44
  179. package/node_modules/@earendil-works/pi-tui/dist/kill-ring.js.map +0 -1
  180. package/node_modules/@earendil-works/pi-tui/dist/native-modifiers.d.ts +0 -3
  181. package/node_modules/@earendil-works/pi-tui/dist/native-modifiers.d.ts.map +0 -1
  182. package/node_modules/@earendil-works/pi-tui/dist/native-modifiers.js +0 -53
  183. package/node_modules/@earendil-works/pi-tui/dist/native-modifiers.js.map +0 -1
  184. package/node_modules/@earendil-works/pi-tui/dist/stdin-buffer.d.ts +0 -50
  185. package/node_modules/@earendil-works/pi-tui/dist/stdin-buffer.d.ts.map +0 -1
  186. package/node_modules/@earendil-works/pi-tui/dist/stdin-buffer.js +0 -361
  187. package/node_modules/@earendil-works/pi-tui/dist/stdin-buffer.js.map +0 -1
  188. package/node_modules/@earendil-works/pi-tui/dist/terminal-image.d.ts +0 -90
  189. package/node_modules/@earendil-works/pi-tui/dist/terminal-image.d.ts.map +0 -1
  190. package/node_modules/@earendil-works/pi-tui/dist/terminal-image.js +0 -366
  191. package/node_modules/@earendil-works/pi-tui/dist/terminal-image.js.map +0 -1
  192. package/node_modules/@earendil-works/pi-tui/dist/terminal.d.ts +0 -113
  193. package/node_modules/@earendil-works/pi-tui/dist/terminal.d.ts.map +0 -1
  194. package/node_modules/@earendil-works/pi-tui/dist/terminal.js +0 -472
  195. package/node_modules/@earendil-works/pi-tui/dist/terminal.js.map +0 -1
  196. package/node_modules/@earendil-works/pi-tui/dist/tui.d.ts +0 -227
  197. package/node_modules/@earendil-works/pi-tui/dist/tui.d.ts.map +0 -1
  198. package/node_modules/@earendil-works/pi-tui/dist/tui.js +0 -1106
  199. package/node_modules/@earendil-works/pi-tui/dist/tui.js.map +0 -1
  200. package/node_modules/@earendil-works/pi-tui/dist/undo-stack.d.ts +0 -17
  201. package/node_modules/@earendil-works/pi-tui/dist/undo-stack.d.ts.map +0 -1
  202. package/node_modules/@earendil-works/pi-tui/dist/undo-stack.js +0 -25
  203. package/node_modules/@earendil-works/pi-tui/dist/undo-stack.js.map +0 -1
  204. package/node_modules/@earendil-works/pi-tui/dist/utils.d.ts +0 -84
  205. package/node_modules/@earendil-works/pi-tui/dist/utils.d.ts.map +0 -1
  206. package/node_modules/@earendil-works/pi-tui/dist/utils.js +0 -1029
  207. package/node_modules/@earendil-works/pi-tui/dist/utils.js.map +0 -1
  208. package/node_modules/@earendil-works/pi-tui/dist/word-navigation.d.ts +0 -25
  209. package/node_modules/@earendil-works/pi-tui/dist/word-navigation.d.ts.map +0 -1
  210. package/node_modules/@earendil-works/pi-tui/dist/word-navigation.js +0 -96
  211. package/node_modules/@earendil-works/pi-tui/dist/word-navigation.js.map +0 -1
  212. package/node_modules/@earendil-works/pi-tui/native/darwin/prebuilds/darwin-arm64/darwin-modifiers.node +0 -0
  213. package/node_modules/@earendil-works/pi-tui/native/darwin/prebuilds/darwin-x64/darwin-modifiers.node +0 -0
  214. package/node_modules/@earendil-works/pi-tui/native/win32/prebuilds/win32-arm64/win32-console-mode.node +0 -0
  215. package/node_modules/@earendil-works/pi-tui/native/win32/prebuilds/win32-x64/win32-console-mode.node +0 -0
  216. package/node_modules/@earendil-works/pi-tui/package.json +0 -47
  217. package/node_modules/get-east-asian-width/index.d.ts +0 -60
  218. package/node_modules/get-east-asian-width/index.js +0 -30
  219. package/node_modules/get-east-asian-width/license +0 -9
  220. package/node_modules/get-east-asian-width/lookup-data.js +0 -21
  221. package/node_modules/get-east-asian-width/lookup.js +0 -138
  222. package/node_modules/get-east-asian-width/package.json +0 -71
  223. package/node_modules/get-east-asian-width/readme.md +0 -65
  224. package/node_modules/get-east-asian-width/utilities.js +0 -24
  225. package/node_modules/marked/LICENSE.md +0 -44
  226. package/node_modules/marked/README.md +0 -106
  227. package/node_modules/marked/bin/main.js +0 -282
  228. package/node_modules/marked/bin/marked.js +0 -15
  229. package/node_modules/marked/lib/marked.cjs +0 -2211
  230. package/node_modules/marked/lib/marked.cjs.map +0 -7
  231. package/node_modules/marked/lib/marked.d.cts +0 -728
  232. package/node_modules/marked/lib/marked.d.ts +0 -728
  233. package/node_modules/marked/lib/marked.esm.js +0 -2189
  234. package/node_modules/marked/lib/marked.esm.js.map +0 -7
  235. package/node_modules/marked/lib/marked.umd.js +0 -2213
  236. package/node_modules/marked/lib/marked.umd.js.map +0 -7
  237. package/node_modules/marked/man/marked.1 +0 -111
  238. package/node_modules/marked/man/marked.1.md +0 -92
  239. package/node_modules/marked/marked.min.js +0 -69
  240. package/node_modules/marked/package.json +0 -111
@@ -22,14 +22,14 @@ import { sleep } from "../utils/sleep.js";
22
22
  import { ATOMIC_GUIDE_COMMAND_NAME, ATOMIC_GUIDE_HELP_CHOICES, atomicGuideModeForChoice, getAtomicGuideMessage, isAtomicGuideHelpChoice, normalizeAtomicGuideMode, } from "./atomic-guide-command.js";
23
23
  import { formatNoApiKeyFoundMessage, formatNoModelSelectedMessage } from "./auth-guidance.js";
24
24
  import { executeBashWithOperations } from "./bash-executor.js";
25
- import { calculateContextTokens, collectEntriesForBranchSummary, compact, estimateContextTokens, generateBranchSummary, prepareCompaction, shouldCompact, } from "./compaction/index.js";
25
+ import { calculateContextTokens, collectEntriesForBranchSummary, compact, contextCompact as runContextCompact, estimateContextTokens, generateBranchSummary, prepareCompaction, prepareContextCompaction, shouldCompact, } from "./compaction/index.js";
26
26
  import { DEFAULT_THINKING_LEVEL } from "./defaults.js";
27
27
  import { exportSessionToHtml } from "./export-html/index.js";
28
28
  import { createToolHtmlRenderer } from "./export-html/tool-renderer.js";
29
29
  import { ExtensionRunner, wrapRegisteredTools, } from "./extensions/index.js";
30
30
  import { emitSessionShutdownEvent } from "./extensions/runner.js";
31
31
  import { expandPromptTemplate } from "./prompt-templates.js";
32
- import { CURRENT_SESSION_VERSION, getLatestCompactionEntry } from "./session-manager.js";
32
+ import { CURRENT_SESSION_VERSION, getLatestCompactionBoundaryEntry } from "./session-manager.js";
33
33
  import { createSyntheticSourceInfo } from "./source-info.js";
34
34
  import { buildSystemPrompt } from "./system-prompt.js";
35
35
  import { createLocalBashOperations } from "./tools/bash.js";
@@ -1587,6 +1587,66 @@ export class AgentSession {
1587
1587
  this._reconnectToAgent();
1588
1588
  }
1589
1589
  }
1590
+ /**
1591
+ * Manually compact the session context by applying validated logical deletions.
1592
+ * Retained transcript entries/content blocks stay verbatim; no user prompt text is accepted.
1593
+ */
1594
+ async contextCompact() {
1595
+ this._disconnectFromAgent();
1596
+ await this.abort();
1597
+ this._compactionAbortController = new AbortController();
1598
+ this._emit({ type: "context_compaction_start", reason: "manual" });
1599
+ try {
1600
+ if (!this.model) {
1601
+ throw new Error(formatNoModelSelectedMessage());
1602
+ }
1603
+ const { apiKey, headers } = await this._getRequiredRequestAuth(this.model);
1604
+ const pathEntries = this.sessionManager.getBranch();
1605
+ const settings = this.settingsManager.getCompactionSettings();
1606
+ const preparation = prepareContextCompaction(pathEntries, settings);
1607
+ if (!preparation) {
1608
+ throw new Error("Nothing to context-compact (session too small)");
1609
+ }
1610
+ const validated = await runContextCompact(preparation, this.model, apiKey, headers, this._compactionAbortController.signal, this.thinkingLevel);
1611
+ if (this._compactionAbortController.signal.aborted) {
1612
+ throw new Error("Compaction cancelled");
1613
+ }
1614
+ const backupPath = this.sessionManager.writeBackupSnapshot("context-compact");
1615
+ this.sessionManager.appendContextCompaction(validated.deletedTargets, validated.protectedEntryIds, validated.stats, backupPath);
1616
+ const sessionContext = this.sessionManager.buildSessionContext();
1617
+ this.agent.state.messages = sessionContext.messages;
1618
+ const result = {
1619
+ ...validated,
1620
+ promptVersion: 1,
1621
+ backupPath,
1622
+ };
1623
+ this._emit({
1624
+ type: "context_compaction_end",
1625
+ reason: "manual",
1626
+ result,
1627
+ aborted: false,
1628
+ willRetry: false,
1629
+ });
1630
+ return result;
1631
+ }
1632
+ catch (error) {
1633
+ const message = error instanceof Error ? error.message : String(error);
1634
+ const aborted = message === "Compaction cancelled" || (error instanceof Error && error.name === "AbortError");
1635
+ this._emit({
1636
+ type: "context_compaction_end",
1637
+ reason: "manual",
1638
+ result: undefined,
1639
+ aborted,
1640
+ willRetry: false,
1641
+ errorMessage: aborted ? undefined : `Context compaction failed: ${message}`,
1642
+ });
1643
+ throw error;
1644
+ }
1645
+ finally {
1646
+ this._compactionAbortController = undefined;
1647
+ this._reconnectToAgent();
1648
+ }
1649
+ }
1590
1650
  /**
1591
1651
  * Cancel in-progress compaction (manual or auto).
1592
1652
  */
@@ -1606,7 +1666,7 @@ export class AgentSession {
1606
1666
  *
1607
1667
  * Two cases:
1608
1668
  * 1. Overflow: LLM returned context overflow error, remove error message from agent state, compact, auto-retry
1609
- * 2. Threshold: Context over threshold, compact, NO auto-retry (user continues manually)
1669
+ * 2. Threshold: Context over threshold, compact, resume queued active-turn work if present; otherwise wait for user
1610
1670
  *
1611
1671
  * @param assistantMessage The assistant message to check
1612
1672
  * @param skipAbortedCheck If false, include aborted messages (for pre-prompt check). Default: true
@@ -1627,9 +1687,10 @@ export class AgentSession {
1627
1687
  // Skip compaction checks if this assistant message is older than the latest
1628
1688
  // compaction boundary. This prevents a stale pre-compaction usage/error
1629
1689
  // from retriggering compaction on the first prompt after compaction.
1630
- const compactionEntry = getLatestCompactionEntry(this.sessionManager.getBranch());
1631
- const assistantIsFromBeforeCompaction = compactionEntry !== null && assistantMessage.timestamp <= new Date(compactionEntry.timestamp).getTime();
1632
- if (assistantIsFromBeforeCompaction) {
1690
+ const compactionBoundaryEntry = getLatestCompactionBoundaryEntry(this.sessionManager.getBranch());
1691
+ const assistantIsFromBeforeCompactionBoundary = compactionBoundaryEntry !== null &&
1692
+ assistantMessage.timestamp <= new Date(compactionBoundaryEntry.timestamp).getTime();
1693
+ if (assistantIsFromBeforeCompactionBoundary) {
1633
1694
  return;
1634
1695
  }
1635
1696
  // Case 1: Overflow - LLM returned context overflow error
@@ -1668,9 +1729,9 @@ export class AgentSession {
1668
1729
  // have stale usage reflecting the old (larger) context and would falsely
1669
1730
  // trigger compaction right after one just finished.
1670
1731
  const usageMsg = messages[estimate.lastUsageIndex];
1671
- if (compactionEntry &&
1732
+ if (compactionBoundaryEntry &&
1672
1733
  usageMsg.role === "assistant" &&
1673
- usageMsg.timestamp <= new Date(compactionEntry.timestamp).getTime()) {
1734
+ usageMsg.timestamp <= new Date(compactionBoundaryEntry.timestamp).getTime()) {
1674
1735
  return;
1675
1736
  }
1676
1737
  contextTokens = estimate.tokens;
@@ -1682,6 +1743,40 @@ export class AgentSession {
1682
1743
  await this._runAutoCompaction("threshold", false);
1683
1744
  }
1684
1745
  }
1746
+ /**
1747
+ * Internal: remove the trailing overflow error from retry context if it is still present.
1748
+ */
1749
+ _dropTrailingOverflowAssistantErrorIfPresent() {
1750
+ const messages = this.agent.state.messages;
1751
+ const lastMsg = messages[messages.length - 1];
1752
+ if (lastMsg?.role === "assistant" && lastMsg.stopReason === "error") {
1753
+ this.agent.state.messages = messages.slice(0, -1);
1754
+ }
1755
+ }
1756
+ /**
1757
+ * Internal: schedule a live post-event continuation probe after compaction_end listeners can flush queues.
1758
+ */
1759
+ _schedulePostAutoCompactionContinuationProbe(reason, willRetry) {
1760
+ setTimeout(() => {
1761
+ if (this.isCompacting || this.isStreaming) {
1762
+ return;
1763
+ }
1764
+ if (reason === "overflow" && willRetry) {
1765
+ this._resumeAfterAutoCompaction();
1766
+ return;
1767
+ }
1768
+ if (!this.agent.hasQueuedMessages()) {
1769
+ return;
1770
+ }
1771
+ this._resumeAfterAutoCompaction();
1772
+ }, 100);
1773
+ }
1774
+ /**
1775
+ * Internal: resume generation after successful auto-compaction only when active work remains.
1776
+ */
1777
+ _resumeAfterAutoCompaction() {
1778
+ this.agent.continue().catch(() => { });
1779
+ }
1685
1780
  /**
1686
1781
  * Internal: Run auto-compaction with events.
1687
1782
  */
@@ -1782,6 +1877,9 @@ export class AgentSession {
1782
1877
  const newEntries = this.sessionManager.getEntries();
1783
1878
  const sessionContext = this.sessionManager.buildSessionContext();
1784
1879
  this.agent.state.messages = sessionContext.messages;
1880
+ if (reason === "overflow" && willRetry) {
1881
+ this._dropTrailingOverflowAssistantErrorIfPresent();
1882
+ }
1785
1883
  // Get the saved compaction entry for the extension event
1786
1884
  const savedCompactionEntry = newEntries.find((e) => e.type === "compaction" && e.summary === summary);
1787
1885
  if (this._extensionRunner && savedCompactionEntry) {
@@ -1798,23 +1896,7 @@ export class AgentSession {
1798
1896
  details,
1799
1897
  };
1800
1898
  this._emit({ type: "compaction_end", reason, result, aborted: false, willRetry });
1801
- if (willRetry) {
1802
- const messages = this.agent.state.messages;
1803
- const lastMsg = messages[messages.length - 1];
1804
- if (lastMsg?.role === "assistant" && lastMsg.stopReason === "error") {
1805
- this.agent.state.messages = messages.slice(0, -1);
1806
- }
1807
- setTimeout(() => {
1808
- this.agent.continue().catch(() => { });
1809
- }, 100);
1810
- }
1811
- else if (this.agent.hasQueuedMessages()) {
1812
- // Auto-compaction can complete while follow-up/steering/custom messages are waiting.
1813
- // Kick the loop so queued messages are actually delivered.
1814
- setTimeout(() => {
1815
- this.agent.continue().catch(() => { });
1816
- }, 100);
1817
- }
1899
+ this._schedulePostAutoCompactionContinuationProbe(reason, willRetry);
1818
1900
  }
1819
1901
  catch (error) {
1820
1902
  const errorMessage = error instanceof Error ? error.message : "compaction failed";
@@ -2633,10 +2715,10 @@ export class AgentSession {
2633
2715
  // We can only trust usage from an assistant that responded after the latest compaction.
2634
2716
  // If no such assistant exists, context token count is unknown until the next LLM response.
2635
2717
  const branchEntries = this.sessionManager.getBranch();
2636
- const latestCompaction = getLatestCompactionEntry(branchEntries);
2637
- if (latestCompaction) {
2718
+ const latestCompactionBoundary = getLatestCompactionBoundaryEntry(branchEntries);
2719
+ if (latestCompactionBoundary) {
2638
2720
  // Check if there's a valid assistant usage after the compaction boundary
2639
- const compactionIndex = branchEntries.lastIndexOf(latestCompaction);
2721
+ const compactionIndex = branchEntries.lastIndexOf(latestCompactionBoundary);
2640
2722
  let hasPostCompactionUsage = false;
2641
2723
  for (let i = branchEntries.length - 1; i > compactionIndex; i--) {
2642
2724
  const entry = branchEntries[i];